- File:
-
- 1 edited
-
tests/collections/string-istream-manip.cfa (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tests/collections/string-istream-manip.cfa
r0860d9c rff56dd2e 3 3 #include <collections/string.hfa> 4 4 #include <collections/string_res.hfa> 5 #include <stdio.h>6 7 // No-op manipulators.8 // Temporary hack while there are two code paths in the string implementation.9 // (One for reading plain strings, the other for reading via a manipulator.)10 // The test cases that use plainjane(-) are exercising the via-manipulator code path,11 // just with trivial manipulation.12 static _Istream_Sstr plainjane( string & s ) { return (_Istream_Sstr)@{ s, {{0p}, -1, {.flags.rwd : false}} }; }13 static _Istream_Rstr plainjane( string_res & s ) { return (_Istream_Rstr)@{ &s, {{0p}, -1, {.flags.rwd : false}} }; }14 15 static void forceStringHeapFreeSpaceTo(int desiredSize) {16 for (1_000_000) {17 string x = "a";18 (void)x;19 if (desiredSize == DEBUG_string_bytes_avail_until_gc(DEBUG_string_heap())) return;20 }21 sout | "Unable to force size" | desiredSize | "in 1,000,000 tries";22 }23 5 24 6 int main() { 25 // These "pre" cases deal with issues analogous to the "pre" cases of io/manipulatorsInput.26 // The acceptance criterion is simpler but driving the cases is harder.27 // The tests just read strings and echo what they read; acceptance of simple echoing assures28 // no spurious splitting merging.29 // The lengths of the strings are chosen to match white-box knowledge of when the string layer30 // has tor drive the cstring layer through a second iteration:31 // - for no-manip, lengths are near the room at end of string heap32 // (chosen target size of 9 showed the original bug on preS2, aligned with the other cases)33 // - for manip, lengths are near the auxiliary buffer size of 12834 // Only first case repeats for string_res; rest run only from the passthru string layer.35 // Similarly, the manipulator breadth isn't checked at the cstring layer either.36 {37 // S: string, no manipulator38 void echoTillX(const char * casename) {39 string s;40 do {41 forceStringHeapFreeSpaceTo(9);42 sin | s;43 sout | casename | s;44 } while ( size(s) > 0 && s[size(s)-1] != 'x' );45 }46 echoTillX("preS1");47 echoTillX("preS2");48 echoTillX("preS3");49 echoTillX("preS4");50 }51 {52 // SMN: string, manipulator for no-op53 void echoTillX(const char * casename) {54 string s;55 do {56 sin | plainjane( s );57 sout | casename | s;58 } while ( size(s) > 0 && s[size(s)-1] != 'x' );59 }60 echoTillX("preSMN1");61 echoTillX("preSMN2");62 echoTillX("preSMN3");63 echoTillX("preSMN4");64 }65 {66 // RMN: string_res, manipulator for no-op67 void echoTillX(const char * casename) {68 string_res s;69 do {70 sin | plainjane( s );71 sout | casename | s;72 } while ( size(s) > 0 && s[size(s)-1] != 'x' );73 }74 echoTillX("preRMN1");75 echoTillX("preRMN2");76 echoTillX("preRMN3");77 echoTillX("preRMN4");78 }79 {80 // SMI: string, manipulator `incl`81 void echoTillX(const char * casename) {82 string s;83 do {84 sin | skip("-\n");85 sin | incl( ".:|# x", s );86 sout | casename | " \"" | s | "\"";87 } while ( size(s) > 0 && s[size(s)-1] != 'x' );88 }89 echoTillX("preSMI1");90 echoTillX("preSMI2");91 echoTillX("preSMI3");92 echoTillX("preSMI4");93 }94 {95 // SME: string, manipulator `excl`96 void echoTillX(const char * casename) {97 string s;98 do {99 sin | skip("-\n");100 sin | excl( "-\n", s );101 sout | casename | " \"" | s | "\"";102 } while ( size(s) > 0 && s[size(s)-1] != 'x' );103 }104 echoTillX("preSME1");105 echoTillX("preSME2");106 echoTillX("preSME3");107 echoTillX("preSME4");108 }109 sin | skip("-\n");110 {111 // SMG: string, manipulator `getline`112 void echoTillX(const char * casename) {113 string s;114 do {115 sin | getline( s );116 sout | casename | s;117 } while ( size(s) > 0 && s[size(s)-1] != 'x' );118 }119 echoTillX("preSMG1");120 echoTillX("preSMG2");121 echoTillX("preSMG3");122 echoTillX("preSMG4");123 }124 {125 // SMD: string, manipulator (`getline` with custom) delimiter126 void echoTillX(const char * casename) {127 string s;128 do {129 sin | getline( s, '@' );130 sout | casename | s;131 } while ( size(s) > 0 && s[size(s)-1] != 'x' );132 sin | skip(" \n");133 }134 echoTillX("preSMD1");135 echoTillX("preSMD2");136 echoTillX("preSMD3");137 echoTillX("preSMD4");138 }139 140 7 /* Keep harmonized with io/manipulatorsInput */ 141 8 { … … 156 23 sin | ignore( incl( "abc", wdi( 8, s ) ) ); sout | "12" | s; 157 24 sin | ignore( excl( "abc", wdi( 8, s ) ) ); sout | "13" | s; 158 159 s = "q"; 160 sin | incl( "abc", s ); sout | "14" | s; 161 s = "q"; 162 sin | excl( "u", s ); sout | "15" | s; 163 sin | skip( "u" ); 164 sin | "\n"; 165 } 166 // Full repeat on string_res layer assures the full manipulator vocabulary is supported there. 25 } 167 26 { 168 27 string_res s = "yyyyyyyyyyyyyyyyyyyy"; … … 182 41 sin | ignore( incl( "abc", wdi( 8, s ) ) ); sout | "12" | s; 183 42 sin | ignore( excl( "abc", wdi( 8, s ) ) ); sout | "13" | s; 184 185 s = "q";186 sin | incl( "abc", s ); sout | "14" | s;187 s = "q";188 sin | excl( "u", s ); sout | "15" | s;189 sin | skip( "u" );190 sin | "\n";191 43 } 192 44 }
Note:
See TracChangeset
for help on using the changeset viewer.