诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

797 rivejä
25 KiB

  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. #include <google/protobuf/stubs/stringpiece.h>
  31. #include <iterator>
  32. #include <map>
  33. #include <string>
  34. #include <utility>
  35. #include <vector>
  36. #include <google/protobuf/testing/googletest.h>
  37. #include <google/protobuf/stubs/hash.h>
  38. #include <gtest/gtest.h>
  39. namespace google {
  40. namespace protobuf {
  41. namespace {
  42. TEST(StringPiece, Ctor) {
  43. {
  44. // Null.
  45. StringPiece s10;
  46. EXPECT_TRUE(s10.data() == nullptr);
  47. EXPECT_EQ(0, s10.length());
  48. }
  49. {
  50. // const char* without length.
  51. const char* hello = "hello";
  52. StringPiece s20(hello);
  53. EXPECT_TRUE(s20.data() == hello);
  54. EXPECT_EQ(5, s20.length());
  55. // const char* with length.
  56. StringPiece s21(hello, 4);
  57. EXPECT_TRUE(s21.data() == hello);
  58. EXPECT_EQ(4, s21.length());
  59. // Not recommended, but valid C++
  60. StringPiece s22(hello, 6);
  61. EXPECT_TRUE(s22.data() == hello);
  62. EXPECT_EQ(6, s22.length());
  63. }
  64. {
  65. // std::string.
  66. std::string hola = "hola";
  67. StringPiece s30(hola);
  68. EXPECT_TRUE(s30.data() == hola.data());
  69. EXPECT_EQ(4, s30.length());
  70. // std::string with embedded '\0'.
  71. hola.push_back('\0');
  72. hola.append("h2");
  73. hola.push_back('\0');
  74. StringPiece s31(hola);
  75. EXPECT_TRUE(s31.data() == hola.data());
  76. EXPECT_EQ(8, s31.length());
  77. }
  78. #if defined(HAS_GLOBAL_STRING)
  79. {
  80. // ::string
  81. string bonjour = "bonjour";
  82. StringPiece s40(bonjour);
  83. EXPECT_TRUE(s40.data() == bonjour.data());
  84. EXPECT_EQ(7, s40.length());
  85. }
  86. #endif
  87. // TODO(mec): StringPiece(StringPiece x, int pos);
  88. // TODO(mec): StringPiece(StringPiece x, int pos, int len);
  89. // TODO(mec): StringPiece(const StringPiece&);
  90. }
  91. TEST(StringPiece, STLComparator) {
  92. string s1("foo");
  93. string s2("bar");
  94. string s3("baz");
  95. StringPiece p1(s1);
  96. StringPiece p2(s2);
  97. StringPiece p3(s3);
  98. typedef std::map<StringPiece, int> TestMap;
  99. TestMap map;
  100. map.insert(std::make_pair(p1, 0));
  101. map.insert(std::make_pair(p2, 1));
  102. map.insert(std::make_pair(p3, 2));
  103. EXPECT_EQ(map.size(), 3);
  104. TestMap::const_iterator iter = map.begin();
  105. EXPECT_EQ(iter->second, 1);
  106. ++iter;
  107. EXPECT_EQ(iter->second, 2);
  108. ++iter;
  109. EXPECT_EQ(iter->second, 0);
  110. ++iter;
  111. EXPECT_TRUE(iter == map.end());
  112. TestMap::iterator new_iter = map.find("zot");
  113. EXPECT_TRUE(new_iter == map.end());
  114. new_iter = map.find("bar");
  115. EXPECT_TRUE(new_iter != map.end());
  116. map.erase(new_iter);
  117. EXPECT_EQ(map.size(), 2);
  118. iter = map.begin();
  119. EXPECT_EQ(iter->second, 2);
  120. ++iter;
  121. EXPECT_EQ(iter->second, 0);
  122. ++iter;
  123. EXPECT_TRUE(iter == map.end());
  124. }
  125. TEST(StringPiece, ComparisonOperators) {
  126. #define COMPARE(result, op, x, y) \
  127. EXPECT_EQ(result, StringPiece((x)) op StringPiece((y))); \
  128. EXPECT_EQ(result, StringPiece((x)).compare(StringPiece((y))) op 0)
  129. COMPARE(true, ==, "", "");
  130. COMPARE(true, ==, "", nullptr);
  131. COMPARE(true, ==, nullptr, "");
  132. COMPARE(true, ==, "a", "a");
  133. COMPARE(true, ==, "aa", "aa");
  134. COMPARE(false, ==, "a", "");
  135. COMPARE(false, ==, "", "a");
  136. COMPARE(false, ==, "a", "b");
  137. COMPARE(false, ==, "a", "aa");
  138. COMPARE(false, ==, "aa", "a");
  139. COMPARE(false, !=, "", "");
  140. COMPARE(false, !=, "a", "a");
  141. COMPARE(false, !=, "aa", "aa");
  142. COMPARE(true, !=, "a", "");
  143. COMPARE(true, !=, "", "a");
  144. COMPARE(true, !=, "a", "b");
  145. COMPARE(true, !=, "a", "aa");
  146. COMPARE(true, !=, "aa", "a");
  147. COMPARE(true, <, "a", "b");
  148. COMPARE(true, <, "a", "aa");
  149. COMPARE(true, <, "aa", "b");
  150. COMPARE(true, <, "aa", "bb");
  151. COMPARE(false, <, "a", "a");
  152. COMPARE(false, <, "b", "a");
  153. COMPARE(false, <, "aa", "a");
  154. COMPARE(false, <, "b", "aa");
  155. COMPARE(false, <, "bb", "aa");
  156. COMPARE(true, <=, "a", "a");
  157. COMPARE(true, <=, "a", "b");
  158. COMPARE(true, <=, "a", "aa");
  159. COMPARE(true, <=, "aa", "b");
  160. COMPARE(true, <=, "aa", "bb");
  161. COMPARE(false, <=, "b", "a");
  162. COMPARE(false, <=, "aa", "a");
  163. COMPARE(false, <=, "b", "aa");
  164. COMPARE(false, <=, "bb", "aa");
  165. COMPARE(false, >=, "a", "b");
  166. COMPARE(false, >=, "a", "aa");
  167. COMPARE(false, >=, "aa", "b");
  168. COMPARE(false, >=, "aa", "bb");
  169. COMPARE(true, >=, "a", "a");
  170. COMPARE(true, >=, "b", "a");
  171. COMPARE(true, >=, "aa", "a");
  172. COMPARE(true, >=, "b", "aa");
  173. COMPARE(true, >=, "bb", "aa");
  174. COMPARE(false, >, "a", "a");
  175. COMPARE(false, >, "a", "b");
  176. COMPARE(false, >, "a", "aa");
  177. COMPARE(false, >, "aa", "b");
  178. COMPARE(false, >, "aa", "bb");
  179. COMPARE(true, >, "b", "a");
  180. COMPARE(true, >, "aa", "a");
  181. COMPARE(true, >, "b", "aa");
  182. COMPARE(true, >, "bb", "aa");
  183. string x;
  184. for (int i = 0; i < 256; i++) {
  185. x += 'a';
  186. string y = x;
  187. COMPARE(true, ==, x, y);
  188. for (int j = 0; j < i; j++) {
  189. string z = x;
  190. z[j] = 'b'; // Differs in position 'j'
  191. COMPARE(false, ==, x, z);
  192. COMPARE(true, <, x, z);
  193. COMPARE(true, >, z, x);
  194. if (j + 1 < i) {
  195. z[j + 1] = 'A'; // Differs in position 'j+1' as well
  196. COMPARE(false, ==, x, z);
  197. COMPARE(true, <, x, z);
  198. COMPARE(true, >, z, x);
  199. z[j + 1] = 'z'; // Differs in position 'j+1' as well
  200. COMPARE(false, ==, x, z);
  201. COMPARE(true, <, x, z);
  202. COMPARE(true, >, z, x);
  203. }
  204. }
  205. }
  206. #undef COMPARE
  207. }
  208. TEST(StringPiece, STL1) {
  209. const StringPiece a("abcdefghijklmnopqrstuvwxyz");
  210. const StringPiece b("abc");
  211. const StringPiece c("xyz");
  212. const StringPiece d("foobar");
  213. const StringPiece e;
  214. string temp("123");
  215. temp += '\0';
  216. temp += "456";
  217. const StringPiece f(temp);
  218. EXPECT_EQ(a[6], 'g');
  219. EXPECT_EQ(b[0], 'a');
  220. EXPECT_EQ(c[2], 'z');
  221. EXPECT_EQ(f[3], '\0');
  222. EXPECT_EQ(f[5], '5');
  223. EXPECT_EQ(*d.data(), 'f');
  224. EXPECT_EQ(d.data()[5], 'r');
  225. EXPECT_TRUE(e.data() == nullptr);
  226. EXPECT_EQ(*a.begin(), 'a');
  227. EXPECT_EQ(*(b.begin() + 2), 'c');
  228. EXPECT_EQ(*(c.end() - 1), 'z');
  229. EXPECT_EQ(*a.rbegin(), 'z');
  230. EXPECT_EQ(*(b.rbegin() + 2), 'a');
  231. EXPECT_EQ(*(c.rend() - 1), 'x');
  232. EXPECT_TRUE(a.rbegin() + 26 == a.rend());
  233. EXPECT_EQ(a.size(), 26);
  234. EXPECT_EQ(b.size(), 3);
  235. EXPECT_EQ(c.size(), 3);
  236. EXPECT_EQ(d.size(), 6);
  237. EXPECT_EQ(e.size(), 0);
  238. EXPECT_EQ(f.size(), 7);
  239. EXPECT_TRUE(!d.empty());
  240. EXPECT_TRUE(d.begin() != d.end());
  241. EXPECT_TRUE(d.begin() + 6 == d.end());
  242. EXPECT_TRUE(e.empty());
  243. EXPECT_TRUE(e.begin() == e.end());
  244. EXPECT_GE(a.max_size(), a.capacity());
  245. EXPECT_GE(a.capacity(), a.size());
  246. char buf[4] = { '%', '%', '%', '%' };
  247. EXPECT_EQ(a.copy(buf, 4), 4);
  248. EXPECT_EQ(buf[0], a[0]);
  249. EXPECT_EQ(buf[1], a[1]);
  250. EXPECT_EQ(buf[2], a[2]);
  251. EXPECT_EQ(buf[3], a[3]);
  252. EXPECT_EQ(a.copy(buf, 3, 7), 3);
  253. EXPECT_EQ(buf[0], a[7]);
  254. EXPECT_EQ(buf[1], a[8]);
  255. EXPECT_EQ(buf[2], a[9]);
  256. EXPECT_EQ(buf[3], a[3]);
  257. EXPECT_EQ(c.copy(buf, 99), 3);
  258. EXPECT_EQ(buf[0], c[0]);
  259. EXPECT_EQ(buf[1], c[1]);
  260. EXPECT_EQ(buf[2], c[2]);
  261. EXPECT_EQ(buf[3], a[3]);
  262. }
  263. // Separated from STL1() because some compilers produce an overly
  264. // large stack frame for the combined function.
  265. TEST(StringPiece, STL2) {
  266. const StringPiece a("abcdefghijklmnopqrstuvwxyz");
  267. const StringPiece b("abc");
  268. const StringPiece c("xyz");
  269. StringPiece d("foobar");
  270. const StringPiece e;
  271. const StringPiece f("123" "\0" "456", 7);
  272. d.clear();
  273. EXPECT_EQ(d.size(), 0);
  274. EXPECT_TRUE(d.empty());
  275. EXPECT_TRUE(d.data() == nullptr);
  276. EXPECT_TRUE(d.begin() == d.end());
  277. EXPECT_EQ(StringPiece::npos, string::npos);
  278. EXPECT_EQ(a.find(b), 0);
  279. EXPECT_EQ(a.find(b, 1), StringPiece::npos);
  280. EXPECT_EQ(a.find(c), 23);
  281. EXPECT_EQ(a.find(c, 9), 23);
  282. EXPECT_EQ(a.find(c, StringPiece::npos), StringPiece::npos);
  283. EXPECT_EQ(b.find(c), StringPiece::npos);
  284. EXPECT_EQ(b.find(c, StringPiece::npos), StringPiece::npos);
  285. EXPECT_EQ(a.find(d), 0);
  286. EXPECT_EQ(a.find(e), 0);
  287. EXPECT_EQ(a.find(d, 12), 12);
  288. EXPECT_EQ(a.find(e, 17), 17);
  289. StringPiece g("xx not found bb");
  290. EXPECT_EQ(a.find(g), StringPiece::npos);
  291. // empty string nonsense
  292. EXPECT_EQ(d.find(b), StringPiece::npos);
  293. EXPECT_EQ(e.find(b), StringPiece::npos);
  294. EXPECT_EQ(d.find(b, 4), StringPiece::npos);
  295. EXPECT_EQ(e.find(b, 7), StringPiece::npos);
  296. size_t empty_search_pos = string().find(string());
  297. EXPECT_EQ(d.find(d), empty_search_pos);
  298. EXPECT_EQ(d.find(e), empty_search_pos);
  299. EXPECT_EQ(e.find(d), empty_search_pos);
  300. EXPECT_EQ(e.find(e), empty_search_pos);
  301. EXPECT_EQ(d.find(d, 4), string().find(string(), 4));
  302. EXPECT_EQ(d.find(e, 4), string().find(string(), 4));
  303. EXPECT_EQ(e.find(d, 4), string().find(string(), 4));
  304. EXPECT_EQ(e.find(e, 4), string().find(string(), 4));
  305. EXPECT_EQ(a.find('a'), 0);
  306. EXPECT_EQ(a.find('c'), 2);
  307. EXPECT_EQ(a.find('z'), 25);
  308. EXPECT_EQ(a.find('$'), StringPiece::npos);
  309. EXPECT_EQ(a.find('\0'), StringPiece::npos);
  310. EXPECT_EQ(f.find('\0'), 3);
  311. EXPECT_EQ(f.find('3'), 2);
  312. EXPECT_EQ(f.find('5'), 5);
  313. EXPECT_EQ(g.find('o'), 4);
  314. EXPECT_EQ(g.find('o', 4), 4);
  315. EXPECT_EQ(g.find('o', 5), 8);
  316. EXPECT_EQ(a.find('b', 5), StringPiece::npos);
  317. // empty string nonsense
  318. EXPECT_EQ(d.find('\0'), StringPiece::npos);
  319. EXPECT_EQ(e.find('\0'), StringPiece::npos);
  320. EXPECT_EQ(d.find('\0', 4), StringPiece::npos);
  321. EXPECT_EQ(e.find('\0', 7), StringPiece::npos);
  322. EXPECT_EQ(d.find('x'), StringPiece::npos);
  323. EXPECT_EQ(e.find('x'), StringPiece::npos);
  324. EXPECT_EQ(d.find('x', 4), StringPiece::npos);
  325. EXPECT_EQ(e.find('x', 7), StringPiece::npos);
  326. EXPECT_EQ(a.rfind(b), 0);
  327. EXPECT_EQ(a.rfind(b, 1), 0);
  328. EXPECT_EQ(a.rfind(c), 23);
  329. EXPECT_EQ(a.rfind(c, 22), StringPiece::npos);
  330. EXPECT_EQ(a.rfind(c, 1), StringPiece::npos);
  331. EXPECT_EQ(a.rfind(c, 0), StringPiece::npos);
  332. EXPECT_EQ(b.rfind(c), StringPiece::npos);
  333. EXPECT_EQ(b.rfind(c, 0), StringPiece::npos);
  334. EXPECT_EQ(a.rfind(d), a.as_string().rfind(string()));
  335. EXPECT_EQ(a.rfind(e), a.as_string().rfind(string()));
  336. EXPECT_EQ(a.rfind(d, 12), 12);
  337. EXPECT_EQ(a.rfind(e, 17), 17);
  338. EXPECT_EQ(a.rfind(g), StringPiece::npos);
  339. EXPECT_EQ(d.rfind(b), StringPiece::npos);
  340. EXPECT_EQ(e.rfind(b), StringPiece::npos);
  341. EXPECT_EQ(d.rfind(b, 4), StringPiece::npos);
  342. EXPECT_EQ(e.rfind(b, 7), StringPiece::npos);
  343. // empty string nonsense
  344. EXPECT_EQ(d.rfind(d, 4), string().rfind(string()));
  345. EXPECT_EQ(e.rfind(d, 7), string().rfind(string()));
  346. EXPECT_EQ(d.rfind(e, 4), string().rfind(string()));
  347. EXPECT_EQ(e.rfind(e, 7), string().rfind(string()));
  348. EXPECT_EQ(d.rfind(d), string().rfind(string()));
  349. EXPECT_EQ(e.rfind(d), string().rfind(string()));
  350. EXPECT_EQ(d.rfind(e), string().rfind(string()));
  351. EXPECT_EQ(e.rfind(e), string().rfind(string()));
  352. EXPECT_EQ(g.rfind('o'), 8);
  353. EXPECT_EQ(g.rfind('q'), StringPiece::npos);
  354. EXPECT_EQ(g.rfind('o', 8), 8);
  355. EXPECT_EQ(g.rfind('o', 7), 4);
  356. EXPECT_EQ(g.rfind('o', 3), StringPiece::npos);
  357. EXPECT_EQ(f.rfind('\0'), 3);
  358. EXPECT_EQ(f.rfind('\0', 12), 3);
  359. EXPECT_EQ(f.rfind('3'), 2);
  360. EXPECT_EQ(f.rfind('5'), 5);
  361. // empty string nonsense
  362. EXPECT_EQ(d.rfind('o'), StringPiece::npos);
  363. EXPECT_EQ(e.rfind('o'), StringPiece::npos);
  364. EXPECT_EQ(d.rfind('o', 4), StringPiece::npos);
  365. EXPECT_EQ(e.rfind('o', 7), StringPiece::npos);
  366. EXPECT_EQ(a.find_first_of(b), 0);
  367. EXPECT_EQ(a.find_first_of(b, 0), 0);
  368. EXPECT_EQ(a.find_first_of(b, 1), 1);
  369. EXPECT_EQ(a.find_first_of(b, 2), 2);
  370. EXPECT_EQ(a.find_first_of(b, 3), StringPiece::npos);
  371. EXPECT_EQ(a.find_first_of(c), 23);
  372. EXPECT_EQ(a.find_first_of(c, 23), 23);
  373. EXPECT_EQ(a.find_first_of(c, 24), 24);
  374. EXPECT_EQ(a.find_first_of(c, 25), 25);
  375. EXPECT_EQ(a.find_first_of(c, 26), StringPiece::npos);
  376. EXPECT_EQ(g.find_first_of(b), 13);
  377. EXPECT_EQ(g.find_first_of(c), 0);
  378. EXPECT_EQ(a.find_first_of(f), StringPiece::npos);
  379. EXPECT_EQ(f.find_first_of(a), StringPiece::npos);
  380. // empty string nonsense
  381. EXPECT_EQ(a.find_first_of(d), StringPiece::npos);
  382. EXPECT_EQ(a.find_first_of(e), StringPiece::npos);
  383. EXPECT_EQ(d.find_first_of(b), StringPiece::npos);
  384. EXPECT_EQ(e.find_first_of(b), StringPiece::npos);
  385. EXPECT_EQ(d.find_first_of(d), StringPiece::npos);
  386. EXPECT_EQ(e.find_first_of(d), StringPiece::npos);
  387. EXPECT_EQ(d.find_first_of(e), StringPiece::npos);
  388. EXPECT_EQ(e.find_first_of(e), StringPiece::npos);
  389. EXPECT_EQ(a.find_first_not_of(b), 3);
  390. EXPECT_EQ(a.find_first_not_of(c), 0);
  391. EXPECT_EQ(b.find_first_not_of(a), StringPiece::npos);
  392. EXPECT_EQ(c.find_first_not_of(a), StringPiece::npos);
  393. EXPECT_EQ(f.find_first_not_of(a), 0);
  394. EXPECT_EQ(a.find_first_not_of(f), 0);
  395. EXPECT_EQ(a.find_first_not_of(d), 0);
  396. EXPECT_EQ(a.find_first_not_of(e), 0);
  397. // empty string nonsense
  398. EXPECT_EQ(d.find_first_not_of(a), StringPiece::npos);
  399. EXPECT_EQ(e.find_first_not_of(a), StringPiece::npos);
  400. EXPECT_EQ(d.find_first_not_of(d), StringPiece::npos);
  401. EXPECT_EQ(e.find_first_not_of(d), StringPiece::npos);
  402. EXPECT_EQ(d.find_first_not_of(e), StringPiece::npos);
  403. EXPECT_EQ(e.find_first_not_of(e), StringPiece::npos);
  404. StringPiece h("====");
  405. EXPECT_EQ(h.find_first_not_of('='), StringPiece::npos);
  406. EXPECT_EQ(h.find_first_not_of('=', 3), StringPiece::npos);
  407. EXPECT_EQ(h.find_first_not_of('\0'), 0);
  408. EXPECT_EQ(g.find_first_not_of('x'), 2);
  409. EXPECT_EQ(f.find_first_not_of('\0'), 0);
  410. EXPECT_EQ(f.find_first_not_of('\0', 3), 4);
  411. EXPECT_EQ(f.find_first_not_of('\0', 2), 2);
  412. // empty string nonsense
  413. EXPECT_EQ(d.find_first_not_of('x'), StringPiece::npos);
  414. EXPECT_EQ(e.find_first_not_of('x'), StringPiece::npos);
  415. EXPECT_EQ(d.find_first_not_of('\0'), StringPiece::npos);
  416. EXPECT_EQ(e.find_first_not_of('\0'), StringPiece::npos);
  417. // StringPiece g("xx not found bb");
  418. StringPiece i("56");
  419. EXPECT_EQ(h.find_last_of(a), StringPiece::npos);
  420. EXPECT_EQ(g.find_last_of(a), g.size()-1);
  421. EXPECT_EQ(a.find_last_of(b), 2);
  422. EXPECT_EQ(a.find_last_of(c), a.size()-1);
  423. EXPECT_EQ(f.find_last_of(i), 6);
  424. EXPECT_EQ(a.find_last_of('a'), 0);
  425. EXPECT_EQ(a.find_last_of('b'), 1);
  426. EXPECT_EQ(a.find_last_of('z'), 25);
  427. EXPECT_EQ(a.find_last_of('a', 5), 0);
  428. EXPECT_EQ(a.find_last_of('b', 5), 1);
  429. EXPECT_EQ(a.find_last_of('b', 0), StringPiece::npos);
  430. EXPECT_EQ(a.find_last_of('z', 25), 25);
  431. EXPECT_EQ(a.find_last_of('z', 24), StringPiece::npos);
  432. EXPECT_EQ(f.find_last_of(i, 5), 5);
  433. EXPECT_EQ(f.find_last_of(i, 6), 6);
  434. EXPECT_EQ(f.find_last_of(a, 4), StringPiece::npos);
  435. // empty string nonsense
  436. EXPECT_EQ(f.find_last_of(d), StringPiece::npos);
  437. EXPECT_EQ(f.find_last_of(e), StringPiece::npos);
  438. EXPECT_EQ(f.find_last_of(d, 4), StringPiece::npos);
  439. EXPECT_EQ(f.find_last_of(e, 4), StringPiece::npos);
  440. EXPECT_EQ(d.find_last_of(d), StringPiece::npos);
  441. EXPECT_EQ(d.find_last_of(e), StringPiece::npos);
  442. EXPECT_EQ(e.find_last_of(d), StringPiece::npos);
  443. EXPECT_EQ(e.find_last_of(e), StringPiece::npos);
  444. EXPECT_EQ(d.find_last_of(f), StringPiece::npos);
  445. EXPECT_EQ(e.find_last_of(f), StringPiece::npos);
  446. EXPECT_EQ(d.find_last_of(d, 4), StringPiece::npos);
  447. EXPECT_EQ(d.find_last_of(e, 4), StringPiece::npos);
  448. EXPECT_EQ(e.find_last_of(d, 4), StringPiece::npos);
  449. EXPECT_EQ(e.find_last_of(e, 4), StringPiece::npos);
  450. EXPECT_EQ(d.find_last_of(f, 4), StringPiece::npos);
  451. EXPECT_EQ(e.find_last_of(f, 4), StringPiece::npos);
  452. EXPECT_EQ(a.find_last_not_of(b), a.size()-1);
  453. EXPECT_EQ(a.find_last_not_of(c), 22);
  454. EXPECT_EQ(b.find_last_not_of(a), StringPiece::npos);
  455. EXPECT_EQ(b.find_last_not_of(b), StringPiece::npos);
  456. EXPECT_EQ(f.find_last_not_of(i), 4);
  457. EXPECT_EQ(a.find_last_not_of(c, 24), 22);
  458. EXPECT_EQ(a.find_last_not_of(b, 3), 3);
  459. EXPECT_EQ(a.find_last_not_of(b, 2), StringPiece::npos);
  460. // empty string nonsense
  461. EXPECT_EQ(f.find_last_not_of(d), f.size()-1);
  462. EXPECT_EQ(f.find_last_not_of(e), f.size()-1);
  463. EXPECT_EQ(f.find_last_not_of(d, 4), 4);
  464. EXPECT_EQ(f.find_last_not_of(e, 4), 4);
  465. EXPECT_EQ(d.find_last_not_of(d), StringPiece::npos);
  466. EXPECT_EQ(d.find_last_not_of(e), StringPiece::npos);
  467. EXPECT_EQ(e.find_last_not_of(d), StringPiece::npos);
  468. EXPECT_EQ(e.find_last_not_of(e), StringPiece::npos);
  469. EXPECT_EQ(d.find_last_not_of(f), StringPiece::npos);
  470. EXPECT_EQ(e.find_last_not_of(f), StringPiece::npos);
  471. EXPECT_EQ(d.find_last_not_of(d, 4), StringPiece::npos);
  472. EXPECT_EQ(d.find_last_not_of(e, 4), StringPiece::npos);
  473. EXPECT_EQ(e.find_last_not_of(d, 4), StringPiece::npos);
  474. EXPECT_EQ(e.find_last_not_of(e, 4), StringPiece::npos);
  475. EXPECT_EQ(d.find_last_not_of(f, 4), StringPiece::npos);
  476. EXPECT_EQ(e.find_last_not_of(f, 4), StringPiece::npos);
  477. EXPECT_EQ(h.find_last_not_of('x'), h.size() - 1);
  478. EXPECT_EQ(h.find_last_not_of('='), StringPiece::npos);
  479. EXPECT_EQ(b.find_last_not_of('c'), 1);
  480. EXPECT_EQ(h.find_last_not_of('x', 2), 2);
  481. EXPECT_EQ(h.find_last_not_of('=', 2), StringPiece::npos);
  482. EXPECT_EQ(b.find_last_not_of('b', 1), 0);
  483. // empty string nonsense
  484. EXPECT_EQ(d.find_last_not_of('x'), StringPiece::npos);
  485. EXPECT_EQ(e.find_last_not_of('x'), StringPiece::npos);
  486. EXPECT_EQ(d.find_last_not_of('\0'), StringPiece::npos);
  487. EXPECT_EQ(e.find_last_not_of('\0'), StringPiece::npos);
  488. EXPECT_EQ(a.substr(0, 3), b);
  489. EXPECT_EQ(a.substr(23), c);
  490. EXPECT_EQ(a.substr(23, 3), c);
  491. EXPECT_EQ(a.substr(23, 99), c);
  492. EXPECT_EQ(a.substr(0), a);
  493. EXPECT_EQ(a.substr(3, 2), "de");
  494. // empty string nonsense
  495. EXPECT_EQ(a.substr(99, 2), e);
  496. EXPECT_EQ(d.substr(99), e);
  497. EXPECT_EQ(d.substr(0, 99), e);
  498. EXPECT_EQ(d.substr(99, 99), e);
  499. // use of npos
  500. EXPECT_EQ(a.substr(0, StringPiece::npos), a);
  501. EXPECT_EQ(a.substr(23, StringPiece::npos), c);
  502. EXPECT_EQ(a.substr(StringPiece::npos, 0), e);
  503. EXPECT_EQ(a.substr(StringPiece::npos, 1), e);
  504. EXPECT_EQ(a.substr(StringPiece::npos, StringPiece::npos), e);
  505. // Substring constructors.
  506. EXPECT_EQ(StringPiece(a, 0, 3), b);
  507. EXPECT_EQ(StringPiece(a, 23), c);
  508. EXPECT_EQ(StringPiece(a, 23, 3), c);
  509. EXPECT_EQ(StringPiece(a, 23, 99), c);
  510. EXPECT_EQ(StringPiece(a, 0), a);
  511. EXPECT_EQ(StringPiece(a, 3, 2), "de");
  512. // empty string nonsense
  513. EXPECT_EQ(StringPiece(d, 0, 99), e);
  514. // Verify that they work taking an actual string, not just a StringPiece.
  515. string a2 = a.as_string();
  516. EXPECT_EQ(StringPiece(a2, 0, 3), b);
  517. EXPECT_EQ(StringPiece(a2, 23), c);
  518. EXPECT_EQ(StringPiece(a2, 23, 3), c);
  519. EXPECT_EQ(StringPiece(a2, 23, 99), c);
  520. EXPECT_EQ(StringPiece(a2, 0), a);
  521. EXPECT_EQ(StringPiece(a2, 3, 2), "de");
  522. }
  523. TEST(StringPiece, Custom) {
  524. StringPiece a("foobar");
  525. string s1("123");
  526. s1 += '\0';
  527. s1 += "456";
  528. StringPiece b(s1);
  529. StringPiece e;
  530. string s2;
  531. // CopyToString
  532. a.CopyToString(&s2);
  533. EXPECT_EQ(s2.size(), 6);
  534. EXPECT_EQ(s2, "foobar");
  535. b.CopyToString(&s2);
  536. EXPECT_EQ(s2.size(), 7);
  537. EXPECT_EQ(s1, s2);
  538. e.CopyToString(&s2);
  539. EXPECT_TRUE(s2.empty());
  540. // AppendToString
  541. s2.erase();
  542. a.AppendToString(&s2);
  543. EXPECT_EQ(s2.size(), 6);
  544. EXPECT_EQ(s2, "foobar");
  545. a.AppendToString(&s2);
  546. EXPECT_EQ(s2.size(), 12);
  547. EXPECT_EQ(s2, "foobarfoobar");
  548. // starts_with
  549. EXPECT_TRUE(a.starts_with(a));
  550. EXPECT_TRUE(a.starts_with("foo"));
  551. EXPECT_TRUE(a.starts_with(e));
  552. EXPECT_TRUE(b.starts_with(s1));
  553. EXPECT_TRUE(b.starts_with(b));
  554. EXPECT_TRUE(b.starts_with(e));
  555. EXPECT_TRUE(e.starts_with(""));
  556. EXPECT_TRUE(!a.starts_with(b));
  557. EXPECT_TRUE(!b.starts_with(a));
  558. EXPECT_TRUE(!e.starts_with(a));
  559. // ends with
  560. EXPECT_TRUE(a.ends_with(a));
  561. EXPECT_TRUE(a.ends_with("bar"));
  562. EXPECT_TRUE(a.ends_with(e));
  563. EXPECT_TRUE(b.ends_with(s1));
  564. EXPECT_TRUE(b.ends_with(b));
  565. EXPECT_TRUE(b.ends_with(e));
  566. EXPECT_TRUE(e.ends_with(""));
  567. EXPECT_TRUE(!a.ends_with(b));
  568. EXPECT_TRUE(!b.ends_with(a));
  569. EXPECT_TRUE(!e.ends_with(a));
  570. // remove_prefix
  571. StringPiece c(a);
  572. c.remove_prefix(3);
  573. EXPECT_EQ(c, "bar");
  574. c = a;
  575. c.remove_prefix(0);
  576. EXPECT_EQ(c, a);
  577. c.remove_prefix(c.size());
  578. EXPECT_EQ(c, e);
  579. // remove_suffix
  580. c = a;
  581. c.remove_suffix(3);
  582. EXPECT_EQ(c, "foo");
  583. c = a;
  584. c.remove_suffix(0);
  585. EXPECT_EQ(c, a);
  586. c.remove_suffix(c.size());
  587. EXPECT_EQ(c, e);
  588. // set
  589. c.set("foobar", 6);
  590. EXPECT_EQ(c, a);
  591. c.set("foobar", 0);
  592. EXPECT_EQ(c, e);
  593. c.set("foobar", 7);
  594. EXPECT_NE(c, a);
  595. c.set("foobar");
  596. EXPECT_EQ(c, a);
  597. c.set(static_cast<const void*>("foobar"), 6);
  598. EXPECT_EQ(c, a);
  599. c.set(static_cast<const void*>("foobar"), 0);
  600. EXPECT_EQ(c, e);
  601. c.set(static_cast<const void*>("foobar"), 7);
  602. EXPECT_NE(c, a);
  603. // as_string
  604. string s3(a.as_string().c_str(), 7);
  605. EXPECT_EQ(c, s3);
  606. string s4(e.as_string());
  607. EXPECT_TRUE(s4.empty());
  608. // ToString
  609. {
  610. string s5(a.ToString().c_str(), 7);
  611. EXPECT_EQ(c, s5);
  612. string s6(e.ToString());
  613. EXPECT_TRUE(s6.empty());
  614. }
  615. // Consume
  616. a.set("foobar");
  617. EXPECT_TRUE(a.Consume("foo"));
  618. EXPECT_EQ(a, "bar");
  619. EXPECT_FALSE(a.Consume("foo"));
  620. EXPECT_FALSE(a.Consume("barbar"));
  621. EXPECT_FALSE(a.Consume("ar"));
  622. EXPECT_EQ(a, "bar");
  623. a.set("foobar");
  624. EXPECT_TRUE(a.ConsumeFromEnd("bar"));
  625. EXPECT_EQ(a, "foo");
  626. EXPECT_FALSE(a.ConsumeFromEnd("bar"));
  627. EXPECT_FALSE(a.ConsumeFromEnd("foofoo"));
  628. EXPECT_FALSE(a.ConsumeFromEnd("fo"));
  629. EXPECT_EQ(a, "foo");
  630. }
  631. TEST(StringPiece, Contains) {
  632. StringPiece a("abcdefg");
  633. StringPiece b("abcd");
  634. StringPiece c("efg");
  635. StringPiece d("gh");
  636. EXPECT_TRUE(a.contains(b));
  637. EXPECT_TRUE(a.contains(c));
  638. EXPECT_TRUE(!a.contains(d));
  639. }
  640. TEST(StringPiece, NullInput) {
  641. // we used to crash here, but now we don't.
  642. StringPiece s(nullptr);
  643. EXPECT_EQ(s.data(), (const char*)nullptr);
  644. EXPECT_EQ(s.size(), 0);
  645. s.set(nullptr);
  646. EXPECT_EQ(s.data(), (const char*)nullptr);
  647. EXPECT_EQ(s.size(), 0);
  648. // .ToString() on a StringPiece with nullptr should produce the empty string.
  649. EXPECT_EQ("", s.ToString());
  650. EXPECT_EQ("", s.as_string());
  651. }
  652. TEST(StringPiece, Comparisons2) {
  653. StringPiece abc("abcdefghijklmnopqrstuvwxyz");
  654. // check comparison operations on strings longer than 4 bytes.
  655. EXPECT_EQ(abc, StringPiece("abcdefghijklmnopqrstuvwxyz"));
  656. EXPECT_EQ(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyz")), 0);
  657. EXPECT_LT(abc, StringPiece("abcdefghijklmnopqrstuvwxzz"));
  658. EXPECT_LT(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxzz")), 0);
  659. EXPECT_GT(abc, StringPiece("abcdefghijklmnopqrstuvwxyy"));
  660. EXPECT_GT(abc.compare(StringPiece("abcdefghijklmnopqrstuvwxyy")), 0);
  661. // starts_with
  662. EXPECT_TRUE(abc.starts_with(abc));
  663. EXPECT_TRUE(abc.starts_with("abcdefghijklm"));
  664. EXPECT_TRUE(!abc.starts_with("abcdefguvwxyz"));
  665. // ends_with
  666. EXPECT_TRUE(abc.ends_with(abc));
  667. EXPECT_TRUE(!abc.ends_with("abcdefguvwxyz"));
  668. EXPECT_TRUE(abc.ends_with("nopqrstuvwxyz"));
  669. }
  670. TEST(ComparisonOpsTest, StringCompareNotAmbiguous) {
  671. EXPECT_EQ("hello", string("hello"));
  672. EXPECT_LT("hello", string("world"));
  673. }
  674. TEST(ComparisonOpsTest, HeterogenousStringPieceEquals) {
  675. EXPECT_EQ(StringPiece("hello"), string("hello"));
  676. EXPECT_EQ("hello", StringPiece("hello"));
  677. }
  678. TEST(FindOneCharTest, EdgeCases) {
  679. StringPiece a("xxyyyxx");
  680. // Set a = "xyyyx".
  681. a.remove_prefix(1);
  682. a.remove_suffix(1);
  683. EXPECT_EQ(0, a.find('x'));
  684. EXPECT_EQ(0, a.find('x', 0));
  685. EXPECT_EQ(4, a.find('x', 1));
  686. EXPECT_EQ(4, a.find('x', 4));
  687. EXPECT_EQ(StringPiece::npos, a.find('x', 5));
  688. EXPECT_EQ(4, a.rfind('x'));
  689. EXPECT_EQ(4, a.rfind('x', 5));
  690. EXPECT_EQ(4, a.rfind('x', 4));
  691. EXPECT_EQ(0, a.rfind('x', 3));
  692. EXPECT_EQ(0, a.rfind('x', 0));
  693. // Set a = "yyy".
  694. a.remove_prefix(1);
  695. a.remove_suffix(1);
  696. EXPECT_EQ(StringPiece::npos, a.find('x'));
  697. EXPECT_EQ(StringPiece::npos, a.rfind('x'));
  698. }
  699. #ifdef PROTOBUF_HAS_DEATH_TEST
  700. #ifndef NDEBUG
  701. TEST(NonNegativeLenTest, NonNegativeLen) {
  702. EXPECT_DEATH(StringPiece("xyz", -1), "len >= 0");
  703. }
  704. #endif // ndef DEBUG
  705. #endif // PROTOBUF_HAS_DEATH_TEST
  706. } // namespace
  707. } // namespace protobuf
  708. } // namespace google