1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
/******************************************************************************
*
* swbuftest.cpp -
*
* $Id: swbuftest.cpp 2982 2013-09-15 13:33:03Z scribe $
*
* Copyright 2003-2013 CrossWire Bible Society (http://www.crosswire.org)
* CrossWire Bible Society
* P. O. Box 2528
* Tempe, AZ 85280-2528
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation version 2.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
*/
#include <time.h>
#include <iostream>
#define BASEI 102400000L
#include <swbuf.h>
#include <utilstr.h>
typedef sword::SWBuf StringType;
//#include <string>
//typedef std::string StringType;
using std::cout;
using std::cerr;
using sword::utf8ToWChar;
using sword::wcharToUTF8;
void markTime() {
static clock_t start = clock();
static clock_t last = start;
clock_t current = clock();
cerr << ((float)(current - last)/CLOCKS_PER_SEC) << " / " << ((float)(current - start)/CLOCKS_PER_SEC) << " (Seconds Delta / Seconds Total)\n";
cerr.flush();
last = current;
}
void appendChTest() {
cerr << "\nSTART: append ch test -------\n";
cerr.flush();
StringType s;
for (unsigned long i = 0; i < BASEI+14; i++) {
s += (char) (i%125)+1;
}
cerr << "\nEND: append ch test -------\n";
cerr.flush();
}
void appendStringTest() {
cerr << "\nSTART: append string test -------\n";
cerr.flush();
StringType s;
unsigned long iterations = BASEI/2L;
for (unsigned long i = 0; i < iterations; i++) {
s.append("this is a test", 3);
if (!(i%3))s.append("test");
}
cerr << "\nEND: append string test -------\n";
cerr.flush();
}
void subscriptTest() {
cerr << "\nSTART: subscript access test -------\n";
cerr.flush();
StringType s;
for (int j = 0; j < 100; j++) {
s += "0123456789";
}
for (int j = 0; j < BASEI/200; j++) {
for (unsigned long i = s.length()-1; i; i--) {
s[i] = (char) (i%40)+65;
}
}
cerr << "\nEND: subscript access test -------\n";
cerr.flush();
}
void ctorAssignTest() {
cerr << "\nSTART: constructor and assign test -------\n";
cerr.flush();
StringType s;
for (int j = 0; j < 100; j++) {
s += "0123456789";
}
for (unsigned long i = (BASEI/8); i; i--) {
StringType s2;
s2 = s;
s2[0] = '0'; // keep defeat copy on write optimizations
}
cerr << "\nEND: constructor and assign test -------\n";
cerr.flush();
}
void compareTest() {
cerr << "\nSTART: compare test -------\n";
cerr.flush();
StringType first = "firsttestAfirst";
StringType second = "firsttestBsecond";
for (unsigned long i = (unsigned long)(BASEI/1.5); i; i--) {
if (first != second) {
if (first <= second) {
if (first > second) {;}
else if (!(BASEI%10000)) {
first[0] = 'f'; // keep us from being optimized out
}
}
}
}
cerr << "\nEND: compare test -------\n";
cerr.flush();
}
void insertStringTest() {
cerr << "\nSTART: insert string test -------\n";
cerr.flush();
StringType s;
StringType sub = "text ->this part should not appear :)";
for (int j = 0; j < BASEI/7000; j++) {
s = "Start end";
for (int i = 0; i < 1000; i++) {
s.insert(s.length()/2, sub, 0, 5);
}
}
cerr << "\nEND: insert string test -------\n";
cerr.flush();
}
int main(int argc, char **argv) {
bool showTimings = !(argc > 1 && !strcmp(argv[1], "--no-timings"));
StringType x;
cout << "x should be (): (" << x << ")\n";
cout << "size should be 0: " << x.size() << "\n";
x = "hello";
cout << "x should be (hello): (" << x << ")\n";
x += " world";
cout << "x should be (hello world): (" << x << ")\n";
cout << "size should be 11: " << x.size() << "\n";
cout << "x[7] should be 'o': '" << x[7] << "'\n";
x[7] = 'u';
cout << "x[7] should be 'u': '" << x[7] << "'\n";
cout << "x should be (hello wurld): (" << x << ")\n";
StringType y = x + " " + x;
cout << "should be (hello wurld hello wurld): (" << y << ")\n";
sword::SWBuf prefixTest = "prefix:value";
cout << "Prefix test: " << prefixTest << "\n";
cout << "Prefix should be (prefix): " << prefixTest.stripPrefix(':') << "\n";
cout << "Value should be (value): " << prefixTest << "\n";
x = utf8ToWChar("ⲉⲛⲧⲁⲡⲛⲟⲩⲧⲉ");
cout << (wchar_t *)x.getRawData() << "\n";
x = wcharToUTF8((wchar_t *)x.getRawData());
cout << x << "\n";
// y.appendFormatted(" from %d %s running %02.05f miles", 4, "dogs", 1.9f);
// cout << "should be (hello wurld hello wurld from 4 dogs running 1.90000 miles): (" << y << ")\n";
// y += '!';
// cout << "should be (hello wurld hello wurld from 4 dogs running 1.90000 miles!): (" << y << ")\n";
// y.append(y.c_str(),5);
// cout << "should be (hello wurld hello wurld from 4 dogs running 1.90000 miles!hello): (" << y << ")\n";
if (showTimings) markTime();
appendChTest();
if (showTimings) markTime();
appendStringTest();
if (showTimings) markTime();
subscriptTest();
if (showTimings) markTime();
ctorAssignTest();
if (showTimings) markTime();
compareTest();
if (showTimings) markTime();
insertStringTest();
if (showTimings) markTime();
}
|