/// parser_inference.rs /// /// Simple tests for the type inferences use super::*; #[test] fn test_integer_inference() { Tester::new_single_source_expect_ok( "by arguments", " int call(byte b, short s, int i, long l) { auto b2 = b; auto s2 = s; auto i2 = i; auto l2 = l; return i2; } " ).for_function("call", |f| { f .for_variable("b2", |v| { v .assert_parser_type("auto") .assert_concrete_type("byte"); }) .for_variable("s2", |v| { v .assert_parser_type("auto") .assert_concrete_type("short"); }) .for_variable("i2", |v| { v .assert_parser_type("auto") .assert_concrete_type("int"); }) .for_variable("l2", |v| { v .assert_parser_type("auto") .assert_concrete_type("long"); }); }); Tester::new_single_source_expect_ok( "by assignment", " int call() { byte b1 = 0; short s1 = 0; int i1 = 0; long l1 = 0; auto b2 = b1; auto s2 = s1; auto i2 = i1; auto l2 = l1; return 0; }" ).for_function("call", |f| { f .for_variable("b2", |v| { v .assert_parser_type("auto") .assert_concrete_type("byte"); }) .for_variable("s2", |v| { v .assert_parser_type("auto") .assert_concrete_type("short"); }) .for_variable("i2", |v| { v .assert_parser_type("auto") .assert_concrete_type("int"); }) .for_variable("l2", |v| { v .assert_parser_type("auto") .assert_concrete_type("long"); }); }); } #[test] fn test_struct_inference() { Tester::new_single_source_expect_ok( "by function calls", " struct Pair{ T1 first, T2 second } Pair construct(T1 first, T2 second) { return Pair{ first: first, second: second }; } int fix_t1(Pair arg) { return 0; } int fix_t2(Pair arg) { return 0; } int test() { auto first = 0; auto second = 1; auto pair = construct(first, second); fix_t1(pair); fix_t2(pair); return 0; } " ).for_function("test", |f| { f .for_variable("first", |v| { v .assert_parser_type("auto") .assert_concrete_type("byte"); }) .for_variable("second", |v| { v .assert_parser_type("auto") .assert_concrete_type("int"); }) .for_variable("pair", |v| { v .assert_parser_type("auto") .assert_concrete_type("Pair"); }); }); Tester::new_single_source_expect_ok( "by field access", " struct Pair{ T1 first, T2 second } Pair construct(T1 first, T2 second) { return Pair{ first: first, second: second }; } int test() { auto first = 0; auto second = 1; auto pair = construct(first, second); byte assign_first = 0; long assign_second = 1; pair.first = assign_first; pair.second = assign_second; return 0; } " ).for_function("test", |f| { f .for_variable("first", |v| { v .assert_parser_type("auto") .assert_concrete_type("byte"); }) .for_variable("second", |v| { v .assert_parser_type("auto") .assert_concrete_type("long"); }) .for_variable("pair", |v| { v .assert_parser_type("auto") .assert_concrete_type("Pair"); }); }); Tester::new_single_source_expect_ok( "by nested field access", " struct Node{ T1 l, T2 r } Node construct(T1 l, T2 r) { return Node{ l: l, r: r }; } int fix_poly(Node a) { return 0; } int test() { byte assigned = 0; auto thing = construct(assigned, construct(0, 1)); fix_poly(thing.r); thing.r.r = assigned; return 0; } ", ).for_function("test", |f| { f .for_variable("thing", |v| { v .assert_parser_type("auto") .assert_concrete_type("Node>"); }); }); }