marshalling_test.cc 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. //
  2. // Copyright 2019 The Abseil Authors.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // https://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. #include "absl/flags/marshalling.h"
  16. #include <stdint.h>
  17. #include <cmath>
  18. #include <limits>
  19. #include <string>
  20. #include <vector>
  21. #include "gtest/gtest.h"
  22. namespace {
  23. TEST(MarshallingTest, TestBoolParsing) {
  24. std::string err;
  25. bool value;
  26. // True values.
  27. EXPECT_TRUE(absl::ParseFlag("True", &value, &err));
  28. EXPECT_TRUE(value);
  29. EXPECT_TRUE(absl::ParseFlag("true", &value, &err));
  30. EXPECT_TRUE(value);
  31. EXPECT_TRUE(absl::ParseFlag("TRUE", &value, &err));
  32. EXPECT_TRUE(value);
  33. EXPECT_TRUE(absl::ParseFlag("Yes", &value, &err));
  34. EXPECT_TRUE(value);
  35. EXPECT_TRUE(absl::ParseFlag("yes", &value, &err));
  36. EXPECT_TRUE(value);
  37. EXPECT_TRUE(absl::ParseFlag("YES", &value, &err));
  38. EXPECT_TRUE(value);
  39. EXPECT_TRUE(absl::ParseFlag("t", &value, &err));
  40. EXPECT_TRUE(value);
  41. EXPECT_TRUE(absl::ParseFlag("T", &value, &err));
  42. EXPECT_TRUE(value);
  43. EXPECT_TRUE(absl::ParseFlag("y", &value, &err));
  44. EXPECT_TRUE(value);
  45. EXPECT_TRUE(absl::ParseFlag("Y", &value, &err));
  46. EXPECT_TRUE(value);
  47. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  48. EXPECT_TRUE(value);
  49. // False values.
  50. EXPECT_TRUE(absl::ParseFlag("False", &value, &err));
  51. EXPECT_FALSE(value);
  52. EXPECT_TRUE(absl::ParseFlag("false", &value, &err));
  53. EXPECT_FALSE(value);
  54. EXPECT_TRUE(absl::ParseFlag("FALSE", &value, &err));
  55. EXPECT_FALSE(value);
  56. EXPECT_TRUE(absl::ParseFlag("No", &value, &err));
  57. EXPECT_FALSE(value);
  58. EXPECT_TRUE(absl::ParseFlag("no", &value, &err));
  59. EXPECT_FALSE(value);
  60. EXPECT_TRUE(absl::ParseFlag("NO", &value, &err));
  61. EXPECT_FALSE(value);
  62. EXPECT_TRUE(absl::ParseFlag("f", &value, &err));
  63. EXPECT_FALSE(value);
  64. EXPECT_TRUE(absl::ParseFlag("F", &value, &err));
  65. EXPECT_FALSE(value);
  66. EXPECT_TRUE(absl::ParseFlag("n", &value, &err));
  67. EXPECT_FALSE(value);
  68. EXPECT_TRUE(absl::ParseFlag("N", &value, &err));
  69. EXPECT_FALSE(value);
  70. EXPECT_TRUE(absl::ParseFlag("0", &value, &err));
  71. EXPECT_FALSE(value);
  72. // Whitespace handling.
  73. EXPECT_TRUE(absl::ParseFlag(" true", &value, &err));
  74. EXPECT_TRUE(value);
  75. EXPECT_TRUE(absl::ParseFlag("true ", &value, &err));
  76. EXPECT_TRUE(value);
  77. EXPECT_TRUE(absl::ParseFlag(" true ", &value, &err));
  78. EXPECT_TRUE(value);
  79. // Invalid input.
  80. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  81. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  82. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  83. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  84. EXPECT_FALSE(absl::ParseFlag("2", &value, &err));
  85. EXPECT_FALSE(absl::ParseFlag("11", &value, &err));
  86. EXPECT_FALSE(absl::ParseFlag("tt", &value, &err));
  87. }
  88. // --------------------------------------------------------------------
  89. TEST(MarshallingTest, TestInt16Parsing) {
  90. std::string err;
  91. int16_t value;
  92. // Decimal values.
  93. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  94. EXPECT_EQ(value, 1);
  95. EXPECT_TRUE(absl::ParseFlag("0", &value, &err));
  96. EXPECT_EQ(value, 0);
  97. EXPECT_TRUE(absl::ParseFlag("-1", &value, &err));
  98. EXPECT_EQ(value, -1);
  99. EXPECT_TRUE(absl::ParseFlag("123", &value, &err));
  100. EXPECT_EQ(value, 123);
  101. EXPECT_TRUE(absl::ParseFlag("-18765", &value, &err));
  102. EXPECT_EQ(value, -18765);
  103. EXPECT_TRUE(absl::ParseFlag("+3", &value, &err));
  104. EXPECT_EQ(value, 3);
  105. // Leading zero values.
  106. EXPECT_TRUE(absl::ParseFlag("01", &value, &err));
  107. EXPECT_EQ(value, 1);
  108. EXPECT_TRUE(absl::ParseFlag("-001", &value, &err));
  109. EXPECT_EQ(value, -1);
  110. EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err));
  111. EXPECT_EQ(value, 100);
  112. // Hex values.
  113. EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err));
  114. EXPECT_EQ(value, 16);
  115. EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err));
  116. EXPECT_EQ(value, 564);
  117. // TODO(rogeeff): fix below validations
  118. EXPECT_FALSE(absl::ParseFlag("-0x7FFD", &value, &err));
  119. EXPECT_NE(value, -3);
  120. EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err));
  121. EXPECT_NE(value, 49);
  122. // Whitespace handling
  123. EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err));
  124. EXPECT_EQ(value, 10);
  125. EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err));
  126. EXPECT_EQ(value, 11);
  127. EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err));
  128. EXPECT_EQ(value, 12);
  129. EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err));
  130. EXPECT_EQ(value, 34);
  131. // Invalid values.
  132. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  133. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  134. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  135. EXPECT_FALSE(absl::ParseFlag("40000", &value, &err));
  136. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  137. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  138. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  139. EXPECT_FALSE(absl::ParseFlag("2U", &value, &err));
  140. EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err));
  141. }
  142. // --------------------------------------------------------------------
  143. TEST(MarshallingTest, TestUint16Parsing) {
  144. std::string err;
  145. uint16_t value;
  146. // Decimal values.
  147. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  148. EXPECT_EQ(value, 1);
  149. EXPECT_TRUE(absl::ParseFlag("0", &value, &err));
  150. EXPECT_EQ(value, 0);
  151. EXPECT_TRUE(absl::ParseFlag("123", &value, &err));
  152. EXPECT_EQ(value, 123);
  153. EXPECT_TRUE(absl::ParseFlag("+3", &value, &err));
  154. EXPECT_EQ(value, 3);
  155. // Leading zero values.
  156. EXPECT_TRUE(absl::ParseFlag("01", &value, &err));
  157. EXPECT_EQ(value, 1);
  158. EXPECT_TRUE(absl::ParseFlag("001", &value, &err));
  159. EXPECT_EQ(value, 1);
  160. EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err));
  161. EXPECT_EQ(value, 100);
  162. // Hex values.
  163. EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err));
  164. EXPECT_EQ(value, 16);
  165. EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err));
  166. EXPECT_EQ(value, 564);
  167. // TODO(rogeeff): fix below validations
  168. EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err));
  169. EXPECT_NE(value, 49);
  170. // Whitespace handling
  171. EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err));
  172. EXPECT_EQ(value, 10);
  173. EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err));
  174. EXPECT_EQ(value, 11);
  175. EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err));
  176. EXPECT_EQ(value, 12);
  177. EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err));
  178. EXPECT_EQ(value, 34);
  179. // Invalid values.
  180. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  181. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  182. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  183. EXPECT_FALSE(absl::ParseFlag("70000", &value, &err));
  184. EXPECT_FALSE(absl::ParseFlag("-1", &value, &err));
  185. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  186. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  187. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  188. EXPECT_FALSE(absl::ParseFlag("2U", &value, &err));
  189. EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err));
  190. }
  191. // --------------------------------------------------------------------
  192. TEST(MarshallingTest, TestInt32Parsing) {
  193. std::string err;
  194. int32_t value;
  195. // Decimal values.
  196. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  197. EXPECT_EQ(value, 1);
  198. EXPECT_TRUE(absl::ParseFlag("0", &value, &err));
  199. EXPECT_EQ(value, 0);
  200. EXPECT_TRUE(absl::ParseFlag("-1", &value, &err));
  201. EXPECT_EQ(value, -1);
  202. EXPECT_TRUE(absl::ParseFlag("123", &value, &err));
  203. EXPECT_EQ(value, 123);
  204. EXPECT_TRUE(absl::ParseFlag("-98765", &value, &err));
  205. EXPECT_EQ(value, -98765);
  206. EXPECT_TRUE(absl::ParseFlag("+3", &value, &err));
  207. EXPECT_EQ(value, 3);
  208. // Leading zero values.
  209. EXPECT_TRUE(absl::ParseFlag("01", &value, &err));
  210. EXPECT_EQ(value, 1);
  211. EXPECT_TRUE(absl::ParseFlag("-001", &value, &err));
  212. EXPECT_EQ(value, -1);
  213. EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err));
  214. EXPECT_EQ(value, 100);
  215. // Hex values.
  216. EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err));
  217. EXPECT_EQ(value, 16);
  218. EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err));
  219. EXPECT_EQ(value, 564);
  220. // TODO(rogeeff): fix below validations
  221. EXPECT_FALSE(absl::ParseFlag("-0x7FFFFFFD", &value, &err));
  222. EXPECT_NE(value, -3);
  223. EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err));
  224. EXPECT_NE(value, 49);
  225. // Whitespace handling
  226. EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err));
  227. EXPECT_EQ(value, 10);
  228. EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err));
  229. EXPECT_EQ(value, 11);
  230. EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err));
  231. EXPECT_EQ(value, 12);
  232. EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err));
  233. EXPECT_EQ(value, 34);
  234. // Invalid values.
  235. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  236. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  237. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  238. EXPECT_FALSE(absl::ParseFlag("70000000000", &value, &err));
  239. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  240. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  241. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  242. EXPECT_FALSE(absl::ParseFlag("2U", &value, &err));
  243. EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err));
  244. }
  245. // --------------------------------------------------------------------
  246. TEST(MarshallingTest, TestUint32Parsing) {
  247. std::string err;
  248. uint32_t value;
  249. // Decimal values.
  250. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  251. EXPECT_EQ(value, 1);
  252. EXPECT_TRUE(absl::ParseFlag("0", &value, &err));
  253. EXPECT_EQ(value, 0);
  254. EXPECT_TRUE(absl::ParseFlag("123", &value, &err));
  255. EXPECT_EQ(value, 123);
  256. EXPECT_TRUE(absl::ParseFlag("+3", &value, &err));
  257. EXPECT_EQ(value, 3);
  258. // Leading zero values.
  259. EXPECT_TRUE(absl::ParseFlag("01", &value, &err));
  260. EXPECT_EQ(value, 1);
  261. EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err));
  262. EXPECT_EQ(value, 100);
  263. // Hex values.
  264. EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err));
  265. EXPECT_EQ(value, 16);
  266. EXPECT_TRUE(absl::ParseFlag("0X234", &value, &err));
  267. EXPECT_EQ(value, 564);
  268. EXPECT_TRUE(absl::ParseFlag("0xFFFFFFFD", &value, &err));
  269. EXPECT_EQ(value, 4294967293);
  270. // TODO(rogeeff): fix below validations
  271. EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err));
  272. EXPECT_NE(value, 49);
  273. // Whitespace handling
  274. EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err));
  275. EXPECT_EQ(value, 10);
  276. EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err));
  277. EXPECT_EQ(value, 11);
  278. EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err));
  279. EXPECT_EQ(value, 12);
  280. EXPECT_TRUE(absl::ParseFlag(" 0x22 ", &value, &err));
  281. EXPECT_EQ(value, 34);
  282. // Invalid values.
  283. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  284. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  285. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  286. EXPECT_FALSE(absl::ParseFlag("140000000000", &value, &err));
  287. EXPECT_FALSE(absl::ParseFlag("-1", &value, &err));
  288. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  289. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  290. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  291. EXPECT_FALSE(absl::ParseFlag("2U", &value, &err));
  292. EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err));
  293. }
  294. // --------------------------------------------------------------------
  295. TEST(MarshallingTest, TestInt64Parsing) {
  296. std::string err;
  297. int64_t value;
  298. // Decimal values.
  299. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  300. EXPECT_EQ(value, 1);
  301. EXPECT_TRUE(absl::ParseFlag("0", &value, &err));
  302. EXPECT_EQ(value, 0);
  303. EXPECT_TRUE(absl::ParseFlag("-1", &value, &err));
  304. EXPECT_EQ(value, -1);
  305. EXPECT_TRUE(absl::ParseFlag("123", &value, &err));
  306. EXPECT_EQ(value, 123);
  307. EXPECT_TRUE(absl::ParseFlag("-98765", &value, &err));
  308. EXPECT_EQ(value, -98765);
  309. EXPECT_TRUE(absl::ParseFlag("+3", &value, &err));
  310. EXPECT_EQ(value, 3);
  311. // Leading zero values.
  312. EXPECT_TRUE(absl::ParseFlag("01", &value, &err));
  313. EXPECT_EQ(value, 1);
  314. EXPECT_TRUE(absl::ParseFlag("001", &value, &err));
  315. EXPECT_EQ(value, 1);
  316. EXPECT_TRUE(absl::ParseFlag("0000100", &value, &err));
  317. EXPECT_EQ(value, 100);
  318. // Hex values.
  319. EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err));
  320. EXPECT_EQ(value, 16);
  321. EXPECT_TRUE(absl::ParseFlag("0XFFFAAABBBCCCDDD", &value, &err));
  322. EXPECT_EQ(value, 1152827684197027293);
  323. // TODO(rogeeff): fix below validation
  324. EXPECT_FALSE(absl::ParseFlag("-0x7FFFFFFFFFFFFFFE", &value, &err));
  325. EXPECT_NE(value, -2);
  326. EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err));
  327. EXPECT_NE(value, 49);
  328. // Whitespace handling
  329. EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err));
  330. EXPECT_EQ(value, 10);
  331. EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err));
  332. EXPECT_EQ(value, 11);
  333. EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err));
  334. EXPECT_EQ(value, 12);
  335. EXPECT_TRUE(absl::ParseFlag(" 0x7F ", &value, &err));
  336. EXPECT_EQ(value, 127);
  337. // Invalid values.
  338. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  339. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  340. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  341. EXPECT_FALSE(absl::ParseFlag("0xFFFFFFFFFFFFFFFFFF", &value, &err));
  342. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  343. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  344. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  345. EXPECT_FALSE(absl::ParseFlag("2U", &value, &err));
  346. EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err));
  347. }
  348. // --------------------------------------------------------------------
  349. TEST(MarshallingTest, TestUInt64Parsing) {
  350. std::string err;
  351. uint64_t value;
  352. // Decimal values.
  353. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  354. EXPECT_EQ(value, 1);
  355. EXPECT_TRUE(absl::ParseFlag("0", &value, &err));
  356. EXPECT_EQ(value, 0);
  357. EXPECT_TRUE(absl::ParseFlag("123", &value, &err));
  358. EXPECT_EQ(value, 123);
  359. EXPECT_TRUE(absl::ParseFlag("+13", &value, &err));
  360. EXPECT_EQ(value, 13);
  361. // Leading zero values.
  362. EXPECT_TRUE(absl::ParseFlag("01", &value, &err));
  363. EXPECT_EQ(value, 1);
  364. EXPECT_TRUE(absl::ParseFlag("001", &value, &err));
  365. EXPECT_EQ(value, 1);
  366. EXPECT_TRUE(absl::ParseFlag("0000300", &value, &err));
  367. EXPECT_EQ(value, 300);
  368. // Hex values.
  369. EXPECT_TRUE(absl::ParseFlag("0x10", &value, &err));
  370. EXPECT_EQ(value, 16);
  371. EXPECT_TRUE(absl::ParseFlag("0XFFFF", &value, &err));
  372. EXPECT_EQ(value, 65535);
  373. // TODO(rogeeff): fix below validation
  374. EXPECT_FALSE(absl::ParseFlag("+0x31", &value, &err));
  375. EXPECT_NE(value, 49);
  376. // Whitespace handling
  377. EXPECT_TRUE(absl::ParseFlag("10 ", &value, &err));
  378. EXPECT_EQ(value, 10);
  379. EXPECT_TRUE(absl::ParseFlag(" 11", &value, &err));
  380. EXPECT_EQ(value, 11);
  381. EXPECT_TRUE(absl::ParseFlag(" 012 ", &value, &err));
  382. EXPECT_EQ(value, 12);
  383. // Invalid values.
  384. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  385. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  386. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  387. EXPECT_FALSE(absl::ParseFlag("0xFFFFFFFFFFFFFFFFFF", &value, &err));
  388. EXPECT_FALSE(absl::ParseFlag("-1", &value, &err));
  389. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  390. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  391. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  392. EXPECT_FALSE(absl::ParseFlag("2U", &value, &err));
  393. EXPECT_FALSE(absl::ParseFlag("FFF", &value, &err));
  394. }
  395. // --------------------------------------------------------------------
  396. TEST(MarshallingTest, TestFloatParsing) {
  397. std::string err;
  398. float value;
  399. // Ordinary values.
  400. EXPECT_TRUE(absl::ParseFlag("1.3", &value, &err));
  401. EXPECT_FLOAT_EQ(value, 1.3f);
  402. EXPECT_TRUE(absl::ParseFlag("-0.1", &value, &err));
  403. EXPECT_DOUBLE_EQ(value, -0.1f);
  404. EXPECT_TRUE(absl::ParseFlag("+0.01", &value, &err));
  405. EXPECT_DOUBLE_EQ(value, 0.01f);
  406. // Scientific values.
  407. EXPECT_TRUE(absl::ParseFlag("1.2e3", &value, &err));
  408. EXPECT_DOUBLE_EQ(value, 1.2e3f);
  409. EXPECT_TRUE(absl::ParseFlag("9.8765402e-37", &value, &err));
  410. EXPECT_DOUBLE_EQ(value, 9.8765402e-37f);
  411. EXPECT_TRUE(absl::ParseFlag("0.11e+3", &value, &err));
  412. EXPECT_DOUBLE_EQ(value, 0.11e+3f);
  413. EXPECT_TRUE(absl::ParseFlag("1.e-2300", &value, &err));
  414. EXPECT_DOUBLE_EQ(value, 0.f);
  415. EXPECT_TRUE(absl::ParseFlag("1.e+2300", &value, &err));
  416. EXPECT_TRUE(std::isinf(value));
  417. // Leading zero values.
  418. EXPECT_TRUE(absl::ParseFlag("01.6", &value, &err));
  419. EXPECT_DOUBLE_EQ(value, 1.6f);
  420. EXPECT_TRUE(absl::ParseFlag("000.0001", &value, &err));
  421. EXPECT_DOUBLE_EQ(value, 0.0001f);
  422. // Trailing zero values.
  423. EXPECT_TRUE(absl::ParseFlag("-5.1000", &value, &err));
  424. EXPECT_DOUBLE_EQ(value, -5.1f);
  425. // Exceptional values.
  426. EXPECT_TRUE(absl::ParseFlag("NaN", &value, &err));
  427. EXPECT_TRUE(std::isnan(value));
  428. EXPECT_TRUE(absl::ParseFlag("Inf", &value, &err));
  429. EXPECT_TRUE(std::isinf(value));
  430. // Hex values
  431. EXPECT_TRUE(absl::ParseFlag("0x10.23p12", &value, &err));
  432. EXPECT_DOUBLE_EQ(value, 66096.f);
  433. EXPECT_TRUE(absl::ParseFlag("-0xF1.A3p-2", &value, &err));
  434. EXPECT_NEAR(value, -60.4092f, 5e-5f);
  435. EXPECT_TRUE(absl::ParseFlag("+0x0.0AAp-12", &value, &err));
  436. EXPECT_NEAR(value, 1.01328e-05f, 5e-11f);
  437. EXPECT_TRUE(absl::ParseFlag("0x.01p1", &value, &err));
  438. EXPECT_NEAR(value, 0.0078125f, 5e-8f);
  439. // Whitespace handling
  440. EXPECT_TRUE(absl::ParseFlag("10.1 ", &value, &err));
  441. EXPECT_DOUBLE_EQ(value, 10.1f);
  442. EXPECT_TRUE(absl::ParseFlag(" 2.34", &value, &err));
  443. EXPECT_DOUBLE_EQ(value, 2.34f);
  444. EXPECT_TRUE(absl::ParseFlag(" 5.7 ", &value, &err));
  445. EXPECT_DOUBLE_EQ(value, 5.7f);
  446. EXPECT_TRUE(absl::ParseFlag(" -0xE0.F3p01 ", &value, &err));
  447. EXPECT_NEAR(value, -449.8984375f, 5e-8f);
  448. // Invalid values.
  449. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  450. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  451. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  452. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  453. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  454. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  455. EXPECT_FALSE(absl::ParseFlag("2.3xxx", &value, &err));
  456. EXPECT_FALSE(absl::ParseFlag("0x0.1pAA", &value, &err));
  457. // TODO(rogeeff): below assertion should fail
  458. EXPECT_TRUE(absl::ParseFlag("0x0.1", &value, &err));
  459. }
  460. // --------------------------------------------------------------------
  461. TEST(MarshallingTest, TestDoubleParsing) {
  462. std::string err;
  463. double value;
  464. // Ordinary values.
  465. EXPECT_TRUE(absl::ParseFlag("1.3", &value, &err));
  466. EXPECT_DOUBLE_EQ(value, 1.3);
  467. EXPECT_TRUE(absl::ParseFlag("-0.1", &value, &err));
  468. EXPECT_DOUBLE_EQ(value, -0.1);
  469. EXPECT_TRUE(absl::ParseFlag("+0.01", &value, &err));
  470. EXPECT_DOUBLE_EQ(value, 0.01);
  471. // Scientific values.
  472. EXPECT_TRUE(absl::ParseFlag("1.2e3", &value, &err));
  473. EXPECT_DOUBLE_EQ(value, 1.2e3);
  474. EXPECT_TRUE(absl::ParseFlag("9.00000002e-123", &value, &err));
  475. EXPECT_DOUBLE_EQ(value, 9.00000002e-123);
  476. EXPECT_TRUE(absl::ParseFlag("0.11e+3", &value, &err));
  477. EXPECT_DOUBLE_EQ(value, 0.11e+3);
  478. EXPECT_TRUE(absl::ParseFlag("1.e-2300", &value, &err));
  479. EXPECT_DOUBLE_EQ(value, 0);
  480. EXPECT_TRUE(absl::ParseFlag("1.e+2300", &value, &err));
  481. EXPECT_TRUE(std::isinf(value));
  482. // Leading zero values.
  483. EXPECT_TRUE(absl::ParseFlag("01.6", &value, &err));
  484. EXPECT_DOUBLE_EQ(value, 1.6);
  485. EXPECT_TRUE(absl::ParseFlag("000.0001", &value, &err));
  486. EXPECT_DOUBLE_EQ(value, 0.0001);
  487. // Trailing zero values.
  488. EXPECT_TRUE(absl::ParseFlag("-5.1000", &value, &err));
  489. EXPECT_DOUBLE_EQ(value, -5.1);
  490. // Exceptional values.
  491. EXPECT_TRUE(absl::ParseFlag("NaN", &value, &err));
  492. EXPECT_TRUE(std::isnan(value));
  493. EXPECT_TRUE(absl::ParseFlag("nan", &value, &err));
  494. EXPECT_TRUE(std::isnan(value));
  495. EXPECT_TRUE(absl::ParseFlag("Inf", &value, &err));
  496. EXPECT_TRUE(std::isinf(value));
  497. EXPECT_TRUE(absl::ParseFlag("inf", &value, &err));
  498. EXPECT_TRUE(std::isinf(value));
  499. // Hex values
  500. EXPECT_TRUE(absl::ParseFlag("0x10.23p12", &value, &err));
  501. EXPECT_DOUBLE_EQ(value, 66096);
  502. EXPECT_TRUE(absl::ParseFlag("-0xF1.A3p-2", &value, &err));
  503. EXPECT_NEAR(value, -60.4092, 5e-5);
  504. EXPECT_TRUE(absl::ParseFlag("+0x0.0AAp-12", &value, &err));
  505. EXPECT_NEAR(value, 1.01328e-05, 5e-11);
  506. EXPECT_TRUE(absl::ParseFlag("0x.01p1", &value, &err));
  507. EXPECT_NEAR(value, 0.0078125, 5e-8);
  508. // Whitespace handling
  509. EXPECT_TRUE(absl::ParseFlag("10.1 ", &value, &err));
  510. EXPECT_DOUBLE_EQ(value, 10.1);
  511. EXPECT_TRUE(absl::ParseFlag(" 2.34", &value, &err));
  512. EXPECT_DOUBLE_EQ(value, 2.34);
  513. EXPECT_TRUE(absl::ParseFlag(" 5.7 ", &value, &err));
  514. EXPECT_DOUBLE_EQ(value, 5.7);
  515. EXPECT_TRUE(absl::ParseFlag(" -0xE0.F3p01 ", &value, &err));
  516. EXPECT_NEAR(value, -449.8984375, 5e-8);
  517. // Invalid values.
  518. EXPECT_FALSE(absl::ParseFlag("", &value, &err));
  519. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  520. EXPECT_FALSE(absl::ParseFlag(" ", &value, &err));
  521. EXPECT_FALSE(absl::ParseFlag("--1", &value, &err));
  522. EXPECT_FALSE(absl::ParseFlag("\n", &value, &err));
  523. EXPECT_FALSE(absl::ParseFlag("\t", &value, &err));
  524. EXPECT_FALSE(absl::ParseFlag("2.3xxx", &value, &err));
  525. EXPECT_FALSE(absl::ParseFlag("0x0.1pAA", &value, &err));
  526. // TODO(rogeeff): below assertion should fail
  527. EXPECT_TRUE(absl::ParseFlag("0x0.1", &value, &err));
  528. }
  529. // --------------------------------------------------------------------
  530. TEST(MarshallingTest, TestStringParsing) {
  531. std::string err;
  532. std::string value;
  533. EXPECT_TRUE(absl::ParseFlag("", &value, &err));
  534. EXPECT_EQ(value, "");
  535. EXPECT_TRUE(absl::ParseFlag(" ", &value, &err));
  536. EXPECT_EQ(value, " ");
  537. EXPECT_TRUE(absl::ParseFlag(" ", &value, &err));
  538. EXPECT_EQ(value, " ");
  539. EXPECT_TRUE(absl::ParseFlag("\n", &value, &err));
  540. EXPECT_EQ(value, "\n");
  541. EXPECT_TRUE(absl::ParseFlag("\t", &value, &err));
  542. EXPECT_EQ(value, "\t");
  543. EXPECT_TRUE(absl::ParseFlag("asdfg", &value, &err));
  544. EXPECT_EQ(value, "asdfg");
  545. EXPECT_TRUE(absl::ParseFlag("asdf ghjk", &value, &err));
  546. EXPECT_EQ(value, "asdf ghjk");
  547. EXPECT_TRUE(absl::ParseFlag("a\nb\nc", &value, &err));
  548. EXPECT_EQ(value, "a\nb\nc");
  549. EXPECT_TRUE(absl::ParseFlag("asd\0fgh", &value, &err));
  550. EXPECT_EQ(value, "asd");
  551. EXPECT_TRUE(absl::ParseFlag("\\\\", &value, &err));
  552. EXPECT_EQ(value, "\\\\");
  553. }
  554. // --------------------------------------------------------------------
  555. TEST(MarshallingTest, TestVectorOfStringParsing) {
  556. std::string err;
  557. std::vector<std::string> value;
  558. EXPECT_TRUE(absl::ParseFlag("", &value, &err));
  559. EXPECT_EQ(value, std::vector<std::string>{});
  560. EXPECT_TRUE(absl::ParseFlag("1", &value, &err));
  561. EXPECT_EQ(value, std::vector<std::string>({"1"}));
  562. EXPECT_TRUE(absl::ParseFlag("a,b", &value, &err));
  563. EXPECT_EQ(value, std::vector<std::string>({"a", "b"}));
  564. EXPECT_TRUE(absl::ParseFlag("a,b,c,", &value, &err));
  565. EXPECT_EQ(value, std::vector<std::string>({"a", "b", "c", ""}));
  566. EXPECT_TRUE(absl::ParseFlag("a,,", &value, &err));
  567. EXPECT_EQ(value, std::vector<std::string>({"a", "", ""}));
  568. EXPECT_TRUE(absl::ParseFlag(",", &value, &err));
  569. EXPECT_EQ(value, std::vector<std::string>({"", ""}));
  570. EXPECT_TRUE(absl::ParseFlag("a, b,c ", &value, &err));
  571. EXPECT_EQ(value, std::vector<std::string>({"a", " b", "c "}));
  572. }
  573. // --------------------------------------------------------------------
  574. TEST(MarshallingTest, TestBoolUnparsing) {
  575. EXPECT_EQ(absl::UnparseFlag(true), "true");
  576. EXPECT_EQ(absl::UnparseFlag(false), "false");
  577. }
  578. // --------------------------------------------------------------------
  579. TEST(MarshallingTest, TestInt16Unparsing) {
  580. int16_t value;
  581. value = 1;
  582. EXPECT_EQ(absl::UnparseFlag(value), "1");
  583. value = 0;
  584. EXPECT_EQ(absl::UnparseFlag(value), "0");
  585. value = -1;
  586. EXPECT_EQ(absl::UnparseFlag(value), "-1");
  587. value = 9876;
  588. EXPECT_EQ(absl::UnparseFlag(value), "9876");
  589. value = -987;
  590. EXPECT_EQ(absl::UnparseFlag(value), "-987");
  591. }
  592. // --------------------------------------------------------------------
  593. TEST(MarshallingTest, TestUint16Unparsing) {
  594. uint16_t value;
  595. value = 1;
  596. EXPECT_EQ(absl::UnparseFlag(value), "1");
  597. value = 0;
  598. EXPECT_EQ(absl::UnparseFlag(value), "0");
  599. value = 19876;
  600. EXPECT_EQ(absl::UnparseFlag(value), "19876");
  601. }
  602. // --------------------------------------------------------------------
  603. TEST(MarshallingTest, TestInt32Unparsing) {
  604. int32_t value;
  605. value = 1;
  606. EXPECT_EQ(absl::UnparseFlag(value), "1");
  607. value = 0;
  608. EXPECT_EQ(absl::UnparseFlag(value), "0");
  609. value = -1;
  610. EXPECT_EQ(absl::UnparseFlag(value), "-1");
  611. value = 12345;
  612. EXPECT_EQ(absl::UnparseFlag(value), "12345");
  613. value = -987;
  614. EXPECT_EQ(absl::UnparseFlag(value), "-987");
  615. }
  616. // --------------------------------------------------------------------
  617. TEST(MarshallingTest, TestUint32Unparsing) {
  618. uint32_t value;
  619. value = 1;
  620. EXPECT_EQ(absl::UnparseFlag(value), "1");
  621. value = 0;
  622. EXPECT_EQ(absl::UnparseFlag(value), "0");
  623. value = 1234500;
  624. EXPECT_EQ(absl::UnparseFlag(value), "1234500");
  625. }
  626. // --------------------------------------------------------------------
  627. TEST(MarshallingTest, TestInt64Unparsing) {
  628. int64_t value;
  629. value = 1;
  630. EXPECT_EQ(absl::UnparseFlag(value), "1");
  631. value = 0;
  632. EXPECT_EQ(absl::UnparseFlag(value), "0");
  633. value = -1;
  634. EXPECT_EQ(absl::UnparseFlag(value), "-1");
  635. value = 123456789L;
  636. EXPECT_EQ(absl::UnparseFlag(value), "123456789");
  637. value = -987654321L;
  638. EXPECT_EQ(absl::UnparseFlag(value), "-987654321");
  639. value = 0x7FFFFFFFFFFFFFFF;
  640. EXPECT_EQ(absl::UnparseFlag(value), "9223372036854775807");
  641. value = 0xFFFFFFFFFFFFFFFF;
  642. EXPECT_EQ(absl::UnparseFlag(value), "-1");
  643. }
  644. // --------------------------------------------------------------------
  645. TEST(MarshallingTest, TestUint64Unparsing) {
  646. uint64_t value;
  647. value = 1;
  648. EXPECT_EQ(absl::UnparseFlag(value), "1");
  649. value = 0;
  650. EXPECT_EQ(absl::UnparseFlag(value), "0");
  651. value = 123456789L;
  652. EXPECT_EQ(absl::UnparseFlag(value), "123456789");
  653. value = 0xFFFFFFFFFFFFFFFF;
  654. EXPECT_EQ(absl::UnparseFlag(value), "18446744073709551615");
  655. }
  656. // --------------------------------------------------------------------
  657. TEST(MarshallingTest, TestFloatUnparsing) {
  658. float value;
  659. value = 1.1f;
  660. EXPECT_EQ(absl::UnparseFlag(value), "1.1");
  661. value = 0.01f;
  662. EXPECT_EQ(absl::UnparseFlag(value), "0.01");
  663. value = 1.23e-2f;
  664. EXPECT_EQ(absl::UnparseFlag(value), "0.0123");
  665. value = -0.71f;
  666. EXPECT_EQ(absl::UnparseFlag(value), "-0.71");
  667. }
  668. // --------------------------------------------------------------------
  669. TEST(MarshallingTest, TestDoubleUnparsing) {
  670. double value;
  671. value = 1.1;
  672. EXPECT_EQ(absl::UnparseFlag(value), "1.1");
  673. value = 0.01;
  674. EXPECT_EQ(absl::UnparseFlag(value), "0.01");
  675. value = 1.23e-2;
  676. EXPECT_EQ(absl::UnparseFlag(value), "0.0123");
  677. value = -0.71;
  678. EXPECT_EQ(absl::UnparseFlag(value), "-0.71");
  679. value = -0;
  680. EXPECT_EQ(absl::UnparseFlag(value), "0");
  681. value = std::nan("");
  682. EXPECT_EQ(absl::UnparseFlag(value), "nan");
  683. value = std::numeric_limits<double>::infinity();
  684. EXPECT_EQ(absl::UnparseFlag(value), "inf");
  685. }
  686. // --------------------------------------------------------------------
  687. TEST(MarshallingTest, TestStringUnparsing) {
  688. EXPECT_EQ(absl::UnparseFlag(""), "");
  689. EXPECT_EQ(absl::UnparseFlag(" "), " ");
  690. EXPECT_EQ(absl::UnparseFlag("qwerty"), "qwerty");
  691. EXPECT_EQ(absl::UnparseFlag("ASDFGH"), "ASDFGH");
  692. EXPECT_EQ(absl::UnparseFlag("\n\t "), "\n\t ");
  693. }
  694. // --------------------------------------------------------------------
  695. template <typename T>
  696. void TestRoundtrip(T v) {
  697. T new_v;
  698. std::string err;
  699. EXPECT_TRUE(absl::ParseFlag(absl::UnparseFlag(v), &new_v, &err));
  700. EXPECT_EQ(new_v, v);
  701. }
  702. TEST(MarshallingTest, TestFloatRoundTrip) {
  703. TestRoundtrip(0.1f);
  704. TestRoundtrip(0.12f);
  705. TestRoundtrip(0.123f);
  706. TestRoundtrip(0.1234f);
  707. TestRoundtrip(0.12345f);
  708. TestRoundtrip(0.123456f);
  709. TestRoundtrip(0.1234567f);
  710. TestRoundtrip(0.12345678f);
  711. TestRoundtrip(0.1e20f);
  712. TestRoundtrip(0.12e20f);
  713. TestRoundtrip(0.123e20f);
  714. TestRoundtrip(0.1234e20f);
  715. TestRoundtrip(0.12345e20f);
  716. TestRoundtrip(0.123456e20f);
  717. TestRoundtrip(0.1234567e20f);
  718. TestRoundtrip(0.12345678e20f);
  719. TestRoundtrip(0.1e-20f);
  720. TestRoundtrip(0.12e-20f);
  721. TestRoundtrip(0.123e-20f);
  722. TestRoundtrip(0.1234e-20f);
  723. TestRoundtrip(0.12345e-20f);
  724. TestRoundtrip(0.123456e-20f);
  725. TestRoundtrip(0.1234567e-20f);
  726. TestRoundtrip(0.12345678e-20f);
  727. }
  728. TEST(MarshallingTest, TestDoubleRoundTrip) {
  729. TestRoundtrip(0.1);
  730. TestRoundtrip(0.12);
  731. TestRoundtrip(0.123);
  732. TestRoundtrip(0.1234);
  733. TestRoundtrip(0.12345);
  734. TestRoundtrip(0.123456);
  735. TestRoundtrip(0.1234567);
  736. TestRoundtrip(0.12345678);
  737. TestRoundtrip(0.123456789);
  738. TestRoundtrip(0.1234567891);
  739. TestRoundtrip(0.12345678912);
  740. TestRoundtrip(0.123456789123);
  741. TestRoundtrip(0.1234567891234);
  742. TestRoundtrip(0.12345678912345);
  743. TestRoundtrip(0.123456789123456);
  744. TestRoundtrip(0.1234567891234567);
  745. TestRoundtrip(0.12345678912345678);
  746. TestRoundtrip(0.1e50);
  747. TestRoundtrip(0.12e50);
  748. TestRoundtrip(0.123e50);
  749. TestRoundtrip(0.1234e50);
  750. TestRoundtrip(0.12345e50);
  751. TestRoundtrip(0.123456e50);
  752. TestRoundtrip(0.1234567e50);
  753. TestRoundtrip(0.12345678e50);
  754. TestRoundtrip(0.123456789e50);
  755. TestRoundtrip(0.1234567891e50);
  756. TestRoundtrip(0.12345678912e50);
  757. TestRoundtrip(0.123456789123e50);
  758. TestRoundtrip(0.1234567891234e50);
  759. TestRoundtrip(0.12345678912345e50);
  760. TestRoundtrip(0.123456789123456e50);
  761. TestRoundtrip(0.1234567891234567e50);
  762. TestRoundtrip(0.12345678912345678e50);
  763. TestRoundtrip(0.1e-50);
  764. TestRoundtrip(0.12e-50);
  765. TestRoundtrip(0.123e-50);
  766. TestRoundtrip(0.1234e-50);
  767. TestRoundtrip(0.12345e-50);
  768. TestRoundtrip(0.123456e-50);
  769. TestRoundtrip(0.1234567e-50);
  770. TestRoundtrip(0.12345678e-50);
  771. TestRoundtrip(0.123456789e-50);
  772. TestRoundtrip(0.1234567891e-50);
  773. TestRoundtrip(0.12345678912e-50);
  774. TestRoundtrip(0.123456789123e-50);
  775. TestRoundtrip(0.1234567891234e-50);
  776. TestRoundtrip(0.12345678912345e-50);
  777. TestRoundtrip(0.123456789123456e-50);
  778. TestRoundtrip(0.1234567891234567e-50);
  779. TestRoundtrip(0.12345678912345678e-50);
  780. }
  781. } // namespace