reSIProcate/rutil  9694
testData.cxx
Go to the documentation of this file.
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  */