home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / gnu / g__lib / tstring.cc < prev    next >
C/C++ Source or Header  |  1993-07-23  |  8KB  |  391 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 <String.h>
  8. #include <std.h>
  9. #include <assert.h>
  10.  
  11. // can't nicely echo assertions because they contain quotes
  12.  
  13. #define tassert(ex) {if (!(ex)) \
  14.                      { cerr << "failed assertion at " << __LINE__ << "\n"; \
  15.                        abort(); } }
  16.  
  17.   String X = "Hello";
  18.   String Y = "world";
  19.   String N = "123";
  20.   String c;
  21.   char*  s = ",";
  22.   Regex  r = "e[a-z]*o";
  23.  
  24. void decltest()
  25. {
  26.   String x;
  27.   cout << "an empty String:" << x << "\n";
  28.   assert(x.OK());
  29.   assert(x == "");
  30.  
  31.   String y = "Hello";
  32.   cout << "A string initialized to Hello:" << y << "\n";
  33.   assert(y.OK());
  34.   assert(y == "Hello");
  35.  
  36.   String a = y;
  37.   cout << "A string initialized to previous string:" << a << "\n";
  38.   assert(a.OK());
  39.   assert(a == "Hello");
  40.   assert(a == y);
  41.  
  42.   String b (a.at(1, 2));
  43.   cout << "A string initialized to previous string.at(1, 2):" << b << "\n";
  44.   assert(b.OK());
  45.   assert(b == "el");
  46.  
  47.   char ch = '@';
  48.   String z(ch); 
  49.   cout << "A string initialized to @:" << z << "\n";
  50.   assert(z.OK());
  51.   assert(z == "@");
  52.  
  53.   String n = dec(20);
  54.   cout << "A string initialized to dec(20):" << n << "\n";
  55.   assert(n.OK());
  56.   assert(n == "20");
  57.  
  58.   int i = atoi(n);
  59.   double f = atof(n);
  60.   cout << "n = " << n << " atoi(n) = " << i << " atof(n) = " << f << "\n";
  61.   assert(i == 20);
  62.   assert(f == 20);
  63.  
  64.   assert(X.OK());
  65.   assert(Y.OK());
  66.   assert(x.OK());
  67.   assert(y.OK());
  68.   assert(z.OK());
  69.   assert(n.OK());
  70.   assert(r.OK());
  71. }
  72.  
  73. void cattest()
  74. {
  75.   String x = X;
  76.   String y = Y;
  77.   String z = x + y;
  78.   cout << "z = x + y = " << z << "\n";
  79.   assert(x.OK());
  80.   assert(y.OK());
  81.   assert(z.OK());
  82.   assert(z == "Helloworld");
  83.  
  84.   x += y;
  85.   cout << "x += y; x = " << x << "\n";
  86.   assert(x.OK());
  87.   assert(y.OK());
  88.   assert(x == "Helloworld");
  89.  
  90.   y = Y;
  91.   x = X;
  92.   y.prepend(x);
  93.   cout << "y.prepend(x); y = " << y << "\n";
  94.   assert(y == "Helloworld");
  95.  
  96.   x = X;
  97.   y = Y;
  98.   z = x + s + ' ' + y.at("w") + y.after("w") + ".";
  99.   cout << "z = x + s +  + y.at(w) + y.after(w) + . = " << z << "\n";
  100.   assert(z.OK());
  101.   assert(z == "Hello, world.");
  102.  
  103. }
  104.  
  105. void comparetest()
  106. {  
  107.   String x = X;
  108.   String y = Y;
  109.   String n = N;
  110.   String z = x + y;
  111.  
  112.   assert(x != y);
  113.   assert(x == "Hello");
  114.   assert(x != z.at(0, 4));
  115.   assert (x < y);
  116.   assert(!(x >= z.at(0, 6)));
  117.   assert(x.contains("He"));
  118.   assert (z.contains(x));
  119.   assert(x.contains(r));
  120.  
  121.   assert(!(x.matches(r)));
  122.   assert(x.matches(RXalpha));
  123.   assert(!(n.matches(RXalpha)));
  124.   assert(n.matches(RXint));
  125.   assert(n.matches(RXdouble));
  126.  
  127.   assert(x.index("lo") == 3);
  128.   assert(x.index("l", 2) == 2);
  129.   assert(x.index("l", -1) == 3);
  130.   assert(x.index(r)  == 1);
  131.   assert(x.index(r, -2) == 1);
  132.  
  133.   assert(x.contains("el", 1) == 2);
  134.   assert(x.contains("el", 0) == 0);
  135.  
  136.   assert(common_prefix(x, "Help") == "Hel");
  137.   assert(common_suffix(x, "to") == "o");
  138.  
  139.   assert(fcompare(x, "hELlo") == 0);
  140.   assert(fcompare(x, "hElp") < 0);
  141. }
  142.  
  143. void substrtest()
  144. {
  145.   String x = X;
  146.   String y = Y;
  147.  
  148.   char ch = x[0];
  149.   cout << "ch = x[0] = " << ch << "\n";
  150.   assert(ch == 'H');
  151.  
  152.   String z = x.at(2, 3);
  153.   cout << "z = x.at(2, 3) = " << z << "\n";
  154.   assert(z.OK());
  155.   assert(z == "llo");
  156.  
  157.   x.at(2, 2) = "r";
  158.   cout << "x.at(2, 2) = r; x = " << x << "\n";
  159.   assert(x.OK());
  160.   assert(x.at(2,2).OK());
  161.   assert(x == "Hero");
  162.  
  163.   x = X;
  164.   x.at(0, 1) = "j";
  165.   cout << "x.at(0, 1) = j; x = " << x << "\n";
  166.   assert(x.OK());
  167.   assert(x == "jello");
  168.  
  169.   x = X;
  170.   x.at("He") = "je";
  171.   cout << "x.at(He) = je; x = " << x << "\n";
  172.   assert(x.OK());
  173.   assert(x == "jello");
  174.  
  175.   x = X;
  176.   x.at("l", -1) = "i";
  177.   cout << "x.at(l, -1) = i; x = " << x << "\n";
  178.   assert(x.OK());
  179.   assert(x == "Helio");
  180.   
  181.   x = X;
  182.   z = x.at(r);
  183.   cout << "z = x.at(r) = " << z << "\n";
  184.   assert(z.OK());
  185.   assert(z == "ello");
  186.  
  187.   z = x.before("o");
  188.   cout << "z = x.before(o) = " << z << "\n";
  189.   assert(z.OK());
  190.   assert(z == "Hell");
  191.  
  192.   x.before("ll") = "Bri";
  193.   cout << "x.before(ll) = Bri; x = " << x << "\n";
  194.   assert(x.OK());
  195.   assert(x == "Brillo");
  196.  
  197.   x = X;
  198.   z = x.before(2);
  199.   cout << "z = x.before(2) = " << z << "\n";
  200.   assert(z.OK());
  201.   assert(z == "He");
  202.  
  203.   z = x.after("Hel");
  204.   cout << "z = x.after(Hel) = " << z << "\n";
  205.   assert(z.OK());
  206.   assert(z == "lo");
  207.  
  208.   x.after("Hel") = "p";  
  209.   cout << "x.after(Hel) = p; x = " << x << "\n";
  210.   assert(x.OK());
  211.   assert(x == "Help");
  212.  
  213.   x = X;
  214.   z = x.after(3);
  215.   cout << "z = x.after(3) = " << z << "\n";
  216.   assert(z.OK());
  217.   assert(z == "o");
  218.  
  219.   z = "  a bc";
  220.   z  = z.after(RXwhite);
  221.   cout << "z =   a bc; z = z.after(RXwhite); z =" << z << "\n";
  222.   assert(z.OK());
  223.   assert(z == "a bc");
  224. }
  225.  
  226.  
  227. void utiltest()
  228. {
  229.   String x = X;
  230.   int matches = x.gsub("l", "ll");
  231.   cout << "x.gsub(l, ll); x = " << x << "\n";
  232.   assert(x.OK());
  233.   assert(matches == 2);
  234.   assert(x == "Hellllo");
  235.  
  236.   x = X;
  237.   matches = x.gsub(r, "ello should have been replaced by this string");
  238.   cout << "x.gsub(r, ...); x = " << x << "\n";
  239.   assert(x.OK());
  240.   assert(matches == 1);
  241.   assert(x == "Hello should have been replaced by this string");
  242.  
  243.   matches = x.gsub(RXwhite, "#");
  244.   cout << "x.gsub(RXwhite, #); x = " << x << "\n";
  245.   assert(matches == 7);
  246.   assert(x.OK());
  247.  
  248.   String z = X + Y;
  249.   z.del("loworl");
  250.   cout << "z = x+y; z.del(loworl); z = " << z << "\n";
  251.   assert(z.OK());
  252.   assert(z == "Held");
  253.  
  254.   x = X;
  255.   z = reverse(x);
  256.   cout << "reverse(x) = " << z << "\n";
  257.   assert(z.OK());
  258.   assert(z == "olleH");
  259.  
  260.   x.reverse();
  261.   cout << "x.reverse() = " << x << "\n";
  262.   assert(x.OK());
  263.   assert(x == z);
  264.  
  265.   x = X;
  266.   z = upcase(x);
  267.   cout << "upcase(x) = " << z << "\n";
  268.   assert(z.OK());
  269.   assert(z == "HELLO");
  270.  
  271.   z = downcase(x);
  272.   cout << "downcase(x) = " << z << "\n";
  273.   assert(z.OK());
  274.   assert(z == "hello");
  275.  
  276.   z = capitalize(x);
  277.   cout << "capitalize(x) = " << z << "\n";
  278.   assert(z.OK());
  279.   assert(z == "Hello");
  280.   
  281.   z = replicate('*', 10);
  282.   cout << "z = replicate(*, 10) = " << z << "\n";
  283.   assert(z.OK());
  284.   assert(z == "**********");
  285.   assert(z.length() == 10);
  286. }
  287.  
  288. void splittest()
  289. {
  290.   String z = "This string\thas\nfive words";
  291.   cout << "z = " << z << "\n";
  292.   String w[10];
  293.   int nw = split(z, w, 10, RXwhite);
  294.   assert(nw == 5);
  295.   cout << "from split(z, RXwhite, w, 10), n words = " << nw << ":\n";
  296.   for (int i = 0; i < nw; ++i)
  297.   {
  298.     assert(w[i].OK());
  299.     cout << w[i] << "\n";
  300.   }
  301.   assert(w[0] == "This");
  302.   assert(w[1] == "string");
  303.   assert(w[2] == "has");
  304.   assert(w[3] == "five");
  305.   assert(w[4] == "words");
  306.   assert(w[5] == 0);
  307.  
  308.   z = join(w, nw, "/");
  309.   cout << "z = join(w, nw, /); z =" << z << "\n";
  310.   assert(z.OK());
  311.   assert(z == "This/string/has/five/words");
  312. }
  313.  
  314.  
  315. void iotest()
  316. {
  317.   String z;
  318.   cout << "enter a word:";
  319.   cin >> z;
  320.   cout << "word =" << z << " ";
  321.   cout << "length = " << z.length() << "\n";
  322. }
  323.  
  324. void identitytest(String a, String b)
  325. {
  326.   String x = a;
  327.   String y = b;
  328.   x += b;
  329.   y.prepend(a);
  330.   assert((a + b) == x);
  331.   assert((a + b) == y);
  332.   assert(x == y);
  333.   assert(x.after(a) == b);
  334.   assert(x.before(b, -1) == a);
  335.   assert(x.from(a) == x);
  336.   assert(x.through(b, -1) == x);
  337.   assert(x.at(a) == a);
  338.   assert(x.at(b) == b);
  339.  
  340.   assert(reverse(x) == reverse(b) + reverse(a));
  341.   
  342.   assert((a + b + a) == (a + (b + a)));
  343.  
  344.   x.del(b, -1);
  345.   assert(x == a);
  346.  
  347.   y.before(b, -1) = b;
  348.   assert(y == (b + b));
  349.   y.at(b) = a;
  350.   assert(y == (a + b));
  351.  
  352.   x = a + reverse(a);
  353.   for (int i = 0; i < 7; ++i)
  354.   {
  355.     y = x;
  356.     x += x;
  357.     assert(x.OK());
  358.     assert(x == reverse(x));
  359.     assert(x.index(y) == 0);
  360.     assert(x.index(y, -1) == x.length() / 2);
  361.   }
  362. }
  363.  
  364. void freqtest()
  365. {
  366.   String x = "Hello World";
  367.   SubString y = x.at(0,5);
  368.   assert(x.freq('l') == 3);    // char
  369.   assert(x.freq("lo") == 1);    // char*
  370.   assert(x.freq(x) == 1);    // String
  371.   assert(x.freq(y) == 1);    // SubString
  372. }
  373.  
  374. main()
  375. {
  376.   decltest();
  377.   cattest();
  378.   comparetest();
  379.   substrtest();
  380.   utiltest();
  381.   splittest();
  382.   freqtest();
  383.   identitytest(X, X);
  384.   identitytest(X, Y);
  385.   identitytest(X+Y+N+X+Y+N, "A string that will be used in identitytest but is otherwise just another useless string.");
  386.   iotest();
  387.   cout << "\nEnd of test\n";
  388. }
  389.  
  390.  
  391.