00001
00002
00003 #define _SCL_SECURE_NO_WARNINGS
00004
00005 #include <cppscript>
00006 #include "unit_tests.hpp"
00007
00008
00009 namespace
00010 {
00011 var obj1_compute(var obj1)
00012 {
00013 return obj1["a"] + obj1["b"];
00014 }
00015
00016 var obj1_create()
00017 {
00018 return object().extend
00019 ("a", 12)
00020 ("b", 13)
00021 ("compute", obj1_compute);
00022 }
00023
00024 void producer_produce(var producer)
00025 {
00026 for(int i=0; i<10; ++i)
00027 {
00028 producer["queue"].push_back(i);
00029 producer["item_available_event"]["signal"]();
00030 }
00031 }
00032
00033 var producer_create()
00034 {
00035 return object().extend
00036 ("queue", list())
00037 ("function", producer_produce)
00038 ("item_available_event", event());
00039 }
00040
00041 var consumer_pop_item(var consumer)
00042 {
00043
00044 if(consumer["queue"].empty())
00045 consumer["item_available_event"]["wait"]();
00046
00047 var item = consumer["queue"].pop_front();
00048 return item;
00049 }
00050
00051 var consumer_consume(var consumer)
00052 {
00053 var total=0;
00054 for(int i=0; i<10; ++i)
00055 {
00056 total += consumer["pop_item"]();
00057 }
00058 return total;
00059 }
00060
00061 var consumer_create(var producer)
00062 {
00063 return object("consumer").extend
00064 ("pop_item",consumer_pop_item)
00065 ("queue", producer["queue"])
00066 ("function", consumer_consume)
00067 ("item_available_event", producer["item_available_event"]);
00068 }
00069
00070 void summer_receive(var summer, var value)
00071 {
00072 summer["total"] += value;
00073 }
00074 }
00075
00076
00077 void test_queue()
00078 {
00079 var summer = object().extend
00080 ("receive", summer_receive)
00081 ("total", 0);
00082
00083 var q = message_queue(summer["receive"],5);
00084 finally( q["close"] );
00085
00086 foreach(i, range(1,100))
00087 q["post"](i);
00088
00089 q["wait"]();
00090
00091 assertx( summer["total"] == 5050 );
00092 }
00093
00094
00095 void thread_throws1()
00096 {
00097 throw var(123);
00098 }
00099
00100
00101 void test_threads()
00102 {
00103
00104 var obj1 = obj1_create();
00105 var thread1 = thread(obj1["compute"]);
00106 var result = thread1["join"]();
00107 assert( result == 25 );
00108
00109
00110 var thread2 = thread( thread_throws1 );
00111 try
00112 {
00113 thread2["join"]();
00114 assertx(0);
00115 }
00116 catch( var v )
00117 {
00118 assertx( v == 123 );
00119 }
00120
00121 var producer = producer_create();
00122 var consumer = consumer_create(producer);
00123 var consumer_thread = thread(consumer["function"]);
00124 var producer_thread = thread(producer["function"]);
00125
00126 producer_thread["join"]();
00127
00128 var total = consumer_thread["join"]();
00129 assert( total == 45 );
00130
00131
00132 var m = mutex();
00133 m["lock"]();
00134 finally(m["unlock"]);
00135 }
00136
00137
00138 namespace
00139 {
00140 volatile int t1_value=0;
00141 volatile int t2_value=0;
00142
00143
00144 void thread_cmd()
00145 {
00146 ++t1_value;
00147 }
00148
00149
00150 void thread_cmd2(var value)
00151 {
00152 t2_value += value.as_int();
00153 }
00154
00155
00156 var vfn(var numbers)
00157 {
00158 var total=0;
00159 foreach(n, numbers) total += n;
00160 return total;
00161 }
00162
00163
00164 namespace x
00165 {
00166 var array() { return dynamic::array(); }
00167 }
00168 }
00169
00170
00171 void test_proxy()
00172 {
00173 using internal::proxy;
00174
00175
00176 var ps = proxy("Fillet steak");
00177
00178
00179 assert( !ps.impl().shared_var() );
00180
00181
00182 assert( ps.class_name() == "string" );
00183
00184
00185 assert( ps.impl().comparison_index() == cmp_proxy );
00186 assert( ps > 123 );
00187 assert( ps == ps );
00188 assert( ps != +ps );
00189 assert( var(2).proxy() == 2 );
00190 assert( proxy(2) != 2 );
00191
00192
00193 var ps2 = +ps;
00194 assert( ps2.as_string() == "Fillet steak" );
00195 ps2.clear();
00196 assert( ps2.as_string() == "" );
00197 assert( ps.as_string() == "Fillet steak" );
00198
00199
00200 assert( proxy("123").as_int() == 123 );
00201 assert( proxy("123").as_string() == "123" );
00202 assert( proxy("123").as_wstring() == L"123" );
00203 assert( proxy("12.5").as_double() == 12.5 );
00204 assert( proxy("1") );
00205 assert( ps2.impl().as_ptr()==0 );
00206
00207
00208 assert( ps2.proxy() == ps2 );
00209
00210
00211 assert( var(object().extend("a", ps))["a"].as_string() == "Fillet steak");
00212
00213
00214 var fp = proxy(varargs(vfn));
00215 assert( fp() == 0 );
00216 assert( fp(1) == 1 );
00217 assert( fp(1,2) == 3 );
00218 assert( fp(1,2,3) == 6 );
00219 assert( fp(1,2,3,4) == 10 );
00220 assert( fp(1,2,3,4,5) == 15 );
00221 assert( fp(1,2,3,4,5,6) == 21 );
00222 assert( fp(1,2,3,4,5,6,7) == 28 );
00223 assert( fp(1,2,3,4,5,6,7,8) == 36 );
00224 assert( fp(1,2,3,4,5,6,7,8,9) == 45 );
00225 assert( fp(1,2,3,4,5,6,7,8,9,10) == 55 );
00226 assert( proxy(vfn).max_args() == 1 );
00227
00228
00229 var op = proxy(object().extend("m", varargs(vfn)));
00230 assert( op["m"]() == 0 );
00231 assert( op["m"](1) == 1 );
00232 assert( op["m"](1,2) == 3 );
00233 assert( op["m"](1,2,3) == 6 );
00234 assert( op["m"](1,2,3,4) == 10 );
00235 assert( op["m"](1,2,3,4,5) == 15 );
00236 assert( op["m"](1,2,3,4,5,6) == 21 );
00237 assert( op["m"](1,2,3,4,5,6,7) == 28 );
00238 assert( op["m"](1,2,3,4,5,6,7,8) == 36 );
00239 assert( op["m"](1,2,3,4,5,6,7,8,9) == 45 );
00240 assert( op["m"](1,2,3,4,5,6,7,8,9,10) == 55 );
00241
00242
00243 var items2[] = { 1,2,3,4 };
00244 var pi1 = items2;
00245 var pi2 = proxy(items2);
00246
00247 assert( std::equal(pi1.begin(), pi1.end(), pi2.begin() ) );
00248
00249
00250 assert( std::equal(pi1.rbegin(), pi1.rend(), pi2.rbegin() ) );
00251
00252
00253 var i = pi2.enumerator();
00254 assert( i );
00255 assert( *i++ == 1 );
00256 assert( i );
00257 assert( *i++ == 2 );
00258 assert( *i++ == 3 );
00259 assert( *i++ == 4 );
00260 assert( !i );
00261
00262
00263 i = pi2.reverse_enumerator();
00264 assert( i );
00265 assert( *i++ == 4 );
00266 assert( i );
00267 assert( *i++ == 3 );
00268 assert( *i++ == 2 );
00269 assert( *i++ == 1 );
00270 assert( !i );
00271
00272
00273 var items[] = { 1,2,"3" };
00274 var pl = proxy(items);
00275 assert( pl.size() == 3 );
00276 pl.resize(4);
00277 assert( pl.size() == 4 );
00278 assert( pl );
00279 assert( !pl.empty() );
00280
00281
00282 assert( pl.front() == 1 );
00283
00284
00285 assert( pl.back() == null );
00286
00287
00288 pl.clear();
00289 assert( pl.empty() );
00290
00291
00292 assert( pi2.keys().size() == 4 );
00293 assert( pi2.keys()[0] == 0 );
00294 assert( pi2.values().size() == 4 );
00295 assert( pi2.values()[0] == 1 );
00296
00297
00298 var a = proxy(map());
00299 var b = proxy(object());
00300 var c = proxy(array());
00301 a[1] = 12;
00302 assert( a[1] == 12 );
00303 assert_throws( var, b[12]=3 );
00304 assert_throws( var, b[var(1)]=1 );
00305 b["x"] = 13;
00306 assert( b["x"] == 13 );
00307 c[1] = 3;
00308 assert( c[0] == null );
00309
00310
00311 var list_proxy = proxy(list());
00312 list_proxy.push_back(3);
00313 list_proxy.push_back(1);
00314 assert(list_proxy.back() == 1);
00315 list_proxy.push_front(2);
00316 assert( list_proxy.front() == 2 );
00317
00318
00319
00320 assert( list_proxy.pop_front() == 2 );
00321 assert( list_proxy.pop_back() == 1 );
00322
00323
00324 var po = proxy( object().extend("a", "a" ) );
00325 assert( po.contains("a") );
00326 assert( !po.contains("b") );
00327 assert( !po.contains(2) );
00328
00329
00330 po.erase("a");
00331 assert( !po.contains("a") );
00332
00333
00334 po["a"] = 1;
00335 ++po["a"];
00336 assert( po["a"] == 2 );
00337 -- po["a"];
00338 assert( po["a"] == 1 );
00339
00340
00341 po["a"] += 3;
00342 assert( po["a"] == 4 );
00343 po["a"] -= 1;
00344 assert( po["a"] == 3 );
00345
00346
00347 assert_throws( not_supported, po.mixin( object().extend("b", 8) ) );
00348
00349
00350 var p = proxy(1);
00351 ++p;
00352 assert( p.as_int() == 2 );
00353
00354
00355 --p;
00356 assert( p.as_int() == 1 );
00357
00358
00359 assert( po.begin().key().as_string() == "a" );
00360
00361
00362 assert( po.begin().value() == 3 );
00363
00364
00365 assert( (*po.begin()).as_string() == "a" );
00366
00367
00368 assert( (proxy("abc") + "def").as_string() == "abcdef" );
00369 assert_throws( var, proxy(x::array)+1 );
00370
00371 assert( (proxy(4) - proxy(3)).as_int() == 1 );
00372 assert_throws( var, proxy(x::array)-1 );
00373
00374 assert( (proxy(4) * proxy(3)).as_int() == 12 );
00375 assert_throws( var, proxy(x::array)*1 );
00376
00377 assert( (proxy(6) / proxy(3)).as_int() == 2 );
00378 assert_throws( var, proxy(x::array)/1 );
00379
00380 assert( (proxy(6) % proxy(3)).as_int() == 0 );
00381 assert_throws( var, proxy(x::array)%1 );
00382
00383 assert( (+proxy(2)).as_int() == 2 );
00384 assert( (-proxy(2)).as_int() == -2 );
00385
00386 assert( (proxy(3)<<1).as_int() == 6 );
00387 assert( (proxy(12)>>2).as_int() == 3 );
00388 assert( (proxy(3)&2).as_int() == 2);
00389 assert( (proxy(1)|2).as_int() == 3);
00390 assert( (~proxy(~10)).as_int() == 10);
00391 assert( (proxy(1)^5).as_int() == 4);
00392
00393
00394 var pa = proxy(1);
00395 assert( (pa += 2).as_int() == 3 );
00396 assert( (pa -= 1).as_int() == 2 );
00397 assert( (pa *= 4).as_int() == 8 );
00398 assert( (pa /= 2).as_int() == 4 );
00399 assert( (pa %= 3).as_int() == 1 );
00400 assert( (pa <<= 3).as_int() == 8 );
00401 assert( (pa >>= 1).as_int() == 4 );
00402 assert( (pa |= 2).as_int() == 6 );
00403 assert( (pa &= 2).as_int() == 2 );
00404 assert( (pa ^= 6).as_int() == 4 );
00405
00406
00407 gc_force_collect();
00408 }