00001
00002
00003 #include <cppscript>
00004 #include <tls.hpp>
00005
00006 #include "unit_tests.hpp"
00007
00008
00009 namespace
00010 {
00011 void throws()
00012 {
00013 throw var();
00014 }
00015 }
00016
00017
00018 void test_files()
00019 {
00020
00021 var f1 = write_file("test.txt");
00022 f1["writeln"]("hello");
00023 f1["close"]();
00024
00025 try
00026 {
00027 f1["writeln"]("this will fail");
00028 assert(0);
00029 }
00030 catch(var e)
00031 {
00032 assert( e.class_name() == "io_error" );
00033 }
00034
00035 var f2 = read_file("test.txt");
00036 assert( f2["readln"]() == "hello" );
00037 f2["close"]();
00038
00039 f2["readln"]();
00040 assert_throws( var, f2["read"]() );
00041
00042
00043 var stat = fstat("test.txt");
00044 assert( stat );
00045 assert( stat["size"] >= 6 );
00046
00047 var stat2 = fstat("file_does_not_exist");
00048 assert( !stat2 );
00049
00050 gc_force_collect();
00051
00052
00053 {
00054 var object1 = object();
00055 object1["name"] = "Calum";
00056 object1["age"] = 34;
00057
00058 pickle_file("test.pickle", object1);
00059 var object2 = unpickle_file("test.pickle");
00060 assert( lex_equal(object2, object1) );
00061 }
00062
00063 #if 0
00064 write("Enter your name: ");
00065 writeln("Your name is '" + readln()+"'");
00066
00067
00068 var stream = out();
00069 stream["writeln"]("Hello world!");
00070 stream["write"]("abc");
00071 stream["writech"]('X');
00072
00073
00074 stream = err();
00075 stream["writeln"]("Hello error!");
00076 stream["write"]("def");
00077 stream["writech"]('Y');
00078
00079
00080 writeln( "Input name: ");
00081 writeln( "Your name is: " + in()["readln"]() );
00082 #endif
00083
00084
00085 assert_throws( var, read_file("no_such_file") );
00086 assert_throws( var, open_file("no_such_file", std::ios_base::in|std::ios_base::out) );
00087 assert_throws( var, write_file("") );
00088
00089
00090
00091 var m1 = mem_file();
00092 m1["writeln"]("Hello foo");
00093 m1["rewind"]();
00094 assertx( m1["readln"]() == "Hello foo" );
00095 assertx( m1["readln"]() == null );
00096 m1["rewind"]();
00097
00098
00099 m1 = mem_file();
00100 m1["write"]("abc");
00101 m1["rewind"]();
00102 var s = "";
00103 foreach( ch, characters(m1) ) s += ch;
00104 assert( s=="abc" );
00105
00106
00107 m1["rewind"]();
00108 assert( m1["read"]() == "abc" );
00109
00110 assert_throws( var, m1["read"]() );
00111
00112
00113 m1 = mem_file();
00114 m1["writeln"](123);
00115 m1["writeln"](456);
00116 var c=0;
00117
00118 foreach( l, lines(m1) )
00119 {
00120 c++;
00121 if(c==1) assert( l=="123" );
00122 if(c==2) assert( l=="456" );
00123 }
00124
00125
00126
00127 try
00128 {
00129 foreach( l, lines( object().extend("readln",throws) ) )
00130 ;
00131 assert(0 && "Exception not thrown");
00132 }
00133 catch(var x)
00134 {
00135 assert( x == null );
00136 }
00137 }
00138
00139
00140 void test_foreach()
00141 {
00142 var sum=0;
00143 foreach(i, range(4, 5))
00144 sum += i;
00145
00146 assert( sum == 9 );
00147
00148 sum=0;
00149
00150 foreach(i, range(4, 4) )
00151 sum += i;
00152
00153 assert( sum == 4 );
00154
00155
00156 sum=0;
00157 foreach(i, range(3,2) ) sum += i;
00158 assert( sum == 5 );
00159 foreach(i, reverse(range(3,2)) ) sum -= i;
00160 assert( sum == 0 );
00161
00162 foreach(i, array()) assert(0);
00163 }
00164
00165
00166 static void set_exit(var obj)
00167 {
00168 obj["exit"]=true;
00169 }
00170
00171
00172 void test_scopeguard()
00173 {
00174 var o = object();
00175
00176 {
00177 finally( bind(set_exit, o) );
00178 }
00179 assert( o["exit"] );
00180
00181 o=object();
00182 {
00183 scopeguard g1( bind(set_exit, o) );
00184 g1.dismiss();
00185 }
00186 assert( !o.contains("exit") );
00187 }
00188
00189
00190 void e1()
00191 {
00192 throw exception();
00193 }
00194
00195
00196 void test_exception()
00197 {
00198 try
00199 {
00200 (var(e1))();
00201 }
00202 catch(var v)
00203 {
00204 assert(v["text"] == "exception");
00205 assert(v["stack"].size() == 1);
00206 assert(v["stack"][0] == "script_main");
00207
00208 try
00209 {
00210 throw;
00211 }
00212 catch(std::exception & ex)
00213 {
00214 assert(ex.what() == std::string("exception"));
00215 }
00216 }
00217
00218 try
00219 {
00220 throw exception("my_class");
00221 }
00222 catch(var v)
00223 {
00224 assert(v.class_name() == "my_class");
00225 assert(v["text"] == "my_class");
00226 assert(v["data"] == var() );
00227 assert( exception_description(v) == "my_class (my_class)\n called from script_main" );
00228 }
00229
00230 try
00231 {
00232 throw exception("my_class2", "It happened");
00233 }
00234 catch(var v)
00235 {
00236 assert( v.class_name() == "my_class2" );
00237 assert( v["text"] == "It happened" );
00238 assert( v["data"] == var() );
00239 assert( exception_description(v) == "It happened (my_class2)\n called from script_main" );
00240 }
00241
00242 try
00243 {
00244 throw exception("my_class2", "abc", "def");
00245 }
00246 catch(var v)
00247 {
00248 assert( v.class_name() == "my_class2" );
00249 assert( v["text"] == "abc" );
00250 assert( v["data"] = "def" );
00251 assert( exception_description(v) == "abc (my_class2)\n called from script_main" );
00252 }
00253 }
00254
00255
00256 void tf1(var obj)
00257 {
00258 var s = stack_trace();
00259 assert( s.size() == 2 );
00260 assert( s[0].as_string() == "My A.f1" );
00261
00262 obj["f2"]();
00263
00264 s = stack_trace();
00265 assert( s.size() == 2 );
00266 assert( s[0].as_string() == "My A.f1" );
00267 }
00268
00269
00270 void tf2(var obj)
00271 {
00272 var s = stack_trace();
00273 assert( s.size() == 3 );
00274 assert( s[0].as_string() == "My A.f2" );
00275 assert( s[1].as_string() == "My A.f1" );
00276 }
00277
00278
00279 static void thread_fn()
00280 {
00281 var st = stack_trace();
00282 assert( st.size() == 1 );
00283 assert( st[0] == "thread" );
00284 }
00285
00286
00287 void test_stack_trace()
00288 {
00289 assert( stack_trace().size() == 1 );
00290 var o = object("My A").extend("f1", tf1)("f2", tf2 );
00291 o["f1"]();
00292 assert( stack_trace().size() == 1 );
00293
00294 thread(thread_fn)["join"]();
00295 }
00296
00297
00298 void test_tls()
00299 {
00300 int i1=1, i2=2;
00301 assert( (cg::tls<int*,int>::get() == 0 ));
00302 cg::tls<int*,int>::set(&i1);
00303 assert( (cg::tls<int*,int>::get() == &i1 ));
00304
00305 assert(( cg::tls<int*,char>::get() == 0 ));
00306 cg::tls<int*,char>::set(&i2);
00307 assert( (cg::tls<int*,char>::get() == &i2 ));
00308 }
00309
00310
00311 void test_framework2(var self)
00312 {
00313 ++self["count"];
00314 }
00315
00316
00317 void test_test_framework()
00318 {
00319
00320
00321 var self = object().extend("test", test_framework2)("count",0);
00322 assertx( run_tests( map() ) == 0 );
00323 assertx( run_tests( map("test_tf1", self["test"])("test_tf2", self["test"]) ) == 0 );
00324 assertx( self["count"]==2 );
00325 }
00326
00327
00328 var always_true(var ch)
00329 {
00330 return true;
00331 }
00332
00333
00334 void test_string_functions()
00335 {
00336
00337 assert( substring("hello", range(1,3)) == "ell" );
00338 assert( substring("", range(0,1)) == "" );
00339 assert( substring("abc", range(-1,-2) ) == "cb" );
00340 assert( substring("abc", range(-2,-1) ) == "bc" );
00341 assert( substring("abc", range(1,10) ) == "bc" );
00342
00343
00344 assert( !string_find("hello", "xyz") );
00345 assert( string_find("hello", "ll") == range(2,3) );
00346 assert( string_find("", "") == null );
00347 assert( string_find("a", "") == range_ex(0,0) );
00348
00349
00350 assert( !string_find_last("hello", "xyz") );
00351 assert( string_find_last("hellohello", "ll") == range(7,8) );
00352 assert( string_find_last("", "") == null );
00353 assert( string_find_last("ab", "") == range_ex(1,1) );
00354
00355
00356 assert( string_find_all("hello", "xyz").size() == 0 );
00357 var r1 = string_find_all("abcabcabab", "ab");
00358 assert( r1.size() == 4 );
00359 assert( r1[0] == range(0,1) );
00360 assert( r1[1] == range(3,4) );
00361 assert( r1[2] == range(6,7) );
00362 assert( r1[3] == range(8,9) );
00363
00364
00365 r1 = split_chars(always_true, "abc");
00366 assert( r1.size() == 1 );
00367 assert( r1[0] == "abc" );
00368
00369 r1 = split_chars( bind(is_one_of,"abc"), "abcdaddab" );
00370 assert( r1.size() == 3 );
00371 assert( r1[0] == "abc" );
00372 assert( r1[1] == "a" );
00373 assert( r1[2] == "ab" );
00374
00375
00376 assert( is_space(' ') );
00377 assert( !is_space('x') );
00378 assert( is_one_of("abc", 'b') );
00379 assert( is_not_one_of("abc", 'x') );
00380 }
00381
00382
00383 void test_libs()
00384 {
00385 assert( dynamic::min(1,2)==1 );
00386 assert( dynamic::max(1,2)==2 );
00387 }