|  | DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes | 
This is an automatic "excavation" of a thematic subset of
 See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. | 
top - metrics - downloadIndex: T t
    Length: 8057 (0x1f79)
    Types: TextFile
    Names: »tString.cc«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
    └─⟦cc8755de2⟧ »./libg++-1.36.1.tar.Z« 
        └─⟦23757c458⟧ 
            └─⟦this⟧ »libg++/tests/tString.cc« 
// This may look like C code, but it is really -*- C++ -*-
 
/*
 A test file for Strings
*/
#include <String.h>
#include <std.h>
#include <assert.h>
// can't nicely echo assertions because they contain quotes
#define tassert(ex) {if (!(ex)) \
                     { cerr << "failed assertion at " << __LINE__ << "\n"; \
                       abort(); } }
  String X = "Hello";
  String Y = "world";
  String N = "123";
  String c;
  char*  s = ",";
  Regex  r = "e[a-z]*o";
void decltest()
{
  String x;
  cout << "an empty String:" << x << "\n";
  assert(x.OK());
  assert(x == "");
  String y = "Hello";
  cout << "A string initialized to Hello:" << y << "\n";
  assert(y.OK());
  assert(y == "Hello");
  String a = y;
  cout << "A string initialized to previous string:" << a << "\n";
  assert(a.OK());
  assert(a == "Hello");
  assert(a == y);
  String b (a.at(1, 2));
  cout << "A string initialized to previous string.at(1, 2):" << b << "\n";
  assert(b.OK());
  assert(b == "el");
  char ch = '@';
  String z(ch); 
  cout << "A string initialized to @:" << z << "\n";
  assert(z.OK());
  assert(z == "@");
  String n = dec(20);
  cout << "A string initialized to dec(20):" << n << "\n";
  assert(n.OK());
  assert(n == "20");
  int i = atoi(n);
  double f = atof(n);
  cout << "n = " << n << " atoi(n) = " << i << " atof(n) = " << f << "\n";
  assert(i == 20);
  assert(f == 20);
  assert(X.OK());
  assert(Y.OK());
  assert(x.OK());
  assert(y.OK());
  assert(z.OK());
  assert(n.OK());
  assert(r.OK());
}
void cattest()
{
  String x = X;
  String y = Y;
  String z = x + y;
  cout << "z = x + y = " << z << "\n";
  assert(x.OK());
  assert(y.OK());
  assert(z.OK());
  assert(z == "Helloworld");
  x += y;
  cout << "x += y; x = " << x << "\n";
  assert(x.OK());
  assert(y.OK());
  assert(x == "Helloworld");
  y = Y;
  x = X;
  y.prepend(x);
  cout << "y.prepend(x); y = " << y << "\n";
  assert(y == "Helloworld");
  x = X;
  y = Y;
  z = x + s + ' ' + y.at("w") + y.after("w") + ".";
  cout << "z = x + s +  + y.at(w) + y.after(w) + . = " << z << "\n";
  assert(z.OK());
  assert(z == "Hello, world.");
}
void comparetest()
{  
  String x = X;
  String y = Y;
  String n = N;
  String z = x + y;
  assert(x != y);
  assert(x == "Hello");
  assert(x != z.at(0, 4));
  assert (x < y);
  assert(!(x >= z.at(0, 6)));
  assert(x.contains("He"));
  assert (z.contains(x));
  assert(x.contains(r));
  assert(!(x.matches(r)));
  assert(x.matches(RXalpha));
  assert(!(n.matches(RXalpha)));
  assert(n.matches(RXint));
  assert(n.matches(RXdouble));
  assert(x.index("lo") == 3);
  assert(x.index("l", 2) == 2);
  assert(x.index("l", -1) == 3);
  assert(x.index(r)  == 1);
  assert(x.index(r, -2) == 1);
  assert(x.contains("el", 1) == 2);
  assert(x.contains("el", 0) == 0);
  assert(common_prefix(x, "Help") == "Hel");
  assert(common_suffix(x, "to") == "o");
  assert(fcompare(x, "hELlo") == 0);
  assert(fcompare(x, "hElp") < 0);
}
void substrtest()
{
  String x = X;
  char ch = x[0];
  cout << "ch = x[0] = " << ch << "\n";
  assert(ch == 'H');
  String z = x.at(2, 3);
  cout << "z = x.at(2, 3) = " << z << "\n";
  assert(z.OK());
  assert(z == "llo");
  x.at(2, 2) = "r";
  cout << "x.at(2, 2) = r; x = " << x << "\n";
  assert(x.OK());
  assert(x.at(2,2).OK());
  assert(x == "Hero");
  x = X;
  x.at(0, 1) = "j";
  cout << "x.at(0, 1) = j; x = " << x << "\n";
  assert(x.OK());
  assert(x == "jello");
  x = X;
  x.at("He") = "je";
  cout << "x.at(He) = je; x = " << x << "\n";
  assert(x.OK());
  assert(x == "jello");
  x = X;
  x.at("l", -1) = "i";
  cout << "x.at(l, -1) = i; x = " << x << "\n";
  assert(x.OK());
  assert(x == "Helio");
  
  x = X;
  z = x.at(r);
  cout << "z = x.at(r) = " << z << "\n";
  assert(z.OK());
  assert(z == "ello");
  z = x.before("o");
  cout << "z = x.before(o) = " << z << "\n";
  assert(z.OK());
  assert(z == "Hell");
  x.before("ll") = "Bri";
  cout << "x.before(ll) = Bri; x = " << x << "\n";
  assert(x.OK());
  assert(x == "Brillo");
  x = X;
  z = x.before(2);
  cout << "z = x.before(2) = " << z << "\n";
  assert(z.OK());
  assert(z == "He");
  z = x.after("Hel");
  cout << "z = x.after(Hel) = " << z << "\n";
  assert(z.OK());
  assert(z == "lo");
  x.after("Hel") = "p";  
  cout << "x.after(Hel) = p; x = " << x << "\n";
  assert(x.OK());
  assert(x == "Help");
  x = X;
  z = x.after(3);
  cout << "z = x.after(3) = " << z << "\n";
  assert(z.OK());
  assert(z == "o");
  z = "  a bc";
  z  = z.after(RXwhite);
  cout << "z =   a bc; z = z.after(RXwhite); z =" << z << "\n";
  assert(z.OK());
  assert(z == "a bc");
}
void utiltest()
{
  String x = X;
  int matches = x.gsub("l", "ll");
  cout << "x.gsub(l, ll); x = " << x << "\n";
  assert(x.OK());
  assert(matches == 2);
  assert(x == "Hellllo");
  x = X;
  matches = x.gsub(r, "ello should have been replaced by this string");
  cout << "x.gsub(r, ...); x = " << x << "\n";
  assert(x.OK());
  assert(matches == 1);
  assert(x == "Hello should have been replaced by this string");
  matches = x.gsub(RXwhite, "#");
  cout << "x.gsub(RXwhite, #); x = " << x << "\n";
  assert(matches == 7);
  assert(x.OK());
  String z = X + Y;
  z.del("loworl");
  cout << "z = x+y; z.del(loworl); z = " << z << "\n";
  assert(z.OK());
  assert(z == "Held");
  x = X;
  z = reverse(x);
  cout << "reverse(x) = " << z << "\n";
  assert(z.OK());
  assert(z == "olleH");
  x.reverse();
  cout << "x.reverse() = " << x << "\n";
  assert(x.OK());
  assert(x == z);
  x = X;
  z = upcase(x);
  cout << "upcase(x) = " << z << "\n";
  assert(z.OK());
  assert(z == "HELLO");
  z = downcase(x);
  cout << "downcase(x) = " << z << "\n";
  assert(z.OK());
  assert(z == "hello");
  z = capitalize(x);
  cout << "capitalize(x) = " << z << "\n";
  assert(z.OK());
  assert(z == "Hello");
  
  z = replicate('*', 10);
  cout << "z = replicate(*, 10) = " << z << "\n";
  assert(z.OK());
  assert(z == "**********");
  assert(z.length() == 10);
}
void splittest()
{
  String z = "This string\thas\nfive words";
  cout << "z = " << z << "\n";
  String w[10];
  int nw = split(z, w, 10, RXwhite);
  assert(nw == 5);
  cout << "from split(z, RXwhite, w, 10), n words = " << nw << ":\n";
  for (int i = 0; i < nw; ++i)
  {
    assert(w[i].OK());
    cout << w[i] << "\n";
  }
  assert(w[0] == "This");
  assert(w[1] == "string");
  assert(w[2] == "has");
  assert(w[3] == "five");
  assert(w[4] == "words");
  assert(w[5] == 0);
  z = join(w, nw, "/");
  cout << "z = join(w, nw, /); z =" << z << "\n";
  assert(z.OK());
  assert(z == "This/string/has/five/words");
}
void iotest()
{
  String z;
  cout << "enter a word:";
  cin >> z;
  cout << "word =" << z << " ";
  cout << "length = " << z.length() << "\n";
}
void identitytest(String a, String b)
{
  String x = a;
  String y = b;
  x += b;
  y.prepend(a);
  assert((a + b) == x);
  assert((a + b) == y);
  assert(x == y);
  assert(x.after(a) == b);
  assert(x.before(b, -1) == a);
  assert(x.from(a) == x);
  assert(x.through(b, -1) == x);
  assert(x.at(a) == a);
  assert(x.at(b) == b);
  assert(reverse(x) == reverse(b) + reverse(a));
  
  assert((a + b + a) == (a + (b + a)));
  x.del(b, -1);
  assert(x == a);
  y.before(b, -1) = b;
  assert(y == (b + b));
  y.at(b) = a;
  assert(y == (a + b));
  x = a + reverse(a);
  for (int i = 0; i < 7; ++i)
  {
    y = x;
    x += x;
    assert(x.OK());
    assert(x == reverse(x));
    assert(x.index(y) == 0);
    assert(x.index(y, -1) == x.length() / 2);
  }
}
void freqtest()
{
  String x = "Hello World";
  SubString y = x.at(0,5);
  assert(x.freq('l') == 3);	// char
  assert(x.freq("lo") == 1);	// char*
  assert(x.freq(x) == 1);	// String
  assert(x.freq(y) == 1);	// SubString
}
main()
{
  decltest();
  cattest();
  comparetest();
  substrtest();
  utiltest();
  splittest();
  freqtest();
  identitytest(X, X);
  identitytest(X, Y);
  identitytest(X+Y+N+X+Y+N, "A string that will be used in identitytest but is otherwise just another useless string.");
  iotest();
  cout << "\nEnd of test\n";
}