File: src/test.ml (return to index)



Statistics:  
kind coverage
binding 1 / 1 (100%)
sequence 3 / 5 (60%)
for 0 / 0 (-%)
if/then 2 / 4 (50%)
try 0 / 0 (-%)
while 0 / 0 (-%)
match/function 0 / 0 (-%)
kind coverage
class expression 0 / 0 (-%)
class initializer 0 / 0 (-%)
class method 0 / 0 (-%)
class value 0 / 0 (-%)
toplevel expression 1 / 1 (100%)
lazy operator 2 / 3 (66%)



Source:

fold all unfold all
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
000831|     (*[1]*)Arg.parse argspec (fun _ -> ((*[0]*)Arg.usage argspec usagemsg; (*[0]*)exit 1)) usagemsg;
000832|     (*[1]*)all := (*[1]*)!all || ((*[1]*)!basic && (*[0]*)!functional);
000833|     (*[1]*)if !all
000834|     then (*[0]*)run_test_tt_main ("OUnit all testsuite" >::: (basic_tests @ functional_tests))
000835|     else (*[1]*)if !functional
000836|     then (*[0]*)run_test_tt_main ("OUnit functional testsuite" >::: functional_tests)
000837|     else (*[1]*)run_test_tt_main ("OUnit basic testsuite" >::: basic_tests)
000838|   end

Legend:
   some code - line containing no point
   some code - line containing only visited points
   some code - line containing only unvisited points
   some code - line containing both visited and unvisited points