TestTextUtil.cpp 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <EAStdC/EATextUtil.h>
  5. #include <EAStdC/EAString.h>
  6. #include <EAStdCTest/EAStdCTest.h>
  7. #include <EATest/EATest.h>
  8. #include <EASTL/fixed_string.h>
  9. #include <EASTL/string.h>
  10. #include <string.h>
  11. #ifdef _MSC_VER
  12. #pragma warning(disable: 4310) // cast truncates constant value.
  13. #endif
  14. typedef eastl::basic_string<char> String8;
  15. typedef eastl::basic_string<char16_t> String16;
  16. typedef eastl::basic_string<char32_t> String32;
  17. static int TestUTF8()
  18. {
  19. using namespace EA::StdC;
  20. int nErrorCount(0);
  21. bool bResult;
  22. const char* pResult;
  23. char16_t cResult;
  24. size_t nResult;
  25. char buffer[32];
  26. // We would need a lot more strings than this to test this functionality well.
  27. const uint8_t str1[] = { 0 };
  28. const uint8_t str2[] = { 'a', 'b', 'c', 0 };
  29. const uint8_t str3[] = { 0xe8, 0x8f, 0xa4, 0xc8, 0x80, 0x61, 0 }; // 0x83e4, 0x0200, 0x0061
  30. const uint8_t str4[] = { 0x7f, 0xc4, 0x80, 0xef, 0xbf, 0xb0, 0 }; // 0x007f, 0x0100, 0xfff0
  31. const char* strArray[] =
  32. {
  33. reinterpret_cast<const char*>(str1),
  34. reinterpret_cast<const char*>(str2),
  35. reinterpret_cast<const char*>(str3),
  36. reinterpret_cast<const char*>(str4)
  37. };
  38. // These represent bad combinations of bytes that any UTF8 decoder should recognize.
  39. const uint8_t strBad1[] = { 0xc1, 0 };
  40. const uint8_t strBad2[] = { 0xfe, 0 };
  41. const uint8_t strBad3[] = { 0xc2, 0x7f, 0 };
  42. const uint8_t strBad4[] = { 0xc2, 0xc0, 0 };
  43. const uint8_t strBad5[] = { 0xe0, 0x9f, 0x80, 0 };
  44. const uint8_t strBad6[] = { 0xe0, 0x80, 0xff, 0 };
  45. // The following UTF-8 sequences should be rejected like malformed sequences, because they never represent valid ISO 10646 characters and a UTF-8 decoder that accepts them might introduce security problems comparable to overlong UTF-8 sequences.
  46. //const uint8_t strBad7[] = { 0xed, 0xa0, 0x80, 0 };
  47. //const uint8_t strBad8[] = { 0xed, 0xbf, 0xbf, 0 };
  48. //const uint8_t strBad9[] = { 0xef, 0xbf, 0xbe, 0 };
  49. const char* strBadArray[] =
  50. {
  51. reinterpret_cast<const char*>(strBad1),
  52. reinterpret_cast<const char*>(strBad2),
  53. reinterpret_cast<const char*>(strBad3),
  54. reinterpret_cast<const char*>(strBad4),
  55. reinterpret_cast<const char*>(strBad5),
  56. reinterpret_cast<const char*>(strBad6)
  57. /*, reinterpret_cast<const char*>(strBad7),
  58. reinterpret_cast<const char*>(strBad8),
  59. reinterpret_cast<const char*>(strBad9) */
  60. };
  61. // bool UTF8Validate(const char* p, size_t nLength);
  62. for(size_t i = 0; i < sizeof(strArray)/sizeof(strArray[0]); ++i)
  63. {
  64. bResult = UTF8Validate(strArray[i], strlen(strArray[i]));
  65. EATEST_VERIFY(bResult);
  66. }
  67. for(size_t i = 0; i < sizeof(strBadArray)/sizeof(strBadArray[0]); ++i)
  68. {
  69. bResult = UTF8Validate(strBadArray[i], strlen(strBadArray[i]));
  70. EATEST_VERIFY(!bResult);
  71. }
  72. // char* UTF8Increment(const char* p, size_t n);
  73. // char* UTF8Decrement(const char* p, size_t n);
  74. pResult = UTF8Increment(strArray[0], 1);
  75. EATEST_VERIFY(pResult == (strArray[0] + 1));
  76. pResult = UTF8Decrement(pResult, 1);
  77. EATEST_VERIFY(pResult == strArray[0]);
  78. pResult = UTF8Increment(strArray[1], 3);
  79. EATEST_VERIFY(pResult == (strArray[1] + 3));
  80. pResult = UTF8Decrement(pResult, 3);
  81. EATEST_VERIFY(pResult == strArray[1]);
  82. pResult = UTF8Increment(strArray[2], 3);
  83. EATEST_VERIFY(pResult == (strArray[2] + 6));
  84. pResult = UTF8Decrement(pResult, 3);
  85. EATEST_VERIFY(pResult == strArray[2]);
  86. pResult = UTF8Increment(strArray[3], 3);
  87. EATEST_VERIFY(pResult == (strArray[3] + 6));
  88. pResult = UTF8Decrement(pResult, 3);
  89. EATEST_VERIFY(pResult == strArray[3]);
  90. // size_t UTF8Length(const char* p);
  91. EATEST_VERIFY(UTF8Length("0123456789") == 10);
  92. EATEST_VERIFY(UTF8Length("") == 0);
  93. EATEST_VERIFY(UTF8Length("\xc2" "\xa2") == 1);
  94. EATEST_VERIFY(UTF8Length("\xd7" "\x90") == 1);
  95. EATEST_VERIFY(UTF8Length("\xe0" "\xbc" "\xa0") == 1);
  96. EATEST_VERIFY(UTF8Length("\xc2\x80 \xc2\x81 \xdf\xbe \xdf\xbf") == 7);
  97. EATEST_VERIFY(UTF8Length("\xe0\xa0\x80 \xe0\xa0\x81 \xef\xbf\xbe \xef\xbf\xbf") == 7);
  98. EATEST_VERIFY(UTF8Length("\xf0\x90\x80\x80 \xf0\x90\x80\x81") == 3);
  99. EATEST_VERIFY(UTF8Length("\xf4\x8f\xbf\xbe \xf4\x8f\xbf\xbf") == 3);
  100. // size_t UTF8Length(const char16_t* p);
  101. EATEST_VERIFY(UTF8Length(EA_CHAR16("0123456789")) == 10);
  102. EATEST_VERIFY(UTF8Length(EA_CHAR16("")) == 0);
  103. EATEST_VERIFY(UTF8Length(EA_CHAR16("\x00a0")) == 2);
  104. EATEST_VERIFY(UTF8Length(EA_CHAR16("\x0400")) == 2);
  105. EATEST_VERIFY(UTF8Length(EA_CHAR16("\x0800")) == 3);
  106. // We have to break up the string into multiple sub-strings because the \x escape sequence has limitations in how it works.
  107. eastl::fixed_string<char16_t, 32> s16; s16 = EA_CHAR16("\xffff"); s16 += EA_CHAR16("\xffff"); // We use a string object because some compilers don't support 16 bit string literals, and thus EA_CHAR16 is a function and doesn't just prepend "L" or "u" to the string.
  108. EATEST_VERIFY(UTF8Length(s16.c_str()) == 6);
  109. s16 = EA_CHAR16("\xffff"); s16 += EA_CHAR16("\x0900"); s16 += EA_CHAR16("0"); s16 += EA_CHAR16("\x00a0");
  110. EATEST_VERIFY(UTF8Length(s16.c_str()) == 9);
  111. // size_t UTF8Length(const char32_t* p);
  112. EATEST_VERIFY(UTF8Length(EA_CHAR32("0123456789")) == 10);
  113. EATEST_VERIFY(UTF8Length(EA_CHAR32("")) == 0);
  114. EATEST_VERIFY(UTF8Length(EA_CHAR32("\x00a0")) == 2);
  115. EATEST_VERIFY(UTF8Length(EA_CHAR32("\x0400")) == 2);
  116. EATEST_VERIFY(UTF8Length(EA_CHAR32("\x0800")) == 3);
  117. // We have to break up the string into multiple sub-strings because the \x escape sequence has limitations in how it works.
  118. eastl::fixed_string<char32_t, 32> s32; s32 = EA_CHAR32("\xffff"); s32 += EA_CHAR32("\xffff"); // We use a string object because some compilers don't support 32 bit string literals, and thus EA_CHAR32 is a function and doesn't just prepend "L" or "u" to the string.
  119. EATEST_VERIFY(UTF8Length(s32.c_str()) == 6);
  120. s32 = EA_CHAR32("\xffff"); s32 += EA_CHAR32("\x0900"); s32 += EA_CHAR32("0"); s32 += EA_CHAR32("\x00a0");
  121. EATEST_VERIFY(UTF8Length(s32.c_str()) == 9);
  122. // size_t UTF8CharSize(const char* p);
  123. EATEST_VERIFY(UTF8CharSize(strArray[0]) == 1);
  124. EATEST_VERIFY(UTF8CharSize(strArray[1]) == 1);
  125. EATEST_VERIFY(UTF8CharSize(strArray[2] + 0) == 3);
  126. EATEST_VERIFY(UTF8CharSize(strArray[2] + 3) == 2);
  127. EATEST_VERIFY(UTF8CharSize(strArray[3] + 1) == 2);
  128. EATEST_VERIFY(UTF8CharSize(strArray[3] + 3) == 3);
  129. // size_t UTF8CharSize(char16_t c);
  130. nResult = UTF8CharSize((char16_t)0x0001);
  131. EATEST_VERIFY(nResult == 1);
  132. nResult = UTF8CharSize((char16_t)0x007f);
  133. EATEST_VERIFY(nResult == 1);
  134. nResult = UTF8CharSize((char16_t)0x0080);
  135. EATEST_VERIFY(nResult == 2);
  136. nResult = UTF8CharSize((char16_t)0x07ff);
  137. EATEST_VERIFY(nResult == 2);
  138. nResult = UTF8CharSize((char16_t)0x0800);
  139. EATEST_VERIFY(nResult == 3);
  140. nResult = UTF8CharSize((char16_t)0xfffd);
  141. EATEST_VERIFY(nResult == 3);
  142. // size_t UTF8CharSize(char32_t c);
  143. nResult = UTF8CharSize((char32_t)0x0001);
  144. EATEST_VERIFY(nResult == 1);
  145. nResult = UTF8CharSize((char32_t)0x007f);
  146. EATEST_VERIFY(nResult == 1);
  147. nResult = UTF8CharSize((char32_t)0x0080);
  148. EATEST_VERIFY(nResult == 2);
  149. nResult = UTF8CharSize((char32_t)0x07ff);
  150. EATEST_VERIFY(nResult == 2);
  151. nResult = UTF8CharSize((char32_t)0x0800);
  152. EATEST_VERIFY(nResult == 3);
  153. nResult = UTF8CharSize((char32_t)0xfffd);
  154. EATEST_VERIFY(nResult == 3);
  155. // char16_t UTF8ReadChar(const char* p, const char** ppEnd = NULL);
  156. pResult = strArray[0];
  157. cResult = UTF8ReadChar(pResult, &pResult);
  158. EATEST_VERIFY((cResult == 0x0000) && (pResult == strArray[0] + 1));
  159. pResult = strArray[1];
  160. cResult = UTF8ReadChar(pResult, &pResult);
  161. EATEST_VERIFY((cResult == 'a') && (pResult == strArray[1] + 1));
  162. cResult = UTF8ReadChar(pResult, &pResult);
  163. EATEST_VERIFY((cResult == 'b') && (pResult == strArray[1] + 2));
  164. pResult = strArray[2];
  165. cResult = UTF8ReadChar(pResult, &pResult);
  166. EATEST_VERIFY((cResult == 0x83e4) && (pResult == strArray[2] + 3));
  167. cResult = UTF8ReadChar(pResult, &pResult);
  168. EATEST_VERIFY((cResult == 0x0200) && (pResult == strArray[2] + 5));
  169. cResult = UTF8ReadChar(pResult, &pResult);
  170. EATEST_VERIFY((cResult == 0x0061) && (pResult == strArray[2] + 6));
  171. pResult = strArray[3];
  172. cResult = UTF8ReadChar(pResult, &pResult);
  173. EATEST_VERIFY((cResult == 0x007f) && (pResult == strArray[3] + 1));
  174. cResult = UTF8ReadChar(pResult, &pResult);
  175. EATEST_VERIFY((cResult == 0x0100) && (pResult == strArray[3] + 3));
  176. cResult = UTF8ReadChar(pResult, &pResult);
  177. EATEST_VERIFY((cResult == 0xfff0) && (pResult == strArray[3] + 6));
  178. // char* UTF8WriteChar(char* p, char16_t c);
  179. pResult = buffer;
  180. pResult = UTF8WriteChar((char*)pResult, (char16_t)0x83e4);
  181. pResult = UTF8WriteChar((char*)pResult, (char16_t)0x0200);
  182. pResult = UTF8WriteChar((char*)pResult, (char16_t)0x0061);
  183. pResult = UTF8WriteChar((char*)pResult, (char16_t)0x0000);
  184. EATEST_VERIFY((strcmp(buffer, strArray[2]) == 0) && (pResult == buffer + 7));
  185. // char* UTF8WriteChar(char* p, char32_t c);
  186. pResult = buffer;
  187. pResult = UTF8WriteChar((char*)pResult, (char32_t)0x83e4);
  188. pResult = UTF8WriteChar((char*)pResult, (char32_t)0x0200);
  189. pResult = UTF8WriteChar((char*)pResult, (char32_t)0x0061);
  190. pResult = UTF8WriteChar((char*)pResult, (char32_t)0x0000);
  191. EATEST_VERIFY((strcmp(buffer, strArray[2]) == 0) && (pResult == buffer + 7));
  192. // bool UTF8IsSoloByte(char c);
  193. EATEST_VERIFY( UTF8IsSoloByte('\0'));
  194. EATEST_VERIFY( UTF8IsSoloByte('\n'));
  195. EATEST_VERIFY( UTF8IsSoloByte('a'));
  196. EATEST_VERIFY( UTF8IsSoloByte((char)0x7f));
  197. EATEST_VERIFY(!UTF8IsSoloByte((char)0x80));
  198. EATEST_VERIFY(!UTF8IsSoloByte((char)0xfd));
  199. EATEST_VERIFY(!UTF8IsSoloByte((char)0xfe));
  200. EATEST_VERIFY(!UTF8IsSoloByte((char)0xff));
  201. // bool UTF8IsLeadByte(char c);
  202. EATEST_VERIFY( UTF8IsSoloByte('\0'));
  203. EATEST_VERIFY( UTF8IsSoloByte('\n'));
  204. EATEST_VERIFY( UTF8IsSoloByte('a'));
  205. EATEST_VERIFY( UTF8IsSoloByte((char)0x7f));
  206. EATEST_VERIFY(!UTF8IsSoloByte((char)0xc0));
  207. EATEST_VERIFY(!UTF8IsSoloByte((char)0xd1));
  208. EATEST_VERIFY(!UTF8IsSoloByte((char)0xe4));
  209. EATEST_VERIFY(!UTF8IsSoloByte((char)0xf0)); // This assumes that we don't support 4, 5, 6 byte sequences.
  210. EATEST_VERIFY(!UTF8IsSoloByte((char)0xfe));
  211. EATEST_VERIFY(!UTF8IsSoloByte((char)0xff));
  212. // bool UTF8IsFollowByte(char c);
  213. EATEST_VERIFY(!UTF8IsFollowByte((char)0x00));
  214. EATEST_VERIFY(!UTF8IsFollowByte((char)0x7f));
  215. EATEST_VERIFY( UTF8IsFollowByte((char)0x80));
  216. EATEST_VERIFY( UTF8IsFollowByte((char)0xbf));
  217. EATEST_VERIFY(!UTF8IsFollowByte((char)0xc0));
  218. EATEST_VERIFY(!UTF8IsFollowByte((char)0xff));
  219. // char* UTF8ReplaceInvalidChar(char* pIn, size_t nLength, char replaceWith);
  220. {
  221. {
  222. char8_t outBuffer[256] = {0};
  223. auto* pBad = EA_CHAR8("foofoobaazong");
  224. auto* pGood = EA_CHAR8("foofoobaazong");
  225. auto* pOut = UTF8ReplaceInvalidChar(pBad, UTF8Length(pBad), outBuffer, '?');
  226. EATEST_VERIFY(UTF8Length(pBad) == size_t(pOut - outBuffer));
  227. EATEST_VERIFY(Strcmp(pGood, outBuffer) == 0);
  228. }
  229. {
  230. char outBuffer[256] = {0};
  231. auto* pBad = "foofoo\xfa" "baazong";
  232. auto* pGood = "foofoo?baazong";
  233. auto* pOut = UTF8ReplaceInvalidChar(pBad, UTF8Length(pBad), outBuffer, '?');
  234. EATEST_VERIFY(UTF8Length(pBad) == size_t(pOut - outBuffer));
  235. EATEST_VERIFY(Strcmp(pGood, outBuffer) == 0);
  236. }
  237. {
  238. char outBuffer[256] = {0};
  239. auto* pBad = "foofoo\xfa\xfa\xfa\xfa\xfa" "baazong";
  240. auto* pGood = "foofoo?????baazong";
  241. auto* pOut = UTF8ReplaceInvalidChar(pBad, UTF8Length(pBad), outBuffer, '?');
  242. EATEST_VERIFY(UTF8Length(pBad) == size_t(pOut - outBuffer));
  243. EATEST_VERIFY(Strcmp(pGood, outBuffer) == 0);
  244. }
  245. {
  246. char outBuffer[256] = {0};
  247. auto* pBad = "foo\xfa" "foo\xfa\xfa" "b\xfa" "a\xfa" "a\xfa" "z\xfa" "o\xfa" "n\xfa" "g\xfa";
  248. auto* pGood = "foo?foo??b?a?a?z?o?n?g?";
  249. auto* pOut = UTF8ReplaceInvalidChar(pBad, UTF8Length(pBad), outBuffer, '?');
  250. EATEST_VERIFY(UTF8Length(pBad) == size_t(pOut - outBuffer));
  251. EATEST_VERIFY(Strcmp(pGood, outBuffer) == 0);
  252. }
  253. }
  254. return nErrorCount;
  255. }
  256. int TestTextUtil()
  257. {
  258. using namespace EA::StdC;
  259. int nErrorCount(0);
  260. nErrorCount += TestUTF8();
  261. // WildcardMatch
  262. {
  263. // char
  264. EATEST_VERIFY(WildcardMatch("abcde", "*e", false) == true);
  265. EATEST_VERIFY(WildcardMatch("abcde", "*f", false) == false);
  266. EATEST_VERIFY(WildcardMatch("abcde", "???de", false) == true);
  267. EATEST_VERIFY(WildcardMatch("abcde", "????g", false) == false);
  268. EATEST_VERIFY(WildcardMatch("abcde", "*c??", false) == true);
  269. EATEST_VERIFY(WildcardMatch("abcde", "*e??", false) == false);
  270. EATEST_VERIFY(WildcardMatch("abcde", "*????", false) == true);
  271. EATEST_VERIFY(WildcardMatch("abcde", "bcdef", false) == false);
  272. EATEST_VERIFY(WildcardMatch("abcde", "*?????", false) == true);
  273. EATEST_VERIFY(WildcardMatch("abcdE", "*E", true) == true);
  274. EATEST_VERIFY(WildcardMatch("abcde", "*f", true) == false);
  275. EATEST_VERIFY(WildcardMatch("abcDE", "???de", true) == false);
  276. EATEST_VERIFY(WildcardMatch("abcde", "????g", true) == false);
  277. EATEST_VERIFY(WildcardMatch("abCde", "*c??", true) == false);
  278. EATEST_VERIFY(WildcardMatch("abcde", "*e??", true) == false);
  279. EATEST_VERIFY(WildcardMatch("abcde", "*????", true) == true);
  280. EATEST_VERIFY(WildcardMatch("abcde", "bcdef", true) == false);
  281. EATEST_VERIFY(WildcardMatch("abcde", "*?????", true) == true);
  282. // char16_t
  283. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*e"), false) == true);
  284. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*f"), false) == false);
  285. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("???de"), false) == true);
  286. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("????g"), false) == false);
  287. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*c??"), false) == true);
  288. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*e??"), false) == false);
  289. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*????"), false) == true);
  290. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("bcdef"), false) == false);
  291. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*?????"), false) == true);
  292. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcdE"), EA_CHAR16("*E"), true) == true);
  293. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*f"), true) == false);
  294. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcDE"), EA_CHAR16("???de"), true) == false);
  295. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("????g"), true) == false);
  296. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abCde"), EA_CHAR16("*c??"), true) == false);
  297. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*e??"), true) == false);
  298. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*????"), true) == true);
  299. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("bcdef"), true) == false);
  300. EATEST_VERIFY(WildcardMatch(EA_CHAR16("abcde"), EA_CHAR16("*?????"), true) == true);
  301. // char32_t
  302. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*e"), false) == true);
  303. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*f"), false) == false);
  304. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("???de"), false) == true);
  305. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("????g"), false) == false);
  306. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*c??"), false) == true);
  307. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*e??"), false) == false);
  308. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*????"), false) == true);
  309. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("bcdef"), false) == false);
  310. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*?????"), false) == true);
  311. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcdE"), EA_CHAR32("*E"), true) == true);
  312. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*f"), true) == false);
  313. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcDE"), EA_CHAR32("???de"), true) == false);
  314. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("????g"), true) == false);
  315. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abCde"), EA_CHAR32("*c??"), true) == false);
  316. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*e??"), true) == false);
  317. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*????"), true) == true);
  318. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("bcdef"), true) == false);
  319. EATEST_VERIFY(WildcardMatch(EA_CHAR32("abcde"), EA_CHAR32("*?????"), true) == true);
  320. }
  321. // EASTDC_API bool ParseDelimitedText(const char* pText, const char* pTextEnd, char cDelimiter,
  322. // const char*& pToken, const char*& pTokenEnd, const char** ppNewText);
  323. // EASTDC_API bool ParseDelimitedText(const char16_t* pText, const char16_t* pTextEnd, char16_t cDelimiter,
  324. // const char16_t*& pToken, const char16_t*& pTokenEnd, const char16_t** ppNewText);
  325. // EASTDC_API bool ParseDelimitedText(const char32_t* pText, const char32_t* pTextEnd, char32_t cDelimiter,
  326. // const char32_t*& pToken, const char32_t*& pTokenEnd, const char32_t** ppNewText);
  327. {
  328. /// Example behavior:
  329. /// 1 Input String MaxResults Delimiter Return Value OutputArray Size Output Array
  330. /// 2 ""; -1 ' ' 0 0 ""
  331. /// 3 "000 111"; -1 ' ' 2 2 "000" "111"
  332. /// 4 "000 111 222 333 444 \"555 555\" 666"; -1 ' ' 7 7 "000" "111" "222" "333" "444" "555 555" "666"
  333. /// 5 " 000 111 222 333 "; -1 ' ' 4 4 "000" "111" "222" "333"
  334. /// 6 " 000 111 222 333 "; 2 ' ' 2 2 "000" "111"
  335. /// 7 ""; -1 ',' 0 0 ""
  336. /// 8 "000,111"; -1 ',' 2 2 "000" "111"
  337. /// 9 "000, 111 , 222 333 ,444 \"555, 555 \" 666"; -1 ',' 4 4 "000" "111" "222 333" "444 \"555, 555 \" 666"
  338. /// 10 " ,, 000 ,111, 222, 333 , "; -1 ',' 6 6 "" "" "000" "111" "222" "333"
  339. /// 11 " ,, 000 ,111, 222, 333 , "; 2 ',' 0 0 "" ""
  340. const char16_t* pTest2 = EA_CHAR16("");
  341. const char16_t* pTest3 = EA_CHAR16("000 111");
  342. const char16_t* pTest4 = EA_CHAR16(" \"555 555\" ");
  343. //const char16_t* pTest5 = EA_CHAR16(" 000 111 222 333 ");
  344. //const char16_t* pTest6 = EA_CHAR16(" 000 111 222 333 ");
  345. //const char16_t* pTest7 = EA_CHAR16(" 000 111 222 333 ");
  346. //const char16_t* pTest8 = EA_CHAR16("000,111"));
  347. //const char16_t* pTest9 = EA_CHAR16("000, 111 , 222 333 ,444 \"555, 555 \" 666");
  348. //const char16_t* pTest10 = EA_CHAR16(" ,, 000 ,111, 222, 333 , ");
  349. //const char16_t* pTest11 = EA_CHAR16(" ,, 000 ,111, 222, 333 , ");
  350. bool result;
  351. const char16_t* pToken;
  352. const char16_t* pTokenEnd;
  353. const char16_t* pNewText;
  354. // Test2
  355. result = ParseDelimitedText(pTest2, pTest2 + Strlen(pTest2), ' ', pToken, pTokenEnd, &pNewText);
  356. EATEST_VERIFY(!result && (pToken == pTest2) && (pTokenEnd == pTest2) && (pNewText == pTest2));
  357. // Test3
  358. result = ParseDelimitedText(pTest3, pTest3 + Strlen(pTest3), ' ', pToken, pTokenEnd, &pNewText);
  359. EATEST_VERIFY(result && (pToken == pTest3) && (pTokenEnd == pTest3 + 3) && (pNewText == pTest3 + 3));
  360. result = ParseDelimitedText(pTest3 + 3, pTest3 + Strlen(pTest3), ' ', pToken, pTokenEnd, &pNewText);
  361. EATEST_VERIFY(result && (pToken == pTest3 + 4) && (pTokenEnd == pTest3 + 7) && (pNewText == pTest3 + 7));
  362. // Test4
  363. result = ParseDelimitedText(pTest4, pTest4 + Strlen(pTest4), ' ', pToken, pTokenEnd, &pNewText);
  364. EATEST_VERIFY(result && (pToken == pTest4 + 3) && (pTokenEnd == pTest4 + 10) && (pNewText == pTest4 + 11));
  365. }
  366. {
  367. const char32_t* pTest2 = EA_CHAR32("");
  368. const char32_t* pTest3 = EA_CHAR32("000 111");
  369. const char32_t* pTest4 = EA_CHAR32(" \"555 555\" ");
  370. //const char32_t* pTest5 = EA_CHAR32(" 000 111 222 333 ");
  371. //const char32_t* pTest6 = EA_CHAR32(" 000 111 222 333 ");
  372. //const char32_t* pTest7 = EA_CHAR32(" 000 111 222 333 ");
  373. //const char32_t* pTest8 = EA_CHAR32("000,111"));
  374. //const char32_t* pTest9 = EA_CHAR32("000, 111 , 222 333 ,444 \"555, 555 \" 666");
  375. //const char32_t* pTest10 = EA_CHAR32(" ,, 000 ,111, 222, 333 , ");
  376. //const char32_t* pTest11 = EA_CHAR32(" ,, 000 ,111, 222, 333 , ");
  377. bool result;
  378. const char32_t* pToken;
  379. const char32_t* pTokenEnd;
  380. const char32_t* pNewText;
  381. // Test2
  382. result = ParseDelimitedText(pTest2, pTest2 + Strlen(pTest2), ' ', pToken, pTokenEnd, &pNewText);
  383. EATEST_VERIFY(!result && (pToken == pTest2) && (pTokenEnd == pTest2) && (pNewText == pTest2));
  384. // Test3
  385. result = ParseDelimitedText(pTest3, pTest3 + Strlen(pTest3), ' ', pToken, pTokenEnd, &pNewText);
  386. EATEST_VERIFY(result && (pToken == pTest3) && (pTokenEnd == pTest3 + 3) && (pNewText == pTest3 + 3));
  387. result = ParseDelimitedText(pTest3 + 3, pTest3 + Strlen(pTest3), ' ', pToken, pTokenEnd, &pNewText);
  388. EATEST_VERIFY(result && (pToken == pTest3 + 4) && (pTokenEnd == pTest3 + 7) && (pNewText == pTest3 + 7));
  389. // Test4
  390. result = ParseDelimitedText(pTest4, pTest4 + Strlen(pTest4), ' ', pToken, pTokenEnd, &pNewText);
  391. EATEST_VERIFY(result && (pToken == pTest4 + 3) && (pTokenEnd == pTest4 + 10) && (pNewText == pTest4 + 11));
  392. }
  393. // ConvertBinaryDataToASCIIArray / ConvertASCIIArrayToBinaryData
  394. {
  395. uint8_t data[4] = { 0x12, 0x34, 0x56, 0x78 };
  396. char result8[32];
  397. char16_t result16[32];
  398. char32_t result32[32];
  399. ConvertBinaryDataToASCIIArray(&data, 4, result8);
  400. EATEST_VERIFY(Strcmp(result8, "12345678") == 0);
  401. ConvertBinaryDataToASCIIArray(&data, 4, result16);
  402. EATEST_VERIFY(Strcmp(result16, EA_CHAR16("12345678")) == 0);
  403. ConvertBinaryDataToASCIIArray(&data, 4, result32);
  404. EATEST_VERIFY(Strcmp(result32, EA_CHAR32("12345678")) == 0);
  405. memset(data, 0, sizeof(data));
  406. EATEST_VERIFY(ConvertASCIIArrayToBinaryData(result8, 8, data) == true);
  407. EATEST_VERIFY((data[0] == 0x12) && (data[3] == 0x78));
  408. memset(data, 0, sizeof(data));
  409. EATEST_VERIFY(ConvertASCIIArrayToBinaryData(result16, 8, data) == true);
  410. EATEST_VERIFY((data[0] == 0x12) && (data[3] == 0x78));
  411. memset(data, 0, sizeof(data));
  412. EATEST_VERIFY(ConvertASCIIArrayToBinaryData(result32, 8, data) == true);
  413. EATEST_VERIFY((data[0] == 0x12) && (data[3] == 0x78));
  414. memset(data, 0, sizeof(data));
  415. result8[0] = '_'; // Set it to an invalid hex character.
  416. EATEST_VERIFY(ConvertASCIIArrayToBinaryData(result8, 8, data) == false);
  417. EATEST_VERIFY((data[0] == 0x02) && (data[3] == 0x78));
  418. memset(data, 0, sizeof(data));
  419. result16[0] = '_'; // Set it to an invalid hex character.
  420. EATEST_VERIFY(ConvertASCIIArrayToBinaryData(result16, 8, data) == false);
  421. EATEST_VERIFY((data[0] == 0x02) && (data[3] == 0x78));
  422. memset(data, 0, sizeof(data));
  423. result32[0] = '_'; // Set it to an invalid hex character.
  424. EATEST_VERIFY(ConvertASCIIArrayToBinaryData(result32, 8, data) == false);
  425. EATEST_VERIFY((data[0] == 0x02) && (data[3] == 0x78));
  426. }
  427. // EASTDC_API const char* GetTextLine(const char* pText, const char* pTextEnd, const char** ppNewText);
  428. {
  429. const char* p1 = "";
  430. const char* p2 = "\n";
  431. const char* p3 = "\r\n";
  432. const char* p4 = "\r\n\n";
  433. const char* p5 = "\n\r\r";
  434. const char* p6 = "aaa\nbbb\rccc\r\nddd";
  435. const char* p7 = "aaa\nddd\n";
  436. const char* p8 = "aaa\nddd\r\n";
  437. const char* pLine;
  438. const char* pLineEnd;
  439. const char* pLineNext;
  440. pLine = p1;
  441. pLineEnd = GetTextLine(pLine, p1 + Strlen(p1), &pLineNext);
  442. EATEST_VERIFY(pLineEnd == pLine);
  443. EATEST_VERIFY(pLineNext == pLine);
  444. pLine = p2;
  445. pLineEnd = GetTextLine(pLine, p2 + Strlen(p2), &pLineNext);
  446. EATEST_VERIFY(pLineEnd == pLine);
  447. EATEST_VERIFY(pLineNext == p2 + Strlen(p2));
  448. pLine = p3;
  449. pLineEnd = GetTextLine(pLine, p3 + Strlen(p3), &pLineNext);
  450. EATEST_VERIFY(pLineEnd == pLine);
  451. EATEST_VERIFY(pLineNext == p3 + Strlen(p3));
  452. pLine = p4;
  453. pLineEnd = GetTextLine(pLine, p4 + Strlen(p4), &pLineNext);
  454. EATEST_VERIFY(pLineEnd == pLine);
  455. EATEST_VERIFY(pLineNext == p4 + 2);
  456. pLine = pLineNext;
  457. pLineEnd = GetTextLine(pLine, p4 + Strlen(p4), &pLineNext);
  458. EATEST_VERIFY(pLineEnd == pLine);
  459. EATEST_VERIFY(pLineNext == p4 + Strlen(p4));
  460. pLine = p5;
  461. pLineEnd = GetTextLine(pLine, p5 + Strlen(p5), &pLineNext);
  462. EATEST_VERIFY(pLineEnd == pLine);
  463. EATEST_VERIFY(pLineNext == p5 + 2);
  464. pLine = pLineNext;
  465. pLineEnd = GetTextLine(pLine, p5 + Strlen(p5), &pLineNext);
  466. EATEST_VERIFY(pLineEnd == pLine);
  467. EATEST_VERIFY(pLineNext == p5 + Strlen(p5));
  468. pLine = p6;
  469. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  470. EATEST_VERIFY(pLineEnd == p6 + 3);
  471. EATEST_VERIFY(pLineNext == p6 + 4);
  472. pLine = pLineNext;
  473. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  474. EATEST_VERIFY(pLineEnd == p6 + 7);
  475. EATEST_VERIFY(pLineNext == p6 + 8);
  476. pLine = pLineNext;
  477. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  478. EATEST_VERIFY(pLineEnd == p6 + 11);
  479. EATEST_VERIFY(pLineNext == p6 + 13);
  480. pLine = pLineNext;
  481. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  482. EATEST_VERIFY(pLineEnd == p6 + Strlen(p6));
  483. EATEST_VERIFY(pLineNext == p6 + Strlen(p6));
  484. pLine = p7;
  485. pLineEnd = GetTextLine(pLine, p7 + Strlen(p7), &pLineNext);
  486. EATEST_VERIFY(pLineEnd == p7 + 3);
  487. EATEST_VERIFY(pLineNext == p7 + 4);
  488. pLine = pLineNext;
  489. pLineEnd = GetTextLine(pLine, p7 + Strlen(p7), &pLineNext);
  490. EATEST_VERIFY(pLineEnd == p7 + 7);
  491. EATEST_VERIFY(pLineNext == p7 + 8);
  492. pLine = p8;
  493. pLineEnd = GetTextLine(pLine, p8 + Strlen(p8), &pLineNext);
  494. EATEST_VERIFY(pLineEnd == p8 + 3);
  495. EATEST_VERIFY(pLineNext == p8 + 4);
  496. pLine = pLineNext;
  497. pLineEnd = GetTextLine(pLine, p8 + Strlen(p8), &pLineNext);
  498. EATEST_VERIFY(pLineEnd == p8 + 7);
  499. EATEST_VERIFY(pLineNext == p8 + 9);
  500. }
  501. // EASTDC_API const char16_t* GetTextLine(const char16_t* pText, const char16_t* pTextEnd, const char16_t** ppNewText);
  502. {
  503. const char16_t* p1 = EA_CHAR16("");
  504. const char16_t* p2 = EA_CHAR16("\n");
  505. const char16_t* p3 = EA_CHAR16("\r\n");
  506. const char16_t* p4 = EA_CHAR16("\r\n\n");
  507. const char16_t* p5 = EA_CHAR16("\n\r\r");
  508. const char16_t* p6 = EA_CHAR16("aaa\nbbb\rccc\r\nddd");
  509. const char16_t* p7 = EA_CHAR16("aaa\nddd\n");
  510. const char16_t* p8 = EA_CHAR16("aaa\nddd\r\n");
  511. const char16_t* pLine;
  512. const char16_t* pLineEnd;
  513. const char16_t* pLineNext;
  514. pLine = p1;
  515. pLineEnd = GetTextLine(pLine, p1 + Strlen(p1), &pLineNext);
  516. EATEST_VERIFY(pLineEnd == pLine);
  517. EATEST_VERIFY(pLineNext == pLine);
  518. pLine = p2;
  519. pLineEnd = GetTextLine(pLine, p2 + Strlen(p2), &pLineNext);
  520. EATEST_VERIFY(pLineEnd == pLine);
  521. EATEST_VERIFY(pLineNext == p2 + Strlen(p2));
  522. pLine = p3;
  523. pLineEnd = GetTextLine(pLine, p3 + Strlen(p3), &pLineNext);
  524. EATEST_VERIFY(pLineEnd == pLine);
  525. EATEST_VERIFY(pLineNext == p3 + Strlen(p3));
  526. pLine = p4;
  527. pLineEnd = GetTextLine(pLine, p4 + Strlen(p4), &pLineNext);
  528. EATEST_VERIFY(pLineEnd == pLine);
  529. EATEST_VERIFY(pLineNext == p4 + 2);
  530. pLine = pLineNext;
  531. pLineEnd = GetTextLine(pLine, p4 + Strlen(p4), &pLineNext);
  532. EATEST_VERIFY(pLineEnd == pLine);
  533. EATEST_VERIFY(pLineNext == p4 + Strlen(p4));
  534. pLine = p5;
  535. pLineEnd = GetTextLine(pLine, p5 + Strlen(p5), &pLineNext);
  536. EATEST_VERIFY(pLineEnd == pLine);
  537. EATEST_VERIFY(pLineNext == p5 + 2);
  538. pLine = pLineNext;
  539. pLineEnd = GetTextLine(pLine, p5 + Strlen(p5), &pLineNext);
  540. EATEST_VERIFY(pLineEnd == pLine);
  541. EATEST_VERIFY(pLineNext == p5 + Strlen(p5));
  542. pLine = p6;
  543. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  544. EATEST_VERIFY(pLineEnd == p6 + 3);
  545. EATEST_VERIFY(pLineNext == p6 + 4);
  546. pLine = pLineNext;
  547. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  548. EATEST_VERIFY(pLineEnd == p6 + 7);
  549. EATEST_VERIFY(pLineNext == p6 + 8);
  550. pLine = pLineNext;
  551. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  552. EATEST_VERIFY(pLineEnd == p6 + 11);
  553. EATEST_VERIFY(pLineNext == p6 + 13);
  554. pLine = pLineNext;
  555. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  556. EATEST_VERIFY(pLineEnd == p6 + Strlen(p6));
  557. EATEST_VERIFY(pLineNext == p6 + Strlen(p6));
  558. pLine = p7;
  559. pLineEnd = GetTextLine(pLine, p7 + Strlen(p7), &pLineNext);
  560. EATEST_VERIFY(pLineEnd == p7 + 3);
  561. EATEST_VERIFY(pLineNext == p7 + 4);
  562. pLine = pLineNext;
  563. pLineEnd = GetTextLine(pLine, p7 + Strlen(p7), &pLineNext);
  564. EATEST_VERIFY(pLineEnd == p7 + 7);
  565. EATEST_VERIFY(pLineNext == p7 + 8);
  566. pLine = p8;
  567. pLineEnd = GetTextLine(pLine, p8 + Strlen(p8), &pLineNext);
  568. EATEST_VERIFY(pLineEnd == p8 + 3);
  569. EATEST_VERIFY(pLineNext == p8 + 4);
  570. pLine = pLineNext;
  571. pLineEnd = GetTextLine(pLine, p8 + Strlen(p8), &pLineNext);
  572. EATEST_VERIFY(pLineEnd == p8 + 7);
  573. EATEST_VERIFY(pLineNext == p8 + 9);
  574. }
  575. // EASTDC_API const char32_t* GetTextLine(const char32_t* pText, const char32_t* pTextEnd, const char32_t** ppNewText);
  576. {
  577. const char32_t* p1 = EA_CHAR32("");
  578. const char32_t* p2 = EA_CHAR32("\n");
  579. const char32_t* p3 = EA_CHAR32("\r\n");
  580. const char32_t* p4 = EA_CHAR32("\r\n\n");
  581. const char32_t* p5 = EA_CHAR32("\n\r\r");
  582. const char32_t* p6 = EA_CHAR32("aaa\nbbb\rccc\r\nddd");
  583. const char32_t* p7 = EA_CHAR32("aaa\nddd\n");
  584. const char32_t* p8 = EA_CHAR32("aaa\nddd\r\n");
  585. const char32_t* pLine;
  586. const char32_t* pLineEnd;
  587. const char32_t* pLineNext;
  588. pLine = p1;
  589. pLineEnd = GetTextLine(pLine, p1 + Strlen(p1), &pLineNext);
  590. EATEST_VERIFY(pLineEnd == pLine);
  591. EATEST_VERIFY(pLineNext == pLine);
  592. pLine = p2;
  593. pLineEnd = GetTextLine(pLine, p2 + Strlen(p2), &pLineNext);
  594. EATEST_VERIFY(pLineEnd == pLine);
  595. EATEST_VERIFY(pLineNext == p2 + Strlen(p2));
  596. pLine = p3;
  597. pLineEnd = GetTextLine(pLine, p3 + Strlen(p3), &pLineNext);
  598. EATEST_VERIFY(pLineEnd == pLine);
  599. EATEST_VERIFY(pLineNext == p3 + Strlen(p3));
  600. pLine = p4;
  601. pLineEnd = GetTextLine(pLine, p4 + Strlen(p4), &pLineNext);
  602. EATEST_VERIFY(pLineEnd == pLine);
  603. EATEST_VERIFY(pLineNext == p4 + 2);
  604. pLine = pLineNext;
  605. pLineEnd = GetTextLine(pLine, p4 + Strlen(p4), &pLineNext);
  606. EATEST_VERIFY(pLineEnd == pLine);
  607. EATEST_VERIFY(pLineNext == p4 + Strlen(p4));
  608. pLine = p5;
  609. pLineEnd = GetTextLine(pLine, p5 + Strlen(p5), &pLineNext);
  610. EATEST_VERIFY(pLineEnd == pLine);
  611. EATEST_VERIFY(pLineNext == p5 + 2);
  612. pLine = pLineNext;
  613. pLineEnd = GetTextLine(pLine, p5 + Strlen(p5), &pLineNext);
  614. EATEST_VERIFY(pLineEnd == pLine);
  615. EATEST_VERIFY(pLineNext == p5 + Strlen(p5));
  616. pLine = p6;
  617. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  618. EATEST_VERIFY(pLineEnd == p6 + 3);
  619. EATEST_VERIFY(pLineNext == p6 + 4);
  620. pLine = pLineNext;
  621. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  622. EATEST_VERIFY(pLineEnd == p6 + 7);
  623. EATEST_VERIFY(pLineNext == p6 + 8);
  624. pLine = pLineNext;
  625. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  626. EATEST_VERIFY(pLineEnd == p6 + 11);
  627. EATEST_VERIFY(pLineNext == p6 + 13);
  628. pLine = pLineNext;
  629. pLineEnd = GetTextLine(pLine, p6 + Strlen(p6), &pLineNext);
  630. EATEST_VERIFY(pLineEnd == p6 + Strlen(p6));
  631. EATEST_VERIFY(pLineNext == p6 + Strlen(p6));
  632. pLine = p7;
  633. pLineEnd = GetTextLine(pLine, p7 + Strlen(p7), &pLineNext);
  634. EATEST_VERIFY(pLineEnd == p7 + 3);
  635. EATEST_VERIFY(pLineNext == p7 + 4);
  636. pLine = pLineNext;
  637. pLineEnd = GetTextLine(pLine, p7 + Strlen(p7), &pLineNext);
  638. EATEST_VERIFY(pLineEnd == p7 + 7);
  639. EATEST_VERIFY(pLineNext == p7 + 8);
  640. pLine = p8;
  641. pLineEnd = GetTextLine(pLine, p8 + Strlen(p8), &pLineNext);
  642. EATEST_VERIFY(pLineEnd == p8 + 3);
  643. EATEST_VERIFY(pLineNext == p8 + 4);
  644. pLine = pLineNext;
  645. pLineEnd = GetTextLine(pLine, p8 + Strlen(p8), &pLineNext);
  646. EATEST_VERIFY(pLineEnd == p8 + 7);
  647. EATEST_VERIFY(pLineNext == p8 + 9);
  648. }
  649. // template<typename String>
  650. // bool GetTextLine(String& sSource, String* pLine);
  651. {
  652. // To do
  653. }
  654. // EASTDC_API bool SplitTokenDelimited(const char* pSource, size_t nSourceLength, char cDelimiter, char* pToken, size_t nTokenLength, const char** ppNewSource = NULL);
  655. {
  656. // To do
  657. }
  658. // EASTDC_API bool SplitTokenDelimited(const char16_t* pSource, size_t nSourceLength, char16_t cDelimiter, char16_t* pToken, size_t nTokenLength, const char16_t** ppNewSource = NULL);
  659. {
  660. const char16_t* pSource;
  661. char16_t pToken[8];
  662. /// source token new source return
  663. /// ---------------------------------------
  664. /// "a,b" "a" "b" true
  665. pSource = EA_CHAR16("a,b");
  666. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  667. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  668. EATEST_VERIFY(String16(pSource) == EA_CHAR16("b"));
  669. /// source token new source return
  670. /// ---------------------------------------
  671. /// "ab,b" "ab" "b" true
  672. pSource = EA_CHAR16("ab,b");
  673. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  674. EATEST_VERIFY(String16(pToken) == EA_CHAR16("ab"));
  675. EATEST_VERIFY(String16(pSource) == EA_CHAR16("b"));
  676. /// source token new source return
  677. /// ---------------------------------------
  678. /// ",a,b" "" "a,b" true
  679. pSource = EA_CHAR16(",a,b");
  680. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  681. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  682. EATEST_VERIFY(String16(pSource) == EA_CHAR16("a,b"));
  683. /// source token new source return
  684. /// ---------------------------------------
  685. /// ",b" "" "b" true
  686. pSource = EA_CHAR16(",b");
  687. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  688. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  689. EATEST_VERIFY(String16(pSource) == EA_CHAR16("b"));
  690. /// source token new source return
  691. /// ---------------------------------------
  692. /// ",,b" "" ",b" true
  693. pSource = EA_CHAR16(",,b");
  694. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  695. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  696. EATEST_VERIFY(String16(pSource) == EA_CHAR16(",b"));
  697. /// source token new source return
  698. /// ---------------------------------------
  699. /// ",a," "" "a," true
  700. pSource = EA_CHAR16(",a,");
  701. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  702. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  703. EATEST_VERIFY(String16(pSource) == EA_CHAR16("a,"));
  704. /// source token new source return
  705. /// ---------------------------------------
  706. /// "a," "a" "" true
  707. pSource = EA_CHAR16("a,");
  708. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  709. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  710. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  711. /// source token new source return
  712. /// ---------------------------------------
  713. /// "," "" "" true
  714. pSource = EA_CHAR16(",");
  715. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  716. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  717. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  718. /// source token new source return
  719. /// ---------------------------------------
  720. /// "a" "a" "" false
  721. pSource = EA_CHAR16("a");
  722. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  723. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  724. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  725. /// source token new source return
  726. /// ---------------------------------------
  727. /// "" "" "" false
  728. pSource = EA_CHAR16("");
  729. EATEST_VERIFY(!SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  730. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  731. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  732. // various additional tests
  733. pSource = EA_CHAR16("testing,long,tokens");
  734. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  735. EATEST_VERIFY(String16(pToken) == EA_CHAR16("testing"));
  736. EATEST_VERIFY(String16(pSource) == EA_CHAR16("long,tokens"));
  737. pSource = EA_CHAR16("tokentoolarge,test");
  738. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  739. EATEST_VERIFY(String16(pToken) == EA_CHAR16("tokento"));
  740. EATEST_VERIFY(String16(pSource) == EA_CHAR16("test"));
  741. pSource = EA_CHAR16("test,source,length");
  742. EATEST_VERIFY(!SplitTokenDelimited(pSource, 0, ',', pToken, 8, &pSource));
  743. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  744. EATEST_VERIFY(String16(pSource) == EA_CHAR16("test,source,length"));
  745. EATEST_VERIFY(SplitTokenDelimited(pSource, 2, ',', pToken, 8, &pSource));
  746. EATEST_VERIFY(String16(pToken) == EA_CHAR16("te"));
  747. EATEST_VERIFY(String16(pSource) == EA_CHAR16("st,source,length"));
  748. EATEST_VERIFY(SplitTokenDelimited(pSource, 3, ',', pToken, 8, &pSource));
  749. EATEST_VERIFY(String16(pToken) == EA_CHAR16("st"));
  750. EATEST_VERIFY(String16(pSource) == EA_CHAR16("source,length"));
  751. }
  752. // EASTDC_API bool SplitTokenDelimited(const char32_t* pSource, size_t nSourceLength, char32_t cDelimiter, char32_t* pToken, size_t nTokenLength, const char32_t** ppNewSource = NULL);
  753. {
  754. const char32_t* pSource;
  755. char32_t pToken[8];
  756. /// source token new source return
  757. /// ---------------------------------------
  758. /// "a,b" "a" "b" true
  759. pSource = EA_CHAR32("a,b");
  760. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  761. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  762. EATEST_VERIFY(String32(pSource) == EA_CHAR32("b"));
  763. /// source token new source return
  764. /// ---------------------------------------
  765. /// "ab,b" "ab" "b" true
  766. pSource = EA_CHAR32("ab,b");
  767. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  768. EATEST_VERIFY(String32(pToken) == EA_CHAR32("ab"));
  769. EATEST_VERIFY(String32(pSource) == EA_CHAR32("b"));
  770. /// source token new source return
  771. /// ---------------------------------------
  772. /// ",a,b" "" "a,b" true
  773. pSource = EA_CHAR32(",a,b");
  774. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  775. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  776. EATEST_VERIFY(String32(pSource) == EA_CHAR32("a,b"));
  777. /// source token new source return
  778. /// ---------------------------------------
  779. /// ",b" "" "b" true
  780. pSource = EA_CHAR32(",b");
  781. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  782. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  783. EATEST_VERIFY(String32(pSource) == EA_CHAR32("b"));
  784. /// source token new source return
  785. /// ---------------------------------------
  786. /// ",,b" "" ",b" true
  787. pSource = EA_CHAR32(",,b");
  788. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  789. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  790. EATEST_VERIFY(String32(pSource) == EA_CHAR32(",b"));
  791. /// source token new source return
  792. /// ---------------------------------------
  793. /// ",a," "" "a," true
  794. pSource = EA_CHAR32(",a,");
  795. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  796. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  797. EATEST_VERIFY(String32(pSource) == EA_CHAR32("a,"));
  798. /// source token new source return
  799. /// ---------------------------------------
  800. /// "a," "a" "" true
  801. pSource = EA_CHAR32("a,");
  802. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  803. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  804. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  805. /// source token new source return
  806. /// ---------------------------------------
  807. /// "," "" "" true
  808. pSource = EA_CHAR32(",");
  809. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  810. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  811. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  812. /// source token new source return
  813. /// ---------------------------------------
  814. /// "a" "a" "" false
  815. pSource = EA_CHAR32("a");
  816. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  817. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  818. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  819. /// source token new source return
  820. /// ---------------------------------------
  821. /// "" "" "" false
  822. pSource = EA_CHAR32("");
  823. EATEST_VERIFY(!SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  824. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  825. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  826. // various additional tests
  827. pSource = EA_CHAR32("testing,long,tokens");
  828. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  829. EATEST_VERIFY(String32(pToken) == EA_CHAR32("testing"));
  830. EATEST_VERIFY(String32(pSource) == EA_CHAR32("long,tokens"));
  831. pSource = EA_CHAR32("tokentoolarge,test");
  832. EATEST_VERIFY(SplitTokenDelimited(pSource, kLengthNull, ',', pToken, 8, &pSource));
  833. EATEST_VERIFY(String32(pToken) == EA_CHAR32("tokento"));
  834. EATEST_VERIFY(String32(pSource) == EA_CHAR32("test"));
  835. pSource = EA_CHAR32("test,source,length");
  836. EATEST_VERIFY(!SplitTokenDelimited(pSource, 0, ',', pToken, 8, &pSource));
  837. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  838. EATEST_VERIFY(String32(pSource) == EA_CHAR32("test,source,length"));
  839. EATEST_VERIFY(SplitTokenDelimited(pSource, 2, ',', pToken, 8, &pSource));
  840. EATEST_VERIFY(String32(pToken) == EA_CHAR32("te"));
  841. EATEST_VERIFY(String32(pSource) == EA_CHAR32("st,source,length"));
  842. EATEST_VERIFY(SplitTokenDelimited(pSource, 3, ',', pToken, 8, &pSource));
  843. EATEST_VERIFY(String32(pToken) == EA_CHAR32("st"));
  844. EATEST_VERIFY(String32(pSource) == EA_CHAR32("source,length"));
  845. }
  846. // template<typename String, typename Char>
  847. // bool SplitTokenDelimited(String& sSource, Char cDelimiter, String* pToken);
  848. {
  849. // To do
  850. }
  851. // EASTDC_API bool SplitTokenSeparated(const char* pSource, size_t nSourceLength, char cDelimiter, char* pToken, size_t nTokenLength, const char** ppNewSource = NULL);
  852. {
  853. // To do
  854. }
  855. // EASTDC_API bool SplitTokenSeparated(const char16_t* pSource, size_t nSourceLength, char16_t cDelimiter, char16_t* pToken, size_t nTokenLength, const char16_t** ppNewSource = NULL);
  856. {
  857. String16 sSource, sToken;
  858. const char16_t* pSource;
  859. char16_t pToken[8];
  860. /// source token new source return
  861. /// ---------------------------------------
  862. /// "a" "a" "" true
  863. pSource = EA_CHAR16("a");
  864. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  865. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  866. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  867. /// source token new source return
  868. /// ---------------------------------------
  869. /// "a b" "a" "b" true
  870. pSource = EA_CHAR16("a b");
  871. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  872. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  873. EATEST_VERIFY(String16(pSource) == EA_CHAR16("b"));
  874. /// source token new source return
  875. /// ---------------------------------------
  876. /// "a b" "a" "b" true
  877. pSource = EA_CHAR16("a b");
  878. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  879. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  880. EATEST_VERIFY(String16(pSource) == EA_CHAR16("b"));
  881. /// source token new source return
  882. /// ---------------------------------------
  883. /// " a b" "a" "b" true
  884. pSource = EA_CHAR16(" a b");
  885. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull,' ', pToken, 8, &pSource));
  886. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  887. EATEST_VERIFY(String16(pSource) == EA_CHAR16("b"));
  888. /// source token new source return
  889. /// ---------------------------------------
  890. /// " a b " "a" "b " true
  891. pSource = EA_CHAR16(" a b ");
  892. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  893. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  894. EATEST_VERIFY(String16(pSource) == EA_CHAR16("b "));
  895. /// source token new source return
  896. /// ---------------------------------------
  897. /// " a " "a" "" true
  898. pSource = EA_CHAR16(" a ");
  899. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  900. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  901. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  902. /// source token new source return
  903. /// ---------------------------------------
  904. /// " a " "a" "" true
  905. pSource = EA_CHAR16(" a ");
  906. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  907. EATEST_VERIFY(String16(pToken) == EA_CHAR16("a"));
  908. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  909. /// source token new source return
  910. /// ---------------------------------------
  911. /// "" "" "" false
  912. pSource = EA_CHAR16("");
  913. EATEST_VERIFY(!SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  914. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  915. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  916. /// source token new source return
  917. /// ---------------------------------------
  918. /// " " "" "" false
  919. pSource = EA_CHAR16(" ");
  920. EATEST_VERIFY(!SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  921. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  922. EATEST_VERIFY(String16(pSource) == EA_CHAR16(""));
  923. /// source token new source return
  924. /// ---------------------------------------
  925. /// " " "" "" false
  926. pSource = NULL;
  927. EATEST_VERIFY(!SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  928. EATEST_VERIFY(String16(pToken) == EA_CHAR16(""));
  929. EATEST_VERIFY(pSource == NULL);
  930. // various additional tests
  931. pSource = EA_CHAR16("testing;;;source;;;length");
  932. EATEST_VERIFY(SplitTokenSeparated(pSource, 4, ';', pToken, 8, &pSource));
  933. EATEST_VERIFY(String16(pToken) == EA_CHAR16("test"));
  934. EATEST_VERIFY(String16(pSource) == EA_CHAR16("ing;;;source;;;length"));
  935. EATEST_VERIFY(SplitTokenSeparated(pSource, 5, ';', pToken, 8, &pSource));
  936. EATEST_VERIFY(String16(pToken) == EA_CHAR16("ing"));
  937. EATEST_VERIFY(String16(pSource) == EA_CHAR16(";source;;;length"));
  938. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ';', pToken, 8, &pSource));
  939. EATEST_VERIFY(String16(pToken) == EA_CHAR16("source"));
  940. EATEST_VERIFY(String16(pSource) == EA_CHAR16("length"));
  941. pSource = EA_CHAR16(";;;;;;;123 456;;;;;a");
  942. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ';', pToken,8, &pSource));
  943. EATEST_VERIFY(String16(pToken) == EA_CHAR16("123 456"));
  944. EATEST_VERIFY(String16(pSource) == EA_CHAR16("a"));
  945. }
  946. // EASTDC_API bool SplitTokenSeparated(const char32_t* pSource, size_t nSourceLength, char32_t cDelimiter, char32_t* pToken, size_t nTokenLength, const char32_t** ppNewSource = NULL);
  947. {
  948. String32 sSource, sToken;
  949. const char32_t* pSource;
  950. char32_t pToken[8];
  951. /// source token new source return
  952. /// ---------------------------------------
  953. /// "a" "a" "" true
  954. pSource = EA_CHAR32("a");
  955. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  956. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  957. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  958. /// source token new source return
  959. /// ---------------------------------------
  960. /// "a b" "a" "b" true
  961. pSource = EA_CHAR32("a b");
  962. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  963. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  964. EATEST_VERIFY(String32(pSource) == EA_CHAR32("b"));
  965. /// source token new source return
  966. /// ---------------------------------------
  967. /// "a b" "a" "b" true
  968. pSource = EA_CHAR32("a b");
  969. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  970. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  971. EATEST_VERIFY(String32(pSource) == EA_CHAR32("b"));
  972. /// source token new source return
  973. /// ---------------------------------------
  974. /// " a b" "a" "b" true
  975. pSource = EA_CHAR32(" a b");
  976. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull,' ', pToken, 8, &pSource));
  977. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  978. EATEST_VERIFY(String32(pSource) == EA_CHAR32("b"));
  979. /// source token new source return
  980. /// ---------------------------------------
  981. /// " a b " "a" "b " true
  982. pSource = EA_CHAR32(" a b ");
  983. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  984. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  985. EATEST_VERIFY(String32(pSource) == EA_CHAR32("b "));
  986. /// source token new source return
  987. /// ---------------------------------------
  988. /// " a " "a" "" true
  989. pSource = EA_CHAR32(" a ");
  990. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  991. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  992. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  993. /// source token new source return
  994. /// ---------------------------------------
  995. /// " a " "a" "" true
  996. pSource = EA_CHAR32(" a ");
  997. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  998. EATEST_VERIFY(String32(pToken) == EA_CHAR32("a"));
  999. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  1000. /// source token new source return
  1001. /// ---------------------------------------
  1002. /// "" "" "" false
  1003. pSource = EA_CHAR32("");
  1004. EATEST_VERIFY(!SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  1005. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  1006. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  1007. /// source token new source return
  1008. /// ---------------------------------------
  1009. /// " " "" "" false
  1010. pSource = EA_CHAR32(" ");
  1011. EATEST_VERIFY(!SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  1012. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  1013. EATEST_VERIFY(String32(pSource) == EA_CHAR32(""));
  1014. /// source token new source return
  1015. /// ---------------------------------------
  1016. /// " " "" "" false
  1017. pSource = NULL;
  1018. EATEST_VERIFY(!SplitTokenSeparated(pSource, kLengthNull, ' ', pToken, 8, &pSource));
  1019. EATEST_VERIFY(String32(pToken) == EA_CHAR32(""));
  1020. EATEST_VERIFY(pSource == NULL);
  1021. // various additional tests
  1022. pSource = EA_CHAR32("testing;;;source;;;length");
  1023. EATEST_VERIFY(SplitTokenSeparated(pSource, 4, ';', pToken, 8, &pSource));
  1024. EATEST_VERIFY(String32(pToken) == EA_CHAR32("test"));
  1025. EATEST_VERIFY(String32(pSource) == EA_CHAR32("ing;;;source;;;length"));
  1026. EATEST_VERIFY(SplitTokenSeparated(pSource, 5, ';', pToken, 8, &pSource));
  1027. EATEST_VERIFY(String32(pToken) == EA_CHAR32("ing"));
  1028. EATEST_VERIFY(String32(pSource) == EA_CHAR32(";source;;;length"));
  1029. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ';', pToken, 8, &pSource));
  1030. EATEST_VERIFY(String32(pToken) == EA_CHAR32("source"));
  1031. EATEST_VERIFY(String32(pSource) == EA_CHAR32("length"));
  1032. pSource = EA_CHAR32(";;;;;;;123 456;;;;;a");
  1033. EATEST_VERIFY(SplitTokenSeparated(pSource, kLengthNull, ';', pToken,8, &pSource));
  1034. EATEST_VERIFY(String32(pToken) == EA_CHAR32("123 456"));
  1035. EATEST_VERIFY(String32(pSource) == EA_CHAR32("a"));
  1036. }
  1037. // template<typename String, typename Char>
  1038. // bool SplitTokenSeparated(String& sSource, Char c, String* pToken);
  1039. {
  1040. // To do
  1041. }
  1042. return nErrorCount;
  1043. }