
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