00001
00002
00003 #include <cppscript>
00004 #include "unit_tests.hpp"
00005
00006
00007 namespace
00008 {
00009 var A_inc(var self)
00010 {
00011 return self["inc_by"](1);
00012 }
00013
00014 var A_inc_by(var self, var count)
00015 {
00016 return self["count"] += count;
00017 }
00018
00019 var C_dec_by(var self, var count)
00020 {
00021 return self["count"]-=count;
00022 }
00023
00024 var B_dec(var self)
00025 {
00026 return self["inc_by"](-1);
00027 }
00028
00029 var make_A()
00030 {
00031 return object().extend("inc",A_inc)("inc_by",A_inc_by)("count",0);
00032 }
00033
00034 var make_B()
00035 {
00036 return make_A().extend("dec",B_dec);
00037 }
00038 }
00039
00040
00041 void test_inheritance()
00042 {
00043 var a = make_B();
00044 a["inc"]();
00045 assert( a["count"] == 1 );
00046 a["dec"]();
00047 assert( a["count"] == 0 );
00048 }
00049
00050
00051 void test_attributes()
00052 {
00053
00054 var o = object();
00055
00056
00057 assert_throws( not_found, (var(object()["no_such_attribute"])) );
00058
00059
00060 o["p"] = 12;
00061
00062
00063 assert( o["p"] == 12 );
00064 assert( o["p"] );
00065
00066
00067 o["q"] = object();
00068 o["q"]["r"] = 7;
00069 o["q"]["s"] = object();
00070 o["q"]["s"]["t"] = 3;
00071 assert( o["q"]["s"]["t"] == 3 );
00072 assert( o["q"]["r"] == 7 );
00073
00074
00075 o["q"]["10"] = 10;
00076 assert( o["q"]["10"] == 10 );
00077
00078 assert( o["q"][10] == 10 );
00079 assert( o["q"][o["q"][10]] == 10 );
00080
00081
00082 o["self"] = o;
00083 assert( o["self"]["self"]["q"]["s"]["t"] == 3 );
00084
00085
00086
00087
00088 assert( o.contains("self") );
00089 assert( !o.contains("no such attribute") );
00090 }
00091
00092
00093 void test_attribute_operators()
00094 {
00095 var o = object();
00096 o["int"] = 0;
00097
00098 assert( ++o["int"] == 1 );
00099 assert( o["int"]++ == 1 );
00100
00101 assert( --o["int"] == 1 );
00102 assert( o["int"]-- == 1 );
00103
00104 assert( (o["int"] += 12) == 12 );
00105 assert( (o["int"] -= 4) == 8 );
00106
00107 assert( o["int"].as_int() == 8 );
00108
00109 o["int"] = 12;
00110 assert( o["int"] + "12" == 24 );
00111
00112 var x=12;
00113
00114 x += 12;
00115 o["array"] = array();
00116 o["array"][0] = 1;
00117 o["it"] = o["array"].begin();
00118 assert( *o["array"].begin() == 1 );
00119 assert( *o["it"] == 1 );
00120 assert( o["it"]->as_string() == "1" );
00121
00122 o["int"] = 3;
00123 assert( o["int"] + o["int"] == 6 );
00124 assert( o["int"] - o["int"] == 0 );
00125 assert( o["int"] * o["int"] == 9 );
00126 assert( o["int"] / o["int"] == 1 );
00127 assert( o["int"] % 2 == 1 );
00128 assert( o["int"] << 1 == 6 );
00129 assert( o["int"] >> 1 == 1 );
00130
00131 assert( -o["int"] == -3 );
00132 assert( +o["int"] == 3 );
00133 }
00134
00135
00136 void test_erase_attribute()
00137 {
00138
00139
00140 var o = object();
00141 o["self"] = o;
00142
00143 o.erase("self");
00144 assert( !o.contains("self") );
00145
00146 o["self"] = o;
00147 assert( o.contains("self") );
00148 }
00149
00150
00151 var hw_fn(var self)
00152 {
00153 return "hw";
00154 }
00155
00156
00157 var hello_fn(var self, var str)
00158 {
00159 return "Hello " + str.as_string();
00160 }
00161
00162
00163 var counter_reset(var self)
00164 {
00165 self["count"]=0;
00166 return var();
00167 }
00168
00169
00170 var counter_inc(var self)
00171 {
00172 self["count"] = self["count"]+1;
00173 return var();
00174 }
00175
00176
00177 namespace
00178 {
00179 void void1(var self) { self["count"] = self["count"]+1; }
00180
00181 void void2(var self, var a) { self["count"] = self["count"] + a; }
00182
00183 void void3(var self, var a, var b) { self["count"] = self["count"] + a + b; }
00184
00185 void void4(var self, var a, var b, var c) { self["count"] = self["count"] + a + b + c; }
00186
00187 void void5(var self, var a, var b, var c, var d) { self["count"] = self["count"] + a + b + c + d; }
00188
00189 void void6(var self, var a, var b, var c, var d, var e) { self["count"] = self["count"] + a + b + c + d + e; }
00190
00191 void void7(var self, var a, var b, var c, var d, var e, var f) { self["count"] = self["count"] + a + b + c + d + e + f; }
00192
00193 void void8(var self, var a, var b, var c, var d, var e, var f, var g) { self["count"] = self["count"] + a + b + c + d + e + f + g; }
00194
00195 void void9(var self, var a, var b, var c, var d, var e, var f, var g, var h) { self["count"] = self["count"] + a + b + c + d + e + f + g + h; }
00196
00197 void void10(var self, var a, var b, var c, var d, var e, var f, var g, var h, var i) { self["count"] = self["count"] + a + b + c + d + e + f + g + h + i; }
00198
00199 var var1(var self) { self["count"]=self["count"]+1; return 1; }
00200
00201 var var2(var self, var a)
00202 {
00203 self["count"] = self["count"] + a;
00204 return a;
00205 }
00206
00207 var var3(var self, var a, var b)
00208 {
00209 var sum = a+b;
00210 self["count"] = self["count"] + sum;
00211 return sum;
00212 }
00213
00214 var var4(var self, var a, var b, var c)
00215 {
00216 var sum = a+b+c;
00217 self["count"] = self["count"] + sum;
00218 return sum;
00219 }
00220
00221 var var5(var self, var a, var b, var c, var d)
00222 {
00223 var sum = a+b+c+d;
00224 self["count"] = self["count"] + sum;
00225 return sum;
00226 }
00227
00228 var var6(var self, var a, var b, var c, var d, var e)
00229 {
00230 var sum = a+b+c+d+e;
00231 self["count"] = self["count"] + sum;
00232 return sum;
00233 }
00234
00235 var var7(var self, var a, var b, var c, var d, var e, var f)
00236 {
00237 var sum = a+b+c+d+e+f;
00238 self["count"] = self["count"] + sum;
00239 return sum;
00240 }
00241
00242 var var8(var self, var a, var b, var c, var d, var e, var f, var g)
00243 {
00244 var sum = a+b+c+d+e+f+g;
00245 self["count"] = self["count"] + sum;
00246 return sum;
00247 }
00248
00249 var var9(var self, var a, var b, var c, var d, var e, var f, var g, var h)
00250 {
00251 var sum = a+b+c+d+e+f+g+h;
00252 self["count"] = self["count"] + sum;
00253 return sum;
00254 }
00255 var var10(var self, var a, var b, var c, var d, var e, var f, var g, var h, var i)
00256 {
00257 var sum = a+b+c+d+e+f+g+h+i;
00258 self["count"] = self["count"] + sum;
00259 return sum;
00260 }
00261 }
00262
00263
00264 void test_methods()
00265 {
00266 var c=object();
00267
00268 c["0"] = hw_fn;
00269 c["1"] = hello_fn;
00270 assert(c["0"]() == "hw");
00271
00272 assert( c["1"]("world") == "Hello world" );
00273
00274
00275
00276 var counter = object().extend
00277 ("count", 0)
00278 ("reset", counter_reset)
00279 ("inc", counter_inc);
00280
00281 var c1 = counter;
00282 c1["inc"]();
00283 c1["inc"]();
00284 assert( c1["count"] == 2 );
00285
00286 c1["reset"]();
00287 assert( c1["count"] == 0 );
00288
00289
00290
00291 counter["void1"] = void1;
00292 counter["void2"] = void2;
00293 counter["void3"] = void3;
00294 counter["void4"] = void4;
00295 counter["void5"] = void5;
00296 counter["void6"] = void6;
00297 counter["void7"] = void7;
00298 counter["void8"] = void8;
00299 counter["void9"] = void9;
00300 counter["void10"]= void10;
00301
00302 counter["var1"] = var1;
00303 counter["var2"] = var2;
00304 counter["var3"] = var3;
00305 counter["var4"] = var4;
00306 counter["var5"] = var5;
00307 counter["var6"] = var6;
00308 counter["var7"] = var7;
00309 counter["var8"] = var8;
00310 counter["var9"] = var9;
00311 counter["var10"]= var10;
00312
00313 counter["void1"]();
00314 counter["void2"](1);
00315 assert( counter["void3"](1,2) == var() );
00316 assert( counter["count"] == 5 );
00317 counter["void4"](1,2,3);
00318 counter["void5"](1,2,3,4);
00319 counter["void6"](1,2,3,4,5);
00320 assert( counter["count"] == 36 );
00321 counter["void7"](1,2,3,4,5,6);
00322 assert( counter["count"] == 57 );
00323 counter["void8"](1,2,3,4,5,6,7);
00324 assert( counter["count"] == 85 );
00325 counter["void9"](1,2,3,4,5,6,7,8);
00326 assert( counter["count"] == 121 );
00327 counter["void10"](1,2,3,4,5,6,7,8,9);
00328 assert( counter["count"] == 166 );
00329
00330 counter["reset"]();
00331
00332 assert( counter["var1"]() == 1 && counter["count"] == 1 );
00333 assert( counter["var2"](1) == 1 && counter["count"] == 2 );
00334 assert( counter["var3"](1,2) == 3 && counter["count"] == 5 );
00335 assert( counter["var4"](1,2,3) == 6 && counter["count"] == 11 );
00336 assert( counter["var5"](1,2,3,4) == 10 && counter["count"] == 21 );
00337 assert( counter["var6"](1,2,3,4,5) == 15 && counter["count"] == 36 );
00338 assert( counter["var7"](1,2,3,4,5,6) == 21 && counter["count"] == 57 );
00339 assert( counter["var8"](1,2,3,4,5,6,7) == 28 && counter["count"] == 85 );
00340 assert( counter["var9"](1,2,3,4,5,6,7,8) == 36 && counter["count"] == 121 );
00341 assert( counter["var10"](1,2,3,4,5,6,7,8,9) == 45 && counter["count"] == 166 );
00342 }
00343
00344
00345 void test_instantiate()
00346 {
00347 var a = object();
00348 a["1"] = 1;
00349 a["2"] = 2;
00350
00351 var b = +a, c=a;
00352 assert( b["2"] == 2 );
00353 c["1"] = 4;
00354 assert( a["1"] == 4 );
00355 assert( b["1"] == 1);
00356 }
00357
00358
00359 void inc(var self)
00360 {
00361 self["count"] = self["count"]+1;
00362 }
00363
00364
00365 namespace
00366 {
00367 void n0() { }
00368 void n1(var) { }
00369 void n2(var,var) { }
00370 void n3(var,var,var) { }
00371 void n4(var,var,var,var) { }
00372 void n5(var,var,var,var,var) { }
00373 void n6(var,var,var,var,var,var) { }
00374 void n7(var,var,var,var,var,var,var) { }
00375 void n8(var,var,var,var,var,var,var,var) { }
00376 void n9(var,var,var,var,var,var,var,var,var) { }
00377 void n10(var,var,var,var,var,var,var,var,var,var) { }
00378
00379 var s0() { return 2; }
00380 var s1(var a0) { return a0; }
00381 var s2(var a0, var a1) { return a0+a1; }
00382 var s3(var a0, var a1, var a2) { return a0+a1+a2; }
00383 var s4(var a0, var a1, var a2, var a3) { return a0+a1+a2+a3; }
00384 var s5(var a0, var a1, var a2, var a3, var a4) { return a0+a1+a2+a3+a4; }
00385 var s6(var a0, var a1, var a2, var a3, var a4, var a5) { return a0+a1+a2+a3+a4+a5; }
00386 var s7(var a0, var a1, var a2, var a3, var a4, var a5, var a6) { return a0+a1+a2+a3+a4+a5+a6; }
00387 var s8(var a0, var a1, var a2, var a3, var a4, var a5, var a6, var a7) { return a0+a1+a2+a3+a4+a5+a6+a7; }
00388 var s9(var a0, var a1, var a2, var a3, var a4, var a5, var a6, var a7, var a8) { return a0+a1+a2+a3+a4+a5+a6+a7+a8; }
00389 var s10(var a0, var a1, var a2, var a3, var a4, var a5, var a6, var a7, var a8, var a9) { return a0+a1+a2+a3+a4+a5+a6+a7+a8+a9; }
00390 }
00391
00392 enable_pickle( n0 );
00393 enable_pickle( n1 );
00394 enable_pickle( s10 );
00395
00396
00397 void test_function()
00398 {
00399
00400 assert( !var(n0).impl().shared_var() );
00401 assert( var(n0).class_name() == "function" );
00402 assertx( var(n0) == var(n0) );
00403 assert( var(n0).impl().comparison_index() == cmp_function_v0 );
00404 assert( var(n1) > object() );
00405 assert( var(n1) < bind(n1, 1) );
00406 assertx( var(n1) != var(n2) );
00407 assertx( var(n1) == +var(n1) );
00408 var x = object();
00409 x["x"] = var(n1);
00410
00411 assertx( unpickle(pickle(n0)) == var(n0) );
00412
00413 assert( unpickle(pickle(n0)) == var(n0) );
00414 assert( unpickle(pickle(n1)) == var(n1) );
00415 assert( unpickle(pickle(s10)) == var(s10) );
00416 assert_throws( exception, pickle(s9) );
00417
00418
00419 assert( var(n0).as_string() == "<<function>>" );
00420 assert( var(n0).as_wstring() == L"<<function>>" );
00421 assert( !var(n0) );
00422 assert( var(n0).as_int() == 0 );
00423 assert( var(n0).as_double() == 0.0 );
00424
00425
00426 assert( var(n0).max_args() == 0 );
00427 assert( var(n1).max_args() == 1 );
00428 assert( var(n2).max_args() == 2 );
00429 assert( var(n3).max_args() == 3 );
00430 assert( var(n4).max_args() == 4 );
00431 assert( var(n5).max_args() == 5 );
00432 assert( var(n6).max_args() == 6 );
00433 assert( var(n7).max_args() == 7 );
00434 assert( var(n8).max_args() == 8 );
00435 assert( var(n9).max_args() == 9 );
00436 assert( var(n10).max_args() == 10 );
00437 assert( var(s0).max_args() == 0 );
00438 assert( var(s1).max_args() == 1 );
00439 assert( var(s2).max_args() == 2 );
00440 assert( var(s3).max_args() == 3 );
00441 assert( var(s4).max_args() == 4 );
00442 assert( var(s5).max_args() == 5 );
00443 assert( var(s6).max_args() == 6 );
00444 assert( var(s7).max_args() == 7 );
00445 assert( var(s8).max_args() == 8 );
00446 assert( var(s9).max_args() == 9 );
00447 assert( var(s10).max_args() == 10 );
00448
00449 test_default_container( n0 );
00450 test_default_iterator( n0 );
00451 test_default_assignment( n0 );
00452
00453
00454 assert_throws( not_supported, var(n0) + 1 );
00455 assert_throws( not_supported, var(n0) - 1 );
00456 assert_throws( not_supported, var(n0) * 1 );
00457 assert_throws( not_supported, var(n0) / 1 );
00458 assert_throws( not_supported, var(n0) % 1 );
00459 assert_throws( not_supported, -var(n0) );
00460 assert_throws( not_supported, ~var(n0) );
00461 assert_throws( not_supported, var(n0) << 1 );
00462 assert_throws( not_supported, var(n0) >> 1 );
00463 assert_throws( not_supported, var(n0) & 1 );
00464 assert_throws( not_supported, var(n0) | 1 );
00465 assert_throws( not_supported, var(n0) ^ 1 );
00466
00467
00468
00469 (var(n0)());
00470 (var(n1))(1);
00471 (var(n2))(1,2);
00472 (var(n3))(1,2,3);
00473 (var(n4))(1,2,3,4);
00474 (var(n5))(1,2,3,4,5);
00475 (var(n6))(1,2,3,4,5,6);
00476 (var(n7))(1,2,3,4,5,6,7);
00477 (var(n8))(1,2,3,4,5,6,7,8);
00478 (var(n9))(1,2,3,4,5,6,7,8,9);
00479 (var(n10))(1,2,3,4,5,6,7,8,9,10);
00480
00481 assert( var(s0)() == 2 );
00482 assert( var(s1)(1) == 1 );
00483 assert( var(s2)(1,2) == 3 );
00484 assert( var(s3)(1,2,3) == 6 );
00485 assert( var(s4)(1,2,3,4) == 10 );
00486 assert( var(s5)(1,2,3,4,5) == 15 );
00487 assert( var(s6)(1,2,3,4,5,6) == 21 );
00488 assert( var(s7)(1,2,3,4,5,6,7) == 28 );
00489 assert( var(s8)(1,2,3,4,5,6,7,8) == 36 );
00490 assert( var(s9)(1,2,3,4,5,6,7,8,9) == 45 );
00491 assert( var(s10)(1,2,3,4,5,6,7,8,9,10) == 55 );
00492 }
00493
00494
00495 void test_void_methods()
00496 {
00497 var A = object();
00498 A["inc"] = inc;
00499 A["count"] = 0;
00500
00501 var a=+A;
00502
00503 a["inc"]();
00504 assert(a["count"] == 0);
00505 assert(A["count"] == 1);
00506 }
00507
00508
00509 void test_pickle(const var & v)
00510 {
00511 assert( unpickle(pickle(v)) == v );
00512 }
00513
00514
00515 var sum1(var a) { return a; }
00516 var sum2(var a, var b) { return a+b; }
00517 var sum3(var a, var b, var c) { return a+b+c; }
00518 var sum4(var a, var b, var c, var d) { return a+b+c+d; }
00519 var sum5(var a, var b, var c, var d, var e) { return a+b+c+d+e; }
00520 var sum6(var a, var b, var c, var d, var e, var f) { return a+b+c+d+e+f; }
00521 var sum7(var a, var b, var c, var d, var e, var f, var g) { return a+b+c+d+e+f+g; }
00522 var sum8(var a, var b, var c, var d, var e, var f, var g, var h) { return a+b+c+d+e+f+g+h; }
00523 var sum9(var a, var b, var c, var d, var e, var f, var g, var h, var i) { return a+b+c+d+e+f+g+h+i; }
00524 var sum10(var a, var b, var c, var d, var e, var f, var g, var h, var i, var j) { return a+b+c+d+e+f+g+h+i+j; }
00525
00526 enable_pickle(sum4)
00527 enable_pickle(sum10)
00528
00529
00530 void test_bind()
00531 {
00532
00533 var c = bind(sum1, 1);
00534
00535
00536 assert( c.impl().shared_var() );
00537 assert( c.class_name() == "bind" );
00538 assert( c > var(sum1) );
00539
00540
00541 assert( c.as_string() == "1.<<bind>>" );
00542 assert( c.as_wstring() == L"1.<<bind>>" );
00543 assert( !c );
00544 assert( c.as_int() == 0 );
00545 assert( c.as_double() == 0.0 );
00546
00547 test_default_container( c );
00548 test_default_iterator( c );
00549 test_default_assignment( c );
00550
00551
00552 assert( bind(sum1, 1)() == 1 );
00553 assert( bind(sum1, 1).max_args() == 0 );
00554
00555 assert( var(sum2)(2,3) == 5 );
00556 assert_throws( not_supported, (var(sum2)(2,3,4)) );
00557
00558 assert( bind(sum3,1)(2,4) == 7 );
00559 assert( bind(sum3,1,2)(4) == 7 );
00560 assert( bind(sum3, 1,2,4)() == 7 );
00561 assert( bind(sum3, 1).max_args() == 2 );
00562 assert_throws( not_supported, (var(sum3)(1,2,3,4)) );
00563
00564 assert( var(sum2)("Hello ","world!") == "Hello world!" );
00565
00566 assert( bind(sum4, 1)(2,3,4) == 10 );
00567 assert( bind(sum4, 1,2)(3,4) == 10 );
00568 assert( bind(sum4, 1,2,3)(4) == 10 );
00569 assert( bind(sum4, 1,2,3,4)() == 10 );
00570 assert( bind(sum4, 1,2,3,4).max_args() == 0 );
00571 assert_throws( too_many_arguments, bind(sum4, 1,2,3,4,5) );
00572 assert_throws( not_supported, (var(sum4)(1,2,3)(3,4)) );
00573
00574 assert( bind(sum5,1)(2,3,4,5) == 15 );
00575 assert( bind(sum5,1,2)(3,4,5) == 15 );
00576 assert( bind(sum5,1,2,3)(4,5) == 15 );
00577 assert( bind(sum5,1,2,3,4)(5) == 15 );
00578 assert( bind(sum5,1,2,3,4,5)() == 15 );
00579 assert_throws( not_supported, (bind(sum5,1,2,3,4)(3,4)) );
00580
00581 assert( bind(sum6,1)(2,3,4,5,6) == 21 );
00582 assert( bind(sum6,1,2)(3,4,5,6) == 21 );
00583 assert( bind(sum6,1,2,3)(4,5,6) == 21 );
00584 assert( bind(sum6,1,2,3,4)(5,6) == 21 );
00585 assert( bind(sum6,1,2,3,4,5)(6) == 21 );
00586 assert( bind(sum6,1,2,3,4,5,6)() == 21 );
00587 assert( bind(sum6,1).max_args() == 5 );
00588 assert_throws( not_supported, (bind(sum6,1,2,3,4,5)(3,4)) );
00589 assert_throws( too_many_arguments, bind(sum6,1,2,3,4,5,6,7) );
00590
00591 assert( bind(sum7,1)(2,3,4,5,6,7) == 28 );
00592 assert( bind(sum7,1,2)(3,4,5,6,7) == 28 );
00593 assert( bind(sum7,1,2,3)(4,5,6,7) == 28 );
00594 assert( bind(sum7,1,2,3,4)(5,6,7) == 28 );
00595 assert( bind(sum7,1,2,3,4,5)(6,7) == 28 );
00596 assert( bind(sum7,1,2,3,4,5,6)(7) == 28 );
00597 assert( bind(sum7,1,2,3,4,5,6,7)() == 28 );
00598 assert_throws( too_many_arguments, bind(sum7,1,2,3,4,5,6,3,4) );
00599
00600 assert( bind(sum8,1)(2,3,4,5,6,7,8) == 36 );
00601 assert( bind(sum8,1,2)(3,4,5,6,7,8) == 36 );
00602 assert( bind(sum8,1,2,3)(4,5,6,7,8) == 36 );
00603 assert( bind(sum8,1,2,3,4)(5,6,7,8) == 36 );
00604 assert( bind(sum8,1,2,3,4,5)(6,7,8) == 36 );
00605 assert( bind(sum8,1,2,3,4,5,6)(7,8) == 36 );
00606 assert( bind(sum8,1,2,3,4,5,6,7)(8) == 36 );
00607 assert( bind(sum8,1,2,3,4,5,6,7,8)() == 36 );
00608 assert_throws( not_supported, bind(sum8,1,2,3,4,5,6,7)(3,4) );
00609
00610 assert( bind(sum9,1)(2,3,4,5,6,7,8,9) == 45 );
00611 assert( bind(sum9,1,2)(3,4,5,6,7,8,9) == 45 );
00612 assert( bind(sum9,1,2,3)(4,5,6,7,8,9) == 45 );
00613 assert( bind(sum9,1,2,3,4)(5,6,7,8,9) == 45 );
00614 assert( bind(sum9,1,2,3,4,5)(6,7,8,9) == 45 );
00615 assert( bind(sum9,1,2,3,4,5,6)(7,8,9) == 45 );
00616 assert( bind(sum9,1,2,3,4,5,6,7)(8,9) == 45 );
00617 assert( bind(sum9,1,2,3,4,5,6,7,8)(9) == 45 );
00618 assert( bind(sum9,1,2,3,4,5,6,7,8,9)() == 45 );
00619 assert_throws( too_many_arguments, bind(sum9,1,2,3,4,5,6,7,8,9,10) );
00620
00621 assert( bind(sum10,1)(2,3,4,5,6,7,8,9,10) == 55 );
00622 assert( bind(sum10,1,2)(3,4,5,6,7,8,9,10) == 55 );
00623 assert( bind(sum10,1,2,3)(4,5,6,7,8,9,10) == 55 );
00624 assert( bind(sum10,1,2,3,4)(5,6,7,8,9,10) == 55 );
00625 assert( bind(sum10,1,2,3,4,5)(6,7,8,9,10) == 55 );
00626 assert( bind(sum10,1,2,3,4,5,6)(7,8,9,10) == 55 );
00627 assert( bind(sum10,1,2,3,4,5,6,7)(8,9,10) == 55 );
00628 assert( bind(sum10,1,2,3,4,5,6,7,8)(9,10) == 55 );
00629 assert( bind(sum10,1,2,3,4,5,6,7,8,9)(10) == 55 );
00630 assert( bind(sum10,1,2,3,4,5,6,7,8,9)(10) == 55 );
00631 assert( bind(sum10,1,2,3,4,5,6,7,8,9,10)() == 55 );
00632 assert_throws( too_many_arguments, bind(sum10,1,2,3,4,5,6,7,8,9)(3,4) );
00633
00634
00635 test_pickle(sum4);
00636
00637
00638 assert( bind(sum1, 1) != 1 );
00639 assert( bind(sum1, 1) == bind(sum1, 1) );
00640 assert( bind(sum1, 1) != bind(sum2, 1) );
00641 assert( bind(sum1, 1) < bind(sum1, 2) );
00642 assert( bind(sum2, 1) < bind(sum2, 1, 2) );
00643
00644
00645 test_pickle(bind(sum10, 2));
00646 test_pickle(bind(sum10, 1, 2));
00647 test_pickle(bind(sum10, 1, 2, 3));
00648 test_pickle(bind(sum10, 1, 2, 3, 4));
00649 test_pickle(bind(sum10, 1, 2, 3, 4, 5));
00650 test_pickle(bind(sum10, 1, 2, 3, 4, 5, "6"));
00651 test_pickle(bind(sum10, 1, 2, 3, 4, 5, "6", "7"));
00652 test_pickle(bind(sum10, 1, 2, 3, 4, 5, "6", "7", 8.0));
00653 test_pickle(bind(sum10, 1, 2, 3, 4, 5, "6", "7", 8.0, 9));
00654 test_pickle(bind(sum10, 1, 2, 3, 4, 5, "6", "7", 8.0, 9, 10));
00655
00656 assert( bind(sum10, 1).as_string() == "1.<<bind>>" );
00657 assert( bind(sum10, 1).as_wstring() == L"1.<<bind>>" );
00658 }
00659
00660
00661 var get_fish(var o)
00662 {
00663 return o["fish"];
00664 }
00665
00666
00667 void test_extend()
00668 {
00669 var o = object().extend("fish", 12);
00670 assert( o["fish"] == 12 );
00671 o.extend("get", get_fish);
00672 assert( o["get"]() == 12 );
00673
00674 var o2 = o.extend("x", "x")("y", "y");
00675 assert( o2["x"] == "x" );
00676 assert( o2["y"] == "y" );
00677 assert( o2 == o );
00678
00679 var o3 = o2.extend("a",1)("b",2.0)("c",L"c");
00680 assert( o3["a"] == 1 );
00681 assert( o3["b"] == 2.0 );
00682 assert( o3["c"] == L"c" );
00683 assert( o3 == o2 );
00684 }
00685
00686
00687 namespace
00688 {
00689 var xf1(var list)
00690 {
00691 assert(list[0] == list.size());
00692 for(var i=1; i<list.size(); ++i)
00693 assert(list[i] == i);
00694 return 12;
00695 }
00696
00697 var xf2(var list)
00698 {
00699 assert(list.empty());
00700 return 13;
00701 }
00702 }
00703
00704 enable_pickle(xf2)
00705
00706
00707 void test_varargs()
00708 {
00709 var va = varargs(xf2);
00710
00711
00712 assert( va.impl().shared_var() );
00713
00714
00715 assert( va.class_name() == "varargs" );
00716
00717
00718 assert( va.impl().comparison_index() == cmp_varargs );
00719
00720
00721 assert( varargs(xf2) == varargs(xf2) );
00722 assert( varargs(xf1) != varargs(xf2) );
00723 assert( varargs(xf1) < varargs(xf2) || varargs(xf1) > varargs(xf2) );
00724
00725
00726 assert( +va == va );
00727
00728
00729 assert( va.as_int() == 0 );
00730
00731
00732 assert( va.as_double() == 0.0 );
00733
00734
00735 assert( !va );
00736
00737
00738 assert( !va.impl().as_ptr() );
00739
00740
00741 test_default_container( va );
00742 test_default_iterator( va );
00743 test_default_operators( va );
00744 test_default_assignment( va );
00745
00746
00747 assert( varargs(xf2)() == 13 );
00748 assert( varargs(xf1)(1) == 12 );
00749 assert( varargs(xf1)(2,1) == 12 );
00750 assert( varargs(xf1)(3,1,2) == 12 );
00751 assert( varargs(xf1)(4,1,2,3) == 12 );
00752 assert( varargs(xf1)(5,1,2,3,4) == 12 );
00753 assert( varargs(xf1)(6,1,2,3,4,5) == 12 );
00754 assert( varargs(xf1)(7,1,2,3,4,5,6) == 12 );
00755 assert( varargs(xf1)(8,1,2,3,4,5,6,7) == 12 );
00756 assert( varargs(xf1)(9,1,2,3,4,5,6,7,8) == 12 );
00757 assert( varargs(xf1)(10,1,2,3,4,5,6,7,8,9) == 12 );
00758
00759 assert( varargs(xf1).max_args() == 10 );
00760
00761
00762 assert( varargs(xf2).as_string() == "varargs(<<function>>)" );
00763 assert( varargs(xf2).as_wstring() == L"varargs(<<function>>)" );
00764
00765
00766 assert( unpickle(pickle(va)) == va );
00767 }
00768
00769
00770 namespace Counter
00771 {
00772 void inc(var self) { ++self["count"]; }
00773
00774 void reset(var self) { self["count"]=0; }
00775
00776 void dec(var self) { self["count"]=self["count"]-1; }
00777
00778 enable_pickle(inc);
00779 enable_pickle(reset);
00780 enable_pickle(dec);
00781
00782 var counter()
00783 {
00784 return object().extend("inc", inc)("dec", dec)("reset", reset)("count", 0);
00785 }
00786 }
00787
00788
00789 void test_pickle_object()
00790 {
00791
00792 var o = object();
00793 o["a"] = 12;
00794 o["b"] = "foo";
00795 o["c"] = o;
00796 var p = unpickle(pickle(o));
00797 assert(p.size() == 3);
00798 assert(p["b"] == "foo");
00799
00800
00801 var c1 = Counter::counter();
00802 assert( c1["count"] == 0 );
00803 c1["inc"]();
00804 assert( c1["count"] == 1 );
00805
00806 var c2 = unpickle(pickle(c1));
00807 c2["inc"]();
00808 assert( c2["count"] == 2 );
00809
00810
00811
00812 var c3 = Counter::counter();
00813
00814 c3["inc"] = c2["dec"];
00815 c3["other_counter"] = c2;
00816 c3["first_counter"] = c3;
00817 c3["count"] = 5;
00818
00819 var c4 = unpickle(pickle(c3));
00820 c4["inc"]();
00821
00822 assert( c4["count"] == 5 );
00823 assert( c4["other_counter"]["count"] == 1 );
00824 }
00825
00826
00827 namespace
00828 {
00829 void hello_this_is_a_function()
00830 {
00831 assert( stack_trace().front().as_string() == "hello_this_is_a_function" );
00832 }
00833 }
00834
00835
00836 void test_named_functor()
00837 {
00838
00839
00840 }