#![cfg(feature = "test")] use support::*; mod support; use gluon::{self, query::AsyncCompilation, vm::core::tests::check_expr_eq, ThreadExt}; #[ignore] #[tokio::test] async fn inline_cross_module() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" let { (+) } = import! std.num let { ? } = import! std.int 1 + 2 "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" 3 "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[ignore] #[tokio::test] async fn inline_with_record_pattern_in_module() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" let f x = x let m1 = { f, } let m2 = let { f } = m1 let num = { (+) = \l -> l, } { f, num, } let { num } = m2 num.(+) 3 "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" 3 "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[ignore] #[tokio::test] async fn inline_across_two_modules() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" let { (+) } = import! tests.optimize.inline_through_module let { ? } = import! tests.optimize.inline_through_module2 1 + 2 "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" 3 "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[ignore] #[tokio::test] async fn prune_prelude() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" let { (+) } = import! std.prelude let { ? } = import! std.int in 1 + 2 "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" 3 "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[ignore] #[tokio::test] async fn prune_factorial() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" let { (-), (*) } = import! std.num let { (<) } = import! std.cmp let { ? } = import! std.int let factorial n = if n < 2 then 1 else n * factorial (n - 1) factorial "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" rec let factorial n = match (#Int<) n 2 with | True -> 1 | False -> let inline_bind = factorial ( (#Int-) n 1) in (#Int*) n inline_bind end in factorial "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[ignore] #[tokio::test] async fn inline_num() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" let mod = import! tests.optimize.inline_num let no_inline x = if x #Int== 0 then no_inline x else x mod.(+) (no_inline 1) 2 "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" rec let no_inline x = match (#Int==) x 0 with | True -> no_inline x | False -> x end in let inline_bind = no_inline 1 in (#Int+) inline_bind 2 "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[tokio::test] #[ignore] async fn inline_match() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" type Test = | A | B match A with | A -> 1 | B -> 2 "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" 1 "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[ignore] #[tokio::test] async fn inline_cmp() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" let mod @ { Option } = import! tests.optimize.cmp let m = mod.mk_ord { (<) = Some (\l r -> l #Int< r), } m.(<) "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" rec let lt l r = (#Int<) l r in lt "#; check_expr_eq(core_expr.value.expr(), expected_str); } #[ignore] #[tokio::test] async fn inline_option() { let _ = env_logger::try_init(); let thread = make_vm(); thread.get_database_mut().set_implicit_prelude(false); thread .load_script( "test", r#" type Option = | None | Some Int let f opt = match opt with | Some x -> x | None -> 0 f (Some 1) "#, ) .unwrap_or_else(|err| panic!("{}", err)); let mut db = thread.get_database(); let core_expr = db .core_expr("test".into(), None) .await .unwrap_or_else(|err| panic!("{}", err)); let expected_str = r#" 1 "#; check_expr_eq(core_expr.value.expr(), expected_str); }