source: tests/collections/string-api-coverage.cfa@ b28ce93

Last change on this file since b28ce93 was 3f631d6, checked in by Michael Brooks <mlbrooks@…>, 5 months ago

Switch string io to be generic upon iostream, rather than specific upon fstream.

No direct test added because we currently lack a second implementation of the abstract streams.

Benefit is removing polymorphism-induced noise from cost calculations, in upcoming string-overload reorganizations.

The change in tests 'collections/string-operator*' shows cases where we stopped picking string for the wrong reason. (If we should be picking string for a better reason, that's just ahead.)

  • Property mode set to 100644
File size: 10.4 KB
RevLine 
[3f631d6]1#include <string.hfa>
[6f7aff3]2#include <string_sharectx.hfa>
[3f631d6]3#include <fstream.hfa>
[f450f2f]4
5
6// Purpose: call each function in string.hfa, top to bottom
7
8int main () {
[6f7aff3]9
10 #ifdef STRING_SHARING_OFF
11 string_sharectx c = { NO_SHARING };
12 #endif
13
[f450f2f]14 string s = "hello";
15 string s2 = "hello";
16 string s3 = "world";
17 string frag = "ell";
18
19 // IO operator, x2
[2b30370]20 sout | s | s | s; // hello hello hello
21
22 // empty ctor then assign
23 string sxx;
24 sout | sxx; // (blank line)
25 sxx = s;
26 sout | sxx; // hello
[f450f2f]27
28 // Comparisons
29 // all print "true false"
30 sout | (s == s2) | (s == s3);
31 sout | (s != s3) | (s != s2);
32 sout | (s == "hello") | (s == "world");
33 sout | (s != "world") | (s != "hello");
[e8b3717]34 sout | ( frag == s(1,3) ) | ( s3 == s(1,3) );
35 sout | ( s3 != s(1,3) ) | ( frag != s(1,3) );
36 sout | ( s2(1,3) == s(1,3) ) | ( s3(1,3) == s(1,3) );
37 sout | ( s3(1,3) != s(1,3) ) | ( s2(1,3) != s(1,3) );
38 sout | ( s(1,3) == frag ) | ( s(1,3) == s3 );
39 sout | ( s(1,3) != s3 ) | ( s(1,3) != frag );
40 sout | ( s(1,3) == "ell" ) | ( s(1,3) == "world" );
41 sout | ( s(1,3) != "world" ) | ( s(1,3) != "ell" );
[f450f2f]42
43
44 //
45 // breadth Constructors
46 //
47 {
[7abc3de]48 string b1 = "1234567";
49 sout | b1; // 1234567
50
51 string b1x = { "1234567", 3 };
52 sout | b1x; // 123
[f450f2f]53
54 string b2 = s;
55 sout | b2; // hello
56
[7abc3de]57 string b2x = { s, 4 };
58 sout | b2x; // hell
59
[f450f2f]60 // todo: a plain string &
61 const string & s_ref = s;
62 string b3 = s_ref;
63 sout | b3; // hello
64
65 & s_ref = & s3;
66 b3 = s_ref;
67 sout | b3; // world
68
69 const string & s_constref = s;
70 string b4 = s_constref;
71 sout | b4; // hello
72
73 & s_constref = & s3;
74 b4 = s_constref;
75 sout | b4; // world
[7abc3de]76
77 string b5 = 'Q';
78 sout | b5; // Q
79
[f2898df]80 string b6 = 42;
81 sout | b6; // 42
[7abc3de]82
[f2898df]83 string b7 = -42;
84 sout | b7; // -42
85
86 string b8 = 5.5;
87 sout | b8; // 5.5
88
89 string b9 = 5.5L;
90 sout | b9; // 5.5
91
92 string b10 = 5.5+3.4i;
93 sout | b10; // 5.5+3.4i
94
95 string b11 = 5.5L+3.4Li;
96 sout | b11; // 5.5+3.4i
[f450f2f]97 }
[b12b1ba]98
[e891349]99 //
100 // Assignments
101 //
102 {
103 string b = "xxx";
104
105 b = "1234567";
106 sout | b; // 1234567
107
108 b = "xxx";
109 b = s;
110 sout | b; // hello
111
112 b = "xxx";
113 b = 'Q';
114 sout | b; // Q
115
116 b = "xxx";
117 assign( b, "1234567", 3 );
118 sout | b; // 123
119
120 b = "xxx";
121 assign( b, s, 4 );
122 sout | b; // hell
123
124 b = "xxx";
125 strcpy(b, "1234567");
126 sout | b; // 1234567
127
128 b = "xxx";
129 strcpy(b, s);
130 sout | b; // hello
131
132 b = "xxx";
133 strncpy( b, "1234567", 3 );
134 sout | b; // 123
135
136 b = "xxx";
137 strncpy( b, s, 4 );
138 sout | b; // hell
[f2898df]139
140 b = 42;
141 sout | b; // 42
142
143 b = -42;
144 sout | b; // -42
145
146 b = 5.5;
147 sout | b; // 5.5
148
149 b = 5.5L;
150 sout | b; // 5.5
151
152 b = 5.5+3.4i;
153 sout | b; // 5.5+3.4i
154
155 b = 5.5L+3.4Li;
156 sout | b; // 5.5+3.4i
[e891349]157 }
[b12b1ba]158
[e891349]159
160
[f450f2f]161
[9aa8dcc]162 sout | len(s); // 5
[f450f2f]163
164 //
165 // concatenation/append
166 //
167
168 string sx = s + s3;
169 sout | sx; // helloworld
170 sx = "xx";
171 sx = s + s3;
172 sout | sx; // helloworld
173
174 sx += '!';
175 sout | sx; // helloworld!
176 sx = s + '!';
177 sout | sx; // hello!
178
179 sx = s;
180 sx += s;
181 sout | sx; // hellohello
182 sx += ", friend";
183 sout | sx; // hellohello, friend
184
185 sx = s + ", friend";
186 sout | sx; // hello, friend
187
188 sx = "bye, " + "friend";
189 sout | sx; // bye, friend
190
[e891349]191 sx = "o";
192 strcat( sx, s );
193 sout | sx; // ohello
194
195 sx = "o";
196 append( sx, s, 4 );
197 sout | sx; // ohell
198
199 sx = "o";
200 strncat( sx, s, 4 );
201 sout | sx; // ohell
202
203 sx = "o";
204 strcat( sx, "mydarling" );
205 sout | sx; // omydarling
206
207 sx = "o";
208 append( sx, "mydarling", 2 );
209 sout | sx; // omy
210
211 sx = "o";
212 strncat( sx, "mydarling", 2 );
213 sout | sx; // omy
214
[f450f2f]215 //
216 // repetition
217 //
[38951c31]218
219 sx = s;
220 sx *= 4;
221 sout | sx; // hellohellohellohello
222
[f450f2f]223 sx = s * 3;
224 sout | sx; // hellohellohello
225
226 sx = 'Q' * (size_t)3;
227 sout | sx; // QQQ
228
229 sx = "asdf" * 3;
230 sout | sx; // asdfasdfasdf
231
232 //
233 // slicing
234 //
235
[e8b3717]236 // Range cases treated thoroughly in "string-overwrite" test.
237 // Composability with comparison and search are demoed above and below.
238 // Coverage here adds the single-argument ("rest of string") overload.
239
240 sx = s;
241 sout | sx(3); // lo
242 sx(3) = "iocentric";
243 sout | s | sx; // hello heliocentric
[f450f2f]244
245 //
246 // character access
247 //
248
249 char c = s[1];
250 sout | c; // e
251
252 s[3] = "p!!!";
253 sout | s; // help!!!o
254
255 s[7] = '!';
256 sout | s; // help!!!!
257
258 s[7] = "";
259 sout | s; // help!!!
260
261 sout | s[3]; // p
262
263 //
264 // search
265 //
266
267 s += '?'; // already tested
268 sout | contains( s, 'h' ) | contains( s, '?' ) | contains( s, 'o' ); // true true false
269
270 sout
271 | find( s, 'h' ) // 0
272 | find( s, '!' ) // 4
273 | find( s, '?' ) // 7
274 | find( s, 'o' ); // 8, not found
275
276 string alphabet = "abcdefghijklmnopqrstuvwxyz";
277
278 sout
279 | find( alphabet, "" ) // 0
280 | find( alphabet, "a" ) // 0
281 | find( alphabet, "z" ) // 25
282 | find( alphabet, "abc" ) // 0
283 | find( alphabet, "abq" ) // 26, not found
284 | find( alphabet, "def"); // 3
285
286 sout
287 | includes( alphabet, "" ) // true
288 | includes( alphabet, "a" ) // true
289 | includes( alphabet, "z" ) // true
290 | includes( alphabet, "abc" ) // true
291 | includes( alphabet, "abq" ) // false
292 | includes( alphabet, "def"); // true
293
294 {
295 char *empty_c = "";
296 char *a_c = "a";
297 char *z_c = "z";
298 char *dex_c = "dex";
299
300 sout
301 | find( alphabet, empty_c ) // 0
302 | find( alphabet, a_c ) // 0
303 | find( alphabet, dex_c ) // 26, not found
304 | find( alphabet, dex_c, 2 ); // 3
305
306 sout
307 | includes( alphabet, empty_c ) // true
308 | includes( alphabet, a_c ) // true
309 | includes( alphabet, dex_c ) // false
310 | includes( alphabet, dex_c, 2 ); // true
311
312 sout
313 | startsWith( alphabet, a_c) // true
314 | endsWith ( alphabet, a_c) // false
315 | startsWith( alphabet, z_c) // false
316 | endsWith ( alphabet, z_c); // true
317
318 string empty = empty_c;
319 string a = a_c;
320 string z = z_c;
321 string dex = dex_c;
322
323 sout
324 | find( alphabet, empty ) // 0
325 | find( alphabet, a ) // 0
326 | find( alphabet, dex ) // 26, not found
327 | find( alphabet, dex(0,2) ); // 3
328
329 sout
330 | includes( alphabet, empty ) // true
331 | includes( alphabet, a ) // true
332 | includes( alphabet, dex ) // false
333 | includes( alphabet, dex(0,2) ); // true
334
335 sout
336 | startsWith( alphabet, a) // true
337 | endsWith ( alphabet, a) // false
338 | startsWith( alphabet, z) // false
339 | endsWith ( alphabet, z); // true
340 }
341
342 sout
343 | find( alphabet , "def") // 3
344 | find( alphabet( 0, 26), "def") // 3
[e8b3717]345 | find( alphabet( 2, 24), "def") // 1
346 | find( alphabet( 3, 23), "def") // 0
347 | find( alphabet( 4, 22), "def") // 22, not found
348 | find( alphabet( 4, 22), "ef") // 0
[f450f2f]349 | find( alphabet( 0, 6), "def") // 3
350 | find( alphabet( 0, 5), "def") // 5, not found
351 | find( alphabet( 0, 5), "de" ); // 3
352
353 sout
354 | includes( alphabet , "def") // true
355 | includes( alphabet( 0, 26), "def") // true
[e8b3717]356 | includes( alphabet( 2, 24), "def") // true
357 | includes( alphabet( 3, 23), "def") // true
358 | includes( alphabet( 4, 22), "def") // false
359 | includes( alphabet( 4, 22), "ef") // true
[f450f2f]360 | includes( alphabet( 0, 6), "def") // true
361 | includes( alphabet( 0, 5), "def") // false
362 | includes( alphabet( 0, 5), "de" ); // true
363
364 sout
365 | startsWith( alphabet , "abc") // true
366 | startsWith( alphabet( 0, 26), "abc") // true
[e8b3717]367 | startsWith( alphabet( 1, 25), "abc") // false
368 | startsWith( alphabet( 1, 25), "bc") // true
[f450f2f]369 | startsWith( alphabet( 0, 26), "abc") // true
370 | startsWith( alphabet( 0, 4), "abc") // true
371 | startsWith( alphabet( 0, 3), "abc") // true
372 | startsWith( alphabet( 0, 3), "ab" ) // true
373 | startsWith( alphabet , "xyz"); // false
374
375 sout
376 | endsWith( alphabet , "xyz") // true
377 | endsWith( alphabet , "xyzz") // false
378 | endsWith( alphabet( 0, 26), "xyz") // true
379 | endsWith( alphabet( 0, 25), "xyz") // false
380 | endsWith( alphabet( 0, 25), "xy" ) // true
381 | endsWith( alphabet( 0, 26), "xyz") // true
[e8b3717]382 | endsWith( alphabet(23, 3), "xyz") // true
383 | endsWith( alphabet(24, 2), "xyz") // false
384 | endsWith( alphabet(24, 2), "yz") // true
[f450f2f]385 | endsWith( alphabet , "abc"); // false
386
387 charclass cc_cba = {"cba"};
388 charclass cc_onml = {"onml"};
389 charclass cc_alphabet = {alphabet};
390
391 // include (rest of the) numbers: tell me where the numbers stop
392 // exclude (until) numbers: tell me where the numbers start (include rest of the non-numbers)
393
394 sout
[7e4f226]395 | (return size_t)include( alphabet, cc_cba ) // 3
396 | (return size_t)exclude( alphabet, cc_cba ) // 0
397 | (return size_t)include( alphabet, cc_onml ) // 0
398 | (return size_t)exclude( alphabet, cc_onml ) // 11
399 | (return size_t)include( alphabet, cc_alphabet ) // 26
400 | (return size_t)exclude( alphabet, cc_alphabet ); // 0
[f450f2f]401
[7e4f226]402 sout
403 | (return string)include( alphabet, cc_cba ) // "abc"
404 | (return string)exclude( alphabet, cc_cba ) // ""
405 | (return string)include( alphabet, cc_onml ) // ""
406 | (return string)exclude( alphabet, cc_onml ) // "abcdefghijk"
407 | (return string)include( alphabet, cc_alphabet ) // "abcdefghijklmnopqrstuvwxyz"
408 | (return string)exclude( alphabet, cc_alphabet ); // ""
409}
Note: See TracBrowser for help on using the repository browser.