home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / tString.C < prev    next >
C/C++ Source or Header  |  1998-08-04  |  10KB  |  465 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2.  
  3. /*
  4.  A test file for strings
  5. */
  6.  
  7. #include "strclass.h"
  8. #include "assert.h"
  9. #include "config.h"
  10.  
  11. #include <stream.h>  // see note below on `dec(20)' about why this will go away
  12. #include <std.h>
  13.  
  14. // can't nicely echo assertions because they contain quotes
  15.  
  16. #define tassert(ex) {if (!(ex)) \
  17.                      { cerr << "failed assertion at " << __LINE__ << "\n"; \
  18.                        abort(); } }
  19.  
  20.   string X0 = "I say: Hello";
  21.   string X = X0.from('H');
  22.  
  23.   string Y0 = "the world";
  24.   string Y = Y0.after("the ");
  25.  
  26.   string N = "123";
  27.   string c;
  28.   char*  s = ",";
  29.  
  30. #if RUNTIME_REGEX
  31.   regex  r = "e[a-z]*o";
  32. #endif
  33.  
  34. void decltest()
  35. {
  36.   string x;
  37.   cout << "an empty string:" << x << "\n";
  38.   assert(x.OK());
  39.   assert(x == "");
  40.  
  41.   string y = "Hello";
  42.   cout << "A string initialized to Hello:" << y << "\n";
  43.   assert(y.OK());
  44.   assert(y == "Hello");
  45.  
  46.   if (y[y.length()-1] == 'o')
  47.     y = y + '\n';
  48.   assert(y == "Hello\n");
  49.   y = "Hello";
  50.  
  51.   string a = y;
  52.   cout << "A string initialized to previous string:" << a << "\n";
  53.   assert(a.OK());
  54.   assert(a == "Hello");
  55.   assert(a == y);
  56.  
  57.   string b (a.at(1, 2));
  58.   cout << "A string initialized to previous string.at(1, 2):" << b << "\n";
  59.   assert(b.OK());
  60.   assert(b == "el");
  61.  
  62.   char ch = '@';
  63.   string z(ch); 
  64.   cout << "A string initialized to @:" << z << "\n";
  65.   assert(z.OK());
  66.   assert(z == "@");
  67.  
  68.   // XXX: `dec' is obsolete.  Since string.h includes iostream.h, and not
  69.   //      stream.h, we include stream.h in this file for the time being.  This
  70.   //      test will be rewritten to be done the "right" way, but for now, let's
  71.   //      save some time and go the easy route.
  72.   string n = dec(20);
  73.   cout << "A string initialized to dec(20):" << n << "\n";
  74.   assert(n.OK());
  75.   assert(n == "20");
  76.  
  77.   int i = atoi(n);
  78.   double f = atof(n);
  79.   cout << "n = " << n << " atoi(n) = " << i << " atof(n) = " << f << "\n";
  80.   assert(i == 20);
  81.   assert(f == 20);
  82.  
  83.   assert(X.OK());
  84.   assert(Y.OK());
  85.   assert(x.OK());
  86.   assert(y.OK());
  87.   assert(z.OK());
  88.   assert(n.OK());
  89.  
  90. #if RUNTIME_REGEX
  91.   assert(r.OK());
  92. #endif
  93. }
  94.  
  95. void cattest()
  96. {
  97.   string x = X;
  98.   string y = Y;
  99.   string z = x + y;
  100.   cout << "z = x + y = " << z << "\n";
  101.   assert(x.OK());
  102.   assert(y.OK());
  103.   assert(z.OK());
  104.   assert(z == "Helloworld");
  105.  
  106.   x += y;
  107.   cout << "x += y; x = " << x << "\n";
  108.   assert(x.OK());
  109.   assert(y.OK());
  110.   assert(x == "Helloworld");
  111.  
  112.   y = Y;
  113.   x = X;
  114.   y.prepend(x);
  115.   cout << "y.prepend(x); y = " << y << "\n";
  116.   assert(y == "Helloworld");
  117.  
  118. #if 0
  119.   y = Y;
  120.   x = X;
  121.   cat(x, y, x, x);
  122.   cout << "cat(x, y, x, x); x = " << x << "\n";
  123.   assert(x == "HelloworldHello");
  124.  
  125.   y = Y;
  126.   x = X;
  127.   cat(y, x, x, x);
  128.   cout << "cat(y, x, x, x); x = " << x << "\n";
  129.   assert(x == "worldHelloHello");
  130. #endif
  131.  
  132.   x = X;
  133.   y = Y;
  134.   z = x + s + ' ' + y.at("w") + y.after("w") + ".";
  135.   cout << "z = x + s +  + y.at(w) + y.after(w) + . = " << z << "\n";
  136.   assert(z.OK());
  137.   assert(z == "Hello, world.");
  138.  
  139. }
  140.  
  141. void comparetest()
  142. {  
  143.   string x = X;
  144.   string y = Y;
  145.   string n = N;
  146.   string z = x + y;
  147.  
  148.   assert(x != y);
  149.   assert(x == "Hello");
  150.   assert(x != z.at(0, 4));
  151.   assert (x < y);
  152.   assert(!(x >= z.at(0, 6)));
  153.   assert(x.contains("He"));
  154.   assert (z.contains(x));
  155.  
  156. #if RUNTIME_REGEX
  157.   assert(x.contains(r));
  158.   assert(!(x.matches(r)));
  159. #endif
  160.  
  161. #if RUNTIME_REGEX
  162.   assert(x.matches(rxalpha));
  163.   assert(!(n.matches(rxalpha)));
  164.   assert(n.matches(rxint));
  165.   assert(n.matches(rxdouble));
  166. #endif
  167.  
  168.   assert(x.index("lo") == 3);
  169.   assert(x.index("l", 2) == 2);
  170.   assert(x.index("l", -1) == 3);
  171.  
  172. #if RUNTIME_REGEX
  173.   assert(x.index(r)  == 1);
  174.   assert(x.index(r, -2) == 1);
  175. #endif
  176.  
  177.   assert(x.contains("el", 1));
  178.   assert(x.contains("el"));
  179.  
  180.   assert(common_prefix(x, "Help") == "Hel");
  181.   assert(common_suffix(x, "to") == "o");
  182.  
  183.   assert(fcompare(x, "hELlo") == 0);
  184.   assert(fcompare(x, "hElp") < 0);
  185. }
  186.  
  187. void substrtest()
  188. {
  189.   string x = X;
  190.  
  191.   char ch = x[0];
  192.   cout << "ch = x[0] = " << ch << "\n";
  193.   assert(ch == 'H');
  194.  
  195.   string z = x.at(2, 3);
  196.   cout << "z = x.at(2, 3) = " << z << "\n";
  197.   assert(z.OK());
  198.   assert(z == "llo");
  199.  
  200.   x.at(2, 2) = "r";
  201.   cout << "x.at(2, 2) = r; x = " << x << "\n";
  202.   assert(x.OK());
  203.   assert(x.at(2,2).OK());
  204.   assert(x == "Hero");
  205.  
  206.   x = X;
  207.   x.at(0, 1) = "j";
  208.   cout << "x.at(0, 1) = j; x = " << x << "\n";
  209.   assert(x.OK());
  210.   assert(x == "jello");
  211.  
  212.   x = X;
  213.   x.at("He") = "je";
  214.   cout << "x.at(He) = je; x = " << x << "\n";
  215.   assert(x.OK());
  216.   assert(x == "jello");
  217.  
  218.   x = X;
  219.   x.at("l", -1) = "i";
  220.   cout << "x.at(l, -1) = i; x = " << x << "\n";
  221.   assert(x.OK());
  222.   assert(x == "Helio");
  223.   
  224. #if RUNTIME_REGEX
  225.   x = X;
  226.   z = x.at(r);
  227.   cout << "z = x.at(r) = " << z << "\n";
  228.   assert(z.OK());
  229.   assert(z == "ello");
  230. #endif
  231.  
  232.   x = X;
  233.   z = x.before("o");
  234.   cout << "z = x.before(o) = " << z << "\n";
  235.   assert(z.OK());
  236.   assert(z == "Hell");
  237.  
  238.   x = X;
  239.   x = x.before("o");
  240.   cout << "x = x.before(o) = " << x << "\n";
  241.   assert(x.OK());
  242.   assert(x == "Hell");
  243.  
  244.   x = X;
  245.   x = x.from("e");
  246.   cout << "x = x.from(e) = " << x << "\n";
  247.   assert(x.OK());
  248.   assert(x == "ello");
  249.  
  250.   x = X;
  251.   x.before("ll") = "Bri";
  252.   cout << "x.before(ll) = Bri; x = " << x << "\n";
  253.   assert(x.OK());
  254.   assert(x == "Brillo");
  255.  
  256.   x = X;
  257.   z = x.before(2);
  258.   cout << "z = x.before(2) = " << z << "\n";
  259.   assert(z.OK());
  260.   assert(z == "He");
  261.  
  262.   x = X;
  263.   z = x.after("Hel");
  264.   cout << "z = x.after(Hel) = " << z << "\n";
  265.   assert(z.OK());
  266.   assert(z == "lo");
  267.  
  268.   x = X;
  269.   x.after("Hel") = "p";  
  270.   cout << "x.after(Hel) = p; x = " << x << "\n";
  271.   assert(x.OK());
  272.   assert(x == "Help");
  273.  
  274.   x = X;
  275.   z = x.after(3);
  276.   cout << "z = x.after(3) = " << z << "\n";
  277.   assert(z.OK());
  278.   assert(z == "o");
  279.  
  280. #if RUNTIME_REGEX
  281.   z = "  a bc";
  282.   z  = z.after(rxwhite);
  283.   cout << "z =   a bc; z = z.after(rxwhite); z =" << z << "\n";
  284.   assert(z.OK());
  285.   assert(z == "a bc");
  286. #endif
  287. }
  288.  
  289.  
  290. void utiltest()
  291. {
  292.   string x = X;
  293.   int matches = x.gsub("l", "ll");
  294.   cout << "x.gsub(l, ll); x = " << x << "\n";
  295.   assert(x.OK());
  296.   assert(matches == 2);
  297.   assert(x == "Hellllo");
  298.  
  299. #if RUNTIME_REGEX
  300.   x = X;
  301.   assert(x.OK());
  302.   matches = x.gsub(r, "ello should have been replaced by this string");
  303.   assert(x.OK());
  304.   cout << "x.gsub(r, ...); x = " << x << "\n";
  305.   assert(x.OK());
  306.   assert(matches == 1);
  307.   assert(x == "Hello should have been replaced by this string");
  308. #endif
  309.  
  310. #if RUNTIME_REGEX
  311.   matches = x.gsub(rxwhite, "#");
  312.   cout << "x.gsub(rxwhite, #); x = " << x << "\n";
  313.   assert(matches == 7);
  314.   assert(x.OK());
  315. #endif
  316.  
  317.   string z = X + Y;
  318.   z.del("loworl");
  319.   cout << "z = x+y; z.del(loworl); z = " << z << "\n";
  320.   assert(z.OK());
  321.   assert(z == "Held");
  322.  
  323.   x = X;
  324.   z = reverse(x);
  325.   cout << "reverse(x) = " << z << "\n";
  326.   assert(z.OK());
  327.   assert(z == "olleH");
  328.  
  329.   x.reverse();
  330.   cout << "x.reverse() = " << x << "\n";
  331.   assert(x.OK());
  332.   assert(x == z);
  333.  
  334.   x = X;
  335.   z = upcase(x);
  336.   cout << "upcase(x) = " << z << "\n";
  337.   assert(z.OK());
  338.   assert(z == "HELLO");
  339.  
  340.   z = downcase(x);
  341.   cout << "downcase(x) = " << z << "\n";
  342.   assert(z.OK());
  343.   assert(z == "hello");
  344.  
  345.   z = capitalize(x);
  346.   cout << "capitalize(x) = " << z << "\n";
  347.   assert(z.OK());
  348.   assert(z == "Hello");
  349.  
  350.   /* Let's see how apostrophe is handled. */
  351.   z = "he asked:'this is nathan's book?'. 'no, it's not',i said.";
  352.   cout << "capitalize(z) = " << capitalize (z) << "\n";
  353.   
  354.   z = replicate('*', 10);
  355.   cout << "z = replicate(*, 10) = " << z << "\n";
  356.   assert(z.OK());
  357.   assert(z == "**********");
  358.   assert(z.length() == 10);
  359. }
  360.  
  361. void splittest()
  362. {
  363. #if RUNTIME_REGEX
  364.   string z = "This string\thas\nfive words";
  365.   cout << "z = " << z << "\n";
  366.   string w[10];
  367.   int nw = split(z, w, 10, rxwhite);
  368.   assert(nw == 5);
  369.   cout << "from split(z, rxwhite, w, 10), n words = " << nw << ":\n";
  370.   for (int i = 0; i < nw; ++i)
  371.   {
  372.     assert(w[i].OK());
  373.     cout << w[i] << "\n";
  374.   }
  375.   assert(w[0] == "This");
  376.   assert(w[1] == "string");
  377.   assert(w[2] == "has");
  378.   assert(w[3] == "five");
  379.   assert(w[4] == "words");
  380.   assert(w[5] == (char*)0);
  381.  
  382.   z = join(w, nw, "/");
  383.   cout << "z = join(w, nw, /); z =" << z << "\n";
  384.   assert(z.OK());
  385.   assert(z == "This/string/has/five/words");
  386. #endif
  387. }
  388.  
  389.  
  390. void iotest()
  391. {
  392.   string z;
  393.   cout << "enter a word:";
  394.   cin >> z;
  395.   cout << "word =" << z << " ";
  396.   cout << "length = " << z.length() << "\n";
  397. }
  398.  
  399. void identitytest(string a, string b)
  400. {
  401.   string x = a;
  402.   string y = b;
  403.   x += b;
  404.   y.prepend(a);
  405.   assert((a + b) == x);
  406.   assert((a + b) == y);
  407.   assert(x == y);
  408.   assert(x.after(a) == b);
  409.   assert(x.before(b, -1) == a);
  410.   assert(x.from(a) == x);
  411.   assert(x.through(b, -1) == x);
  412.   assert(x.at(a) == a);
  413.   assert(x.at(b) == b);
  414.  
  415.   assert(reverse(x) == reverse(b) + reverse(a));
  416.   
  417.   assert((a + b + a) == (a + (b + a)));
  418.  
  419.   x.del(b, -1);
  420.   assert(x == a);
  421.  
  422.   y.before(b, -1) = b;
  423.   assert(y == (b + b));
  424.   y.at(b) = a;
  425.   assert(y == (a + b));
  426.  
  427.   x = a + reverse(a);
  428.   for (int i = 0; i < 7; ++i)
  429.   {
  430.     y = x;
  431.     x += x;
  432.     assert(x.OK());
  433.     assert(x == reverse(x));
  434.     assert(x.index(y) == 0);
  435.     assert(x.index(y, -1) == int(x.length() / 2));
  436.   }
  437. }
  438.  
  439. void freqtest()
  440. {
  441.   string x = "Hello World";
  442.   subString y = x.at(0,5);
  443.   assert(x.freq('l') == 3);    // char
  444.   assert(x.freq("lo") == 1);    // char*
  445.   assert(x.freq(x) == 1);    // string
  446.   assert(x.freq(y) == 1);    // Substring
  447. }
  448.  
  449. int main()
  450. {
  451.   decltest();
  452.   cattest();
  453.   comparetest();
  454.   substrtest();
  455.   utiltest();
  456.   splittest();
  457.   freqtest();
  458.   identitytest(X, X);
  459.   identitytest(X, Y);
  460.   identitytest(X+Y+N+X+Y+N, "A string that will be used in identitytest but is otherwise just another useless string.");
  461.   iotest();
  462.   cout << "\nEnd of test\n";
  463.   return 0;
  464. }
  465.