diff --git a/src/protocol/tests/parser_inference.rs b/src/protocol/tests/parser_inference.rs index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..59eaf4f5d9eab7803804a32ed07fbca10c89fc95 100644 --- a/src/protocol/tests/parser_inference.rs +++ b/src/protocol/tests/parser_inference.rs @@ -0,0 +1,158 @@ +/// 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("Pair>"); + }); + }); +} \ No newline at end of file