00001
00002
00003 #include <cppscript>
00004 #include "unit_tests.hpp"
00005
00006 #include <vector>
00007 #include <cstring>
00008
00009
00010 bool lex_lt(const var & v1, const var & v2)
00011 {
00012 return std::lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());
00013 }
00014
00015
00016 bool lex_equal(const var & v1, const var & v2)
00017 {
00018 return !lex_lt(v1, v2) && !lex_lt(v2, v1);
00019 }
00020
00021
00022 void test_enumerator(var container, var size)
00023 {
00024 assert( std::distance( container.begin(), container.end() ) == size.as_int() );
00025
00026 int n=0;
00027 foreach( i, container ) ++n;
00028 assert( size == n );
00029
00030 foreach( i, reverse(container) ) --n;
00031 assert( 0 == n );
00032 }
00033
00034
00035 void test_string_container()
00036 {
00037
00038 var str = "hello";
00039 var wstr = L"hello";
00040
00041 assert( string_from(list('a')('b')('c')) == "abc" );
00042 char cstr[] = "hello";
00043 assert( string_it(cstr, cstr+5) == "hello" );
00044
00045 assert( str.impl().shared_var() );
00046 assert( str.class_name() == "string" );
00047 assert( wstr.class_name() == "string" );
00048
00049
00050
00051 assert( wstr > str );
00052 assert( str == "hello" );
00053 assert( str < "hello123" );
00054 assert( str > "abc" );
00055
00056
00057 var str2 = +str;
00058 assert( str2 == str );
00059 str2.clear();
00060 assert( str2 != str );
00061
00062
00063 assert_not_supported( str() );
00064
00065
00066 assert( str.as_string() == "hello" );
00067
00068
00069 assert( str.proxy().as_string() == "hello" );
00070
00071
00072 assert( str );
00073 assert( !var("") );
00074
00075
00076 assert( var("10").as_int() == 10 );
00077 assert( var(L"10").as_int() == 10 );
00078
00079
00080 assert( var("0.5").as_double() == 0.5 );
00081 assert( var(L"0.5").as_double() == 0.5 );
00082
00083
00084 assert( str.max_args() == 1 );
00085
00086
00087 assert( unpickle(pickle(str)) == str );
00088
00089
00090
00091
00092 assert_sequence_equals( "123", reverse("321") );
00093
00094
00095 assert( str.size() == 5 );
00096
00097
00098 str2 = +str;
00099 str2.resize(10);
00100 assert( str2 == "hello " );
00101 str2.resize(4);
00102 assert( str2 == "hell" );
00103 str2.resize(0);
00104 assert( !str2 );
00105
00106
00107 str2 = "abc";
00108 str2.impl().reserve(100);
00109 assert( str2.impl().capacity() >= 100 );
00110
00111
00112 assert( str.keys() == range(0,4) );
00113
00114
00115 assert( str.values() == str );
00116
00117
00118 assert( str[0] == 'h' );
00119
00120
00121 str[0] = 'x';
00122 assert( str == "xello" );
00123 str[3] = 'm';
00124 assert( str == "xelmo" );
00125
00126
00127
00128 str[10] = 'z';
00129 assert( str == "xelmo z" );
00130
00131 str[-2] = 'a';
00132 assert( str[-1] == 'z' );
00133 assert( str == "xelmo az" );
00134 assert_throws( not_found, str[-40]=' ' );
00135
00136
00137 str = "123";
00138 assert( str[3] == ' ' );
00139 assert( str[-3] == '1' );
00140 assert( str[-4] == ' ' );
00141
00142
00143 var end = str.end();
00144 std::string text;
00145 for(var::iterator i=str.begin(); i!=end; ++i)
00146 {
00147 text += i->as_int();
00148 }
00149
00150 assert( str == text );
00151
00152
00153 var t="";
00154 foreach( ch, "abcd" ) t.push_back(ch);
00155 assert(t == "abcd");
00156
00157 assert( t[0].class_name() == "char" );
00158 assert( var((char)100) != 100 );
00159 assert( var(t[1]) == var('b') );
00160
00161
00162 str = "hello";
00163 str.insert(0,"abc");
00164 assert( str == "abchello" );
00165 str = "abc";
00166 str.insert( 4, "de" );
00167 assertx( str == "abc de" );
00168 str = "xy";
00169 str.insert(1,"");
00170 assert( str == "xy" );
00171 str.insert(-3, "ab");
00172 assert( str == "ab xy" );
00173
00174
00175 str = "abc";
00176 str.erase( range(1,1) );
00177 assert( str == "ac" );
00178 str.erase( range_ex(0,0) );
00179 assert( str == "ac" );
00180 str.erase( range_ex( -10, 10) );
00181 assert( str == "ac" );
00182 str.erase( range_ex(-10,-8) );
00183 assert( str == "ac" );
00184 str.erase( str.keys() );
00185 assert( !str );
00186
00187
00188 str = "abc";
00189 assert( str+"def" == "abcdef" );
00190 str += "xyz";
00191 assert( str == "abcxyz" );
00192 str = "ab";
00193 assert( str * 2 == "abab" );
00194 str *= 2;
00195 assert( str == "abab" );
00196 str *= 0;
00197 assert( !str );
00198
00199
00200 str = "abc";
00201 str.clear();
00202 assert( !str );
00203
00204
00205 str = "abc";
00206 assert( str.contains(0) );
00207 assert( str.contains(-1) );
00208 assert( str.contains(2) );
00209 assert( !str.contains(3) );
00210 assert( !str.contains(-4) );
00211
00212
00213 assert_not_supported( str.push_front('a') );
00214
00215
00216 assert_not_supported( str.pop_front() );
00217 }
00218
00219
00220 void test_op_lt()
00221 {
00222 var array1 = array();
00223
00224 var object1 = object();
00225
00226 std::vector<var> ascending;
00227 ascending.push_back(null);
00228 ascending.push_back(false);
00229 ascending.push_back(true);
00230 ascending.push_back(-3);
00231 ascending.push_back(3);
00232 ascending.push_back(2.0);
00233 ascending.push_back(2.1);
00234 ascending.push_back("a");
00235 ascending.push_back("aa");
00236 ascending.push_back(L"a");
00237 ascending.push_back(L"aa");
00238 ascending.push_back(array1);
00239 ascending.push_back(object1);
00240
00241 for(std::vector<var>::iterator i=ascending.begin(); i!=ascending.end(); ++i)
00242 {
00243 assert( *i == *i );
00244 for(std::vector<var>::iterator j=i+1; j!=ascending.end(); ++j)
00245 assert( *i < *j );
00246 }
00247
00248 }
00249
00250
00251 void test_object_container()
00252 {
00253
00254 var x = object();
00255 x["b"] = 2;
00256 x["a"] = 1;
00257
00258
00259 assert( object().impl().shared_var() );
00260
00261
00262 assert( x == x );
00263 assert( var(1) < x );
00264 assert( x != object() );
00265
00266
00267 assert( object().impl().comparison_index() == cmp_object );
00268
00269 var y = +x;
00270 assert( y != x );
00271 assert( y.size() == 2 );
00272
00273
00274 assert( object().class_name() == "" );
00275 assert( object("hello").class_name() == "hello" );
00276
00277
00278 assert_not_supported( x() );
00279 assert_not_supported( x(12,13) );
00280 assert( x.max_args() == -1 );
00281
00282
00283 assertx( object("hello").as_string() == "hello" );
00284 assertx( x.as_int() == 0 );
00285 assertx( x.as_double() == 0.0 );
00286
00287
00288 assert( !object() );
00289 assert( var(object().extend("a",1)) );
00290
00291
00292 var i = x.begin();
00293
00294
00295 assert( *i == "a" );
00296
00297
00298 assert( i.key() == "a" );
00299
00300
00301 assert( i.value() == 1 );
00302
00303
00304 ++i;
00305
00306
00307 assert( *i == "b" );
00308 assert( i.key() == "b" );
00309 assert( i.value() == 2 );
00310
00311
00312 ++i;
00313 assert( i == x.end() );
00314
00315
00316 x = object().extend("a",1)("b",2);
00317 x.erase("a");
00318 assert( x.contains("b") );
00319 assert( !x.contains("a") );
00320 assert( !x.contains("c") );
00321
00322
00323 assert_throws( expired_iterator, foreach( i, x ) x["p"] = 1 );
00324
00325
00326 x = object().extend("a",12)("b","hello");
00327 var str="";
00328 foreach(i, x) str += x[i];
00329 assertx( str == "12hello" );
00330
00331
00332 str="";
00333 foreach(i, reverse(x)) str += x[i];
00334 assertx( str == "hello12" );
00335
00336
00337 assertx( x.size() == 2 );
00338
00339
00340 assertx( x.keys() == x );
00341
00342
00343 str = "";
00344 foreach( i, x.values() ) str += i;
00345 assertx( str == "12hello" );
00346
00347
00348 assert_not_supported( x.insert(2) );
00349 assert_not_supported( x.insert(2,3) );
00350
00351 assert_not_supported( x.push_back(2) );
00352 assert_not_supported( x.pop_back() );
00353 assert_not_supported( x.push_front(1) );
00354 assert_not_supported( x.pop_front() );
00355
00356 assert_not_supported( x.back() );
00357 assert_not_supported( x.front() );
00358
00359
00360 x.clear();
00361 assert( !x );
00362
00363
00364 x.extend("a",12)("b","hello");
00365 assertx( x.contains("a") );
00366 assertx( x.contains("b") );
00367 assertx( !x.contains("c") );
00368
00369
00370 x.erase("c");
00371 x.erase("a");
00372 assertx( !x.contains("a") );
00373
00374
00375 x["a"] = 12;
00376 ++ x["a"];
00377 assert( x["a"] == 13 );
00378 x["a"]++;
00379 assert( x["a"] == 14 );
00380
00381
00382 -- x["a"] ;
00383 assert( x["a"] == 13 );
00384 x["a"]--;
00385 assert( x["a"] == 12 );
00386
00387
00388 x["a"] += 4;
00389 assert( x["a"] == 16 );
00390
00391
00392 x["a"]-=3;
00393 assert( x["a"] == 13 );
00394
00395
00396
00397
00398 x += object().extend("c","c_member");
00399 assert( x["c"] == "c_member" );
00400 assert( x["a"] == 13 );
00401
00402
00403 y = var(object().extend("a",1)) + var(object().extend("b",2));
00404 assert( y["a"] == 1 );
00405 assert( y["b"] == 2 );
00406
00407
00408
00409 assert_not_supported( x-null );
00410 assert_not_supported( x*null );
00411 assert_not_supported( x/null );
00412 assert_not_supported( x%null );
00413
00414
00415 assert_not_supported( x-=null );
00416 assert_not_supported( x*=null );
00417 assert_not_supported( x/=null );
00418 assert_not_supported( x%=null );
00419 }
00420
00421
00422 void test_empty_container(var c)
00423 {
00424 assert( c.empty() );
00425 assert( c.size() == 0 );
00426 assert( null == c.front() );
00427 assert( null == c.back() );
00428 assert( c.begin() == c.end() );
00429 assert( c.rbegin() == c.rend() );
00430 }
00431
00432
00433
00434 void test_container_basics(var c)
00435 {
00436
00437
00438 assert(c.begin() == c.begin());
00439 assert(c.end() == c.end());
00440
00441
00442 assert( c.size() == 3 );
00443
00444
00445
00446 assert( *c.begin() == 1 );
00447 assert( c.begin().value() == 1 );
00448
00449
00450 assert( std::distance(c.begin(), c.end()) == 3 );
00451
00452
00453 assert( c.front() == 1 );
00454 assert( c.back() == 3 );
00455
00456
00457 assert( c.rbegin() == c.rbegin() );
00458 assert( c.rend() == c.rend() );
00459 assert( *c.rbegin() == 3 );
00460 assert( c.rbegin().value() == 3 );
00461 assert( std::distance(c.rbegin(), c.rend()) == 3 );
00462
00463
00464 assert( c.begin() == --++c.begin() );
00465 assert( c.rbegin() == --++c.rbegin() );
00466
00467
00468 assert( c == c );
00469
00470
00471 var d = +c;
00472 d.clear();
00473 assert( c.size() == 3 );
00474
00475 test_empty_container(d);
00476
00477
00478 var e = c.enumerator();
00479 assert( *e == 1 );
00480 assert( *++e == 2 );
00481 assert( *++e == 3 );
00482 assert( !++e );
00483
00484 var re = c.reverse_enumerator();
00485 assert( *re == 3 );
00486 assert( *++re == 2 );
00487 assert( *++re == 1 );
00488 assert( !++re );
00489 }
00490
00491
00492 void test_get_negative_array_index()
00493 {
00494 var x = array()[-1];
00495 }
00496
00497
00498 void test_set_negative_array_index()
00499 {
00500 array()[-1] = var();
00501 }
00502
00503
00504 var one()
00505 {
00506 return 1;
00507 }
00508
00509
00510 void test_array()
00511 {
00512
00513 var a1 = array();
00514 assert( array().as_string() == "[]" );
00515 assert( array(1).as_string() == "[1]" );
00516 assert( array(1)(2).as_string() == "[1,2]" );
00517 assert( array(1,2).as_string() == "[1,2]" );
00518 assert( array(1)(2)(3).as_string() == "[1,2,3]" );
00519 assert( array(1,2,3).as_string() == "[1,2,3]" );
00520
00521 var ca[] = { 1,2,3 };
00522 assert( array(ca).as_string() == "[1,2,3]" );
00523
00524
00525 assert( array_from(range(1,3)).as_string() == "[1,2,3]" );
00526
00527
00528 assertx( lex_equal( array(1,2), array(1)(2) ) );
00529 assertx( lex_equal( array(1,2,3), array(1)(2)(3) ) );
00530 assertx( lex_equal( array(1,2,3,4), array(1)(2)(3)(4) ) );
00531 assertx( lex_equal( array(1,2,3,4,5), array(1)(2)(3)(4)(5) ) );
00532 assertx( lex_equal( array(1,2,3,4,5,6), array(1)(2)(3)(4)(5)(6) ) );
00533 assertx( lex_equal( array(1,2,3,4,5,6,7), array(1)(2)(3)(4)(5)(6)(7) ) );
00534 assertx( lex_equal( array(1,2,3,4,5,6,7,8), array(1)(2)(3)(4)(5)(6)(7)(8) ) );
00535 assertx( lex_equal( array(1,2,3,4,5,6,7,8,9), array(1)(2)(3)(4)(5)(6)(7)(8)(9) ) );
00536 assertx( lex_equal( array(1,2,3,4,5,6,7,8,9,10), array(1)(2)(3)(4)(5)(6)(7)(8)(9)(10) ) );
00537
00538
00539 var a4 = fill_array(20, "x");
00540 assert(a4.size() == 20);
00541 assert(a4[0] == "x");
00542 assert(a4[19] == "x");
00543 assert(a4[-1] == "x");
00544
00545 assert( a4.as_int() == 0 );
00546 assert( a4.as_double() == 0.0 );
00547 assert( a4.impl().as_ptr() == 0 );
00548
00549 assert_throws( not_found, fill_array(-1, "") );
00550
00551 assert( a1.class_name() == "array" );
00552 assert( a1.max_args() == 1 );
00553 assert_throws( not_supported, a1() );
00554
00555
00556 assert( a1.empty() );
00557 assert( a1.size() == 0 );
00558
00559
00560 test_enumerator( array(), 0 );
00561 test_enumerator( array(1,2,3), 3 );
00562 assert( lex_equal( array(1,2,3), reverse(array(3,2,1)) ) );
00563
00564
00565 a1.impl().reserve( 10 );
00566 assert( a1.impl().capacity() >= 10 );
00567
00568
00569 a1.push_back(2);
00570
00571
00572 assert( !a1.empty() );
00573 assert( a1.size() == 1 );
00574 assert( a1[0] == 2 );
00575
00576
00577 a1.pop_back();
00578 assert( a1.empty() );
00579
00580
00581 a1.pop_back();
00582 assert( a1.empty() );
00583
00584
00585 assert( a1[1] == null );
00586
00587
00588 a1.push_back(100);
00589 assert(a1[-1] == 100);
00590 assert(a1[-2] == null);
00591
00592
00593 a1[-1] = 12;
00594 assert( a1[-1] == 12 );
00595 assert_throws( not_found, a1[-2] = 2);
00596
00597
00598 a1[0] = var(one);
00599 assert( a1[0]() == 1 );
00600 assert( a1["0"]() == 1 );
00601
00602
00603
00604 a1[10] = "fish";
00605 assert( a1[10] == "fish" );
00606 assert( a1[5] == null );
00607 assert( a1.size() == 11 );
00608
00609
00610 char str[] = "hello";
00611 var a2 = array_it(str, str+strlen(str));
00612 assert( a2[0] == 'h' );
00613 assert( a2[4] == 'o' );
00614 assert( var(a2[4]).as_string() == "o" );
00615
00616
00617 assert( a2 == a2 );
00618 assert( lex_equal(a2, +a2) );
00619 assert( a2 != array() );
00620 assert( a2 != null );
00621
00622 {
00623 var a3 = array();
00624 a3[0] = "1";
00625 a3[1] = "2";
00626 var a4 = array();
00627 a4[0] = 1;
00628 a4[1] = 2;
00629 assert( a3 != a4 );
00630 assert( a4 != a3 );
00631 }
00632
00633
00634 {
00635 char str1[]="hello", str2[]="help";
00636 var a1 = array_it(str1, str1+5), a2 = array_it(str2, str2+4);
00637 assert( lex_lt(a1, a2) );
00638 assert( a1 <= a1 );
00639
00640
00641 assert( var("hello") < a1 );
00642 }
00643
00644
00645 assert_not_supported( a1.insert(3) );
00646
00647 a1 = array(1,2,3);
00648 a1.insert(1, array(4,5) );
00649 assertx( a1.as_string() == "[1,4,5,2,3]" );
00650 a1.insert(-6, array(9,10));
00651 assertx( a1.as_string() == "[9,10,null,1,4,5,2,3]" );
00652 a1 = array(2,3);
00653 a1.insert(4, array(1,2));
00654 assert( lex_equal( a1, array(2)(3)(null)(null)(1)(2) ) );
00655 a1 = array(2,3);
00656 assert_throws( expired_iterator, a1.insert(4,a1) );
00657
00658
00659 a1 = array(1,2,3);
00660 a1.erase(0);
00661 assertx( a1.as_string() == "[2,3]" );
00662
00663 a1.erase(range(0,1));
00664 assert( !a1 );
00665
00666 a1 = array(1,2,3);
00667 a1.erase( range(1,10) );
00668 assert( a1.size() == 1 );
00669 assert( a1[0] == 1 );
00670 a1.erase(range(-10,5));
00671
00672 a1 = array(1,2,3);
00673 a1.erase(range(10,20));
00674 assert( a1.size() == 3 );
00675
00676 a1.erase(range(-1,-2));
00677 assert( a1.size() == 1 && a1[0] == 1 );
00678
00679 a1 = array(1,2,3);
00680 a1.erase( range_ex(1,1) );
00681 assert( a1.size() == 3 );
00682
00683 a1.erase(-1);
00684 assert( a1.as_string() == "[1,2]" );
00685
00686
00687 {
00688 char str1[]="hello";
00689 var a1 = array_it(str1, str1+5);
00690 a1.resize(3);
00691 assert( lex_equal(a1, array_it(str1, str1+3)) );
00692 }
00693
00694
00695 var a3 = array();
00696 a3[0] = 1;
00697 a3[1] = 2;
00698 a3[2] = 3;
00699 test_container_basics(a3);
00700 test_empty_container(array());
00701
00702
00703 assert( a3 );
00704 assert( !array() );
00705
00706
00707 assert( a3.as_string() == "[1,2,3]" );
00708 assert( a3.as_wstring() == L"[1,2,3]" );
00709
00710
00711 assert( a3.proxy().as_string() == "[1,2,3]" );
00712
00713
00714 assert( array(2,3,4).keys() == range(0,2) );
00715
00716
00717 assert( a3.values() == a3 );
00718
00719
00720 assert( a3[1] == 2 );
00721 assert( a3["1"] == 2 );
00722 assert( a3[var(1)] == 2 );
00723 assert( a3[-1] == 3 );
00724 assert( a3[10] == null );
00725 assert( a3[-10] == null );
00726
00727
00728 assert( (a3[1] = 10) == 10 );
00729 assert( (a3["1"] = 5) == 5 );
00730 assert( (a3[var(1)] = 2) == 2 );
00731
00732
00733 assert_throws( not_supported, a3.push_front(1) );
00734
00735
00736 assert_throws( not_supported, a3.pop_front() );
00737
00738
00739 a3.clear();
00740 assert( !a3 );
00741
00742
00743 a3 = array(1,2,3);
00744 assert(a3.contains(0));
00745 assert(a3.contains(2));
00746 assert(!a3.contains(3));
00747 assert(a3.contains(-1));
00748 assert(a3.contains(-3));
00749 assert(!a3.contains(-4));
00750
00751
00752 assert_throws( expired_iterator, *array().begin() );
00753 assert_throws( expired_iterator, *array().end() );
00754 a1 = array(1);
00755 var ia1 = a1.begin();
00756 a1.push_back(2);
00757 assert_throws( expired_iterator, *ia1 );
00758 ++(array().begin());
00759
00760 std::pair<std::size_t, std::size_t> r;
00761 assert_not_supported( array().impl().get_range(10,r) );
00762
00763
00764 assertx( lex_equal(array(1)(2) + array(3)(4), array(1)(2)(3)(4) ) );
00765 assertx( (array(1)(2) + array(3)(4)).as_string() == "[1,2,3,4]" );
00766 assertx( !(array() + 5) );
00767
00768
00769 var a = array(1,2,3);
00770 assert_not_supported( a-1 );
00771 assert_not_supported( a/1 );
00772 assert_not_supported( a%1 );
00773 assert( +a != a );
00774 assert_not_supported ( -a );
00775 assert_not_supported( a<<1 );
00776 assert_not_supported( a>>1 );
00777 assert_not_supported( a&1 );
00778 assert_not_supported( a|1 );
00779 assert_not_supported( ~a );
00780
00781
00782 a = array(1,2,3);
00783 a += +a;
00784 assertx( lex_equal(a, array(1)(2)(3)(1)(2)(3) ) );
00785
00786
00787 assertx( lex_equal(array(1,2)*3, array(1)(2)(1)(2)(1)(2) ) );
00788 assertx( lex_equal(array(1,2)*0, array() ) );
00789
00790
00791 a = array(2,3);
00792 a *= 3;
00793 assertx( lex_equal( a, array(2)(3)(2)(3)(2)(3) ) );
00794 a *= 0;
00795 assertx( !a );
00796
00797
00798 assert_not_supported( a-=2 );
00799 assert_not_supported( a/=2 );
00800 assert_not_supported( a%=2 );
00801 assert_not_supported( a<<=2 );
00802 assert_not_supported( a>>=2 );
00803 assert_not_supported( a&=2 );
00804 assert_not_supported( a|=2 );
00805 assert_not_supported( a^=2 );
00806 }
00807
00808
00809 void test_comma_lists()
00810 {
00811 var l[] = { 1,2,3 };
00812 assert( var(l).as_string() == "[1,2,3]" );
00813 }
00814
00815
00816 void test_list()
00817 {
00818
00819
00820 var cl[] = { 1,2,3 };
00821 assert( list(cl).as_string() == "[1,2,3]" );
00822
00823 assert( list().as_string() == "[]" );
00824 assert( list(1).as_string() == "[1]" );
00825 assert( list(1)(2)(3).as_string() == "[1,2,3]" );
00826 assert( lex_equal( list_from(array(1)(2)(3)), list(1)(2)(3)) );
00827
00828 assert( lex_equal( list_it(cl, cl+3), range(1,3) ) );
00829
00830 var l = list();
00831 assert( l.empty() );
00832 assert( l.size() == 0 );
00833 assert( l.begin() == l.end() );
00834 assert( l.rbegin() == l.rend() );
00835
00836
00837 assertx( lex_equal( list(1,2), list(1)(2) ) );
00838 assertx( lex_equal( list(1,2,3), list(1)(2)(3) ) );
00839 assertx( lex_equal( list(1,2,3,4), list(1)(2)(3)(4) ) );
00840 assertx( lex_equal( list(1,2,3,4,5), list(1)(2)(3)(4)(5) ) );
00841 assertx( lex_equal( list(1,2,3,4,5,6), list(1)(2)(3)(4)(5)(6) ) );
00842 assertx( lex_equal( list(1,2,3,4,5,6,7), list(1)(2)(3)(4)(5)(6)(7) ) );
00843 assertx( lex_equal( list(1,2,3,4,5,6,7,8), list(1)(2)(3)(4)(5)(6)(7)(8) ) );
00844 assertx( lex_equal( list(1,2,3,4,5,6,7,8,9), list(1)(2)(3)(4)(5)(6)(7)(8)(9) ) );
00845 assertx( lex_equal( list(1,2,3,4,5,6,7,8,9,10), list(1)(2)(3)(4)(5)(6)(7)(8)(9)(10) ) );
00846
00847
00848 assert( l.class_name() == "list" );
00849 assert( l.impl().shared_var() );
00850
00851
00852 assert_not_supported( l() );
00853 assert( l.max_args() == 1 );
00854
00855
00856 assert( l.as_int() == 0 );
00857 assert( l.as_double() == 0.0 );
00858 assert( !list() );
00859 assert( list(1) );
00860
00861
00862 l=list();
00863 l.push_back(2);
00864 var l2=+l;
00865 assert( l2 != l );
00866 l2.clear();
00867 assert( l.back() == 2 );
00868
00869
00870
00871 l=list();
00872 assert( null == l.pop_back() );
00873 l.push_back(1);
00874 assert( l.size() == 1 );
00875 assert( !l.empty() );
00876
00877 assert(l.pop_back() == 1 );
00878 assert( l.empty() );
00879
00880
00881 l.clear();
00882 l.push_back(1);
00883 l.push_back(2);
00884 l.push_front(3);
00885
00886
00887 assert( l.as_string() == "[3,1,2]" );
00888 assert( l.as_wstring() == L"[3,1,2]" );
00889 assert( list().as_string() == "[]" );
00890
00891 assert( l.back() == 2 );
00892 assert( l.front() == 3 );
00893 assert( l.pop_front() == 3 );
00894 assert( l.pop_back() == 2 );
00895 assert( l.front() == 1 );
00896 assert( l.back() == 1 );
00897
00898
00899 l.push_back(2);
00900 l.push_front(3);
00901
00902 assert( std::distance(l.begin(), l.end()) == 3 );
00903 assert( std::distance(l.rbegin(), l.rend()) == 3 );
00904 assert( *l.begin() == 3 );
00905 assert( *l.rbegin() == 2 );
00906
00907 var b = l.begin();
00908 l.clear();
00909 assert_throws( expired_iterator, ++b );
00910
00911
00912 char str[]="hello";
00913 l2 = list_it(str, str+5);
00914 var l3 = +l2;
00915 assert( lex_equal(l2, l3) );
00916 l3.pop_back();
00917 assert(lex_lt(l3,l2));
00918 l3.push_back('p');
00919 assert( lex_lt(l2, l3) );
00920
00921
00922 assert( lex_equal(l3, unpickle(pickle(l3)) ));
00923
00924
00925 test_container_basics( list(1)(2)(3) );
00926
00927
00928 assert_not_supported( (var)l[0] );
00929 assert_not_supported( (l[0]=2) );
00930
00931
00932 assert( l.keys().empty() );
00933 assert( l.values() == l );
00934
00935 assert_not_supported( l.insert(1) );
00936
00937 assert( !l.contains(1) );
00938
00939
00940 l.erase( l.begin() );
00941 l = list(1)(2)(3);
00942 l.erase(l.begin());
00943 l.erase(l.end());
00944 assert( l.as_string() == "[2,3]" );
00945 l.erase( ++l.begin() );
00946 assert( l.as_string() == "[2]" );
00947
00948
00949 assert_not_supported( l.mixin(null) );
00950
00951
00952 assert( lex_equal( list(1)(2)*2, list(1)(2)(1)(2) ) );
00953 assert( lex_equal( list(1)(2)+list(3)(4), list(1)(2)(3)(4) ) );
00954 l = list(1)(2);
00955 l *= 3;
00956 assert( l.as_string() == "[1,2,1,2,1,2]" );
00957 l = list(1)(2);
00958 l += list(3)(4);
00959 assert( l.as_string() == "[1,2,3,4]" );
00960 }
00961
00962
00963
00964 void test_map()
00965 {
00966
00967 var m = map();
00968
00969 assert( m.class_name() == "map" );
00970 assert( m != map() );
00971 assert( m.impl().comparison_index() == cmp_map );
00972
00973
00974 m[4] = "fish";
00975 m["haddock"] = 0;
00976 m["cod"] = 12;
00977 m[12] = 13;
00978
00979 assert( m.as_string() == "{4:fish,12:13,cod:12,haddock:0}" );
00980 assert( m.as_wstring() == L"{4:fish,12:13,cod:12,haddock:0}" );
00981 assert( map().as_string() == "{}" );
00982
00983 assert( m.as_int() == 0 );
00984 assert( m.as_double() == 0.0 );
00985
00986
00987 assert( m );
00988 assert( !map() );
00989
00990
00991 assert( map()(1,2)[1] == 2 );
00992 assert( map(3,4)(5,6)[3] == 4 );
00993 assert( map(3,4)(5,6)(7,8)[7] == 8 );
00994
00995
00996 m[12] = 13;
00997 assert( m[12] == 13 );
00998
00999 assert_not_supported( m() );
01000 assert( m.max_args() == 2 );
01001
01002
01003 assert( m.contains(12) );
01004 assert( !m.contains("12") );
01005
01006
01007 assert_not_supported( m.push_back(null) );
01008 assert_not_supported( m.push_front(null) );
01009 assert_not_supported( m.pop_back() );
01010 assert_not_supported( m.pop_front() );
01011 assert_not_supported( m.back() );
01012 assert_not_supported( m.front() );
01013
01014
01015 var m1 = map();
01016 m1["a"] = 12;
01017 m1["b"] = 13;
01018 m1["c"] = 14;
01019
01020 var m2 = +m1;
01021
01022
01023 assert( lex_equal(m1, m2) );
01024
01025 m2.erase("c");
01026 assert( lex_lt(m2, m1) );
01027
01028 test_enumerator(m1, 3);
01029
01030 var str="";
01031 foreach( i, reverse(m1) ) str += i;
01032 assert( str == "cba" );
01033
01034
01035 assert( m1.size() == 3 );
01036 assert( map().size() == 0 );
01037
01038
01039 assert_not_supported( map().resize(2) );
01040
01041
01042 str="";
01043 foreach( i, m1.values() ) str += i;
01044 assert( str == "121314" );
01045
01046
01047 assert( m2.as_string() == unpickle(pickle(m2)).as_string() );
01048 assert( m1.as_string() == unpickle(pickle(m1)).as_string() );
01049
01050
01051 m[123]=123;
01052 m.erase(123);
01053 assert( !m.contains(123) );
01054
01055
01056 var m3 = map().extend("1",1)("2",2)("3",3);
01057 var m4 = map().extend("4",4);
01058 var m5 = m3+m4;
01059 assert( m5["1"] == 1 );
01060 assert( m5["4"] == 4 );
01061 m5.erase(4);
01062 m5 += m4;
01063 assert( m5["4"] == 4 );
01064 }
01065
01066
01067
01068 void test_set()
01069 {
01070
01071 var s = set();
01072
01073 assert( lex_equal( set_from(range(1,3)), range(1,3) ) );
01074 char str[] = "abc";
01075 assert( lex_equal( set_it(str,str+3), "abc" ) );
01076
01077 assert( s.impl().shared_var() );
01078 assert( s.class_name() == "set" );
01079 assert( s < map() );
01080 assert( s==s );
01081 assert( s!=+s );
01082 assert( s.impl().comparison_index() == cmp_set );
01083
01084
01085 assertx( lex_equal( set(1,2), set(1)(2) ) );
01086 assertx( lex_equal( set(1,2,3), set(1)(2)(3) ) );
01087 assertx( lex_equal( set(1,2,3,4), set(1)(2)(3)(4) ) );
01088 assertx( lex_equal( set(1,2,3,4,5), set(1)(2)(3)(4)(5) ) );
01089 assertx( lex_equal( set(1,2,3,4,5,6), set(1)(2)(3)(4)(5)(6) ) );
01090 assertx( lex_equal( set(1,2,3,4,5,6,7), set(1)(2)(3)(4)(5)(6)(7) ) );
01091 assertx( lex_equal( set(1,2,3,4,5,6,7,8), set(1)(2)(3)(4)(5)(6)(7)(8) ) );
01092 assertx( lex_equal( set(1,2,3,4,5,6,7,8,9), set(1)(2)(3)(4)(5)(6)(7)(8)(9) ) );
01093 assertx( lex_equal( set(1,2,3,4,5,6,7,8,9,10), set(1)(2)(3)(4)(5)(6)(7)(8)(9)(10) ) );
01094
01095
01096 var s1 = set(1)(2), s2=+s1;
01097 s1.erase(1);
01098 assert( s2.contains(1) );
01099
01100
01101 assert( !set() );
01102 assert( set(1) );
01103
01104
01105 assert( set(2)(1).as_string() == "{1,2}" );
01106 assert( set().as_string() == "{}" );
01107 assert( set(2)(1).as_wstring() == L"{1,2}" );
01108 assert( set().as_wstring() == L"{}" );
01109
01110
01111 assert( lex_equal( unpickle(pickle(set(1)(2)(3))), array(1)(2)(3) ) );
01112
01113
01114 assert( s.max_args() == 1 );
01115
01116
01117 s1 = set(1)(2)(3);
01118 s1.erase(2);
01119 assert( lex_equal( s1, set(1)(3) ) );
01120
01121
01122 assert( s1.contains(1) );
01123 assert( !s1.contains(2) );
01124
01125
01126 assert( s1.size() == 2 );
01127 assert( set().size() == 0 );
01128
01129
01130 assert( set().empty() );
01131 assert( !s1.empty() );
01132
01133 test_container_basics( set(1)(2)(3) );
01134
01135
01136 assert_not_supported( s1[1] == null );
01137 assert_not_supported( s1[1] = null );
01138
01139
01140 assert( lex_equal( reverse(set(1)(2)(3)), list(3)(2)(1) ) );
01141
01142
01143 s1 = set(1);
01144 s1.clear();
01145 assert( !s1 );
01146
01147
01148 s = set();
01149 s.insert(2);
01150 s.insert(2);
01151 assert( s.contains(2) );
01152
01153
01154 s = set("a")(1)(0.2);
01155 assert( s.keys().empty() );
01156
01157
01158 assert( s.values() == s );
01159
01160
01161 assert( lex_equal( set(1)(2) + set(2)(3), set(1)(2)(3) ) );
01162 assert( lex_equal( set(1)(2) - set(2)(3), set(1) ) );
01163 assert( lex_equal( set(1)(2)(3)(4) * set(2)(4)(5), set(2)(4) ) );
01164
01165
01166 s = set(1)(2)(3);
01167 s += array(4)(5);
01168 assert( lex_equal( s, array(1)(2)(3)(4)(5) ) );
01169 s-=array(2)(1);
01170 assert( lex_equal(s, array(3)(4)(5) ) );
01171 s*=set(3)(5)(6);
01172 assert( lex_equal(s, array(3)(5) ) );
01173
01174 s.mixin(set(1));
01175 assert( lex_equal(s, array(1)(3)(5) ) );
01176 }
01177
01178
01179 void test_reverse()
01180 {
01181
01182 var items[] = { 1, 2, 3 };
01183 var ritems = reverse(items);
01184
01185
01186 assert( ritems.impl().shared_var() );
01187
01188 assert( ritems.class_name() == "reverse" );
01189 assert( ritems.impl().comparison_index() == cmp_reverse );
01190 assert( null < ritems );
01191
01192
01193 assert( +ritems != ritems );
01194 assert( (+ritems).as_string() == "reverse([1,2,3])" );
01195
01196
01197 assert( ritems == var(object().extend("x", ritems))["x"] );
01198 assert_throws( not_supported, ritems() );
01199 assert( ritems.max_args() == -1 );
01200
01201
01202 assert( ritems.as_string() == "reverse([1,2,3])" );
01203 assert( ritems.as_wstring() == L"reverse([1,2,3])" );
01204
01205
01206 assert( ritems.proxy() != ritems );
01207 assert( ritems.proxy().as_string() == "reverse([1,2,3])" );
01208
01209
01210 assert( unpickle(pickle(ritems)).as_string() == "reverse([1,2,3])" );
01211
01212 assert( ritems.as_int() == 0 );
01213 assert( ritems.as_double() == 0 );
01214 assert( ritems );
01215 assert( !ritems.impl().as_ptr() );
01216
01217
01218 assert( std::distance( ritems.begin(), ritems.end() ) == 3 );
01219 assert( std::distance( ritems.rbegin(), ritems.rend() ) == 3 );
01220
01221
01222 var total="";
01223 foreach( i, ritems ) total += i;
01224 assert( total == "321" );
01225 foreach( i, reverse(ritems) ) total += i;
01226 assert( total == "321123" );
01227
01228
01229 assert( ritems.size() == 3 );
01230
01231
01232 assert_throws( not_supported, ritems.resize(2) );
01233
01234 ritems.impl().reserve(10);
01235 assert( ritems.impl().capacity() == 0 );
01236
01237
01238 ritems.clear();
01239 assert( !ritems );
01240 assert( ritems.empty() );
01241 ritems = reverse(items);
01242 assert( !ritems.empty() );
01243
01244
01245 var rkeys = ritems.keys();
01246 assert( rkeys[0] == 0 );
01247 assert( rkeys[2] == 2 );
01248 assert( rkeys.size() == 3 );
01249
01250
01251 assert( ritems.values().as_string() == ritems.as_string() );
01252
01253
01254 assert( ritems[0] == 1 );
01255 assert( ritems[2] == 3 );
01256
01257
01258 assert_throws( not_supported, ritems[2] = 2 );
01259 assert_throws( not_supported, ritems.insert(2) );
01260 assert_throws( not_supported, ritems.insert(2,3) );
01261
01262
01263 assert( ritems.front() == 3 );
01264 assert( ritems.back() == 1 );
01265
01266 assert( ritems.pop_front() == 3 );
01267 assert( ritems.pop_front() == 2 );
01268 assert( ritems.pop_front() == 1 );
01269
01270 var l = list();
01271 var rlist = reverse(l);
01272 rlist.push_back(2);
01273 rlist.push_back(3);
01274 rlist.push_front(1);
01275 assert(rlist.back() == 3);
01276 assert(l.front() == 3);
01277 assert(rlist.front() == 1);
01278 assert(l.back() == 1);
01279 assert( rlist.pop_back() == 3 );
01280
01281
01282 ritems = reverse(items);
01283 assert( ritems.contains(1) );
01284 assert( !ritems.contains(3) );
01285
01286
01287 var obj = object().extend("x", 12);
01288 reverse(obj).erase("x");
01289 assert( !obj );
01290 }
01291
01292
01293 void assert_sequence_equals(var s0, var s1)
01294 {
01295 assert( s0.size() == s1.size() );
01296 for(var i0=s0.begin(), i1=s1.begin(); i0!=s0.end(); ++i0, ++i1)
01297 {
01298 assert( *i0 == *i1 );
01299 }
01300
01301 for(var i0=s0.enumerator(), i1=s1.enumerator(); i0 && i1; ++i0, ++i1)
01302 {
01303 assert( *i0 == *i1 );
01304 }
01305 }
01306
01307
01308 void test_sequence()
01309 {
01310
01311 var s0 = range_ex(0,0);
01312 var s1 = range(1,3);
01313 var s2 = range(1,1);
01314 var s3 = range(2,1);
01315 var s4 = range_ex(2,1);
01316 var s5 = sequence(10,10);
01317 var s6 = sequence(10,5,2);
01318
01319
01320 assert( s0.size() == 0 );
01321 assert( !s0 );
01322 assert( s1.size() == 3 );
01323 assert( s1 );
01324 assert( s2.size() == 1 );
01325 assert( s3.size() == 2 );
01326 assert( s4.size() == 1 );
01327 assert( s5.size() == 10 );
01328 assert( s6.size() == 5 );
01329
01330
01331 assert( s0.class_name() == "sequence" );
01332
01333
01334 assert( s0.impl().shared_var() );
01335
01336
01337 assert( s0.impl().comparison_index() == cmp_sequence );
01338
01339
01340 assert( s0.max_args() == -1 );
01341
01342
01343 assert( s1 > null );
01344 assert( s1 == s1 );
01345 assert( range(1,1) == range_ex(1,2) );
01346 assert( range(1,2) < range(1,3) );
01347 assert( range(1,10) < range(2,4) );
01348 assert( sequence(1,0,-1) == sequence(1,0,4) );
01349 assert( range(1,1) == sequence(1,1,1) );
01350 assert( range(2,1) == sequence(2,2,-1) );
01351 assert( range_ex(4,4) == sequence(4,0) );
01352 assert( range_ex(4,3) == sequence(4,1,-1) );
01353 assert( sequence(10,10) == sequence(10,10,1) );
01354
01355
01356 assert( s1 == +s1 );
01357 assert( +s3 == s3 );
01358 (+s3).resize(100);
01359 assert( s3.size() == 2 );
01360
01361
01362 var o = object();
01363 o["x"] = s1;
01364 assert( o["x"] == s1 );
01365
01366
01367 assert( range(1,4).as_string() == "sequence(1,4,1)" );
01368 assert( range(1,4).as_wstring() == L"sequence(1,4,1)" );
01369 assert( range_ex(4,2).as_string() == "sequence(4,2,-1)" );
01370 assert( range_ex(4,2).as_wstring() == L"sequence(4,2,-1)" );
01371 assert( sequence(10,2,3).as_string() == "sequence(10,2,3)" );
01372
01373
01374 assert( range(1,2).proxy().as_string() == "sequence(1,2,1)" );
01375
01376
01377 assert( unpickle(pickle(s1)) == s1 );
01378 assert( unpickle(pickle(s6)) == s6 );
01379
01380
01381 assert_throws( not_supported, s0() );
01382
01383
01384 assert( range(4,2).as_int() == 4 );
01385
01386
01387 assert( range(4,2).as_double() == 4.0 );
01388
01389
01390 assert( range(1,1) );
01391 assert( !range_ex(1,1) );
01392
01393
01394 assert( !s0.impl().as_ptr() );
01395
01396
01397 assert_sequence_equals( range(1,2), reverse(range(2,1)) );
01398 assert_sequence_equals( sequence(5, 4, 3), reverse(sequence(14,4,-3)) );
01399 assert( std::distance( s5.begin(), s5.end() ) == 10 );
01400
01401 assert_throws( not_supported, *s0 );
01402 assert_throws( not_supported, s0.key() );
01403 assert_throws( not_supported, s0.value() );
01404
01405
01406 test_enumerator(range(1,3), 3);
01407 test_container_basics(range(1,3));
01408
01409 s0.impl().reserve(10);
01410 assert( s0.impl().capacity() == 0 );
01411
01412
01413 assert( range_ex(1,1).empty() );
01414 assert( sequence(100, 0, 10).empty() );
01415 assert( !range(1,2).empty() );
01416
01417
01418 assert( range(1,10)[0] == 1 );
01419 assert( sequence(4,3,2)[3] == 10 );
01420 assert( sequence(4,5,2)[-2] == 10 );
01421
01422
01423 assert_throws( not_supported, range(1,10)[1] = 2 );
01424
01425
01426 s0 = range(1,10);
01427 s0.resize(15);
01428 assert( s0 == range(1,15) );
01429
01430
01431 assert_throws( not_supported, s0.insert(1) );
01432 assert_throws( not_supported, s0.insert(null,null) );
01433
01434
01435 assert( range(1,10).keys() == range(0,9) );
01436 assert( sequence(5,3,-1).keys() == range_ex(0,3) );
01437 assert( range_ex(0,10).keys() == range_ex(0,10) );
01438
01439
01440 assert( range(1,10).values() == range(1,10) );
01441
01442
01443 assert_throws( not_supported, s0.push_back(var()) );
01444
01445
01446 assert_throws( not_supported, s0.push_front(var()) );
01447
01448 s0 = sequence(2,3,4);
01449 s1 = sequence(10,0);
01450
01451
01452 assert( s0.back() == 10 );
01453 assert( s1.back() == var() );
01454
01455
01456 assert( s0.front() == 2 );
01457 assert( s1.front() == var() );
01458
01459
01460 assert( s0.pop_front() == 2 );
01461 assert( s0 == sequence(6,2,4) );
01462 assert( s1.pop_front() == var() );
01463 assert( s1 == sequence(10,0) );
01464
01465
01466 assert( s0.pop_back() == 10 );
01467 assert( s0 == sequence(6,1,4) );
01468 assert( s1.pop_front() == var() );
01469 assert( s1 == sequence(10,0) );
01470
01471
01472 s0.clear();
01473 assert( s0 == sequence(6,0) );
01474
01475
01476 s0 = range(1,10);
01477 assert( s0.contains(0) );
01478 assert( s0.contains(9) );
01479 assert( !s0.contains(10) );
01480 assert( !s0.contains(-1) );
01481
01482
01483 s0.erase(12);
01484
01485
01486 assert_throws( not_supported, ++s0["test"] );
01487 assert_throws( not_supported, --s0["test"] );
01488 assert_throws( not_supported, s0["test"]+=2 );
01489 assert_throws( not_supported, s0["test"]-=4 );
01490
01491
01492 assert_throws( not_supported, s0["1"]() );
01493
01494
01495 assert_throws( not_supported, s0.mixin(s1) );
01496
01497
01498 assert_throws( not_supported, s0.key() );
01499 assert_throws( not_supported, s0.value() );
01500 assert_throws( not_supported, *s0 );
01501
01502
01503 assert( ++sequence(12,2) == sequence(13,2) );
01504
01505
01506 assert( --range(5,6) == range(4,5) );
01507
01508
01509 assert( range(3,5)+5 == range(8,10) );
01510
01511
01512 assert( range(3,5)-2 == range(1,3) );
01513
01514
01515 assert( range(2,3)*4 == range(2,9) );
01516
01517
01518 assert_throws( not_supported, s0/2 );
01519 assert_throws( not_supported, s0%2 );
01520 assert_throws( not_supported, -s0 );
01521 assert_throws( not_supported, s0&1 );
01522 assert_throws( not_supported, s0|1 );
01523 assert_throws( not_supported, s0^1 );
01524 assert_throws( not_supported, ~s0 );
01525
01526 s0 = range(2,4);
01527
01528
01529 assert( (s0 += 3) == range(5,7) );
01530
01531
01532 assert( (s0 -= 2) == range(3,5) );
01533
01534
01535 assert( (s0 *= 3) == range(3,11) );
01536
01537
01538 assert_throws( not_supported, s0 /= 2 );
01539 assert_throws( not_supported, s0 %= 2 );
01540 assert_throws( not_supported, s0 <<= 2 );
01541 assert_throws( not_supported, s0 >>= 2 );
01542 assert_throws( not_supported, s0 &= 2 );
01543 assert_throws( not_supported, s0 |= 2 );
01544 assert_throws( not_supported, s0 ^= 2 );
01545 }
01546
01547
01548 void counter_set(var counter, var name, var value)
01549 {
01550 counter[name] = value;
01551 }
01552
01553
01554 var counter_get(var counter, var name)
01555 {
01556 var result = counter.contains(name) ? counter[name] : var(0);
01557 counter[name] = result+1;
01558 return result;
01559 }
01560
01561
01562 var get_rnd(var object, var member)
01563 {
01564 return object["seed"] * 1664525 + 1013904223;
01565 }
01566
01567
01568 var echo(var x)
01569 {
01570 return x;
01571 }
01572
01573
01574 var constant(var x)
01575 {
01576 return bind(echo,x);
01577 }
01578
01579
01580 var record_param(var observer, var value)
01581 {
01582 observer["value"]=value;
01583 return value;
01584 }
01585
01586
01587 var record_param2(var observer, var v1, var v2)
01588 {
01589 observer["value1"] = v1;
01590 observer["value2"]=v2;
01591 return v2;
01592 }
01593
01594
01595 var mock(var observer, var return_val, var input)
01596 {
01597 observer["value"] = input;
01598 return return_val;
01599 }
01600
01601
01602 enable_pickle(counter_get);
01603 enable_pickle(counter_set);
01604 enable_pickle(get_rnd);
01605 enable_pickle(echo)
01606 enable_pickle(constant)
01607 enable_pickle(record_param)
01608 enable_pickle(record_param2)
01609 enable_pickle(mock)
01610
01611
01612 void test_dispatcher()
01613 {
01614 var observer = object();
01615 var record_one_param = bind(record_param, observer);
01616 var record_two_params = bind(record_param2, observer);
01617
01618
01619 var o = object().extend
01620 ("seed", 0)
01621 ("get_member", get_rnd)
01622 ("class_name", constant("class_name"))
01623 ("call", varargs(echo))
01624 ("as_string", constant("as_string"))
01625 ("as_int", constant(123))
01626 ("as_double", constant(0.125))
01627 ("as_bool", constant(true))
01628 ("enumerator", constant("enumerator"))
01629 ("reverse_enumerator", constant("reverse_enumerator"))
01630 ("size", constant(10))
01631 ("empty", constant(false))
01632 ("keys", constant("keys"))
01633 ("values", constant("values"))
01634 ("reserve", record_one_param)
01635 ("insert", record_one_param)
01636 ("capacity", constant(9))
01637 ("set_member", record_two_params)
01638 ("get_member", var(echo))
01639 ;
01640
01641 var d = dispatcher(o);
01642
01643
01644 assert( d.impl().shared_var() );
01645
01646
01647 assert( d.class_name() == "class_name" );
01648
01649
01650 assert( d == d );
01651 assert( d > 2 );
01652 assert( d != dispatcher(o) );
01653 assert( d.impl().comparison_index() == cmp_dispatcher );
01654
01655
01656 o["clone"] = constant(3);
01657 assert( d.clone() == 3 );
01658
01659
01660 var d2 = unpickle(pickle(d));
01661 assert( d2.clone() == 3 );
01662 assert( d2.impl().capacity() == 9 );
01663
01664
01665 assert( lex_equal( d(), array() ) );
01666 assert( lex_equal( d(1), array(1) ) );
01667 assert( lex_equal( d(1,2), array(1)(2) ) );
01668 assert( lex_equal( d(1,2,3), array(1)(2)(3) ) );
01669 assert( lex_equal( d(1,2,3,4), array(1)(2)(3)(4) ) );
01670 assert( lex_equal( d(1,2,3,4,5), array(1)(2)(3)(4)(5) ) );
01671 assert( lex_equal( d(1,2,3,4,5,6), array(1)(2)(3)(4)(5)(6) ) );
01672 assert( lex_equal( d(1,2,3,4,5,6,7), array(1)(2)(3)(4)(5)(6)(7) ) );
01673 assert( lex_equal( d(1,2,3,4,5,6,7,8), array(1)(2)(3)(4)(5)(6)(7)(8) ) );
01674 assert( lex_equal( d(1,2,3,4,5,6,7,8,9), array(1)(2)(3)(4)(5)(6)(7)(8)(9) ) );
01675 assert( lex_equal( d(1,2,3,4,5,6,7,8,9,0), array(1)(2)(3)(4)(5)(6)(7)(8)(9)(0) ) );
01676
01677 assert( d.max_args() == varargs(echo).max_args() );
01678
01679 assert( d.as_string() == "as_string" );
01680 assert( d.as_wstring() == L"as_string" );
01681
01682 assert( d.as_int() == 123 );
01683 assert( d.as_double() == 0.125 );
01684 assert( d );
01685
01686
01687 assert( d.size() == 10 );
01688 assert( d.enumerator() == "enumerator" );
01689 assert( d.reverse_enumerator() == "reverse_enumerator" );
01690 assert( !d.empty() );
01691 assert( d.keys() == "keys" );
01692 assert( d.values() == "values" );
01693
01694 d.insert(12);
01695 assert( observer["value"] == 12 );
01696
01697 d.impl().reserve(13);
01698 assert( observer["value"] == 13 );
01699 assert( d.impl().capacity() == 9 );
01700
01701
01702 o["resize"] = record_one_param;
01703 d.resize(10);
01704 assert( observer["value"] == 10 );
01705
01706
01707 assert( d["fish"] == "fish" );
01708 d["hello"]=10;
01709 assert( observer["value1"] == "hello" );
01710 assert( observer["value2"] == 10 );
01711
01712
01713 o["push_back"] = record_one_param;
01714 d.push_back("push_back");
01715 assert(observer["value"] == "push_back" );
01716
01717
01718 o["push_front"] = record_one_param;
01719 d.push_back("push_front");
01720 assert(observer["value"] == "push_front" );
01721
01722
01723 o["back"] = constant("back");
01724 assert( d.back() == "back" );
01725
01726
01727 o["front"] = constant("front");
01728 assert( d.front() == "front" );
01729
01730
01731 o["pop_back"] = constant("pop_back");
01732 assert (d.pop_back() == "pop_back");
01733
01734
01735 o["pop_front"] = constant("pop_front");
01736 assert (d.pop_front() == "pop_front");
01737
01738
01739 o["clear"] = bind(record_one_param, "clear");
01740 d.clear();
01741 assert( observer["value"] == "clear" );
01742
01743
01744 o["contains"] = record_one_param;
01745 assert( !d.contains(false) );
01746 assert( observer["value"] == false );
01747 assert( !d.contains("") );
01748 assert( observer["value"] == "" );
01749 assert( d.contains(12) );
01750 assert( observer["value"] == 12 );
01751
01752
01753 o["erase"] = record_one_param;
01754 d.erase(13);
01755 assert( observer["value"] == 13 );
01756
01757
01758 o["key"] = constant("key");
01759 assert( d.key() == "key" );
01760
01761
01762 o["value"] = constant("value");
01763 assert( d.value() == "value" );
01764
01765
01766 o["deref"] = constant("DEREF");
01767 assert( *d == "DEREF" );
01768
01769
01770 o["++"] = bind( record_one_param, "inc" );
01771 ++d;
01772 assert( observer["value"] == "inc" );
01773
01774
01775 o["--"] = bind( record_one_param, "dec" );
01776 --d;
01777 assert( observer["value"] == "dec" );
01778
01779
01780 o["+"] = bind(mock, observer, "+");
01781 assert( d + 2 == "+" );
01782 assert( observer["value"] == 2 );
01783
01784 o["-"] = bind(mock, observer, "-");
01785 assert( d - 3 == "-" );
01786 assert( observer["value"] == 3 );
01787
01788 o["*"] = bind(mock, observer, "*");
01789 assert( d * 4 == "*" );
01790 assert( observer["value"] == 4 );
01791
01792 o["/"] = bind(mock, observer, "/");
01793 assert( d / 5 == "/" );
01794 assert( observer["value"] == 5 );
01795
01796 o["%"] = bind(mock, observer, "%");
01797 assert( d % 0 == "%" );
01798 assert( observer["value"] == 0 );
01799
01800 o["neg"] = bind(mock, observer, "-", 1);
01801 assert( -d == "-" );
01802 assert( observer["value"] == 1 );
01803
01804 o["<<"] = bind(mock, observer, "<<");
01805 assert( d<<3 == "<<" );
01806 assert( observer["value"] == 3 );
01807
01808 o[">>"] = bind(mock, observer, ">>");
01809 assert( d>>4 == ">>" );
01810 assert( observer["value"] == 4 );
01811
01812 o["&"] = bind(mock, observer, "&");
01813 assert( (d&1) == "&" );
01814 assert( observer["value"] == 1 );
01815
01816 o["|"] = bind(mock, observer, "|");
01817 assert( (d|2) == "|" );
01818 assert( observer["value"] == 2 );
01819
01820 o["^"] = bind(mock, observer, "^");
01821 assert( (d^3) == "^" );
01822 assert( observer["value"] == 3 );
01823
01824 o["~"] = bind(mock, observer, "~", 0);
01825 assert( ~d == "~" );
01826 assert( observer["value"] == 0 );
01827
01828
01829 o["+="] = record_one_param;
01830 d+=2;
01831 assert( observer["value"] == 2 );
01832
01833 o["-="] = record_one_param;
01834 d-=3;
01835 assert( observer["value"] == 3 );
01836
01837 o["*="] = record_one_param;
01838 d*=4;
01839 assert( observer["value"] == 4 );
01840
01841 o["/="] = record_one_param;
01842 d/=1;
01843 assert( observer["value"] == 1 );
01844
01845 o["%="] = record_one_param;
01846 d%=2;
01847 assert( observer["value"] == 2 );
01848
01849 o["<<="] = record_one_param;
01850 d<<=1;
01851 assert( observer["value"] == 1 );
01852
01853 o[">>="] = record_one_param;
01854 d>>=2;
01855 assert( observer["value"] == 2 );
01856
01857 o["&="] = record_one_param;
01858 d&=3;
01859 assert( observer["value"] == 3 );
01860
01861 o["|="] = record_one_param;
01862 d|=4;
01863 assert( observer["value"] == 4 );
01864
01865 o["^="] = record_one_param;
01866 d^=3;
01867 assert( observer["value"] == 3 );
01868
01869
01870
01871
01872 var counter = dispatcher( map().extend
01873 ("get_member", counter_get)
01874 ("set_member", counter_set) );
01875
01876 assert( counter["champ"] == 0 );
01877 assert( counter["champ"] == 1 );
01878 counter["champ"] = 10;
01879 assert( counter["champ"] == 10 );
01880 assert( counter["champ"] == 11 );
01881 counter[6]=4;
01882 assert( counter[6] == 4 );
01883 assert( counter[6] == 5 );
01884 assert( counter["champ"] ==12 );
01885 }
01886
01887
01888 var is_even(var e)
01889 {
01890 return e%2==0;
01891 }
01892
01893
01894 var not_(var p, var i)
01895 {
01896 return !p(i);
01897 }
01898
01899
01900 var double_(var i)
01901 {
01902 return i*2;
01903 }
01904
01905 enable_pickle(is_even)
01906 enable_pickle(double_)
01907
01908
01909 void test_filter()
01910 {
01911
01912 var f = filter(range(1,10), is_even);
01913
01914 assert( f.impl().shared_var() );
01915 assert( f.class_name() == "filter" );
01916 assert( f.impl().comparison_index() == cmp_filter );
01917 assert( f > 1 );
01918 assert( f != +f );
01919 assert( (+f).as_string() == f.as_string() );
01920
01921 assert( f.max_args() == -1 );
01922
01923 assert( f.as_string() == "filter(sequence(1,10,1))" );
01924 assert( f.as_wstring() == L"filter(sequence(1,10,1))" );
01925
01926 assert( unpickle(pickle(f)).as_string() == f.as_string());
01927
01928 assert( f.size() == 0 );
01929
01930
01931 var e = f.enumerator();
01932 assert(e);
01933 assert( *e == 2 );
01934 assert( *++e == 4 );
01935 assert( *++e == 6 );
01936 assert( *++e == 8 );
01937 assert(e);
01938 assert( *++e == 10 );
01939 assert( !++e );
01940
01941
01942 e = f.reverse_enumerator();
01943 assert(e);
01944 assert( *e == 10 );
01945 assert( *++e == 8 );
01946 assert( *++e == 6 );
01947 assert( *++e == 4 );
01948 assert( *++e == 2 );
01949 ++e;
01950 assert( !e );
01951
01952 foreach( i, filter(null, is_even)) assertx(0);
01953
01954 }
01955
01956
01957 void test_transform()
01958 {
01959
01960 var t = transform(range(1,10), double_);
01961
01962 assert( t.impl().shared_var() );
01963 assert( t.class_name() == "transform" );
01964 assert( t.impl().comparison_index() == cmp_transform );
01965 assert( t > "" );
01966 assert( t != +t );
01967 assert( t.as_string() == (+t).as_string() );
01968
01969 assert( t.max_args() == -1 );
01970
01971 assert( t.as_string() == "transform(sequence(1,10,1))" );
01972 assert( t.as_wstring() == L"transform(sequence(1,10,1))" );
01973
01974 assert( unpickle(pickle(t)).as_string() == t.as_string());
01975
01976 assert( t.size() == 10 );
01977 assert( t );
01978 assert( !range(1,10).empty() );
01979 assert( !t.empty() );
01980
01981
01982 var t2 = transform( range(1,3), double_ );
01983 var e = t2.enumerator();
01984 assert(e);
01985 assert( *e == 2 );
01986 assert( *++e == 4 );
01987 assert( *++e == 6 );
01988 assert(e);
01989 assert( !++e);
01990
01991
01992 e = t2.reverse_enumerator();
01993 assert(e);
01994 assert( *e==6 );
01995 assert( *++e == 4 );
01996 assert( *++e == 2 );
01997 assert( e );
01998 assert( !++e );
01999
02000
02001 foreach( i, transform( filter( range(1,3), is_even ), double_ ) )
02002 assert( i == 4 );
02003
02004 foreach( i, filter( transform(range(1,2), double_), is_even) )
02005 assert( i==2 || i==4 );
02006
02007
02008 assert( t2.front() == 2 );
02009
02010
02011 assert( t2.back() == 6 );
02012 }
02013
02014
02015 void test_tail()
02016 {
02017
02018 var t0 = tail(array());
02019 var t1 = tail(array(1));
02020 var t2 = tail(array(1)(2)(3));
02021
02022
02023 assertx( t0.class_name() == "tail" );
02024
02025
02026 assert( t1.impl().shared_var() );
02027
02028
02029 assertx( t0 == t0 );
02030 assertx( t0 > 0 );
02031 assertx( t0 != t1 );
02032
02033
02034 assert( +t0 != t0 );
02035 assert( (+t0).as_string() == t0.as_string() );
02036
02037
02038 assertx( t0.as_string() == "tail([])" );
02039 assertx( t1.as_wstring() == L"tail([1])" );
02040
02041
02042 assertx( lex_equal( array(2)(3), t2) );
02043 assertx( lex_equal( array(), t1 ) );
02044 assertx( lex_equal( array(), t0 ) );
02045
02046 var total=0;
02047 foreach( i, t2 ) total+=i;
02048 assertx( total == 5 );
02049
02050
02051 assertx( unpickle(pickle(t2)).as_string() == t2.as_string() );
02052
02053
02054 assertx( t0.size() == 0 );
02055 assertx( t1.size() == 0 );
02056 assertx( t2.size() == 2 );
02057
02058
02059 assertx( t0.empty() );
02060 assertx( t1.empty() );
02061 assertx( !t2.empty() );
02062
02063
02064 assertx( tail(array(1)(2)(3)).front() == 2 );
02065
02066
02067 assertx( tail(array(1)(2)(3)).back() == 3 );
02068
02069
02070 assertx( !t0 );
02071 assertx( !t1 );
02072 assertx( t2 );
02073 }