|
reSIProcate/rutil
9694
|
00001 #include "rutil/Data.hxx" 00002 #include "rutil/DataStream.hxx" 00003 #include "rutil/Log.hxx" 00004 #include "assert.h" 00005 #include <iostream> 00006 00007 using namespace resip; 00008 using namespace std; 00009 00010 // for friends 00011 class TestData 00012 { 00013 public: 00014 int main() 00015 { 00016 Log::initialize(Log::Cout, Log::Debug, Data::Empty); 00017 00018 { 00019 const char* txt = "buffer"; 00020 Data d(txt); 00021 // copies 00022 assert(txt != d.data()); 00023 00024 const char* b = d.data(); 00025 d.c_str(); 00026 // not reallocated 00027 assert(b == d.data()); 00028 } 00029 00030 { 00031 const char* txt = "buffer"; 00032 Data d(Data::Share, txt, strlen(txt)); 00033 // shared 00034 assert(txt == d.data()); 00035 00036 d.c_str(); 00037 // reallocated 00038 assert(txt != d.data()); 00039 } 00040 00041 { 00042 const char* txt = "buffer"; 00043 Data d(Data::Borrow, txt, strlen(txt)); 00044 // shared 00045 assert(txt == d.data()); 00046 const char* b = d.data(); 00047 00048 d.c_str(); 00049 // reallocated 00050 assert(b != d.data()); 00051 } 00052 00053 { 00054 const int s = 12; 00055 char* txt = new char[s]; 00056 Data d(Data::Take, txt, s); 00057 // shared 00058 assert(txt == d.data()); 00059 00060 d.c_str(); 00061 // reallocated 00062 assert(txt != d.data()); 00063 } 00064 00065 { 00066 { 00067 int length = 16; 00068 char* buffer = new char [length]; 00069 00070 for (int i=0; i<16; ++i) 00071 { 00072 buffer[i] = ' '; 00073 } 00074 00075 Data target(Data::Take, buffer, length); 00076 std::cerr << target.c_str() << endl; 00077 } 00078 00079 { 00080 Data input("abcdefghij"); 00081 std::cerr << "T0: " << input << std::endl; 00082 input.replace("a", "b"); 00083 std::cerr << "T1: " << input << std::endl; 00084 assert(input == "bbcdefghij"); 00085 input.replace("bb", ""); 00086 std::cerr << "T2: " << input << std::endl; 00087 assert(input == "cdefghij"); 00088 } 00089 { 00090 Data input(""); 00091 std::cerr << "T0: " << input << std::endl; 00092 input.replace("a", "b"); 00093 std::cerr << "T1: " << input << std::endl; 00094 assert(input == ""); 00095 input.replace("bb", ""); 00096 std::cerr << "T2: " << input << std::endl; 00097 assert(input == ""); 00098 } 00099 00100 { 00101 Data from; 00102 Data to; 00103 Data example; 00104 00105 // asserts 00106 //example.replace(from, to); 00107 } 00108 00109 { 00110 Data from("a"); 00111 Data to("b"); 00112 Data example; 00113 00114 example.replace(from, to); 00115 assert(example.empty()); 00116 } 00117 00118 { 00119 Data from("a"); 00120 Data to("b"); 00121 Data example("c"); 00122 00123 example.replace(from, to); 00124 assert(example == "c"); 00125 } 00126 00127 { 00128 Data from("a"); 00129 Data to("b"); 00130 Data example("a"); 00131 00132 example.replace(from, to); 00133 assert(example == "b"); 00134 } 00135 00136 { 00137 Data from("a"); 00138 Data to("b"); 00139 Data example("aaaa"); 00140 00141 example.replace(from, to); 00142 assert(example == "bbbb"); 00143 } 00144 00145 { 00146 Data from("a"); 00147 Data to("b"); 00148 Data example("abracadabra"); 00149 00150 example.replace(from, to); 00151 assert(example == "bbrbcbdbbrb"); 00152 } 00153 00154 { 00155 Data from("aa"); 00156 Data to("b"); 00157 Data example("aa"); 00158 00159 example.replace(from, to); 00160 assert(example == "b"); 00161 } 00162 00163 { 00164 Data from("aa"); 00165 Data to("b"); 00166 Data example("aaaaa"); 00167 00168 example.replace(from, to); 00169 assert(example == "bba"); 00170 } 00171 00172 { 00173 Data from("a"); 00174 Data to("bb"); 00175 Data example("a"); 00176 00177 example.replace(from, to); 00178 assert(example == "bb"); 00179 } 00180 00181 { 00182 Data from("a"); 00183 Data to("bb"); 00184 Data example("abracadabra"); 00185 00186 example.replace(from, to); 00187 assert(example == "bbbrbbcbbdbbbrbb"); 00188 } 00189 00190 { 00191 Data from("a"); 00192 Data to("bb"); 00193 const char* buffer = "abracadabra"; 00194 Data example(Data::Share, buffer, strlen(buffer)); 00195 00196 example.replace(from, to); 00197 assert(example == "bbbrbbcbbdbbbrbb"); 00198 } 00199 00200 { 00201 Data from("a"); 00202 Data to("aa"); 00203 Data example("a"); 00204 00205 example.replace(from, to); 00206 assert(example == "aa"); 00207 } 00208 00209 { 00210 Data from("a"); 00211 Data to("aa"); 00212 Data example("abracadabra"); 00213 00214 example.replace(from, to); 00215 assert(example == "aabraacaadaabraa"); 00216 } 00217 00218 { 00219 Data from("abracadabra"); 00220 Data to("a"); 00221 Data example("abracadabra"); 00222 00223 example.replace(from, to); 00224 assert(example == "a"); 00225 } 00226 00227 { 00228 Data from("abracadabra"); 00229 Data to(""); 00230 Data example("abracadabra"); 00231 00232 example.replace(from, to); 00233 assert(example == ""); 00234 } 00235 00236 { 00237 Data from("abracadabra"); 00238 Data to(""); 00239 Data example("abracadabraabracadabraabracadabra"); 00240 00241 example.replace(from, to); 00242 assert(example == ""); 00243 } 00244 } 00245 00246 { 00247 Data input("abc123abca"); 00248 std::cerr << "T0: " << input << std::endl; 00249 input.replace("abc", "ABCD"); 00250 std::cerr << "T1: " << input << std::endl; 00251 assert(input == "ABCD123ABCDa"); 00252 } 00253 00254 00255 { 00256 const char* s = "a"; 00257 const char* ss = "bb"; 00258 const char* sss = "ccc"; 00259 00260 Data one; 00261 Data two; 00262 Data three; 00263 00264 for (int i = 0; i < 100; ++i) 00265 { 00266 one.append(s, strlen(s)); 00267 two.append(ss, strlen(ss)); 00268 three.append(sss, strlen(sss)); 00269 } 00270 00271 assert(one.size() == 100); 00272 assert(two.size() == 200); 00273 assert(three.size() == 300); 00274 } 00275 00276 { 00277 Data httpString("safe"); 00278 00279 Data enc; 00280 enc = httpString.urlEncoded(); 00281 00282 cerr << "res: " << enc << endl; 00283 } 00284 00285 { 00286 Data httpString("-_.~!$'()*,;=:@/?"); 00287 httpString += "0123456789"; 00288 00289 Data result; 00290 { 00291 DataStream str(result); 00292 httpString.urlEncode(str); 00293 } 00294 assert(result == httpString.urlEncoded()); 00295 cerr << ">> " << httpString.urlEncoded() << endl; 00296 cerr << "<< " << httpString.urlEncoded().urlDecoded() << endl; 00297 cerr << ".. " << httpString << endl; 00298 00299 assert(httpString == httpString.urlEncoded().urlDecoded()); 00300 assert(result == httpString); 00301 } 00302 00303 { 00304 Data httpString("http::/foo.com/in word?arg1=\"quote%\"&arg2=\"%%%%%\""); 00305 00306 Data result; 00307 { 00308 DataStream str(result); 00309 httpString.urlEncode(str); 00310 } 00311 00312 cerr << result << endl; 00313 assert(result == "http::/foo.com/in+word?arg1=%22quote%25%22%26arg2=%22%25%25%25%25%25%22"); 00314 assert(result == httpString.urlEncoded()); 00315 00316 cerr << ">> " << httpString.urlEncoded() << endl; 00317 cerr << "<< " << httpString.urlEncoded().urlDecoded() << endl; 00318 cerr << ".. " << httpString << endl; 00319 00320 assert(httpString == httpString.urlEncoded().urlDecoded()); 00321 } 00322 00323 { 00324 Data needsCharEncode("CharEncode % me"); 00325 cerr << "original " << needsCharEncode << endl; 00326 cerr << "charEncoded " << needsCharEncode.charEncoded() << endl; 00327 cerr << "charUnencoded " << needsCharEncode.charEncoded().charUnencoded() << endl; 00328 00329 assert(needsCharEncode.charEncoded().charUnencoded() == needsCharEncode); 00330 } 00331 00332 { 00333 Data needsCharEncode("CharEncode % me"); 00334 needsCharEncode += " \";/?:@&=+%$,/t-_.!~*'()"; 00335 needsCharEncode += char(0); 00336 needsCharEncode += char(254); 00337 needsCharEncode += char(17); 00338 00339 cerr << needsCharEncode.charEncoded() << endl; 00340 00341 assert(needsCharEncode.charEncoded().charUnencoded() == needsCharEncode); 00342 } 00343 00344 { 00345 Data needsNoCharEncode("dontcharEncodeme"); 00346 00347 cerr << needsNoCharEncode.charEncoded() << endl; 00348 00349 assert(needsNoCharEncode.charEncoded().charUnencoded() == needsNoCharEncode); 00350 } 00351 00352 { 00353 Data charEncodeCase("%5b%5D%5B%5d"); 00354 00355 cerr << charEncodeCase.charUnencoded() << endl; 00356 00357 Data shouldMatch("[][]"); 00358 assert(charEncodeCase.charUnencoded()==shouldMatch); 00359 } 00360 00361 { 00362 Data s1; 00363 assert(s1.convertInt() == 0); 00364 00365 Data s2("12foo"); 00366 assert(s2.convertInt() == 12); 00367 00368 Data s3("12"); 00369 assert(s3.convertInt() == 12); 00370 00371 Data s4("foo"); 00372 assert(s4.convertInt() == 0); 00373 00374 Data s5(" "); 00375 assert(s5.convertInt() == 0); 00376 00377 Data s6(" +"); 00378 assert(s6.convertInt() == 0); 00379 00380 Data s7(" +17"); 00381 assert(s7.convertInt() == 17); 00382 00383 Data s8(" -17"); 00384 assert(s8.convertInt() == -17); 00385 00386 Data s9(" --17"); 00387 assert(s9.convertInt() == 0); 00388 } 00389 00390 { 00391 Data s1; 00392 assert(s1.convertUnsignedLong() == 0); 00393 00394 Data s2("12foo"); 00395 assert(s2.convertUnsignedLong() == 12); 00396 00397 Data s3("12"); 00398 assert(s3.convertUnsignedLong() == 12); 00399 00400 Data s4("foo"); 00401 assert(s4.convertUnsignedLong() == 0); 00402 00403 Data s5(" "); 00404 assert(s5.convertUnsignedLong() == 0); 00405 00406 Data s6(" +"); 00407 assert(s6.convertUnsignedLong() == 0); 00408 00409 Data s7(" +17"); 00410 assert(s7.convertUnsignedLong() == 17); 00411 00412 Data s8(" -17"); 00413 assert(s8.convertUnsignedLong() == 0); 00414 } 00415 00416 { 00417 Data s1; 00418 assert(s1.convertUInt64() == 0); 00419 00420 Data s2("12foo"); 00421 assert(s2.convertUInt64() == 12); 00422 00423 Data s3("12"); 00424 assert(s3.convertUInt64() == 12); 00425 00426 Data s4("foo"); 00427 assert(s4.convertUInt64() == 0); 00428 00429 Data s5(" "); 00430 assert(s5.convertUInt64() == 0); 00431 00432 Data s6(" +"); 00433 assert(s6.convertUInt64() == 0); 00434 00435 Data s7(" +17"); 00436 assert(s7.convertUInt64() == 17); 00437 00438 Data s8(" -17"); 00439 assert(s8.convertUInt64() == 0); 00440 } 00441 00442 { 00443 Data s1; 00444 assert(s1.convertSize() == 0); 00445 00446 Data s2("12foo"); 00447 assert(s2.convertSize() == 12); 00448 00449 Data s3("12"); 00450 assert(s3.convertSize() == 12); 00451 00452 Data s4("foo"); 00453 assert(s4.convertSize() == 0); 00454 00455 Data s5(" "); 00456 assert(s5.convertSize() == 0); 00457 00458 Data s6(" +"); 00459 assert(s6.convertSize() == 0); 00460 00461 Data s7(" +17"); 00462 assert(s7.convertSize() == 17); 00463 00464 Data s8(" -17"); 00465 assert(s8.convertSize() == 0); 00466 } 00467 00468 #ifndef RESIP_FIXED_POINT 00469 { 00470 Data s1; 00471 assert(s1.convertDouble() == 0); 00472 00473 Data s2("12foo"); 00474 assert(s2.convertDouble() == 12); 00475 00476 Data s3("12"); 00477 assert(s3.convertDouble() == 12); 00478 00479 Data s4("foo"); 00480 assert(s4.convertDouble() == 0); 00481 00482 Data s5(" "); 00483 assert(s5.convertDouble() == 0); 00484 00485 Data s6(" +"); 00486 assert(s6.convertDouble() == 0); 00487 00488 Data s7(" +17"); 00489 assert(s7.convertDouble() == 17); 00490 00491 Data s8(" -17"); 00492 assert(s8.convertDouble() == -17); 00493 00494 Data s9(" --17"); 00495 assert(s9.convertDouble() == 0); 00496 } 00497 00498 { 00499 Data s1("."); 00500 assert(s1.convertDouble() == 0); 00501 00502 Data s2("12.12foo"); 00503 assert(s2.convertDouble() == 12.12L); 00504 00505 Data s3("12.12"); 00506 assert(s3.convertDouble() == 12.12L); 00507 00508 Data s4(".foo"); 00509 assert(s4.convertDouble() == 0); 00510 00511 Data s5(" ."); 00512 assert(s5.convertDouble() == 0); 00513 00514 Data s6(" +."); 00515 assert(s6.convertDouble() == 0); 00516 00517 Data s6a(" -."); 00518 assert(s6a.convertDouble() == 0); 00519 00520 Data s7(" +17.17"); 00521 assert(s7.convertDouble() == 17.17L); 00522 00523 Data s8(" -17.17"); 00524 assert(s8.convertDouble() == -17.17L); 00525 00526 Data s9(" -17.17foo"); 00527 assert(s9.convertDouble() == -17.17L); 00528 00529 Data s10(" --17.17"); 00530 assert(s10.convertDouble() == 0); 00531 00532 Data s11(" -0000.017"); 00533 assert(s11.convertDouble() == -0.017L); 00534 00535 Data s12(".017"); 00536 assert(s12.convertDouble() == 0.017L); 00537 00538 Data s13(" .017"); 00539 assert(s13.convertDouble() == 0.017L); 00540 00541 Data s14(" +.017"); 00542 assert(s14.convertDouble() == 0.017L); 00543 00544 Data s15(" -.017"); 00545 assert(s15.convertDouble() == -0.017L); 00546 00547 } 00548 #endif 00549 { 00550 Data s; 00551 s = "some text"; 00552 s += Data::Empty; 00553 s += ""; 00554 00555 assert(s == "some text"); 00556 } 00557 00558 { 00559 Data d; 00560 const char *q = "\0"; 00561 d += q; 00562 00563 for(const char *p = 00564 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00565 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00566 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00567 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00568 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00569 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00570 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00571 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00572 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00573 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00574 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00575 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00576 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00577 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00578 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00579 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00580 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 00581 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 00582 *p; 00583 ++p) 00584 { 00585 d += *p; 00586 d += q; 00587 d += "~"; 00588 } 00589 00590 } 00591 00592 { 00593 Data d; 00594 assert(d.empty()); 00595 assert(d.c_str()[0] == 0); 00596 } 00597 00598 { 00599 const int maxs = 1024; 00600 Data a; 00601 for (int i = 0; i < maxs; i++) 00602 { 00603 Data b(a.c_str()); 00604 Data c(b); 00605 00606 a += "a"; 00607 } 00608 cerr << "test data size 0.." << maxs << endl; 00609 } 00610 00611 // test comparison 00612 { 00613 { 00614 Data c = "sadfsdf"; 00615 Data d; 00616 d = c; 00617 assert(c == d); 00618 } 00619 00620 { 00621 const char* f = "asdasd"; 00622 Data d = Data(f); 00623 assert(d == f); 00624 } 00625 00626 { 00627 Data d; 00628 const char* f = "asdasd"; 00629 d = f; 00630 assert(d == f); 00631 } 00632 00633 { 00634 Data d("asdfasfdsadf"); 00635 const char* f = "asdasd"; 00636 d = f; 00637 assert(d == f); 00638 } 00639 00640 { 00641 const char* f = "asdasd"; 00642 Data d = Data(f); 00643 assert(!(d < f)); 00644 } 00645 00646 { 00647 Data d; 00648 const char* f = "asdasd"; 00649 d = f; 00650 assert(!(d < f)); 00651 } 00652 00653 { 00654 Data d("asdfasfdsadf"); 00655 const char* f = "asdasd"; 00656 d = f; 00657 assert(!(d < f)); 00658 } 00659 00660 { 00661 Data a("qwerty"); 00662 Data b("qwerty"); 00663 assert(!(a < b)); 00664 } 00665 00666 { 00667 Data a("qwert"); 00668 Data b("qwerty"); 00669 assert(a < b); 00670 } 00671 00672 { 00673 Data a("qwert"); 00674 Data b("qwerty"); 00675 assert(a < b); 00676 assert(!(b < a)); 00677 } 00678 00679 { 00680 const char* f = "asdasda"; 00681 Data d("asdasd"); 00682 assert(d < f); 00683 } 00684 00685 { 00686 const char * c("asdfasfdsadf"); 00687 Data d(Data::Share, c, 4); 00688 assert(d < c); 00689 } 00690 00691 { 00692 const char * c("asdfasfdsadf"); 00693 Data d(Data::Share, c, strlen(c)); 00694 assert(!(d < c)); 00695 } 00696 00697 { 00698 const char * c("asdfasfdsadf"); 00699 Data d(Data::Share, c, strlen(c)); 00700 assert(!(d < c)); 00701 Data c1(d); // copy, null terminate 00702 assert(!(d < c1)); 00703 assert(!(c1 < d)); 00704 } 00705 00706 { 00707 const char* f = "asdasd"; 00708 Data d("fsadf"); 00709 00710 assert(!(d <= f)); 00711 } 00712 00713 { 00714 const Data f = "asdasd"; 00715 Data d("fsadf"); 00716 00717 assert(!(d <= f)); 00718 } 00719 00720 { 00721 const char* f = "asdasd"; 00722 Data d = Data(f); 00723 assert(d <= f); 00724 } 00725 00726 { 00727 Data d; 00728 const char* f = "asdasd"; 00729 d = f; 00730 assert(d <= f); 00731 } 00732 00733 { 00734 Data d("asdfasfdsadf"); 00735 const char* f = "asdasd"; 00736 d = f; 00737 assert(d <= f); 00738 } 00739 00740 { 00741 Data a("qwerty"); 00742 Data b("qwerty"); 00743 assert(a <= b); 00744 } 00745 { 00746 Data a("qwert"); 00747 Data b("qwerty"); 00748 assert(a <= b); 00749 } 00750 { 00751 Data a("qwert"); 00752 Data b("qwerty"); 00753 assert(a <= b); 00754 assert(!(b <= a)); 00755 } 00756 00757 { 00758 const char* f = "asdasda"; 00759 Data d("asdasd"); 00760 assert(d <= f); 00761 } 00762 00763 { 00764 const char * c("asdfasfdsadf"); 00765 Data d(Data::Share, c, 4); 00766 assert(d <= c); 00767 } 00768 00769 { 00770 const char * c("asdfasfdsadf"); 00771 Data d(Data::Share, c, strlen(c)); 00772 assert(d <= c); 00773 } 00774 00775 { 00776 const char * c("asdfasfdsadf"); 00777 Data d(Data::Share, c, strlen(c)); 00778 assert(d <= c); 00779 Data c1(d); // copy, null terminate 00780 assert(d <= c1); 00781 assert(c1 <= d); 00782 } 00783 } 00784 00785 // test assignment 00786 { 00787 { 00788 Data d("sadfsa"); 00789 d = "gasdfg"; 00790 00791 assert(d == "gasdfg"); 00792 } 00793 00794 { 00795 Data d; 00796 d = "gasdfg"; 00797 00798 assert(d == "gasdfg"); 00799 } 00800 00801 { 00802 Data d("sdfsdf"); 00803 Data e(d); 00804 Data f("fsdgsdafg"); 00805 Data g(f); 00806 00807 e = g; 00808 assert(e == g); 00809 } 00810 } 00811 00812 { 00813 // test resizing 00814 Data header(10, Data::Preallocate); 00815 assert(header.empty()); 00816 00817 header += 'c'; 00818 header += " char"; 00819 header += "acters"; 00820 00821 assert(header.size() > 10); 00822 cerr << header << endl; 00823 assert(header == "c characters"); 00824 } 00825 00826 { 00827 // test resizing 00828 Data header(10, Data::Preallocate); 00829 assert(header.empty()); 00830 00831 header += 'c'; 00832 header += " char"; 00833 header += Data("acters"); 00834 00835 assert(header.size() > 10); 00836 cerr << header << endl; 00837 assert(header == "c characters"); 00838 } 00839 00840 { 00841 // test resizing 00842 Data header(120, Data::Preallocate); 00843 assert(header.empty()); 00844 00845 header += 'c'; 00846 header += " char"; 00847 header += "acters"; 00848 00849 assert(header == "c characters"); 00850 } 00851 00852 { 00853 const char *txt = "here is some text"; 00854 Data notOwner(Data::Share, txt, strlen(txt)); 00855 assert(notOwner.mShareEnum == Data::Share); 00856 00857 notOwner += " more text"; 00858 assert(notOwner.mShareEnum == Data::Take); 00859 assert(notOwner == "here is some text more text"); 00860 } 00861 00862 { 00863 const char *txt = "here is some text"; 00864 Data notOwner(Data::Share, txt, strlen(txt)); 00865 assert(notOwner.mShareEnum == Data::Share); 00866 00867 notOwner += '!'; 00868 assert(notOwner.mShareEnum == Data::Take); 00869 assert(notOwner == "here is some text!"); 00870 } 00871 00872 { 00873 const char *txt = "here is some text"; 00874 Data notOwner(Data::Share, txt, strlen(txt)); 00875 assert(notOwner.mShareEnum == Data::Share); 00876 00877 notOwner += Data(" more text"); 00878 assert(notOwner.mShareEnum == Data::Take); 00879 assert(notOwner == "here is some text more text"); 00880 } 00881 00882 { 00883 Data v("some text"); 00884 assert(v.prefix("some")); 00885 assert(v.prefix("some ")); 00886 assert(!v.prefix("ome ")); 00887 assert(!v.prefix("some more text")); 00888 00889 assert(v.prefix(Data::Empty)); 00890 assert(v.prefix("some text")); 00891 assert(v.prefix(v)); 00892 assert(!v.prefix("some text ")); 00893 } 00894 00895 { 00896 Data v("some text"); 00897 assert(v.postfix("text")); 00898 assert(v.postfix(" text")); 00899 assert(!v.postfix("tex")); 00900 assert(!v.postfix("more some text")); 00901 00902 assert(v.postfix(Data::Empty)); 00903 assert(v.postfix("some text")); 00904 assert(v.postfix(v)); 00905 assert(!v.postfix(" some text")); 00906 } 00907 00908 { 00909 Data transport("transport"); 00910 assert(isEqualNoCase(transport, "transport")); 00911 } 00912 00913 { 00914 Data d1("0123456789"); 00915 assert(d1.find("0") == 0); 00916 assert(d1.find("1") == 1); 00917 assert(d1.find("8") == 8); 00918 assert(d1.find("9") == 9); 00919 assert(d1.find("01") == 0); 00920 assert(d1.find("12") == 1); 00921 assert(d1.find("a") == Data::npos); 00922 assert(d1.find("0123456789") == 0); 00923 assert(d1.find("0123456789a") == Data::npos); 00924 00925 Data d2; 00926 assert(d2.find("0") == Data::npos); 00927 assert(d2.find("abc") == Data::npos); 00928 assert(d2.find("") == Data::npos); 00929 } 00930 { 00931 Data d1("abcdefghi"); 00932 assert(d1.find("def") == 3); 00933 assert(d1.find("def", 3) == 3); 00934 assert (d1.substr(d1.find("def"), 3) == "def"); 00935 cerr << "substr = " << d1.substr(5,4) << endl; 00936 } 00937 { 00938 Data d1("http://123456/123"); 00939 assert(d1.find("/") == 5); 00940 assert(d1.find("/", 7) == 13); 00941 } 00942 { 00943 Data d1("0"); 00944 Data d2("0"); 00945 d1 ^= d2; 00946 cerr << d1.hex() << endl; 00947 assert(d1.size() == 1); 00948 assert(d1[0] == 0); 00949 00950 d1 = "0"; 00951 d1 ^= Data(); 00952 cerr << d1.hex() << endl; 00953 assert(d1.size() == 1); 00954 assert(d1[0] == '0'); 00955 00956 d1 = Data(); 00957 d1 ^= Data("0"); 00958 cerr << d1.hex() << endl; 00959 assert(d1.size() == 1); 00960 assert(d1[0] == '0'); 00961 00962 d1 = Data(); 00963 d1 ^= Data(); 00964 cerr << d1.hex() << endl; 00965 assert(d1.size() == 0); 00966 00967 00968 d1 = "01234"; 00969 d1 ^= Data("01234"); 00970 cerr << d1.hex() << endl; 00971 assert(d1.size() == 5); 00972 assert(d1[0] == 0); 00973 assert(d1[4] == 0); 00974 00975 d1 = "012"; 00976 d1 ^= Data("01234"); 00977 cerr << d1.hex() << endl; 00978 assert(d1.size() == 5); 00979 assert(d1[0] == 0); 00980 assert(d1[1] == 0); 00981 assert(d1[2] == 0); 00982 assert(d1[3] == '3'); 00983 assert(d1[4] == '4'); 00984 00985 d1 ^= Data("01234"); 00986 cerr << d1.hex() << endl; 00987 assert(d1[0] == '0'); 00988 assert(d1[1] == '1'); 00989 assert(d1[2] == '2'); 00990 assert(d1[3] == 0); 00991 assert(d1[4] == 0); 00992 00993 d1 = Data(100, Data::Preallocate); 00994 d1 ^= Data("0"); 00995 cerr << d1.hex() << endl; 00996 00997 { 00998 Data buffer; 00999 Data working; 01000 01001 { 01002 DataStream strm(buffer); 01003 strm << "user=phone"; 01004 } 01005 working ^= buffer; 01006 01007 buffer.clear(); 01008 { 01009 DataStream strm(buffer); 01010 strm << "maddr=192.168.1.1"; 01011 } 01012 working ^= buffer; 01013 01014 Data result = working; 01015 working.clear(); 01016 01017 buffer.clear(); 01018 { 01019 DataStream strm(buffer); 01020 strm << "maddr=192.168.1.1"; 01021 } 01022 working ^= buffer; 01023 01024 buffer.clear(); 01025 { 01026 DataStream strm(buffer); 01027 strm << "user=phone"; 01028 } 01029 working ^= buffer; 01030 01031 assert(result == working); 01032 } 01033 } 01034 01035 { 01036 Data d("012345"); 01037 assert(d[0] == '0'); 01038 assert(d[1] == '1'); 01039 assert(d[2] == '2'); 01040 assert(d[3] == '3'); 01041 assert(d[4] == '4'); 01042 assert(d[5] == '5'); 01043 } 01044 01045 { 01046 Data *d = new Data("origin",6); 01047 { 01048 Data * t = d; 01049 01050 d = new Data(*d); 01051 01052 assert(d->size() == t->size()); 01053 assert(d->mCapacity == t->mCapacity); 01054 // cout << d->size() << ":" << d->mCapacity << endl; 01055 delete t; 01056 } 01057 delete d; 01058 } 01059 01060 { 01061 char blah[] = "12345"; 01062 Data d(blah, 3); 01063 assert(strlen(d.c_str()) == 3); 01064 } 01065 01066 { 01067 assert(Data(0) == "0"); 01068 assert(Data(1) == "1"); 01069 assert(Data(-1) == "-1"); 01070 assert(Data(11) == "11"); 01071 assert(Data(1234567) == "1234567"); 01072 assert(Data(-1234567) == "-1234567"); 01073 } 01074 01075 { 01076 assert(Data(UInt64(0)) == "0"); 01077 assert(Data(UInt64(1)) == "1"); 01078 assert(Data(UInt64(18446744073709551615ULL)) == "18446744073709551615"); // 2^64 - 1 01079 } 01080 01081 { 01082 cerr << "!! " << Data(true) << endl; 01083 01084 assert(Data(true) == "true"); 01085 assert(Data(false) == "false"); 01086 } 01087 01088 { 01089 assert(Data('c') == "c"); 01090 } 01091 01092 #ifndef RESIP_FIXED_POINT 01093 { 01094 assert(Data(0.21344) == "0.2134"); 01095 assert(Data(0.21347) == "0.2135"); 01096 assert(Data(-0.21347) == "-0.2135"); 01097 assert(Data(-0.21344) == "-0.2134"); 01098 cerr << "!! " << Data(-123454.21344, Data::FiveDigitPrecision) << endl; 01099 assert(Data(-123454.21344, Data::FiveDigitPrecision) == "-123454.21344"); 01100 assert(Data(-123454.21344, Data::SevenDigitPrecision) == "-123454.21344"); 01101 } 01102 #endif 01103 { 01104 Data empt; 01105 Data empt1; 01106 assert(empt.size() == 0); 01107 assert(empt == empt); 01108 assert(empt == empt1); 01109 assert(empt1 == empt); 01110 assert(empt1 == ""); 01111 01112 assert(!(empt != empt)); 01113 assert(!(empt != empt1)); 01114 assert(!(empt1 != empt)); 01115 assert(!(empt1 != "")); 01116 01117 assert(empt1 == ""); 01118 assert("sdf" != empt1); 01119 assert(Data("SAfdsaf") != empt1); 01120 empt = empt; 01121 empt = empt1; 01122 empt = "sdfasf"; 01123 } 01124 01125 { 01126 Data d("qwerty"); 01127 cerr << d << endl; 01128 assert(strcmp(d.data(), "qwerty") == 0); 01129 01130 Data e; 01131 01132 assert(e == ""); 01133 } 01134 01135 { 01136 Data d("qwerty"); 01137 assert(strcmp(d.c_str(), "qwerty") == 0); 01138 01139 Data e; 01140 assert(strcmp(e.c_str(), "") == 0); 01141 } 01142 01143 { 01144 Data d("123"); 01145 assert(d.size() == 3); 01146 } 01147 01148 { 01149 Data d("one"); 01150 Data c("two"); 01151 d += c; 01152 assert(d == "onetwo"); 01153 01154 Data empt; 01155 cerr << empt + d << endl; 01156 assert(empt + d == d); 01157 assert(empt + d == "onetwo"); 01158 assert(empt + "three" == "three"); 01159 } 01160 01161 { 01162 Data s; 01163 s = "c="; 01164 assert(s == "c="); 01165 s += "foo"; 01166 assert(s == "c=foo"); 01167 s += "\r\n"; 01168 s += "bar"; 01169 s += "\r\n"; 01170 assert (s == "c=foo\r\nbar\r\n"); 01171 } 01172 01173 { 01174 Data s; 01175 s += 'c'; 01176 assert(s == "c"); 01177 assert(s.size() == 1); 01178 } 01179 01180 { 01181 Data s; 01182 s = "c="; 01183 assert(s == "c="); 01184 s += 'f'; 01185 assert(s == "c=f"); 01186 assert(s.size() == 3); 01187 } 01188 01189 { 01190 Data s; 01191 s = "some text"; 01192 s += Data::Empty; 01193 01194 assert(s == "some text"); 01195 } 01196 01197 { 01198 Data a("one"); 01199 Data b("two"); 01200 Data c("three"); 01201 01202 assert(a+b+c == "onetwothree"); 01203 } 01204 01205 { 01206 Data d("one"); 01207 cerr << "one + two = " << (d + "two") << endl; 01208 assert((d + "two") == "onetwo"); 01209 } 01210 01211 { 01212 cerr << "test MD5" << endl; 01213 Data d; 01214 assert(d.md5() == "d41d8cd98f00b204e9800998ecf8427e"); 01215 01216 Data d1("qwertyuiop"); 01217 assert(d1.md5() == "6eea9b7ef19179a06954edd0f6c05ceb"); 01218 } 01219 01220 { 01221 Data mixed("MiXed"); 01222 mixed.lowercase(); 01223 assert(mixed == "mixed"); 01224 } 01225 { 01226 Data mixed("miXed"); 01227 mixed.uppercase(); 01228 assert(mixed == "MIXED"); 01229 } 01230 { 01231 Data a("a"); 01232 Data aa(a); 01233 assert(a.size() == aa.size()); 01234 } 01235 { 01236 Data d("ssd"); 01237 Data c; 01238 d = c; 01239 assert(d.empty()); 01240 } 01241 { 01242 Data d; 01243 Data c; 01244 assert(!(d != c)); 01245 d = c; 01246 assert(d.empty()); 01247 } 01248 { 01249 char s[] = "userB@whistler.gloo.net:6062\r\nCo\031"; 01250 char o[] = "S"; 01251 Data d(Data::Share, s, strlen(s)); 01252 Data c(Data::Share, o, strlen(o)); 01253 01254 d = c; 01255 assert(c == "S"); 01256 } 01257 { 01258 Data d((unsigned long)235235); 01259 assert(d == "235235"); 01260 } 01261 01262 if (1) 01263 { 01264 Data d3("MTIz"); Data e3("123" ); 01265 //cerr << "base64 test " <<e3<< " = "<< d3.base64decode().c_str()<<endl; 01266 //cerr << "base64 test " <<d3<< " = "<< e3.base64encode().c_str()<<endl; 01267 assert( d3.base64decode() == e3 ); 01268 assert( e3.base64encode() == d3 ); 01269 01270 Data d1("MQ=="); Data e1("1" ); 01271 //cerr << "base64 test "<<e1<<" = <"<<d1.base64decode()<<">"<<endl; 01272 //cerr << "base64 test hex "<<e1.hex()<<" = <"<<d1.base64decode().hex()<<">"<<endl; 01273 //cerr << "base64 test "<<d1<<" = <"<<e1.base64encode()<<">"<<endl; 01274 assert( e1 == d1.base64decode() ); 01275 assert( e1.base64encode() == d1 ); 01276 01277 Data d2("MTI="); 01278 assert( d2.base64decode() == Data("12" ) ); 01279 assert( Data("12" ).base64encode() == d2 ); 01280 01281 Data d4("MTIzNA=="); 01282 assert( d4.base64decode() == Data("1234" ) ); 01283 assert( Data("1234" ).base64encode() == d4 ); 01284 01285 Data d5("MTIzNDU="); 01286 assert( d5.base64decode() == Data("12345" ) ); 01287 assert( Data("12345" ).base64encode() == d5 ); 01288 01289 Data d6("MTIzNDU2"); 01290 assert( d6.base64decode() == Data("123456" ) ); 01291 assert( Data("123456" ).base64encode() == d6 ); 01292 01293 Data d7("MTIzNDU2Nw=="); 01294 assert( d7.base64decode() == Data("1234567" ) ); 01295 assert( Data("1234567" ).base64encode() == d7 ); 01296 } 01297 01298 for(int i=0; i<4; ++i) 01299 { 01300 const char* buf1="5d7a9b7c02034b5b"; 01301 const char* buf2=" 5d7a9b7c02034b5b"; 01302 const char* buf3=" 5d7a9b7c02034b5b"; 01303 const char* buf4=" 5d7a9b7c02034b5b"; 01304 const char* ubuf1="5D7A9B7C02034B5B"; 01305 const char* ubuf2=" 5D7A9B7C02034B5B"; 01306 const char* ubuf3=" 5D7A9B7C02034B5B"; 01307 const char* ubuf4=" 5D7A9B7C02034B5B"; 01308 01309 Data d1(Data::Share, buf1, 16-i); 01310 Data d2(Data::Share, buf2+1, 16-i); 01311 Data d3(Data::Share, buf3+2, 16-i); 01312 Data d4(Data::Share, buf4+3, 16-i); 01313 01314 Data u1(Data::Share, ubuf1, 16-i); 01315 Data u2(Data::Share, ubuf2+1, 16-i); 01316 Data u3(Data::Share, ubuf3+2, 16-i); 01317 Data u4(Data::Share, ubuf4+3, 16-i); 01318 01319 // All of these point to the same data, but aligned differently. 01320 assert(d1.hash()==d2.hash()); 01321 assert(d1.hash()==d3.hash()); 01322 assert(d1.hash()==d4.hash()); 01323 01324 assert(d1.hash()!=u1.hash()); 01325 assert(d1.hash()!=u2.hash()); 01326 assert(d1.hash()!=u3.hash()); 01327 assert(d1.hash()!=u4.hash()); 01328 01329 assert(d1.caseInsensitivehash()==d2.caseInsensitivehash()); 01330 assert(d1.caseInsensitivehash()==d3.caseInsensitivehash()); 01331 assert(d1.caseInsensitivehash()==d4.caseInsensitivehash()); 01332 01333 assert(d1.caseInsensitivehash()==u1.caseInsensitivehash()); 01334 assert(d1.caseInsensitivehash()==u2.caseInsensitivehash()); 01335 assert(d1.caseInsensitivehash()==u3.caseInsensitivehash()); 01336 assert(d1.caseInsensitivehash()==u4.caseInsensitivehash()); 01337 01338 assert(d1.caseInsensitiveTokenHash()==d2.caseInsensitiveTokenHash()); 01339 assert(d1.caseInsensitiveTokenHash()==d3.caseInsensitiveTokenHash()); 01340 assert(d1.caseInsensitiveTokenHash()==d4.caseInsensitiveTokenHash()); 01341 01342 assert(d1.caseInsensitiveTokenHash()==u1.caseInsensitiveTokenHash()); 01343 assert(d1.caseInsensitiveTokenHash()==u2.caseInsensitiveTokenHash()); 01344 assert(d1.caseInsensitiveTokenHash()==u3.caseInsensitiveTokenHash()); 01345 assert(d1.caseInsensitiveTokenHash()==u4.caseInsensitiveTokenHash()); 01346 01347 assert(d1.caseInsensitiveTokenCompare(d1)); 01348 assert(d1.caseInsensitiveTokenCompare(d2)); 01349 assert(d1.caseInsensitiveTokenCompare(d3)); 01350 assert(d1.caseInsensitiveTokenCompare(d4)); 01351 assert(d1.caseInsensitiveTokenCompare(u1)); 01352 assert(d1.caseInsensitiveTokenCompare(u2)); 01353 assert(d1.caseInsensitiveTokenCompare(u3)); 01354 assert(d1.caseInsensitiveTokenCompare(u4)); 01355 01356 assert(d2.caseInsensitiveTokenCompare(d1)); 01357 assert(d2.caseInsensitiveTokenCompare(d2)); 01358 assert(d2.caseInsensitiveTokenCompare(d3)); 01359 assert(d2.caseInsensitiveTokenCompare(d4)); 01360 assert(d2.caseInsensitiveTokenCompare(u1)); 01361 assert(d2.caseInsensitiveTokenCompare(u2)); 01362 assert(d2.caseInsensitiveTokenCompare(u3)); 01363 assert(d2.caseInsensitiveTokenCompare(u4)); 01364 01365 assert(d3.caseInsensitiveTokenCompare(d1)); 01366 assert(d3.caseInsensitiveTokenCompare(d2)); 01367 assert(d3.caseInsensitiveTokenCompare(d3)); 01368 assert(d3.caseInsensitiveTokenCompare(d4)); 01369 assert(d3.caseInsensitiveTokenCompare(u1)); 01370 assert(d3.caseInsensitiveTokenCompare(u2)); 01371 assert(d3.caseInsensitiveTokenCompare(u3)); 01372 assert(d3.caseInsensitiveTokenCompare(u4)); 01373 01374 assert(d4.caseInsensitiveTokenCompare(d1)); 01375 assert(d4.caseInsensitiveTokenCompare(d2)); 01376 assert(d4.caseInsensitiveTokenCompare(d3)); 01377 assert(d4.caseInsensitiveTokenCompare(d4)); 01378 assert(d4.caseInsensitiveTokenCompare(u1)); 01379 assert(d4.caseInsensitiveTokenCompare(u2)); 01380 assert(d4.caseInsensitiveTokenCompare(u3)); 01381 assert(d4.caseInsensitiveTokenCompare(u4)); 01382 01383 assert(u1.caseInsensitiveTokenCompare(d1)); 01384 assert(u1.caseInsensitiveTokenCompare(d2)); 01385 assert(u1.caseInsensitiveTokenCompare(d3)); 01386 assert(u1.caseInsensitiveTokenCompare(d4)); 01387 assert(u1.caseInsensitiveTokenCompare(u1)); 01388 assert(u1.caseInsensitiveTokenCompare(u2)); 01389 assert(u1.caseInsensitiveTokenCompare(u3)); 01390 assert(u1.caseInsensitiveTokenCompare(u4)); 01391 01392 assert(u2.caseInsensitiveTokenCompare(d1)); 01393 assert(u2.caseInsensitiveTokenCompare(d2)); 01394 assert(u2.caseInsensitiveTokenCompare(d3)); 01395 assert(u2.caseInsensitiveTokenCompare(d4)); 01396 assert(u2.caseInsensitiveTokenCompare(u1)); 01397 assert(u2.caseInsensitiveTokenCompare(u2)); 01398 assert(u2.caseInsensitiveTokenCompare(u3)); 01399 assert(u2.caseInsensitiveTokenCompare(u4)); 01400 01401 assert(u3.caseInsensitiveTokenCompare(d1)); 01402 assert(u3.caseInsensitiveTokenCompare(d2)); 01403 assert(u3.caseInsensitiveTokenCompare(d3)); 01404 assert(u3.caseInsensitiveTokenCompare(d4)); 01405 assert(u3.caseInsensitiveTokenCompare(u1)); 01406 assert(u3.caseInsensitiveTokenCompare(u2)); 01407 assert(u3.caseInsensitiveTokenCompare(u3)); 01408 assert(u3.caseInsensitiveTokenCompare(u4)); 01409 01410 assert(u4.caseInsensitiveTokenCompare(d1)); 01411 assert(u4.caseInsensitiveTokenCompare(d2)); 01412 assert(u4.caseInsensitiveTokenCompare(d3)); 01413 assert(u4.caseInsensitiveTokenCompare(d4)); 01414 assert(u4.caseInsensitiveTokenCompare(u1)); 01415 assert(u4.caseInsensitiveTokenCompare(u2)); 01416 assert(u4.caseInsensitiveTokenCompare(u3)); 01417 assert(u4.caseInsensitiveTokenCompare(u4)); 01418 } 01419 std::cerr << "All OK" << endl; 01420 return 0; 01421 } 01422 }; 01423 01424 int 01425 main() 01426 { 01427 TestData td; 01428 int rVal = td.main(); 01429 return rVal; 01430 } 01431 /* ==================================================================== 01432 * The Vovida Software License, Version 1.0 01433 * 01434 * Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. 01435 * 01436 * Redistribution and use in source and binary forms, with or without 01437 * modification, are permitted provided that the following conditions 01438 * are met: 01439 * 01440 * 1. Redistributions of source code must retain the above copyright 01441 * notice, this list of conditions and the following disclaimer. 01442 * 01443 * 2. Redistributions in binary form must reproduce the above copyright 01444 * notice, this list of conditions and the following disclaimer in 01445 * the documentation and/or other materials provided with the 01446 * distribution. 01447 * 01448 * 3. The names "VOCAL", "Vovida Open Communication Application Library", 01449 * and "Vovida Open Communication Application Library (VOCAL)" must 01450 * not be used to endorse or promote products derived from this 01451 * software without prior written permission. For written 01452 * permission, please contact vocal@vovida.org. 01453 * 01454 * 4. Products derived from this software may not be called "VOCAL", nor 01455 * may "VOCAL" appear in their name, without prior written 01456 * permission of Vovida Networks, Inc. 01457 * 01458 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 01459 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 01460 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND 01461 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA 01462 * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES 01463 * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, 01464 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 01465 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 01466 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 01467 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 01468 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 01469 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 01470 * DAMAGE. 01471 * 01472 * ==================================================================== 01473 * 01474 * This software consists of voluntary contributions made by Vovida 01475 * Networks, Inc. and many individuals on behalf of Vovida Networks, 01476 * Inc. For more information on Vovida Networks, Inc., please see 01477 * <http://www.vovida.org/>. 01478 * 01479 */
1.7.5.1