llstring_test.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:26k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llstring_test.cpp
  3.  * @author Adroit, Steve Linden, Tofu Linden
  4.  * @date 2006-12-24
  5.  * @brief Test cases of llstring.cpp
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "linden_common.h"
  35. #include "../test/lltut.h"
  36. #include "../llstring.h"
  37. namespace tut
  38. {
  39. struct string_index
  40. {
  41. };
  42. typedef test_group<string_index> string_index_t;
  43. typedef string_index_t::object string_index_object_t;
  44. tut::string_index_t tut_string_index("string_test");
  45. template<> template<>
  46. void string_index_object_t::test<1>()
  47. {
  48. std::string llstr1;
  49. ensure("Empty std::string", (llstr1.size() == 0) && llstr1.empty());
  50. std::string llstr2("Hello");
  51. ensure("std::string = Hello", (!strcmp(llstr2.c_str(), "Hello")) && (llstr2.size() == 5) && !llstr2.empty());
  52. std::string llstr3(llstr2);
  53. ensure("std::string = std::string(std::string)", (!strcmp(llstr3.c_str(), "Hello")) && (llstr3.size() == 5) && !llstr3.empty());
  54. std::string str("Hello World");
  55. std::string llstr4(str, 6);
  56. ensure("std::string = std::string(s, size_type pos, size_type n = npos)", (!strcmp(llstr4.c_str(), "World")) && (llstr4.size() == 5) && !llstr4.empty());
  57. std::string llstr5(str, str.size());
  58. ensure("std::string = std::string(s, size_type pos, size_type n = npos)", (llstr5.size() == 0) && llstr5.empty());
  59. std::string llstr6(5, 'A');
  60. ensure("std::string = std::string(count, c)", (!strcmp(llstr6.c_str(), "AAAAA")) && (llstr6.size() == 5) && !llstr6.empty());
  61. std::string llstr7("Hello World", 5);
  62. ensure("std::string(s, n)", (!strcmp(llstr7.c_str(), "Hello")) && (llstr7.size() == 5) && !llstr7.empty());
  63. std::string llstr8("Hello World", 6, 5);
  64. ensure("std::string(s, n, count)", (!strcmp(llstr8.c_str(), "World")) && (llstr8.size() == 5) && !llstr8.empty());
  65. std::string llstr9("Hello World", sizeof("Hello World")-1, 5); // go past end
  66. ensure("std::string(s, n, count) goes past end", (llstr9.size() == 0) && llstr9.empty());
  67. }
  68. template<> template<>
  69. void string_index_object_t::test<3>()
  70. {
  71. std::string str("Len=5");
  72. ensure("isValidIndex failed", LLStringUtil::isValidIndex(str, 0) == TRUE &&
  73.   LLStringUtil::isValidIndex(str, 5) == TRUE &&
  74.   LLStringUtil::isValidIndex(str, 6) == FALSE);
  75. std::string str1;
  76. ensure("isValidIndex failed fo rempty string", LLStringUtil::isValidIndex(str1, 0) == FALSE);
  77. }
  78. template<> template<>
  79. void string_index_object_t::test<4>()
  80. {
  81. std::string str_val("               Testing the extra whitespaces   ");
  82. LLStringUtil::trimHead(str_val);
  83. ensure_equals("1: trimHead failed", str_val, "Testing the extra whitespaces   ");
  84. std::string str_val1("ntrn  Testing the extra whitespaces   ");
  85. LLStringUtil::trimHead(str_val1);
  86. ensure_equals("2: trimHead failed", str_val1, "Testing the extra whitespaces   ");
  87. }
  88. template<> template<>
  89. void string_index_object_t::test<5>()
  90. {
  91. std::string str_val("  Testing the   extra     whitespaces         ");
  92. LLStringUtil::trimTail(str_val);
  93. ensure_equals("1: trimTail failed", str_val, "  Testing the   extra     whitespaces");
  94. std::string str_val1("n  Testing the extra whitespaces  ntrn   ");
  95. LLStringUtil::trimTail(str_val1);
  96. ensure_equals("2: trimTail failed", str_val1, "n  Testing the extra whitespaces");
  97. }
  98. template<> template<>
  99. void string_index_object_t::test<6>()
  100. {
  101. std::string str_val("  t r Testing the   extra     rn whitespaces     n t    ");
  102. LLStringUtil::trim(str_val);
  103. ensure_equals("1: trim failed", str_val, "Testing the   extra     rn whitespaces");
  104. }
  105. template<> template<>
  106. void string_index_object_t::test<7>()
  107. {
  108. std::string str("Second LindenLabs");
  109. LLStringUtil::truncate(str, 6);
  110. ensure_equals("1: truncate", str, "Second");
  111. // further truncate more than the length
  112. LLStringUtil::truncate(str, 0);
  113. ensure_equals("2: truncate", str, "");
  114. }
  115. template<> template<>
  116. void string_index_object_t::test<8>()
  117. {
  118. std::string str_val("SecondLife Source");
  119. LLStringUtil::toUpper(str_val);
  120. ensure_equals("toUpper failed", str_val, "SECONDLIFE SOURCE");
  121. }
  122. template<> template<>
  123. void string_index_object_t::test<9>()
  124. {
  125. std::string str_val("SecondLife Source");
  126. LLStringUtil::toLower(str_val);
  127. ensure_equals("toLower failed", str_val, "secondlife source");
  128. }
  129. template<> template<>
  130. void string_index_object_t::test<10>()
  131. {
  132. std::string str_val("Second");
  133. ensure("1. isHead failed", LLStringUtil::isHead(str_val, "SecondLife Source") == TRUE);
  134. ensure("2. isHead failed", LLStringUtil::isHead(str_val, " SecondLife Source") == FALSE);
  135. std::string str_val2("");
  136. ensure("3. isHead failed", LLStringUtil::isHead(str_val2, "") == FALSE);
  137. }
  138. template<> template<>
  139. void string_index_object_t::test<11>()
  140. {
  141. std::string str_val("Hello.nn Lindenlabs. n This is na simple test.n");
  142. std::string orig_str_val(str_val);
  143. LLStringUtil::addCRLF(str_val);
  144. ensure_equals("addCRLF failed", str_val, "Hello.rnrn Lindenlabs. rn This is rna simple test.rn");
  145. LLStringUtil::removeCRLF(str_val);
  146. ensure_equals("removeCRLF failed", str_val, orig_str_val);
  147. }
  148. template<> template<>
  149. void string_index_object_t::test<12>()
  150. {
  151. std::string str_val("Hello.nnt t Lindenlabs. tt");
  152. std::string orig_str_val(str_val);
  153. LLStringUtil::replaceTabsWithSpaces(str_val, 1);
  154. ensure_equals("replaceTabsWithSpaces failed", str_val, "Hello.nn    Lindenlabs.   ");
  155. LLStringUtil::replaceTabsWithSpaces(orig_str_val, 0);
  156. ensure_equals("replaceTabsWithSpaces failed for 0", orig_str_val, "Hello.nn  Lindenlabs. ");
  157. str_val = "tttt";
  158. LLStringUtil::replaceTabsWithSpaces(str_val, 0);
  159. ensure_equals("replaceTabsWithSpaces failed for all tabs", str_val, "");
  160. }
  161. template<> template<>
  162. void string_index_object_t::test<13>()
  163. {
  164. std::string str_val("Hello.nnttrnLindenlabsX.");
  165. LLStringUtil::replaceNonstandardASCII(str_val, 'X');
  166. ensure_equals("replaceNonstandardASCII failed", str_val, "Hello.nnXXXnLindenlabsX.");
  167. }
  168. template<> template<>
  169. void string_index_object_t::test<14>()
  170. {
  171. std::string str_val("Hello.ntrnABCDEFGHIABABAB");
  172. LLStringUtil::replaceChar(str_val, 'A', 'X');
  173. ensure_equals("1: replaceChar failed", str_val, "Hello.ntrnXBCDEFGHIXBXBXB");
  174. std::string str_val1("Hello.ntrnABCDEFGHIABABAB");
  175. }
  176. template<> template<>
  177. void string_index_object_t::test<15>()
  178. {
  179. std::string str_val("Hello.nrt");
  180. ensure("containsNonprintable failed", LLStringUtil::containsNonprintable(str_val) == TRUE);
  181. str_val = "ABC ";
  182. ensure("containsNonprintable failed", LLStringUtil::containsNonprintable(str_val) == FALSE);
  183. }
  184. template<> template<>
  185. void string_index_object_t::test<16>()
  186. {
  187. std::string str_val("Hello.nrt Again!");
  188. LLStringUtil::stripNonprintable(str_val);
  189. ensure_equals("stripNonprintable failed", str_val, "Hello. Again!");
  190. str_val = "rntt";
  191. LLStringUtil::stripNonprintable(str_val);
  192. ensure_equals("stripNonprintable resulting in empty string failed", str_val, "");
  193. str_val = "";
  194. LLStringUtil::stripNonprintable(str_val);
  195. ensure_equals("stripNonprintable of empty string resulting in empty string failed", str_val, "");
  196. }
  197. template<> template<>
  198. void string_index_object_t::test<17>()
  199. {
  200. BOOL value;
  201. std::string str_val("1");
  202. ensure("convertToBOOL 1 failed", LLStringUtil::convertToBOOL(str_val, value) && value);
  203. str_val = "T";
  204. ensure("convertToBOOL T failed", LLStringUtil::convertToBOOL(str_val, value) && value);
  205. str_val = "t";
  206. ensure("convertToBOOL t failed", LLStringUtil::convertToBOOL(str_val, value) && value);
  207. str_val = "TRUE";
  208. ensure("convertToBOOL TRUE failed", LLStringUtil::convertToBOOL(str_val, value) && value);
  209. str_val = "True";
  210. ensure("convertToBOOL True failed", LLStringUtil::convertToBOOL(str_val, value) && value);
  211. str_val = "true";
  212. ensure("convertToBOOL true failed", LLStringUtil::convertToBOOL(str_val, value) && value);
  213. str_val = "0";
  214. ensure("convertToBOOL 0 failed", LLStringUtil::convertToBOOL(str_val, value) && !value);
  215. str_val = "F";
  216. ensure("convertToBOOL F failed", LLStringUtil::convertToBOOL(str_val, value) && !value);
  217. str_val = "f";
  218. ensure("convertToBOOL f failed", LLStringUtil::convertToBOOL(str_val, value) && !value);
  219. str_val = "FALSE";
  220. ensure("convertToBOOL FASLE failed", LLStringUtil::convertToBOOL(str_val, value) && !value);
  221. str_val = "False";
  222. ensure("convertToBOOL False failed", LLStringUtil::convertToBOOL(str_val, value) && !value);
  223. str_val = "false";
  224. ensure("convertToBOOL false failed", LLStringUtil::convertToBOOL(str_val, value) && !value);
  225. str_val = "Tblah";
  226. ensure("convertToBOOL false failed", !LLStringUtil::convertToBOOL(str_val, value));
  227. }
  228. template<> template<>
  229. void string_index_object_t::test<18>()
  230. {
  231. U8 value;
  232. std::string str_val("255");
  233. ensure("1: convertToU8 failed", LLStringUtil::convertToU8(str_val, value) && value == 255);
  234. str_val = "0";
  235. ensure("2: convertToU8 failed", LLStringUtil::convertToU8(str_val, value) && value == 0);
  236. str_val = "-1";
  237. ensure("3: convertToU8 failed", !LLStringUtil::convertToU8(str_val, value));
  238. str_val = "256"; // bigger than MAX_U8
  239. ensure("4: convertToU8 failed", !LLStringUtil::convertToU8(str_val, value));
  240. }
  241. template<> template<>
  242. void string_index_object_t::test<19>()
  243. {
  244. S8 value;
  245. std::string str_val("127");
  246. ensure("1: convertToS8 failed", LLStringUtil::convertToS8(str_val, value) && value == 127);
  247. str_val = "0";
  248. ensure("2: convertToS8 failed", LLStringUtil::convertToS8(str_val, value) && value == 0);
  249. str_val = "-128";
  250. ensure("3: convertToS8 failed", LLStringUtil::convertToS8(str_val, value) && value == -128);
  251. str_val = "128"; // bigger than MAX_S8
  252. ensure("4: convertToS8 failed", !LLStringUtil::convertToS8(str_val, value));
  253. str_val = "-129"; 
  254. ensure("5: convertToS8 failed", !LLStringUtil::convertToS8(str_val, value));
  255. }
  256. template<> template<>
  257. void string_index_object_t::test<20>()
  258. {
  259. S16 value;
  260. std::string str_val("32767"); 
  261. ensure("1: convertToS16 failed", LLStringUtil::convertToS16(str_val, value) && value == 32767);
  262. str_val = "0";
  263. ensure("2: convertToS16 failed", LLStringUtil::convertToS16(str_val, value) && value == 0);
  264. str_val = "-32768";
  265. ensure("3: convertToS16 failed", LLStringUtil::convertToS16(str_val, value) && value == -32768);
  266. str_val = "32768"; 
  267. ensure("4: convertToS16 failed", !LLStringUtil::convertToS16(str_val, value));
  268. str_val = "-32769";
  269. ensure("5: convertToS16 failed", !LLStringUtil::convertToS16(str_val, value));
  270. }
  271. template<> template<>
  272. void string_index_object_t::test<21>()
  273. {
  274. U16 value;
  275. std::string str_val("65535"); //0xFFFF
  276. ensure("1: convertToU16 failed", LLStringUtil::convertToU16(str_val, value) && value == 65535);
  277. str_val = "0";
  278. ensure("2: convertToU16 failed", LLStringUtil::convertToU16(str_val, value) && value == 0);
  279. str_val = "-1"; 
  280. ensure("3: convertToU16 failed", !LLStringUtil::convertToU16(str_val, value));
  281. str_val = "65536"; 
  282. ensure("4: convertToU16 failed", !LLStringUtil::convertToU16(str_val, value));
  283. }
  284. template<> template<>
  285. void string_index_object_t::test<22>()
  286. {
  287. U32 value;
  288. std::string str_val("4294967295"); //0xFFFFFFFF
  289. ensure("1: convertToU32 failed", LLStringUtil::convertToU32(str_val, value) && value == 4294967295UL);
  290. str_val = "0";
  291. ensure("2: convertToU32 failed", LLStringUtil::convertToU32(str_val, value) && value == 0);
  292. str_val = "4294967296"; 
  293. ensure("3: convertToU32 failed", !LLStringUtil::convertToU32(str_val, value));
  294. }
  295. template<> template<>
  296. void string_index_object_t::test<23>()
  297. {
  298. S32 value;
  299. std::string str_val("2147483647"); //0x7FFFFFFF
  300. ensure("1: convertToS32 failed", LLStringUtil::convertToS32(str_val, value) && value == 2147483647);
  301. str_val = "0";
  302. ensure("2: convertToS32 failed", LLStringUtil::convertToS32(str_val, value) && value == 0);
  303. // Avoid "unary minus operator applied to unsigned type" warning on VC++. JC
  304. S32 min_val = -2147483647 - 1;
  305. str_val = "-2147483648"; 
  306. ensure("3: convertToS32 failed", LLStringUtil::convertToS32(str_val, value)  && value == min_val);
  307. str_val = "2147483648"; 
  308. ensure("4: convertToS32 failed", !LLStringUtil::convertToS32(str_val, value));
  309. str_val = "-2147483649"; 
  310. ensure("5: convertToS32 failed", !LLStringUtil::convertToS32(str_val, value));
  311. }
  312. template<> template<>
  313. void string_index_object_t::test<24>()
  314. {
  315. F32 value;
  316. std::string str_val("2147483647"); //0x7FFFFFFF
  317. ensure("1: convertToF32 failed", LLStringUtil::convertToF32(str_val, value) && value == 2147483647);
  318. str_val = "0";
  319. ensure("2: convertToF32 failed", LLStringUtil::convertToF32(str_val, value) && value == 0);
  320. /* Need to find max/min F32 values
  321. str_val = "-2147483648"; 
  322. ensure("3: convertToF32 failed", LLStringUtil::convertToF32(str_val, value)  && value == -2147483648);
  323. str_val = "2147483648"; 
  324. ensure("4: convertToF32 failed", !LLStringUtil::convertToF32(str_val, value));
  325. str_val = "-2147483649"; 
  326. ensure("5: convertToF32 failed", !LLStringUtil::convertToF32(str_val, value));
  327. */
  328. }
  329. template<> template<>
  330. void string_index_object_t::test<25>()
  331. {
  332. F64 value;
  333. std::string str_val("9223372036854775807"); //0x7FFFFFFFFFFFFFFF
  334. ensure("1: convertToF64 failed", LLStringUtil::convertToF64(str_val, value) && value == 9223372036854775807LL);
  335. str_val = "0";
  336. ensure("2: convertToF64 failed", LLStringUtil::convertToF64(str_val, value) && value == 0.0F);
  337. /* Need to find max/min F64 values
  338. str_val = "-2147483648"; 
  339. ensure("3: convertToF32 failed", LLStringUtil::convertToF32(str_val, value)  && value == -2147483648);
  340. str_val = "2147483648"; 
  341. ensure("4: convertToF32 failed", !LLStringUtil::convertToF32(str_val, value));
  342. str_val = "-2147483649"; 
  343. ensure("5: convertToF32 failed", !LLStringUtil::convertToF32(str_val, value));
  344. */
  345. }
  346. template<> template<>
  347. void string_index_object_t::test<26>()
  348. {
  349. const char* str1 = NULL;
  350. const char* str2 = NULL;
  351. ensure("1: compareStrings failed", LLStringUtil::compareStrings(str1, str2) == 0);
  352. str2 = "A";
  353. ensure("2: compareStrings failed", LLStringUtil::compareStrings(str1, str2) > 0);
  354. ensure("3: compareStrings failed", LLStringUtil::compareStrings(str2, str1) < 0);
  355. str1 = "A is smaller than B";
  356. str2 = "B is greater than A";
  357. ensure("4: compareStrings failed", LLStringUtil::compareStrings(str1, str2) < 0);
  358. str2 = "A is smaller than B";
  359. ensure("5: compareStrings failed", LLStringUtil::compareStrings(str1, str2) == 0);
  360. }
  361. template<> template<>
  362. void string_index_object_t::test<27>()
  363. {
  364. const char* str1 = NULL;
  365. const char* str2 = NULL;
  366. ensure("1: compareInsensitive failed", LLStringUtil::compareInsensitive(str1, str2) == 0);
  367. str2 = "A";
  368. ensure("2: compareInsensitive failed", LLStringUtil::compareInsensitive(str1, str2) > 0);
  369. ensure("3: compareInsensitive failed", LLStringUtil::compareInsensitive(str2, str1) < 0);
  370. str1 = "A is equal to a";
  371. str2 = "a is EQUAL to A";
  372. ensure("4: compareInsensitive failed", LLStringUtil::compareInsensitive(str1, str2) == 0);
  373. }
  374. template<> template<>
  375. void string_index_object_t::test<28>()
  376. {
  377. std::string lhs_str("PROgraM12files");
  378. std::string rhs_str("PROgram12Files");
  379. ensure("compareDict 1 failed", LLStringUtil::compareDict(lhs_str, rhs_str) < 0);
  380. ensure("precedesDict 1 failed", LLStringUtil::precedesDict(lhs_str, rhs_str) == TRUE);
  381. lhs_str = "PROgram12Files";
  382. rhs_str = "PROgram12Files";
  383. ensure("compareDict 2 failed", LLStringUtil::compareDict(lhs_str, rhs_str) == 0);
  384. ensure("precedesDict 2 failed", LLStringUtil::precedesDict(lhs_str, rhs_str) == FALSE);
  385. lhs_str = "PROgram12Files";
  386. rhs_str = "PROgRAM12FILES";
  387. ensure("compareDict 3 failed", LLStringUtil::compareDict(lhs_str, rhs_str) > 0);
  388. ensure("precedesDict 3 failed", LLStringUtil::precedesDict(lhs_str, rhs_str) == FALSE);
  389. }
  390. template<> template<>
  391. void string_index_object_t::test<29>()
  392. {
  393. char str1[] = "First String...";
  394. char str2[100];
  395. LLStringUtil::copy(str2, str1, 100);
  396. ensure("LLStringUtil::copy with enough dest length failed", strcmp(str2, str1) == 0);
  397. LLStringUtil::copy(str2, str1, sizeof("First"));
  398. ensure("LLStringUtil::copy with less dest length failed", strcmp(str2, "First") == 0);
  399. }
  400. template<> template<>
  401. void string_index_object_t::test<30>()
  402. {
  403. std::string str1 = "This is the sentence...";
  404. std::string str2 = "This is the ";
  405. std::string str3 = "first ";
  406. std::string str4 = "This is the first sentence...";
  407. std::string str5 = "This is the sentence...first ";
  408. std::string dest;
  409. dest = str1;
  410. LLStringUtil::copyInto(dest, str3, str2.length());
  411. ensure("LLStringUtil::copyInto insert failed", dest == str4);
  412. dest = str1;
  413. LLStringUtil::copyInto(dest, str3, dest.length());
  414. ensure("LLStringUtil::copyInto append failed", dest == str5);
  415. }
  416. template<> template<>
  417. void string_index_object_t::test<31>()
  418. {
  419. std::string stripped;
  420. // Plain US ASCII text, including spaces and punctuation,
  421. // should not be altered.
  422. std::string simple_text = "Hello, world!";
  423. stripped = LLStringFn::strip_invalid_xml(simple_text);
  424. ensure("Simple text passed unchanged", stripped == simple_text);
  425. // Control characters should be removed
  426. // except for 0x09, 0x0a, 0x0d
  427. std::string control_chars;
  428. for (char c = 0x01; c < 0x20; c++)
  429. {
  430. control_chars.push_back(c);
  431. }
  432. std::string allowed_control_chars;
  433. allowed_control_chars.push_back( (char)0x09 );
  434. allowed_control_chars.push_back( (char)0x0a );
  435. allowed_control_chars.push_back( (char)0x0d );
  436. stripped = LLStringFn::strip_invalid_xml(control_chars);
  437. ensure("Only tab, LF, CR control characters allowed",
  438. stripped == allowed_control_chars);
  439. // UTF-8 should be passed intact, including high byte
  440. // characters.  Try Francais (with C squiggle cedilla)
  441. std::string french = "Fran";
  442. french.push_back( (char)0xC3 );
  443. french.push_back( (char)0xA7 );
  444. french += "ais";
  445. stripped = LLStringFn::strip_invalid_xml( french );
  446. ensure("UTF-8 high byte text is allowed", french == stripped );
  447. }
  448. template<> template<>
  449. void string_index_object_t::test<32>()
  450. {
  451. // Test LLStringUtil::format() string interpolation
  452. LLStringUtil::format_map_t fmt_map;
  453. std::string s;
  454. int subcount;
  455. fmt_map["[TRICK1]"] = "[A]";
  456. fmt_map["[A]"] = "a";
  457. fmt_map["[B]"] = "b";
  458. fmt_map["[AAA]"] = "aaa";
  459. fmt_map["[BBB]"] = "bbb";
  460. fmt_map["[TRICK2]"] = "[A]";
  461. fmt_map["[EXPLOIT]"] = "!!!!!!!!!!!![EXPLOIT]!!!!!!!!!!!!";
  462. fmt_map["[KEYLONGER]"] = "short";
  463. fmt_map["[KEYSHORTER]"] = "Am I not a long string?";
  464. fmt_map["?"] = "?";
  465. fmt_map["[DELETE]"] = "";
  466. fmt_map["[]"] = "[]"; // doesn't do a substitution, but shouldn't crash either
  467. for (LLStringUtil::format_map_t::const_iterator iter = fmt_map.begin(); iter != fmt_map.end(); ++iter)
  468. {
  469. // Test when source string is entirely one key
  470. std::string s1 = (std::string)iter->first;
  471. std::string s2 = (std::string)iter->second;
  472. subcount = LLStringUtil::format(s1, fmt_map);
  473. ensure_equals("LLStringUtil::format: Raw interpolation result", s1, s2);
  474. if (s1 == "?" || s1 == "[]") // no interp expected
  475. {
  476. ensure_equals("LLStringUtil::format: Raw interpolation result count", 0, subcount);
  477. }
  478. else
  479. {
  480. ensure_equals("LLStringUtil::format: Raw interpolation result count", 1, subcount);
  481. }
  482. }
  483. for (LLStringUtil::format_map_t::const_iterator iter = fmt_map.begin(); iter != fmt_map.end(); ++iter)
  484. {
  485. // Test when source string is one key, duplicated
  486. std::string s1 = (std::string)iter->first;
  487. std::string s2 = (std::string)iter->second;
  488. s = s1 + s1 + s1 + s1;
  489. subcount = LLStringUtil::format(s, fmt_map);
  490. ensure_equals("LLStringUtil::format: Rawx4 interpolation result", s, s2 + s2 + s2 + s2);
  491. if (s1 == "?" || s1 == "[]") // no interp expected
  492. {
  493. ensure_equals("LLStringUtil::format: Rawx4 interpolation result count", 0, subcount);
  494. }
  495. else
  496. {
  497. ensure_equals("LLStringUtil::format: Rawx4 interpolation result count", 4, subcount);
  498. }
  499. }
  500. // Test when source string has no keys
  501. std::string srcs = "!!!!!!!!!!!!!!!!";
  502. s = srcs;
  503. subcount = LLStringUtil::format(s, fmt_map);
  504. ensure_equals("LLStringUtil::format: No key test result", s, srcs);
  505. ensure_equals("LLStringUtil::format: No key test result count", 0, subcount);
  506. // Test when source string has no keys and is empty
  507. std::string srcs3;
  508. s = srcs3;
  509. subcount = LLStringUtil::format(s, fmt_map);
  510. ensure("LLStringUtil::format: No key test3 result", s.empty());
  511. ensure_equals("LLStringUtil::format: No key test3 result count", 0, subcount);
  512. // Test a substitution where a key is substituted with blankness
  513. std::string srcs2 = "[DELETE]";
  514. s = srcs2;
  515. subcount = LLStringUtil::format(s, fmt_map);
  516. ensure("LLStringUtil::format: Delete key test2 result", s.empty());
  517. ensure_equals("LLStringUtil::format: Delete key test2 result count", 1, subcount);
  518. // Test an assorted substitution
  519. std::string srcs4 = "[TRICK1][A][B][AAA][BBB][TRICK2][KEYLONGER][KEYSHORTER]?[DELETE]";
  520. s = srcs4;
  521. subcount = LLStringUtil::format(s, fmt_map);
  522. ensure_equals("LLStringUtil::format: Assorted Test1 result", s, "[A]abaaabbb[A]shortAm I not a long string??");
  523. ensure_equals("LLStringUtil::format: Assorted Test1 result count", 9, subcount);
  524. // Test an assorted substitution
  525. std::string srcs5 = "[DELETE]?[KEYSHORTER][KEYLONGER][TRICK2][BBB][AAA][B][A][TRICK1]";
  526. s = srcs5;
  527. subcount = LLStringUtil::format(s, fmt_map);
  528. ensure_equals("LLStringUtil::format: Assorted Test2 result", s, "?Am I not a long string?short[A]bbbaaaba[A]");
  529. ensure_equals("LLStringUtil::format: Assorted Test2 result count", 9, subcount);
  530. // Test an assorted substitution
  531. std::string srcs8 = "foo[DELETE]bar?";
  532. s = srcs8;
  533. subcount = LLStringUtil::format(s, fmt_map);
  534. ensure_equals("LLStringUtil::format: Assorted Test3 result", s, "foobar?");
  535. ensure_equals("LLStringUtil::format: Assorted Test3 result count", 1, subcount);
  536. }
  537. template<> template<>
  538. void string_index_object_t::test<33>()
  539. {
  540. // Test LLStringUtil::format() string interpolation
  541. LLStringUtil::format_map_t blank_fmt_map;
  542. std::string s;
  543. int subcount;
  544. // Test substituting out of a blank format_map
  545. std::string srcs6 = "12345";
  546. s = srcs6;
  547. subcount = LLStringUtil::format(s, blank_fmt_map);
  548. ensure_equals("LLStringUtil::format: Blankfmt Test1 result", s, "12345");
  549. ensure_equals("LLStringUtil::format: Blankfmt Test1 result count", 0, subcount);
  550. // Test substituting a blank string out of a blank format_map
  551. std::string srcs7;
  552. s = srcs7;
  553. subcount = LLStringUtil::format(s, blank_fmt_map);
  554. ensure("LLStringUtil::format: Blankfmt Test2 result", s.empty());
  555. ensure_equals("LLStringUtil::format: Blankfmt Test2 result count", 0, subcount);
  556. }
  557. template<> template<>
  558. void string_index_object_t::test<34>()
  559. {
  560. // Test that incorrect LLStringUtil::format() use does not explode.
  561. LLStringUtil::format_map_t nasty_fmt_map;
  562. std::string s;
  563. int subcount;
  564. nasty_fmt_map[""] = "never used"; // see, this is nasty.
  565. // Test substituting out of a nasty format_map
  566. std::string srcs6 = "12345";
  567. s = srcs6;
  568. subcount = LLStringUtil::format(s, nasty_fmt_map);
  569. ensure_equals("LLStringUtil::format: Nastyfmt Test1 result", s, "12345");
  570. ensure_equals("LLStringUtil::format: Nastyfmt Test1 result count", 0, subcount);
  571. // Test substituting a blank string out of a nasty format_map
  572. std::string srcs7;
  573. s = srcs7;
  574. subcount = LLStringUtil::format(s, nasty_fmt_map);
  575. ensure("LLStringUtil::format: Nastyfmt Test2 result", s.empty());
  576. ensure_equals("LLStringUtil::format: Nastyfmt Test2 result count", 0, subcount);
  577. }
  578. template<> template<>
  579. void string_index_object_t::test<35>()
  580. {
  581. // Make sure startsWith works
  582. std::string string("anybody in there?");
  583. std::string substr("anybody");
  584. ensure("startsWith works.", LLStringUtil::startsWith(string, substr));
  585. }
  586. template<> template<>
  587. void string_index_object_t::test<36>()
  588. {
  589. // Make sure startsWith correctly fails
  590. std::string string("anybody in there?");
  591. std::string substr("there");
  592. ensure("startsWith fails.", !LLStringUtil::startsWith(string, substr));
  593. }
  594. template<> template<>
  595. void string_index_object_t::test<37>()
  596. {
  597. // startsWith fails on empty strings
  598. std::string value("anybody in there?");
  599. std::string empty;
  600. ensure("empty string.", !LLStringUtil::startsWith(value, empty));
  601. ensure("empty substr.", !LLStringUtil::startsWith(empty, value));
  602. ensure("empty everything.", !LLStringUtil::startsWith(empty, empty));
  603. }
  604. template<> template<>
  605. void string_index_object_t::test<38>()
  606. {
  607. // Make sure endsWith works correctly
  608. std::string string("anybody in there?");
  609. std::string substr("there?");
  610. ensure("endsWith works.", LLStringUtil::endsWith(string, substr));
  611. }
  612. template<> template<>
  613. void string_index_object_t::test<39>()
  614. {
  615. // Make sure endsWith correctly fails
  616. std::string string("anybody in there?");
  617. std::string substr("anybody");
  618. ensure("endsWith fails.", !LLStringUtil::endsWith(string, substr));
  619. substr = "there";
  620. ensure("endsWith fails.", !LLStringUtil::endsWith(string, substr));
  621. substr = "ther?";
  622. ensure("endsWith fails.", !LLStringUtil::endsWith(string, substr));
  623. }
  624. template<> template<>
  625. void string_index_object_t::test<40>()
  626. {
  627. // endsWith fails on empty strings
  628. std::string value("anybody in there?");
  629. std::string empty;
  630. ensure("empty string.", !LLStringUtil::endsWith(value, empty));
  631. ensure("empty substr.", !LLStringUtil::endsWith(empty, value));
  632. ensure("empty everything.", !LLStringUtil::endsWith(empty, empty));
  633. }
  634. }