lean4-htt/src/tests/kernel/level.cpp
Leonardo de Moura eb487e44c1 refactor(kernel): use names instead of unsigned integers to encode level parameters
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2014-03-18 10:27:57 -07:00

82 lines
2.8 KiB
C++

/*
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include <locale>
#include "util/test.h"
#include "util/exception.h"
#include "kernel/level.h"
using namespace lean;
static void check_serializer(level const & l) {
std::ostringstream out;
serializer s(out);
s << l << l;
std::istringstream in(out.str());
deserializer d(in);
level l1, l2;
d >> l1 >> l2;
lean_assert_eq(l, l1);
lean_assert_eq(l, l2);
}
static void tst1() {
level zero;
level one = mk_succ(zero);
level two = mk_succ(one);
lean_assert(mk_max(one, two) == two);
lean_assert(mk_imax(one, two) == two);
lean_assert(mk_imax(two, zero) == zero);
check_serializer(two);
check_serializer(one);
level p = mk_param_univ("p");
lean_assert(mk_imax(p, zero) == zero);
lean_assert(mk_max(zero, p) == p);
lean_assert(mk_max(p, zero) == p);
lean_assert(mk_max(p, one) != p);
check_serializer(mk_max(p, one));
check_serializer(mk_imax(p, one));
check_serializer(mk_imax(one, p));
check_serializer(mk_imax(mk_succ(p), p));
std::cout << pp(mk_max(p, mk_max(mk_succ(mk_param_univ("a")), one))) << "\n";
}
static void tst2() {
level zero;
level one = mk_succ(zero);
level two = mk_succ(one);
level p1 = mk_param_univ("p1");
level p2 = mk_param_univ("p2");
level m1 = mk_meta_univ("m1");
lean_assert(is_trivial(zero, mk_succ(mk_max(p1, p2))));
lean_assert(is_trivial(mk_succ(mk_max(p1, p2)), mk_succ(mk_max(p1, p2))));
lean_assert(is_trivial(p1, mk_succ(mk_max(p1, p2))));
lean_assert(!is_trivial(p1, mk_succ(mk_imax(p1, p2))));
lean_assert(is_trivial(p2, mk_succ(mk_max(p1, p2))));
lean_assert(is_trivial(mk_succ(p2), mk_succ(mk_max(p1, p2))));
lean_assert(is_trivial(p2, mk_succ(mk_imax(p1, p2))));
lean_assert(is_trivial(mk_succ(p2), mk_succ(mk_imax(p1, p2))));
lean_assert(!is_trivial(mk_succ(mk_succ(p2)), mk_succ(mk_max(p1, p2))));
lean_assert(!is_trivial(mk_succ(mk_max(p1, p2)), zero));
lean_assert(is_trivial(mk_succ(mk_succ(p1)), mk_succ(mk_succ(mk_succ(p1)))));
lean_assert(!is_trivial(mk_succ(mk_succ(p1)), mk_succ(mk_succ(mk_succ(p2)))));
lean_assert(!is_trivial(mk_succ(mk_succ(mk_succ(p1))), mk_succ(mk_succ(p1))));
lean_assert(is_trivial(p1, mk_max(m1, mk_max(p1, p2))));
lean_assert(!is_trivial(p1, mk_imax(m1, mk_imax(p1, p2))));
lean_assert(is_trivial(p2, mk_imax(m1, mk_imax(p1, p2))));
lean_assert(is_trivial(zero, one));
lean_assert(is_trivial(one, two));
lean_assert(!is_trivial(one, zero));
lean_assert(!is_trivial(two, one));
lean_assert(!is_trivial(m1, p1));
lean_assert(!is_trivial(p1, m1));
}
int main() {
save_stack_info();
tst1();
tst2();
return has_violations() ? 1 : 0;
}