000001| open OUnit
000002|
000003| module L = Last
000004| module Str = Stringlattice
000005| module VL = Valuelattice
000006| module EL = Envlattice
000007| module PL = Proplattice
000008| module ST = Storelattice
000009| module SL = Statelattice
000010| module AL = Analysislattice
000011|
000012| let vlcmp vl vl' = VL.leq vl vl' && VL.leq vl' vl
000013| let slcmp sl sl' = SL.leq sl sl' && SL.leq sl' sl
000014|
000015| let parse_analyze_lookup fname =
000016| let _,last = Frontend.parse_and_label fname in
000017| let alat = Transfer.transfer_prog last in
000018| let slat = AL.lookup alat last.L.ret_label in
000019| (last, alat, slat)
000020|
000021| let test_syntax = "syntax tests" >:::
000022| [ "syntax01" >:: (fun () -> let _,_,_ = parse_analyze_lookup "examples/syntax01.lua" in
000023| assert_bool "syntax01" true);
000024| "syntax02" >:: (fun () -> let _,_,_ = parse_analyze_lookup "examples/syntax02.lua" in
000025| assert_bool "syntax02" true);
000026| "syntax03" >:: (fun () -> let _,_,_ = parse_analyze_lookup "examples/syntax03.lua" in
000027| assert_bool "syntax03" true);
000028| "syntax04" >:: (fun () -> let _,_,_ = parse_analyze_lookup "examples/syntax04.lua" in
000029| assert_bool "syntax04" true);
000030| ]
000031|
000032| let test_simpl = "simple tests" >:::
000033| [ "simpl01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl01.lua" in
000034| assert_equal (SL.read_name slat "x") VL.number);
000035| "simpl02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl02.lua" in
000036| assert_equal ~cmp:slcmp slat SL.init);
000037| "simpl03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl03.lua" in
000038| let vlat = SL.read_name slat "f" in
000039| assert_bool "simpl03" (VL.may_be_proc vlat));
000040| "simpl04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl04.lua" in
000041| let vlat = SL.read_name slat "f" in
000042| assert_bool "simpl04" (VL.may_be_proc vlat));
000043| "simpl05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl05.lua" in
000044| assert_equal slat SL.bot);
000045| "simpl06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl06.lua" in
000046| assert_equal ~cmp:slcmp slat SL.init);
000047| "simpl07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl07.lua" in
000048| assert_equal ~cmp:slcmp slat SL.bot);
000049| "simpl08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl08.lua" in
000050| assert_equal ~cmp:slcmp slat SL.bot);
000051| "simpl09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl09.lua" in
000052| assert_equal ~cmp:slcmp slat SL.init);
000053| "simpl10" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl10.lua" in
000054| assert_equal ~cmp:slcmp slat SL.init);
000055| "simpl11" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl11.lua" in
000056| let vlat = SL.read_name slat "x" in
000057| assert_equal ~cmp:vlcmp vlat VL.number);
000058| "simpl12" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl12.lua" in
000059| let vlat = SL.read_name slat "x" in
000060| assert_equal ~cmp:vlcmp vlat (VL.join VL.number (VL.string "foo")));
000061| "simpl13" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl13.lua" in
000062| let vlat = SL.read_name slat "y" in
000063| assert_bool "simpl13" (VL.leq (VL.join VL.nil VL.number) vlat));
000064| "simpl14" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl14.lua" in
000065| let vlat = SL.read_name slat "y" in
000066| assert_equal ~cmp:vlcmp vlat VL.nil);
000067| "simpl15" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl15.lua" in
000068| assert_equal ~cmp:slcmp slat SL.init);
000069| "simpl16" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl16.lua" in
000070| assert_equal ~cmp:slcmp slat SL.init);
000071| "simpl17" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl17.lua" in
000072| let vlat_x = SL.read_name slat "x" in
000073| assert_equal ~cmp:vlcmp vlat_x VL.number);
000074| "simpl18" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl18.lua" in
000075| let vlat_x = SL.read_name slat "x" in
000076| assert_equal ~cmp:vlcmp vlat_x VL.number);
000077| "simpl19" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl19.lua" in
000078| let vlat_r = SL.read_name slat "r" in
000079| assert_equal ~cmp:vlcmp vlat_r VL.nil);
000080| "simpl20" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl20.lua" in
000081| let vlat_r = SL.read_name slat "r" in
000082| assert_equal ~cmp:vlcmp vlat_r VL.number);
000083| "simpl21" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl21.lua" in
000084| let vlat_r = SL.read_name slat "r" in
000085| assert_equal ~cmp:vlcmp vlat_r (VL.string "foo"));
000086| "simpl22" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl22.lua" in
000087| let vlat_r = SL.read_name slat "r" in
000088| assert_equal ~cmp:vlcmp vlat_r VL.number);
000089| "simpl23" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl23.lua" in
000090| let vlat_r = SL.read_name slat "r" in
000091| assert_bool "simpl23" (VL.may_be_number vlat_r));
000092| "simpl24" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl24.lua" in
000093| let vlat_a = SL.read_name slat "a" in
000094| assert_bool "simpl24" (VL.may_be_number vlat_a
000095| && VL.leq (VL.string "foo") vlat_a));
000096| "simpl25" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl25.lua" in
000097| let vlat_pr = SL.read_name slat "print" in
000098| assert_equal ~cmp:vlcmp vlat_pr (VL.builtin VL.Print));
000099| "simpl26" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl26.lua" in
000100| let vlat_x = SL.read_name slat "x" in
000101| assert_equal ~cmp:vlcmp vlat_x VL.number);
000102| "simpl27" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl27.lua" in
000103| let vlat_x = SL.read_name slat "x" in
000104| assert_equal ~cmp:vlcmp vlat_x (VL.string "10"));
000105| "simpl32" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl32.lua" in
000106| let vlat_y = SL.read_name slat "y" in
000107| assert_bool "simpl32" (VL.leq (VL.string "wink") vlat_y));
000108| "simpl34" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl34.lua" in
000109| let vlat_y = SL.read_name slat "y" in
000110| assert_bool "simpl34" (VL.leq (VL.string "wink") vlat_y));
000111| "simpl35" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl35.lua" in
000112| let vlat_y = SL.read_name slat "y" in
000113| assert_bool "simpl35" (VL.leq (VL.string "wink") vlat_y));
000114| "simpl36" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl36.lua" in
000115| let vlat_b = SL.read_name slat "b" in
000116| assert_bool "simpl36" (VL.may_be_nil vlat_b));
000117| "simpl37" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl37.lua" in
000118| let vlat_r = SL.read_name slat "r" in
000119| assert_bool "simpl37" (VL.may_be_number vlat_r));
000120| "simpl38" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl38.lua" in
000121| let vlat_r = SL.read_name slat "r" in
000122| assert_bool "simpl38"
000123| (VL.leq (VL.string "19406028921940602892") vlat_r));
000124| "simpl39" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/simpl39.lua" in
000125| let vlat_i = SL.read_name slat "i" in
000126| let vlat_i2 = SL.read_name slat "i2" in
000127| assert_bool "simpl39" (VL.may_be_number vlat_i &&
000128| VL.may_be_number vlat_i2)); ]
000129|
000130| let test_for = "for loop tests" >:::
000131| [ "for01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for01.lua" in
000132| let vlat_var = SL.read_name slat "__var" in
000133| let vlat_limit = SL.read_name slat "__limit" in
000134| assert_bool "for01" (vlat_var = VL.nil && vlat_limit = VL.nil));
000135| "for02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for02.lua" in
000136| let vlat_foo = SL.read_name slat "foo" in
000137| assert_bool "for02" (VL.leq (VL.string "12345678910") vlat_foo));
000138| "for03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for03.lua" in
000139| let vlat_var = SL.read_name slat "__var" in
000140| let vlat_limit = SL.read_name slat "__limit" in
000141| let vlat_step = SL.read_name slat "__step" in
000142| assert_bool "for03" (vlat_var = VL.nil && vlat_limit = VL.nil && vlat_step = VL.nil));
000143| "for04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for04.lua" in
000144| let vlat_foo = SL.read_name slat "foo" in
000145| assert_bool "for04" (VL.leq (VL.string "0246810") vlat_foo));
000146| "for05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for05.lua" in
000147| let vlat_key = SL.read_name slat "key" in
000148| let vlat_val = SL.read_name slat "value" in
000149| let vlat_f = SL.read_name slat "__f" in
000150| let vlat_s = SL.read_name slat "__s" in
000151| let vlat_var = SL.read_name slat "__var" in
000152| let vlat_t = SL.read_name slat "t" in
000153| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_t in
000154| let vlat_props = ST.lookup_all_props slat.SL.store vlat_t in
000155| assert_bool "for05" (VL.nil = vlat_key && VL.nil = vlat_val &&
000156| VL.nil = vlat_f && VL.nil = vlat_s && VL.nil = vlat_var &&
000157| VL.may_be_table vlat_t && VL.may_be_number vlat_props &&
000158| VL.leq (VL.string "a") vlat_keys &&
000159| VL.leq (VL.string "b") vlat_keys &&
000160| VL.leq (VL.string "c") vlat_keys ));
000161| "for06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for06.lua" in
000162| let vlat_s = SL.read_name slat "s" in
000163| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000164| let vlat_props = ST.lookup_all_props slat.SL.store vlat_s in
000165| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000166| assert_bool "for06" (VL.may_be_table vlat_s && vlat_keys = VL.anystring &&
000167| vlcmp vlat_props vlat_str &&
000168| VL.leq (VL.string "str") vlat_str &&
000169| VL.may_be_number vlat_str &&
000170| VL.may_be_bool vlat_str &&
000171| VL.leq (VL.builtin VL.Print) vlat_str &&
000172| VL.may_be_proc vlat_str &&
000173| VL.may_be_table vlat_str));
000174| "for07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for07.lua" in
000175| let vlat_s = SL.read_name slat "s" in
000176| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000177| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000178| let vlat_nonstr = ST.lookup_all_nonstr_props slat.SL.store vlat_s in
000179| assert_bool "for07" (VL.may_be_table vlat_s &&
000180| VL.leq (VL.string "str") vlat_keys &&
000181| VL.may_be_number vlat_keys &&
000182| VL.may_be_bool vlat_keys &&
000183| VL.leq (VL.builtin VL.Print) vlat_keys &&
000184| VL.may_be_proc vlat_keys &&
000185| VL.may_be_table vlat_keys &&
000186| VL.leq (VL.string "a") vlat_str &&
000187| VL.leq (VL.string "b") vlat_nonstr &&
000188| VL.leq (VL.string "c") vlat_nonstr &&
000189| VL.leq (VL.string "d") vlat_nonstr &&
000190| VL.leq (VL.string "e") vlat_nonstr &&
000191| VL.leq (VL.string "f") vlat_nonstr ));
000192| "for08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for08.lua" in
000193| let vlat_s = SL.read_name slat "s" in
000194| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000195| let vlat_props = ST.lookup_all_props slat.SL.store vlat_s in
000196| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000197| assert_bool "for08" (VL.may_be_table vlat_s && VL.eq vlat_keys VL.anystring &&
000198| vlcmp vlat_props vlat_str &&
000199| VL.leq (VL.string "str") vlat_str &&
000200| VL.may_be_number vlat_str &&
000201| VL.may_be_bool vlat_str &&
000202| VL.leq (VL.builtin VL.Print) vlat_str &&
000203| VL.may_be_proc vlat_str &&
000204| VL.may_be_table vlat_str));
000205| "for09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for09.lua" in
000206| let vlat_s = SL.read_name slat "s" in
000207| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000208| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000209| let vlat_nonstr = ST.lookup_all_nonstr_props slat.SL.store vlat_s in
000210| assert_bool "for09" (VL.may_be_table vlat_s &&
000211| VL.leq (VL.string "str") vlat_keys &&
000212| VL.may_be_number vlat_keys &&
000213| VL.may_be_bool vlat_keys &&
000214| VL.leq (VL.builtin VL.Print) vlat_keys &&
000215| VL.may_be_proc vlat_keys &&
000216| VL.may_be_table vlat_keys &&
000217| VL.leq (VL.string "a") vlat_str &&
000218| VL.leq (VL.string "b") vlat_nonstr &&
000219| VL.leq (VL.string "c") vlat_nonstr &&
000220| VL.leq (VL.string "d") vlat_nonstr &&
000221| VL.leq (VL.string "e") vlat_nonstr &&
000222| VL.leq (VL.string "f") vlat_nonstr ));
000223| "for10" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for10.lua" in
000224| let vlat_s = SL.read_name slat "s" in
000225| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000226| let vlat_props = ST.lookup_all_props slat.SL.store vlat_s in
000227| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000228| let vlat_nonstr = ST.lookup_all_nonstr_props slat.SL.store vlat_s in
000229| assert_bool "for10" (VL.may_be_table vlat_s &&
000230| vlcmp vlat_keys VL.number &&
000231| vlcmp vlat_props vlat_nonstr &&
000232| vlcmp vlat_str VL.bot &&
000233| VL.leq (VL.string "str") vlat_nonstr &&
000234| VL.may_be_number vlat_nonstr &&
000235| VL.may_be_bool vlat_nonstr &&
000236| VL.leq (VL.builtin VL.Print) vlat_nonstr &&
000237| VL.may_be_proc vlat_nonstr &&
000238| VL.may_be_table vlat_nonstr ));
000239| "for11" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for11.lua" in
000240| let vlat_s = SL.read_name slat "s" in
000241| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000242| let vlat_props = ST.lookup_all_props slat.SL.store vlat_s in
000243| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000244| let vlat_nonstr = ST.lookup_all_nonstr_props slat.SL.store vlat_s in
000245| assert_bool "for11" (VL.may_be_table vlat_s &&
000246| vlcmp vlat_keys VL.number &&
000247| vlcmp vlat_props vlat_nonstr &&
000248| vlcmp vlat_str VL.bot &&
000249| VL.leq (VL.string "str") vlat_nonstr &&
000250| VL.may_be_number vlat_nonstr &&
000251| VL.may_be_bool vlat_nonstr &&
000252| VL.leq (VL.builtin VL.Print) vlat_nonstr &&
000253| VL.may_be_proc vlat_nonstr &&
000254| VL.may_be_table vlat_nonstr ));
000255| "for12" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/for12.lua" in
000256| let vlat_s = SL.read_name slat "s" in
000257| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000258| let vlat_props = ST.lookup_all_props slat.SL.store vlat_s in
000259| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000260| let vlat_nonstr = ST.lookup_all_nonstr_props slat.SL.store vlat_s in
000261| assert_bool "for12" (VL.may_be_table vlat_s &&
000262| vlcmp vlat_keys VL.bot &&
000263| vlcmp vlat_props VL.bot &&
000264| vlcmp vlat_str VL.bot &&
000265| vlcmp vlat_nonstr VL.bot));
000266| ]
000267|
000268| let test_unop = "unary operation tests" >:::
000269| [ "unop01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/unop01.lua" in
000270| let vlat_y = SL.read_name slat "y" in
000271| assert_equal ~cmp:vlcmp VL.number vlat_y);
000272| "unop02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/unop02.lua" in
000273| let vlat_y = SL.read_name slat "y" in
000274| assert_equal ~cmp:vlcmp VL.number vlat_y);
000275| ]
000276|
000277| let test_func = "function tests" >:::
000278| [ "func01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func01.lua" in
000279| let vlat_f, vlat_g = SL.read_name slat "f", SL.read_name slat "g" in
000280| assert_bool "func01" (VL.may_be_proc vlat_f && VL.may_be_proc vlat_g));
000281| "func02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func02.lua" in
000282| let vlat_f, vlat_g = SL.read_name slat "f", SL.read_name slat "g" in
000283| assert_bool "func02" (VL.may_be_proc vlat_f && VL.may_be_proc vlat_g));
000284| "func03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func03.lua" in
000285| let vlat_f, vlat_z = SL.read_name slat "f", SL.read_name slat "z" in
000286| assert_bool "func03" (VL.may_be_proc vlat_f && vlcmp (VL.string "foo") vlat_z));
000287| "func04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func04.lua" in
000288| let vlat_f, vlat_g = SL.read_name slat "f", SL.read_name slat "g" in
000289| assert_bool "func04" (VL.may_be_proc vlat_f && VL.may_be_proc vlat_g));
000290| "func05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func05.lua" in
000291| let vlat_z = SL.read_name slat "z" in
000292| assert_equal ~cmp:vlcmp vlat_z (VL.join VL.number (VL.string "foo")));
000293| "func06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func06.lua" in
000294| let vlat_v = SL.read_name slat "v" in
000295| assert_bool "func06" (VL.leq (VL.string "foo") vlat_v));
000296| "func07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func07.lua" in
000297| let vlat_v = SL.read_name slat "v" in
000298| assert_bool "func07" (VL.leq (VL.string "foo") vlat_v
000299| && VL.leq (VL.number) vlat_v ));
000300| "func08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func08.lua" in
000301| let vlat_v = SL.read_name slat "v" in
000302| assert_equal ~cmp:vlcmp vlat_v VL.number);
000303| "func09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func09.lua" in
000304| let vlat_f = SL.read_name slat "f" in
000305| assert_bool "func09" (VL.leq (VL.builtin VL.Tonumber) vlat_f));
000306| "func10" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func10.lua" in
000307| let vlat_f = SL.read_name slat "f" in
000308| assert_bool "func10" (VL.may_be_proc vlat_f));
000309| "func11" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func11.lua" in
000310| let vlat_r1 = SL.read_name slat "r1" in
000311| let vlat_r2 = SL.read_name slat "r2" in
000312| assert_bool "func11" (vlat_r1 = VL.number && vlat_r2 = VL.number));
000313| "func12" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func12.lua" in
000314| let vlat_r1 = SL.read_name slat "r1" in
000315| let vlat_r2 = SL.read_name slat "r2" in
000316| let vlat_r3 = SL.read_name slat "r3" in
000317| assert_bool "func12" (vlat_r1 = VL.string "foo" &&
000318| vlat_r2 = VL.nil && vlat_r3 = VL.nil ));
000319| "func13" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func13.lua" in
000320| let vlat_r = SL.read_name slat "r" in
000321| assert_bool "func13" (vlat_r = VL.number));
000322| "func14" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func14.lua" in
000323| let vlat_r = SL.read_name slat "r" in
000324| assert_bool "func14" (vlat_r = VL.number));
000325| "func15" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func15.lua" in
000326| let vlat_r = SL.read_name slat "r" in
000327| assert_bool "func15" (VL.leq (VL.string "hello") vlat_r));
000328| "func16" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/func16.lua" in
000329| let vlat_r = SL.read_name slat "r" in
000330| assert_bool "func16" (VL.leq (VL.string "hello") vlat_r)); ]
000331|
000332| let test_method = "method tests" >:::
000333| [ "method01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/method01.lua" in
000334| let vlat_r = SL.read_name slat "r" in
000335| assert_bool "method01" (VL.leq (VL.string "boo") vlat_r));
000336| "method02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/method02.lua" in
000337| let vlat_r = SL.read_name slat "r" in
000338| assert_bool "method02" (VL.leq (VL.string "boo") vlat_r));
000339| ]
000340|
000341| let test_string = "string tests" >:::
000342| [ "string01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string01.lua" in
000343| let vlat_z = SL.read_name slat "z" in
000344| assert_equal ~cmp:vlcmp (VL.string "foobar") vlat_z);
000345| "string02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string02.lua" in
000346| let vlat_z = SL.read_name slat "z" in
000347| assert_bool "string02" (VL.may_be_strings vlat_z));
000348| "string03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string03.lua" in
000349| let vlat_s = SL.read_name slat "s" in
000350| assert_equal ~cmp:vlcmp (VL.string "foo\\n") vlat_s);
000351| "string04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string04.lua" in
000352| let vlat_s = SL.read_name slat "s" in
000353| assert_equal ~cmp:vlcmp (VL.string "foo\\\"") vlat_s);
000354| "string05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string05.lua" in
000355| let vlat_s = SL.read_name slat "s" in
000356| assert_equal ~cmp:vlcmp (VL.string "<html>:?!@#$%^&*()_-\\\"+=\\\\") vlat_s);
000357| "string06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string06.lua" in
000358| let vlat_desc = SL.read_name slat "description" in
000359| assert_bool "string06" (VL.may_be_strings vlat_desc));
000360| "string07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string07.lua" in
000361| let vlat_str1 = SL.read_name slat "str1" in
000362| let vlat_str2 = SL.read_name slat "str2" in
000363| let vlat_str3 = SL.read_name slat "str3" in
000364| assert_bool "string07" (VL.may_be_strings vlat_str1
000365| && VL.may_be_strings vlat_str2
000366| && VL.may_be_strings vlat_str3 ));
000367| "string08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string08.lua" in
000368| let vlat_str2 = SL.read_name slat "str2" in
000369| assert_equal ~cmp:vlcmp (VL.string " sfdsf ") vlat_str2);
000370| "string09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string09.lua" in
000371| let vlat_len = SL.read_name slat "len" in
000372| assert_equal ~cmp:vlcmp VL.number vlat_len);
000373| "string10" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string10.lua" in
000374| assert_bool "string10" (not (slcmp SL.bot slat)));
000375| "string11" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string11.lua" in
000376| let vlat_u = SL.read_name slat "u" in
000377| let vlat_l = SL.read_name slat "l" in
000378| assert_bool "string11" (vlcmp (VL.string "FOOBAR") vlat_u
000379| && vlcmp (VL.string "foobar") vlat_l));
000380| "string12" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/string12.lua" in
000381| let vlat_c = SL.read_name slat "c" in
000382| let vlat_s1 = SL.read_name slat "s1" in
000383| let vlat_s2 = SL.read_name slat "s2" in
000384| assert_bool "string11" (VL.leq (VL.string "ABC") vlat_c
000385| && VL.may_be_strings vlat_s1
000386| && VL.may_be_strings vlat_s2));
000387| ]
000388|
000389|
000390| let test_coerce = "coercion tests" >:::
000391| [ "coerce01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce01.lua" in
000392| let vlat_z = SL.read_name slat "z" in
000393| assert_bool "coerce01" (VL.may_be_strings vlat_z));
000394| "coerce02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce02.lua" in
000395| let vlat_z = SL.read_name slat "z" in
000396| assert_bool "coerce02" (VL.may_be_number vlat_z));
000397| "coerce03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce03.lua" in
000398| let vlat_z = SL.read_name slat "z" in
000399| assert_bool "coerce03" (VL.may_be_number vlat_z));
000400| "coerce04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce04.lua" in
000401| let vlat_z = SL.read_name slat "z" in
000402| assert_bool "coerce04" (VL.may_be_number vlat_z));
000403| "coerce05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce05.lua" in
000404| let vlat_z = SL.read_name slat "z" in
000405| assert_bool "coerce05" (VL.may_be_number vlat_z));
000406| "coerce06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce06.lua" in
000407| let vlat_z = SL.read_name slat "z" in
000408| assert_bool "coerce06" (VL.may_be_number vlat_z));
000409| "coerce07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce07.lua" in
000410| let vlat_z = SL.read_name slat "z" in
000411| assert_bool "coerce07" (VL.may_be_number vlat_z));
000412| "coerce08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce08.lua" in
000413| let vlat_z = SL.read_name slat "z" in
000414| assert_bool "coerce08" (VL.may_be_number vlat_z));
000415| "coerce09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce09.lua" in
000416| let vlat_z = SL.read_name slat "z" in
000417| assert_bool "coerce08" (VL.may_be_number vlat_z));
000418| "coerce10" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce10.lua" in
000419| let vlat_z = SL.read_name slat "z" in
000420| assert_bool "coerce10" (VL.may_be_bool vlat_z));
000421| "coerce11" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce11.lua" in
000422| let vlat_z = SL.read_name slat "z" in
000423| assert_bool "coerce11" (VL.leq vlat_z VL.bot));
000424| "coerce12" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce12.lua" in
000425| let vlat_z = SL.read_name slat "z" in
000426| assert_bool "coerce12" (VL.leq vlat_z VL.bot));
000427| "coerce13" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce13.lua" in
000428| let vlat_z = SL.read_name slat "z" in
000429| assert_bool "coerce13" (VL.leq vlat_z VL.bot));
000430| "coerce14" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce14.lua" in
000431| let vlat_z = SL.read_name slat "z" in
000432| assert_bool "coerce14" (VL.leq vlat_z VL.bot));
000433| "coerce15" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/coerce15.lua" in
000434| let vlat_z = SL.read_name slat "z" in
000435| assert_bool "coerce15" (VL.may_be_bool vlat_z)); ]
000436|
000437| let test_return = "return tests" >:::
000438| [ "return01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return01.lua" in
000439| assert_equal ~cmp:slcmp slat SL.bot);
000440| "return02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return02.lua" in
000441| let vlat_r = SL.read_name slat "r" in
000442| assert_equal ~cmp:vlcmp vlat_r VL.nil);
000443| "return03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return03.lua" in
000444| let vlat_r1 = SL.read_name slat "r1" in
000445| let vlat_r2 = SL.read_name slat "r2" in
000446| assert_bool "return03" (vlat_r1 = (VL.string "foo") && vlat_r2 = VL.bool));
000447| "return04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return04.lua" in
000448| let vlat_r1 = SL.read_name slat "r1" in
000449| let vlat_r2 = SL.read_name slat "r2" in
000450| assert_bool "return04" (vlat_r1 = (VL.string "foo") && vlat_r2 = (VL.string "jens")));
000451| "return05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return05.lua" in
000452| let vlat_r3 = SL.read_name slat "r3" in
000453| let vlat_r4 = SL.read_name slat "r4" in
000454| let vlat_r5 = SL.read_name slat "r5" in
000455| assert_bool "return05" (vlat_r3 = VL.nil && vlat_r4 = VL.nil && vlat_r5 = VL.nil));
000456| "return06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return06.lua" in
000457| let vlat_t = SL.read_name slat "t" in
000458| let vlat_r1 = ST.lookup_str_prop slat.SL.store vlat_t "r1" in
000459| let vlat_l = SL.read_name slat "l" in
000460| let vlat_r2 = ST.lookup_str_prop slat.SL.store vlat_t "r2" in
000461| let vlat_r3 = ST.lookup_str_prop slat.SL.store vlat_t "r3" in
000462| let vlat_r4 = SL.read_name slat "r4" in
000463| assert_bool "return06" (VL.may_be_table vlat_t &&
000464| VL.leq (VL.string "foo") vlat_r1 &&
000465| VL.leq (VL.string "jens") vlat_l &&
000466| vlat_r2 = VL.nil &&
000467| vlat_r3 = VL.nil && vlat_r4 = VL.nil));
000468| "return07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return07.lua" in
000469| let vlat_t = SL.read_name slat "t" in
000470| let vlat_r1 = ST.lookup_str_prop slat.SL.store vlat_t "r1" in
000471| let vlat_l = SL.read_name slat "l" in
000472| let vlat_r2 = ST.lookup_str_prop slat.SL.store vlat_t "r2" in
000473| let vlat_r3 = SL.read_name slat "r3" in
000474| assert_bool "return07" (VL.may_be_table vlat_t &&
000475| VL.leq (VL.string "foo") vlat_r1 &&
000476| VL.leq (VL.string "jens") vlat_l &&
000477| VL.leq (VL.string "foo") vlat_r2 &&
000478| vlat_r3 = (VL.string "hest") ));
000479| "return08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return08.lua" in
000480| let vlat_b = SL.read_name slat "b" in
000481| assert_bool "return08" (VL.may_be_nil vlat_b));
000482| "return09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/return09.lua" in
000483| let vlat_b = SL.read_name slat "b" in
000484| assert_bool "return09" (VL.may_be_number vlat_b));
000485| ]
000486|
000487| let test_scope = "scope tests" >:::
000488| [ "scope01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope01.lua" in
000489| let vlat_x = SL.read_name slat "x" in
000490| let vlat_y = SL.read_name slat "y" in
000491| let vlat_z = SL.read_name slat "z" in
000492| assert_bool "scope01" (vlat_x = VL.number &&
000493| vlat_y = VL.number && vlat_z = VL.nil));
000494| "scope02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope02.lua" in
000495| let vlat_x = SL.read_name slat "x" in
000496| let vlat_y = SL.read_name slat "y" in
000497| let vlat_z = SL.read_name slat "z" in
000498| let vlat_w = SL.read_name slat "w" in
000499| assert_bool "scope02" (vlat_x = VL.number && vlat_y = VL.number
000500| && vlat_z = VL.nil && vlat_w = VL.nil));
000501| "scope03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope03.lua" in
000502| let vlat_r = SL.read_name slat "r" in
000503| assert_bool "scope03" (VL.may_be_proc vlat_r));
000504| "scope04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope04.lua" in
000505| let vlat_r = SL.read_name slat "r" in
000506| assert_equal ~cmp:vlcmp VL.nil vlat_r);
000507| "scope05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope05.lua" in
000508| let vlat_r = SL.read_name slat "r" in
000509| assert_equal ~cmp:vlcmp VL.bool vlat_r);
000510| "scope06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope06.lua" in
000511| let vlat_r = SL.read_name slat "r" in
000512| assert_equal ~cmp:vlcmp VL.bot vlat_r);
000513| "scope07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope07.lua" in
000514| let vlat_r = SL.read_name slat "r" in
000515| assert_equal ~cmp:vlcmp VL.bot vlat_r);
000516| "scope08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope08.lua" in
000517| let vlat_x = SL.read_name slat "x" in
000518| let vlat_y = SL.read_name slat "y" in
000519| assert_bool "scope08" (vlat_x = VL.bool && vlat_y = VL.number));
000520| "scope09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/scope09.lua" in
000521| let vlat_r = SL.read_name slat "r" in
000522| assert_bool "scope09" (vlat_r = VL.nil)); ]
000523|
000524| let test_table = "table tests" >:::
000525| [ "table01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table01.lua" in
000526| let vlat_x = SL.read_name slat "x" in
000527| assert_bool "table01" (VL.may_be_table vlat_x));
000528| "table02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table02.lua" in
000529| let vlat_x = SL.read_name slat "x" in
000530| let vlat = ST.lookup_str_prop slat.SL.store vlat_x "height" in
000531| assert_equal ~cmp:vlcmp VL.number vlat);
000532| "table03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table03.lua" in
000533| let vlat_y = SL.read_name slat "y" in
000534| assert_equal ~cmp:vlcmp VL.number vlat_y);
000535| "table04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table04.lua" in
000536| let vlat_y = SL.read_name slat "y" in
000537| assert_equal ~cmp:vlcmp VL.number vlat_y);
000538| "table05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table05.lua" in
000539| let vlat_x = SL.read_name slat "x" in
000540| assert_bool "table05" (VL.leq (VL.string "onenumber") vlat_x));
000541| "table06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table06.lua" in
000542| let vlat_x = SL.read_name slat "x" in
000543| assert_bool "table06" (VL.may_be_number vlat_x && VL.may_be_bool vlat_x
000544| && VL.leq (VL.string "hello") vlat_x
000545| && VL.may_be_proc vlat_x ));
000546| "table07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table07.lua" in
000547| let vlat_t = SL.read_name slat "t" in
000548| assert_bool "table07" (VL.may_be_table vlat_t));
000549| "table08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table08.lua" in
000550| let vlat_t = SL.read_name slat "t" in
000551| let vlat_y = ST.lookup_str_prop slat.SL.store vlat_t "y" in
000552| let vlat_1 = ST.lookup_str_prop slat.SL.store vlat_t "1" in
000553| assert_bool "table08" (VL.number = vlat_y && VL.may_be_strings vlat_1));
000554| "table09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table09.lua" in
000555| let vlat_x = SL.read_name slat "x" in
000556| assert_bool "table09" (VL.may_be_number vlat_x &&
000557| VL.leq (VL.string "z") vlat_x));
000558| "table10" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table10.lua" in
000559| let vlat_t = SL.read_name slat "t" in
000560| let vlat_def = ST.lookup_dyn_prop slat.SL.store vlat_t VL.number in
000561| assert_bool "table10" (VL.may_be_bool vlat_def));
000562| "table11" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table11.lua" in
000563| let vlat_r = SL.read_name slat "r" in
000564| assert_bool "table11" (VL.may_be_nil vlat_r));
000565| "table12" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table12.lua" in
000566| let vlat_r = SL.read_name slat "r" in
000567| assert_bool "table12" (VL.may_be_table vlat_r));
000568| "table13" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table13.lua" in
000569| let vlat_r = SL.read_name slat "r" in
000570| assert_bool "table13" (VL.may_be_nil vlat_r));
000571| "table14" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table14.lua" in
000572| let vlat_k = SL.read_name slat "k" in
000573| let vlat_v = SL.read_name slat "v" in
000574| assert_bool "table14"
000575| (VL.leq (VL.string "a") vlat_k && VL.leq (VL.string "str") vlat_v &&
000576| VL.leq (VL.string "b") vlat_k && VL.may_be_number vlat_v &&
000577| VL.leq (VL.string "c") vlat_k && VL.may_be_bool vlat_v &&
000578| VL.leq (VL.string "d") vlat_k && VL.leq (VL.builtin VL.Print) vlat_v &&
000579| VL.leq (VL.string "e") vlat_k && VL.may_be_proc vlat_v &&
000580| VL.leq (VL.string "f") vlat_k && VL.may_be_table vlat_v ));
000581| "table15" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table15.lua" in
000582| let vlat_k = SL.read_name slat "k" in
000583| let vlat_v = SL.read_name slat "v" in
000584| assert_bool "table15"
000585| (VL.leq (VL.string "a") vlat_v && VL.leq (VL.string "str") vlat_k &&
000586| VL.leq (VL.string "b") vlat_v && VL.may_be_number vlat_k &&
000587| VL.leq (VL.string "c") vlat_v && VL.may_be_bool vlat_k &&
000588| VL.leq (VL.string "d") vlat_v && VL.leq (VL.builtin VL.Print) vlat_k &&
000589| VL.leq (VL.string "e") vlat_v && VL.may_be_proc vlat_k &&
000590| VL.leq (VL.string "f") vlat_v && VL.may_be_table vlat_k ));
000591| "table16" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table16.lua" in
000592| let vlat_r = SL.read_name slat "r" in
000593| assert_bool "table16" (VL.may_be_strings vlat_r && VL.may_be_nil vlat_r));
000594| "table17" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table17.lua" in
000595| let vlat_r = SL.read_name slat "r" in
000596| assert_bool "table17" (VL.may_be_strings vlat_r));
000597| "table18" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table18.lua" in
000598| let vlat_r1 = SL.read_name slat "r1" in
000599| let vlat_r2 = SL.read_name slat "r2" in
000600| assert_bool "table18" (VL.leq (VL.string "foo") vlat_r1 &&
000601| VL.may_be_nil vlat_r2));
000602| "table19" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table19.lua" in
000603| let vlat_k = SL.read_name slat "k" in
000604| let vlat_v = SL.read_name slat "v" in
000605| assert_bool "table19" (VL.may_be_nil vlat_k && VL.may_be_number vlat_k
000606| && VL.may_be_nil vlat_v && VL.may_be_strings vlat_v));
000607| "table20" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table20.lua" in
000608| let vlat_k = SL.read_name slat "k" in
000609| let vlat_v = SL.read_name slat "v" in
000610| assert_bool "table20" (VL.nil = vlat_k && VL.nil = vlat_v));
000611| "table21" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table21.lua" in
000612| let vlat_s = SL.read_name slat "s" in
000613| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000614| let vlat_props = ST.lookup_all_props slat.SL.store vlat_s in
000615| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000616| assert_bool "table21" (VL.may_be_table vlat_s && VL.eq vlat_keys VL.anystring &&
000617| vlcmp vlat_props vlat_str &&
000618| VL.leq (VL.string "str") vlat_str &&
000619| VL.may_be_number vlat_str &&
000620| VL.may_be_bool vlat_str &&
000621| VL.leq (VL.builtin VL.Print) vlat_str &&
000622| VL.may_be_proc vlat_str &&
000623| VL.may_be_table vlat_str));
000624| "table22" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table22.lua" in
000625| let vlat_s = SL.read_name slat "s" in
000626| let vlat_keys = ST.lookup_all_keys slat.SL.store vlat_s in
000627| (* let vlat_props = ST.lookup_all_props slat.SL.store vlat_s in *)
000628| let vlat_str = ST.lookup_all_str_props slat.SL.store vlat_s in
000629| let vlat_nonstr = ST.lookup_all_nonstr_props slat.SL.store vlat_s in
000630| assert_bool "table22" (VL.may_be_table vlat_s &&
000631| (* vlcmp vlat_props vlat_def && *)
000632| VL.leq (VL.string "str") vlat_keys &&
000633| VL.may_be_number vlat_keys &&
000634| VL.may_be_bool vlat_keys &&
000635| VL.leq (VL.builtin VL.Print) vlat_keys &&
000636| VL.may_be_proc vlat_keys &&
000637| VL.may_be_table vlat_keys &&
000638| VL.leq (VL.string "a") vlat_str &&
000639| VL.leq (VL.string "b") vlat_nonstr &&
000640| VL.leq (VL.string "c") vlat_nonstr &&
000641| VL.leq (VL.string "d") vlat_nonstr &&
000642| VL.leq (VL.string "e") vlat_nonstr &&
000643| VL.leq (VL.string "f") vlat_nonstr ));
000644| (* table 23 missing *)
000645| "table24" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/table24.lua" in
000646| let vlat_r = SL.read_name slat "r" in
000647| assert_bool "table24" (VL.leq (VL.string "hey jude") vlat_r));
000648| ]
000649|
000650|
000651| let test_meta = "meta tests" >:::
000652| [ "meta01" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta01.lua" in
000653| let vlat_m = SL.read_name slat "m" in
000654| assert_bool "meta01" (VL.may_be_table vlat_m
000655| && vlcmp vlat_m (SL.read_name slat "mt")));
000656| "meta02" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta02.lua" in
000657| let vlat_yval = SL.read_name slat "yval" in
000658| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000659| "meta03" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta03.lua" in
000660| assert_equal ~cmp:slcmp slat SL.bot);
000661| "meta04" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta04.lua" in
000662| let vlat_yval = SL.read_name slat "yval" in
000663| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000664| "meta05" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta05.lua" in
000665| let vlat_yval = SL.read_name slat "yval" in
000666| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000667| "meta06" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta06.lua" in
000668| let vlat_yval = SL.read_name slat "yval" in
000669| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000670| "meta07" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta07.lua" in
000671| let vlat_yval = SL.read_name slat "yval" in
000672| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000673| "meta08" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta08.lua" in
000674| let vlat_yval = SL.read_name slat "yval" in
000675| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000676| "meta09" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta09.lua" in
000677| let vlat_yval = SL.read_name slat "yval" in
000678| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000679| "meta10" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta10.lua" in
000680| let vlat_yval = SL.read_name slat "yval" in
000681| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000682| "meta11" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta11.lua" in
000683| assert_equal ~cmp:slcmp slat SL.bot);
000684| "meta12" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta12.lua" in
000685| let vlat_yval = SL.read_name slat "yval" in
000686| assert_equal ~cmp:vlcmp vlat_yval VL.number);
000687| "meta13" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta13.lua" in
000688| let vlat_a,vlat_b,vlat_c =
000689| SL.read_name slat "a",SL.read_name slat "b",SL.read_name slat "c" in
000690| assert_bool "meta13" (vlcmp vlat_a VL.number && vlcmp vlat_b VL.nil && vlcmp vlat_c VL.nil));
000691| "meta14" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta14.lua" in
000692| let vlat_a,vlat_b,vlat_c =
000693| SL.read_name slat "a",SL.read_name slat "b",SL.read_name slat "c" in
000694| assert_bool "meta14" (vlcmp vlat_a VL.number && vlcmp vlat_b VL.nil && vlcmp vlat_c VL.nil));
000695| "meta15" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta15.lua" in
000696| assert_equal ~cmp:slcmp slat SL.bot);
000697| "meta16" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta16.lua" in
000698| assert_equal ~cmp:slcmp slat SL.bot);
000699| "meta17" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta17.lua" in
000700| assert_bool "meta017" (VL.may_be_table (SL.read_name slat "mt2")));
000701| "meta18" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta18.lua" in
000702| assert_bool "meta018" (VL.may_be_nil (SL.read_name slat "mt2")));
000703| "meta19" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/meta19.lua" in
000704| assert_bool "meta019" (VL.may_be_nil (SL.read_name slat "mt2")));
000705| ]
000706|
000707| let test_builtin = "builtin tests" >:::
000708| let s_maybe_number_in prog_name =
000709| let _,_,slat = parse_analyze_lookup prog_name in
000710| let sval = SL.read_name slat "s" in
000711| assert_bool "tonumber" (VL.may_be_number sval) in
000712|
000713| [ "builtin_os_exit" >:: (fun () -> let _,_,slat =
000714| parse_analyze_lookup "examples/builtin_os_exit.lua" in
000715| assert_bool "os_exit" (slcmp SL.bot slat));
000716| "builtin_type" >:: (fun () -> let _,_,slat =
000717| parse_analyze_lookup "examples/builtin_type.lua" in
000718| assert_bool "type"
000719| ((VL.leq (VL.string "function") (SL.read_name slat "f")) &&
000720| (VL.leq (VL.string "function") (SL.read_name slat "bf")) &&
000721| (VL.leq (VL.string "number") (SL.read_name slat "i")) &&
000722| (VL.leq (VL.string "boolean") (SL.read_name slat "b")) &&
000723| (VL.leq (VL.string "string") (SL.read_name slat "s")) &&
000724| (VL.leq (VL.string "table") (SL.read_name slat "t")) ));
000725| "builtin_tostring" >:: (fun () -> let _,_,slat =
000726| parse_analyze_lookup "examples/builtin_tostring.lua" in
000727| let sval = SL.read_name slat "s" in
000728| assert_bool "tostring" (VL.may_be_strings sval));
000729| "builtin_tonumber" >:: (fun () -> s_maybe_number_in "examples/builtin_tonumber.lua");
000730| "builtin_rawget" >:: (fun () -> s_maybe_number_in "examples/builtin_rawget.lua" );
000731| "builtin_rawset" >:: (fun () -> s_maybe_number_in "examples/builtin_rawset.lua" );
000732| "builtin_math_sqrt" >:: (fun () -> s_maybe_number_in "examples/builtin_math_sqrt.lua");
000733| "builtin_math_floor" >:: (fun () -> s_maybe_number_in "examples/builtin_math_floor.lua");
000734| "builtin_math_random" >:: (fun () -> s_maybe_number_in "examples/builtin_math_random.lua");
000735| "builtin_string_sub" >:: (fun () -> s_maybe_number_in "examples/builtin_string_sub.lua");
000736| "builtin_string_byte" >:: (fun () -> s_maybe_number_in "examples/builtin_string_byte.lua");
000737| "builtin_string_format" >:: (fun () -> s_maybe_number_in "examples/builtin_string_format.lua");
000738| "builtin_table_concat" >:: (fun () -> s_maybe_number_in "examples/builtin_table_concat.lua");
000739| ]
000740|
000741| let test_warn = "warning tests" >:::
000742| let unreachable prog_name =
000743| (fun () -> let _,_,slat = parse_analyze_lookup prog_name in
000744| assert_bool prog_name (slcmp SL.bot slat)) in
000745| [ "warn01" >:: (unreachable "examples/warn01.lua");
000746| "warn02" >:: (unreachable "examples/warn02.lua");
000747| ]
000748|
000749| let basic_tests =
000750| [ test_syntax;
000751| test_simpl;
000752| test_func;
000753| test_method;
000754| test_for;
000755| test_unop;
000756| test_string;
000757| test_coerce;
000758| test_return;
000759| test_scope;
000760| test_table;
000761| test_meta;
000762| test_builtin;
000763| test_warn; ]
000764|
000765| let test_programs = "program tests" >:::
000766| let may_terminate prog_name =
000767| (fun () -> let _,_,slat = parse_analyze_lookup prog_name in
000768| assert_bool prog_name (not (slcmp SL.bot slat))) in
000769| [ "fac" >:: (fun () -> let _,_,slat = parse_analyze_lookup "examples/fac.lua" in
000770| let vlat_r = SL.read_name slat "r" in
000771| assert_equal ~cmp:vlcmp vlat_r VL.number);
000772| "hello" >:: may_terminate "benchmarks/lua.org/hello.lua";
000773| "account" >:: may_terminate "benchmarks/lua.org/account.lua";
000774| "bisect" >:: may_terminate "benchmarks/lua.org/bisect.lua";
000775| (* from Eric Mertens *)
000776| "ericmertens1" >:: may_terminate "benchmarks/ericmertens1.lua";
000777| (* adapted from PPDP13 to Lua 5+ *)
000778| "ackermann" >:: may_terminate "benchmarks/PPDP13-Lua5/ackermann.lua";
000779| "ary" >:: may_terminate "benchmarks/PPDP13-Lua5/ary.lua";
000780| "ary2" >:: may_terminate "benchmarks/PPDP13-Lua5/ary2.lua";
000781| "ary3" >:: may_terminate "benchmarks/PPDP13-Lua5/ary3.lua";
000782| "deep_return" >:: may_terminate "benchmarks/PPDP13-Lua5/deep_return.lua";
000783| "fibo" >:: may_terminate "benchmarks/PPDP13-Lua5/fibo.lua";
000784| "funcall-count" >:: (fun () ->
000785| let _,_,slat = parse_analyze_lookup "benchmarks/PPDP13-Lua5/funcall-count.lua" in
000786| assert_equal ~cmp:vlcmp VL.number (SL.read_name slat "c"));
000787| "hash" >:: (fun () ->
000788| let _,_,slat = parse_analyze_lookup "benchmarks/PPDP13-Lua5/hash.lua" in
000789| assert_equal ~cmp:vlcmp VL.number (SL.read_name slat "c"));
000790| "hash2" >:: may_terminate "benchmarks/PPDP13-Lua5/hash2.lua";
000791| "heapsort" >:: may_terminate "benchmarks/PPDP13-Lua5/heapsort.lua";
000792| "lists" >:: may_terminate "benchmarks/PPDP13-Lua5/lists.lua";
000793| "matrix" >:: may_terminate "benchmarks/PPDP13-Lua5/matrix.lua";
000794| "n_body" >:: may_terminate "benchmarks/PPDP13-Lua5/n_body.lua";
000795| "nestedloop" >:: (fun () ->
000796| let _,_,slat = parse_analyze_lookup "benchmarks/PPDP13-Lua5/nestedloop.lua" in
000797| assert_equal ~cmp:vlcmp VL.number (SL.read_name slat "x"));
000798| "random" >:: may_terminate "benchmarks/PPDP13-Lua5/random.lua";
000799| "sieve" >:: (fun () ->
000800| let _,_,slat = parse_analyze_lookup "benchmarks/PPDP13-Lua5/sieve.lua" in
000801| assert_equal ~cmp:vlcmp VL.number (SL.read_name slat "num_prime"));
000802| "spectral-norm" >:: (fun () ->
000803| let _,_,slat = parse_analyze_lookup "benchmarks/PPDP13-Lua5/spectral-norm.lua" in
000804| assert_bool "spectral-norm" (vlcmp VL.number (SL.read_name slat "vBv")
000805| && vlcmp VL.number (SL.read_name slat "vv")));
000806| "strcat" >:: may_terminate "benchmarks/PPDP13-Lua5/strcat.lua";
000807| "strcat2" >:: may_terminate "benchmarks/PPDP13-Lua5/strcat2.lua";
000808| (* "binary-trees" >:: (fun () ->
000809| let _,_,slat = parse_analyze_lookup "benchmarks/benchmarkgame/binary-trees.lua" in
000810| assert_bool "binary-trees" ((vlcmp VL.number (SL.read_name slat "maxdepth")) &&
000811| (VL.may_be_table (SL.read_name slat "longlivedtree"))));
000812| "spectral-norm" >:: (fun () ->
000813| let _,_,slat = parse_analyze_lookup "benchmarks/benchmarkgame/spectral-norm.lua" in
000814| assert_bool "spectral-norm" ((vlcmp VL.number (SL.read_name slat "vBv")) &&
000815| (vlcmp VL.number (SL.read_name slat "vv"))));
000816| "n-body" >:: may_terminate "benchmarks/benchmarkgame/n-body.lua";
000817| "richards_loop" >:: may_terminate "benchmarks/LuaCLR/richards/richards_loop.lua"; *)
000818| ]
000819|
000820| let functional_tests = [ test_programs; ]
000821|
000822| let usagemsg = "Usage: ./test [option]"
000823| let all,basic,functional = (*[1]*)ref false, ref false, ref false
000824| let argspec =
000825| Arg.align
000826| [ ("-all", Arg.Set all, " Run all tests");
000827| ("-basic", Arg.Set basic, " Run basic tests (default)");
000828| ("-functional", Arg.Set functional, " Run functional tests"); ]
000829| let _ =
000830| (*[1]*)begin