The printer and formatter objects are not trusted code. We moved them to the kernel to be able to provide them as an argument to the trace objects. Another motivation is to eliminate the kernel_exception_formatter hack. With the formatter in the kernel, we can implement the pretty printer for kernel exceptions as a virtual method. Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
106 lines
3.7 KiB
C++
106 lines
3.7 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 <thread>
|
|
#include "util/test.h"
|
|
#include "kernel/environment.h"
|
|
#include "kernel/type_checker.h"
|
|
#include "kernel/builtin.h"
|
|
#include "kernel/normalizer.h"
|
|
#include "kernel/abstract.h"
|
|
#include "kernel/printer.h"
|
|
#include "library/arith/arith.h"
|
|
#include "library/all/all.h"
|
|
using namespace lean;
|
|
|
|
static void tst1() {
|
|
environment env = mk_toplevel();
|
|
expr e = mk_int_value(mpz(10));
|
|
lean_assert(is_int_value(e));
|
|
lean_assert(infer_type(e, env) == Int);
|
|
std::cout << "e: " << e << "\n";
|
|
}
|
|
|
|
static void tst2() {
|
|
environment env = mk_toplevel();
|
|
expr e = iAdd(iVal(10), iVal(30));
|
|
std::cout << e << "\n";
|
|
std::cout << normalize(e, env) << "\n";
|
|
lean_assert(normalize(e, env) == iVal(40));
|
|
std::cout << infer_type(mk_int_add_fn(), env) << "\n";
|
|
lean_assert(infer_type(e, env) == Int);
|
|
lean_assert(infer_type(mk_app(mk_int_add_fn(), iVal(10)), env) == (Int >> Int));
|
|
lean_assert(is_int_value(normalize(e, env)));
|
|
expr e2 = Fun("a", Int, iAdd(Const("a"), iAdd(iVal(10), iVal(30))));
|
|
std::cout << e2 << " --> " << normalize(e2, env) << "\n";
|
|
lean_assert(infer_type(e2, env) == mk_arrow(Int, Int));
|
|
lean_assert(normalize(e2, env) == Fun("a", Int, iAdd(Const("a"), iVal(40))));
|
|
}
|
|
|
|
static void tst3() {
|
|
environment env = mk_toplevel();
|
|
expr e = iMul(iVal(10), iVal(30));
|
|
std::cout << e << "\n";
|
|
std::cout << normalize(e, env) << "\n";
|
|
lean_assert(normalize(e, env) == iVal(300));
|
|
std::cout << infer_type(mk_int_mul_fn(), env) << "\n";
|
|
lean_assert(infer_type(e, env) == Int);
|
|
lean_assert(infer_type(mk_app(mk_int_mul_fn(), iVal(10)), env) == mk_arrow(Int, Int));
|
|
lean_assert(is_int_value(normalize(e, env)));
|
|
expr e2 = Fun("a", Int, iMul(Const("a"), iMul(iVal(10), iVal(30))));
|
|
std::cout << e2 << " --> " << normalize(e2, env) << "\n";
|
|
lean_assert(infer_type(e2, env) == (Int >> Int));
|
|
lean_assert(normalize(e2, env) == Fun("a", Int, iMul(Const("a"), iVal(300))));
|
|
}
|
|
|
|
static void tst4() {
|
|
environment env = mk_toplevel();
|
|
expr e = iSub(iVal(10), iVal(30));
|
|
std::cout << e << "\n";
|
|
std::cout << normalize(e, env) << "\n";
|
|
lean_assert(normalize(e, env) == iVal(-20));
|
|
std::cout << infer_type(mk_int_sub_fn(), env) << "\n";
|
|
lean_assert(infer_type(e, env) == Int);
|
|
lean_assert(infer_type(mk_app(mk_int_sub_fn(), iVal(10)), env) == mk_arrow(Int, Int));
|
|
lean_assert(is_int_value(normalize(e, env)));
|
|
expr e2 = Fun("a", Int, iSub(Const("a"), iSub(iVal(10), iVal(30))));
|
|
std::cout << e2 << " --> " << normalize(e2, env) << "\n";
|
|
lean_assert(infer_type(e2, env) == (Int >> Int));
|
|
lean_assert(normalize(e2, env) == Fun("a", Int, iAdd(Const("a"), iVal(20))));
|
|
}
|
|
|
|
static void tst5() {
|
|
environment env = mk_toplevel();
|
|
env.add_var(name("a"), Int);
|
|
expr e = Eq(iVal(3), iVal(4));
|
|
std::cout << e << " --> " << normalize(e, env) << "\n";
|
|
lean_assert(normalize(e, env) == False);
|
|
lean_assert(normalize(Eq(Const("a"), iVal(3)), env) == Eq(Const("a"), iVal(3)));
|
|
}
|
|
|
|
static void tst6() {
|
|
std::cout << "tst6\n";
|
|
std::cout << mk_int_add_fn().raw() << "\n";
|
|
std::cout << mk_int_add_fn().raw() << "\n";
|
|
|
|
#ifndef __APPLE__
|
|
std::thread t1([](){ std::cout << "t1: " << mk_int_add_fn().raw() << "\n"; });
|
|
t1.join();
|
|
std::thread t2([](){ std::cout << "t2: " << mk_int_add_fn().raw() << "\n"; });
|
|
t2.join();
|
|
#endif
|
|
std::cout << mk_int_add_fn().raw() << "\n";
|
|
}
|
|
|
|
int main() {
|
|
tst1();
|
|
tst2();
|
|
tst3();
|
|
tst4();
|
|
tst5();
|
|
tst6();
|
|
return has_violations() ? 1 : 0;
|
|
}
|