1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "runtime/cpp/emboss_text_util.h"
16
17 #include <cmath>
18 #include <limits>
19
20 #include "gtest/gtest.h"
21
22 namespace emboss {
23 namespace support {
24 namespace test {
25
TEST(DecodeInteger,DecodeUInt8Decimal)26 TEST(DecodeInteger, DecodeUInt8Decimal) {
27 ::std::uint8_t result;
28 EXPECT_TRUE(DecodeInteger("123", &result));
29 EXPECT_EQ(123, result);
30 EXPECT_TRUE(DecodeInteger("0", &result));
31 EXPECT_EQ(0, result);
32 EXPECT_TRUE(DecodeInteger("0123", &result));
33 EXPECT_EQ(123, result);
34 EXPECT_TRUE(DecodeInteger("0_123", &result));
35 EXPECT_EQ(123, result);
36 EXPECT_FALSE(DecodeInteger("_12", &result));
37 EXPECT_EQ(123, result);
38 EXPECT_FALSE(DecodeInteger("1234", &result));
39 EXPECT_EQ(123, result);
40 EXPECT_FALSE(DecodeInteger("12a", &result));
41 EXPECT_EQ(123, result);
42 EXPECT_FALSE(DecodeInteger("12A", &result));
43 EXPECT_EQ(123, result);
44 EXPECT_FALSE(DecodeInteger("12 ", &result));
45 EXPECT_EQ(123, result);
46 EXPECT_FALSE(DecodeInteger(" 12", &result));
47 EXPECT_EQ(123, result);
48 EXPECT_FALSE(DecodeInteger("12.", &result));
49 EXPECT_EQ(123, result);
50 EXPECT_FALSE(DecodeInteger("12.0", &result));
51 EXPECT_EQ(123, result);
52 EXPECT_FALSE(DecodeInteger("256", &result));
53 EXPECT_EQ(123, result);
54 EXPECT_TRUE(DecodeInteger("128", &result));
55 EXPECT_EQ(128, result);
56 EXPECT_FALSE(DecodeInteger("-0", &result));
57 EXPECT_EQ(128, result);
58 EXPECT_TRUE(DecodeInteger("255", &result));
59 EXPECT_EQ(255, result);
60 }
61
TEST(DecodeInteger,DecodeInt8Decimal)62 TEST(DecodeInteger, DecodeInt8Decimal) {
63 ::std::int8_t result;
64 EXPECT_TRUE(DecodeInteger("123", &result));
65 EXPECT_EQ(123, result);
66 EXPECT_TRUE(DecodeInteger("0", &result));
67 EXPECT_EQ(0, result);
68 EXPECT_TRUE(DecodeInteger("0123", &result));
69 EXPECT_EQ(123, result);
70 EXPECT_TRUE(DecodeInteger("0_123", &result));
71 EXPECT_EQ(123, result);
72 EXPECT_FALSE(DecodeInteger("_12", &result));
73 EXPECT_EQ(123, result);
74 EXPECT_FALSE(DecodeInteger("1234", &result));
75 EXPECT_EQ(123, result);
76 EXPECT_FALSE(DecodeInteger("12a", &result));
77 EXPECT_EQ(123, result);
78 EXPECT_FALSE(DecodeInteger("12A", &result));
79 EXPECT_EQ(123, result);
80 EXPECT_FALSE(DecodeInteger("12 ", &result));
81 EXPECT_EQ(123, result);
82 EXPECT_FALSE(DecodeInteger(" 12", &result));
83 EXPECT_EQ(123, result);
84 EXPECT_FALSE(DecodeInteger("12.", &result));
85 EXPECT_EQ(123, result);
86 EXPECT_FALSE(DecodeInteger("12.0", &result));
87 EXPECT_EQ(123, result);
88 EXPECT_FALSE(DecodeInteger("256", &result));
89 EXPECT_EQ(123, result);
90 EXPECT_FALSE(DecodeInteger("128", &result));
91 EXPECT_EQ(123, result);
92 EXPECT_TRUE(DecodeInteger("-0", &result));
93 EXPECT_EQ(0, result);
94 EXPECT_TRUE(DecodeInteger("127", &result));
95 EXPECT_EQ(127, result);
96 EXPECT_TRUE(DecodeInteger("-127", &result));
97 EXPECT_EQ(-127, result);
98 EXPECT_TRUE(DecodeInteger("-128", &result));
99 EXPECT_EQ(-128, result);
100 EXPECT_FALSE(DecodeInteger("0-127", &result));
101 EXPECT_EQ(-128, result);
102 EXPECT_FALSE(DecodeInteger("- 127", &result));
103 EXPECT_EQ(-128, result);
104 }
105
TEST(DecodeInteger,DecodeUInt8Hex)106 TEST(DecodeInteger, DecodeUInt8Hex) {
107 ::std::uint8_t result;
108 EXPECT_TRUE(DecodeInteger("0x23", &result));
109 EXPECT_EQ(0x23, result);
110 EXPECT_TRUE(DecodeInteger("0x0", &result));
111 EXPECT_EQ(0x0, result);
112 EXPECT_TRUE(DecodeInteger("0xff", &result));
113 EXPECT_EQ(0xff, result);
114 EXPECT_TRUE(DecodeInteger("0xFE", &result));
115 EXPECT_EQ(0xfe, result);
116 EXPECT_TRUE(DecodeInteger("0xFd", &result));
117 EXPECT_EQ(0xfd, result);
118 EXPECT_TRUE(DecodeInteger("0XeC", &result));
119 EXPECT_EQ(0xec, result);
120 EXPECT_TRUE(DecodeInteger("0x012", &result));
121 EXPECT_EQ(0x12, result);
122 EXPECT_TRUE(DecodeInteger("0x0_0023", &result));
123 EXPECT_EQ(0x23, result);
124 EXPECT_TRUE(DecodeInteger("0x_0023", &result));
125 EXPECT_EQ(0x23, result);
126 EXPECT_FALSE(DecodeInteger("0x100", &result));
127 EXPECT_EQ(0x23, result);
128 EXPECT_FALSE(DecodeInteger("0x", &result));
129 EXPECT_EQ(0x23, result);
130 EXPECT_FALSE(DecodeInteger("0x0x0", &result));
131 EXPECT_EQ(0x23, result);
132 EXPECT_FALSE(DecodeInteger("0x1g", &result));
133 EXPECT_EQ(0x23, result);
134 }
135
TEST(DecodeInteger,DecodeUInt8Binary)136 TEST(DecodeInteger, DecodeUInt8Binary) {
137 ::std::uint8_t result;
138 EXPECT_TRUE(DecodeInteger("0b10100101", &result));
139 EXPECT_EQ(0xa5, result);
140 EXPECT_TRUE(DecodeInteger("0b0", &result));
141 EXPECT_EQ(0x0, result);
142 EXPECT_TRUE(DecodeInteger("0B1", &result));
143 EXPECT_EQ(0x1, result);
144 EXPECT_TRUE(DecodeInteger("0b11111111", &result));
145 EXPECT_EQ(0xff, result);
146 EXPECT_TRUE(DecodeInteger("0b011111110", &result));
147 EXPECT_EQ(0xfe, result);
148 EXPECT_TRUE(DecodeInteger("0b00_0010_0011", &result));
149 EXPECT_EQ(0x23, result);
150 EXPECT_TRUE(DecodeInteger("0b_0010_0011", &result));
151 EXPECT_EQ(0x23, result);
152 EXPECT_FALSE(DecodeInteger("0b100000000", &result));
153 EXPECT_EQ(0x23, result);
154 EXPECT_FALSE(DecodeInteger("0b", &result));
155 EXPECT_EQ(0x23, result);
156 EXPECT_FALSE(DecodeInteger("0b0b0", &result));
157 EXPECT_EQ(0x23, result);
158 EXPECT_FALSE(DecodeInteger("0b12", &result));
159 EXPECT_EQ(0x23, result);
160 EXPECT_FALSE(DecodeInteger("-0b0", &result));
161 EXPECT_EQ(0x23, result);
162 }
163
TEST(DecodeInteger,DecodeInt8Binary)164 TEST(DecodeInteger, DecodeInt8Binary) {
165 ::std::int8_t result;
166 EXPECT_TRUE(DecodeInteger("0b01011010", &result));
167 EXPECT_EQ(0x5a, result);
168 EXPECT_TRUE(DecodeInteger("0b0", &result));
169 EXPECT_EQ(0x0, result);
170 EXPECT_TRUE(DecodeInteger("0B1", &result));
171 EXPECT_EQ(0x1, result);
172 EXPECT_TRUE(DecodeInteger("0b1111111", &result));
173 EXPECT_EQ(0x7f, result);
174 EXPECT_TRUE(DecodeInteger("0b01111110", &result));
175 EXPECT_EQ(0x7e, result);
176 EXPECT_TRUE(DecodeInteger("0b00_0010_0011", &result));
177 EXPECT_EQ(0x23, result);
178 EXPECT_TRUE(DecodeInteger("0b_0010_0011", &result));
179 EXPECT_EQ(0x23, result);
180 EXPECT_FALSE(DecodeInteger("0b100000000", &result));
181 EXPECT_EQ(0x23, result);
182 EXPECT_FALSE(DecodeInteger("0b", &result));
183 EXPECT_EQ(0x23, result);
184 EXPECT_FALSE(DecodeInteger("-0b", &result));
185 EXPECT_EQ(0x23, result);
186 EXPECT_FALSE(DecodeInteger("0b0b0", &result));
187 EXPECT_EQ(0x23, result);
188 EXPECT_FALSE(DecodeInteger("0b12", &result));
189 EXPECT_EQ(0x23, result);
190 EXPECT_FALSE(DecodeInteger("0b10000000", &result));
191 EXPECT_EQ(0x23, result);
192 EXPECT_TRUE(DecodeInteger("-0b1111111", &result));
193 EXPECT_EQ(-0x7f, result);
194 EXPECT_TRUE(DecodeInteger("-0b10000000", &result));
195 EXPECT_EQ(-0x80, result);
196 EXPECT_FALSE(DecodeInteger("-0b10000001", &result));
197 EXPECT_EQ(-0x80, result);
198 EXPECT_TRUE(DecodeInteger("-0b0", &result));
199 EXPECT_EQ(0x0, result);
200 }
201
TEST(DecodeInteger,DecodeUInt16)202 TEST(DecodeInteger, DecodeUInt16) {
203 ::std::uint16_t result;
204 EXPECT_TRUE(DecodeInteger("65535", &result));
205 EXPECT_EQ(65535, result);
206 EXPECT_FALSE(DecodeInteger("65536", &result));
207 EXPECT_EQ(65535, result);
208 }
209
TEST(DecodeInteger,DecodeInt16)210 TEST(DecodeInteger, DecodeInt16) {
211 ::std::int16_t result;
212 EXPECT_TRUE(DecodeInteger("32767", &result));
213 EXPECT_EQ(32767, result);
214 EXPECT_FALSE(DecodeInteger("32768", &result));
215 EXPECT_EQ(32767, result);
216 EXPECT_TRUE(DecodeInteger("-32768", &result));
217 EXPECT_EQ(-32768, result);
218 EXPECT_FALSE(DecodeInteger("-32769", &result));
219 EXPECT_EQ(-32768, result);
220 }
221
TEST(DecodeInteger,DecodeUInt32)222 TEST(DecodeInteger, DecodeUInt32) {
223 ::std::uint32_t result;
224 EXPECT_TRUE(DecodeInteger("4294967295", &result));
225 EXPECT_EQ(4294967295U, result);
226 EXPECT_FALSE(DecodeInteger("4294967296", &result));
227 EXPECT_EQ(4294967295U, result);
228 }
229
TEST(DecodeInteger,DecodeInt32)230 TEST(DecodeInteger, DecodeInt32) {
231 ::std::int32_t result;
232 EXPECT_TRUE(DecodeInteger("2147483647", &result));
233 EXPECT_EQ(2147483647, result);
234 EXPECT_FALSE(DecodeInteger("2147483648", &result));
235 EXPECT_EQ(2147483647, result);
236 EXPECT_FALSE(DecodeInteger("4294967295", &result));
237 EXPECT_EQ(2147483647, result);
238 EXPECT_TRUE(DecodeInteger("-2147483648", &result));
239 EXPECT_EQ(-2147483647 - 1, result);
240 EXPECT_FALSE(DecodeInteger("-2147483649", &result));
241 EXPECT_EQ(-2147483647 - 1, result);
242 }
243
TEST(DecodeInteger,DecodeUInt64)244 TEST(DecodeInteger, DecodeUInt64) {
245 ::std::uint64_t result;
246 EXPECT_TRUE(DecodeInteger("18446744073709551615", &result));
247 EXPECT_EQ(18446744073709551615ULL, result);
248 EXPECT_FALSE(DecodeInteger("18446744073709551616", &result));
249 EXPECT_EQ(18446744073709551615ULL, result);
250 }
251
TEST(DecodeInteger,DecodeInt64)252 TEST(DecodeInteger, DecodeInt64) {
253 ::std::int64_t result;
254 EXPECT_TRUE(DecodeInteger("9223372036854775807", &result));
255 EXPECT_EQ(9223372036854775807LL, result);
256 EXPECT_FALSE(DecodeInteger("9223372036854775808", &result));
257 EXPECT_EQ(9223372036854775807LL, result);
258 EXPECT_FALSE(DecodeInteger("18446744073709551615", &result));
259 EXPECT_EQ(9223372036854775807LL, result);
260 EXPECT_TRUE(DecodeInteger("-9223372036854775808", &result));
261 EXPECT_EQ(-9223372036854775807LL - 1LL, result);
262 EXPECT_FALSE(DecodeInteger("-9223372036854775809", &result));
263 EXPECT_EQ(-9223372036854775807LL - 1LL, result);
264 }
265
TEST(TextStream,Construction)266 TEST(TextStream, Construction) {
267 ::std::string string_text = "ab";
268 auto text_stream = TextStream(string_text);
269 char result;
270 EXPECT_TRUE(text_stream.Read(&result));
271 EXPECT_EQ('a', result);
272 EXPECT_TRUE(text_stream.Read(&result));
273 EXPECT_EQ('b', result);
274 EXPECT_FALSE(text_stream.Read(&result));
275
276 const char *c_string = "cd";
277 text_stream = TextStream(c_string);
278 EXPECT_TRUE(text_stream.Read(&result));
279 EXPECT_EQ('c', result);
280 EXPECT_TRUE(text_stream.Read(&result));
281 EXPECT_EQ('d', result);
282 EXPECT_FALSE(text_stream.Read(&result));
283
284 const char *long_c_string = "efghi";
285 text_stream = TextStream(long_c_string, 2);
286 EXPECT_TRUE(text_stream.Read(&result));
287 EXPECT_EQ('e', result);
288 EXPECT_TRUE(text_stream.Read(&result));
289 EXPECT_EQ('f', result);
290 EXPECT_FALSE(text_stream.Read(&result));
291 }
292
TEST(TextStream,Methods)293 TEST(TextStream, Methods) {
294 auto text_stream = TextStream{"abc"};
295
296 EXPECT_FALSE(text_stream.Unread('d'));
297 char result;
298 EXPECT_TRUE(text_stream.Read(&result));
299 EXPECT_EQ('a', result);
300
301 EXPECT_FALSE(text_stream.Unread('e'));
302 EXPECT_TRUE(text_stream.Read(&result));
303 EXPECT_EQ('b', result);
304
305 EXPECT_TRUE(text_stream.Unread('b'));
306 result = 'f';
307 EXPECT_TRUE(text_stream.Read(&result));
308 EXPECT_EQ('b', result);
309
310 EXPECT_TRUE(text_stream.Read(&result));
311 EXPECT_EQ('c', result);
312
313 result = 'g';
314 EXPECT_FALSE(text_stream.Read(&result));
315 EXPECT_EQ('g', result);
316
317 auto empty_text_stream = TextStream{""};
318 EXPECT_FALSE(empty_text_stream.Read(&result));
319 EXPECT_EQ('g', result);
320 }
321
TEST(ReadToken,ReadsToken)322 TEST(ReadToken, ReadsToken) {
323 auto text_stream = TextStream{"abc"};
324 ::std::string result;
325 EXPECT_TRUE(ReadToken(&text_stream, &result));
326 EXPECT_EQ("abc", result);
327 EXPECT_TRUE(ReadToken(&text_stream, &result));
328 EXPECT_EQ("", result);
329 EXPECT_TRUE(ReadToken(&text_stream, &result));
330 EXPECT_EQ("", result);
331 }
332
TEST(ReadToken,ReadsTwoTokens)333 TEST(ReadToken, ReadsTwoTokens) {
334 auto text_stream = TextStream{"abc def"};
335 ::std::string result;
336 EXPECT_TRUE(ReadToken(&text_stream, &result));
337 EXPECT_EQ("abc", result);
338 EXPECT_TRUE(ReadToken(&text_stream, &result));
339 EXPECT_EQ("def", result);
340 EXPECT_TRUE(ReadToken(&text_stream, &result));
341 EXPECT_EQ("", result);
342 }
343
TEST(ReadToken,SkipsInitialWhitespace)344 TEST(ReadToken, SkipsInitialWhitespace) {
345 auto text_stream = TextStream{" \t\r\r\n\t\r abc def"};
346 ::std::string result;
347 EXPECT_TRUE(ReadToken(&text_stream, &result));
348 EXPECT_EQ("abc", result);
349 EXPECT_TRUE(ReadToken(&text_stream, &result));
350 EXPECT_EQ("def", result);
351 EXPECT_TRUE(ReadToken(&text_stream, &result));
352 EXPECT_EQ("", result);
353 }
354
TEST(ReadToken,SkipsComments)355 TEST(ReadToken, SkipsComments) {
356 auto text_stream = TextStream{" #comment##\r#comment\n abc #c\n def"};
357 ::std::string result;
358 EXPECT_TRUE(ReadToken(&text_stream, &result));
359 EXPECT_EQ("abc", result);
360 EXPECT_TRUE(ReadToken(&text_stream, &result));
361 EXPECT_EQ("def", result);
362 EXPECT_TRUE(ReadToken(&text_stream, &result));
363 EXPECT_EQ("", result);
364 }
365
TEST(TextOutputOptions,Defaults)366 TEST(TextOutputOptions, Defaults) {
367 TextOutputOptions options;
368 EXPECT_EQ("", options.current_indent());
369 EXPECT_EQ("", options.indent());
370 EXPECT_FALSE(options.multiline());
371 EXPECT_FALSE(options.comments());
372 EXPECT_FALSE(options.digit_grouping());
373 EXPECT_EQ(10, options.numeric_base());
374 }
375
TEST(TextOutputOptions,WithIndent)376 TEST(TextOutputOptions, WithIndent) {
377 TextOutputOptions options;
378 TextOutputOptions new_options = options.WithIndent("xyz");
379 EXPECT_EQ("", options.current_indent());
380 EXPECT_EQ("", options.indent());
381 EXPECT_EQ("", new_options.current_indent());
382 EXPECT_EQ("xyz", new_options.indent());
383 }
384
TEST(TextOutputOptions,PlusOneIndent)385 TEST(TextOutputOptions, PlusOneIndent) {
386 TextOutputOptions options;
387 TextOutputOptions new_options = options.WithIndent("xyz").PlusOneIndent();
388 EXPECT_EQ("", options.current_indent());
389 EXPECT_EQ("", options.indent());
390 EXPECT_EQ("xyz", new_options.current_indent());
391 EXPECT_EQ("xyz", new_options.indent());
392 EXPECT_EQ("xyzxyz", new_options.PlusOneIndent().current_indent());
393 }
394
TEST(TextOutputOptions,WithComments)395 TEST(TextOutputOptions, WithComments) {
396 TextOutputOptions options;
397 TextOutputOptions new_options = options.WithComments(true);
398 EXPECT_FALSE(options.comments());
399 EXPECT_TRUE(new_options.comments());
400 }
401
TEST(TextOutputOptions,WithDigitGrouping)402 TEST(TextOutputOptions, WithDigitGrouping) {
403 TextOutputOptions options;
404 TextOutputOptions new_options = options.WithDigitGrouping(true);
405 EXPECT_FALSE(options.digit_grouping());
406 EXPECT_TRUE(new_options.digit_grouping());
407 }
408
TEST(TextOutputOptions,Multiline)409 TEST(TextOutputOptions, Multiline) {
410 TextOutputOptions options;
411 TextOutputOptions new_options = options.Multiline(true);
412 EXPECT_FALSE(options.multiline());
413 EXPECT_TRUE(new_options.multiline());
414 }
415
TEST(TextOutputOptions,WithNumericBase)416 TEST(TextOutputOptions, WithNumericBase) {
417 TextOutputOptions options;
418 TextOutputOptions new_options = options.WithNumericBase(2);
419 EXPECT_EQ(10, options.numeric_base());
420 EXPECT_EQ(2, new_options.numeric_base());
421 }
422
TEST(TextOutputOptions,WithAllowPartialOutput)423 TEST(TextOutputOptions, WithAllowPartialOutput) {
424 TextOutputOptions options;
425 TextOutputOptions new_options = options.WithAllowPartialOutput(true);
426 EXPECT_FALSE(options.allow_partial_output());
427 EXPECT_TRUE(new_options.allow_partial_output());
428 }
429
430 // Small helper function for the various WriteIntegerToTextStream tests; just
431 // sets up a stream, forwards its arguments to WriteIntegerToTextStream, and
432 // then returns the text from the stream.
433 template <typename Arg0, typename... Args>
WriteIntegerToString(Arg0 && arg0,Args &&...args)434 ::std::string WriteIntegerToString(Arg0 &&arg0, Args &&... args) {
435 TextOutputStream stream;
436 WriteIntegerToTextStream(::std::forward<Arg0>(arg0), &stream,
437 ::std::forward<Args>(args)...);
438 return stream.Result();
439 }
440
TEST(WriteIntegerToTextStream,Decimal)441 TEST(WriteIntegerToTextStream, Decimal) {
442 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(0), 10,
443 false));
444 EXPECT_EQ("100", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(100),
445 10, false));
446 EXPECT_EQ("255", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(255),
447 10, false));
448 EXPECT_EQ("-128", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-128),
449 10, false));
450 EXPECT_EQ("-100", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-100),
451 10, false));
452 EXPECT_EQ(
453 "0", WriteIntegerToString(static_cast</**/ ::std::int8_t>(0), 10, false));
454 EXPECT_EQ("100", WriteIntegerToString(static_cast</**/ ::std::int8_t>(100),
455 10, false));
456 EXPECT_EQ("127", WriteIntegerToString(static_cast</**/ ::std::int8_t>(127),
457 10, false));
458
459 EXPECT_EQ(
460 "0", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(0), 10, true));
461 EXPECT_EQ("100", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(100),
462 10, true));
463 EXPECT_EQ("255", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(255),
464 10, true));
465 EXPECT_EQ("-128", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-128),
466 10, true));
467 EXPECT_EQ("-100", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-100),
468 10, true));
469 EXPECT_EQ("0",
470 WriteIntegerToString(static_cast</**/ ::std::int8_t>(0), 10, true));
471 EXPECT_EQ("100", WriteIntegerToString(static_cast</**/ ::std::int8_t>(100),
472 10, true));
473 EXPECT_EQ("127", WriteIntegerToString(static_cast</**/ ::std::int8_t>(127),
474 10, true));
475
476 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::uint16_t>(0), 10,
477 false));
478 EXPECT_EQ("1000", WriteIntegerToString(
479 static_cast</**/ ::std::uint16_t>(1000), 10, false));
480 EXPECT_EQ("65535", WriteIntegerToString(
481 static_cast</**/ ::std::uint16_t>(65535), 10, false));
482 EXPECT_EQ("-32768", WriteIntegerToString(
483 static_cast</**/ ::std::int16_t>(-32768), 10, false));
484 EXPECT_EQ("-10000", WriteIntegerToString(
485 static_cast</**/ ::std::int16_t>(-10000), 10, false));
486 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::int16_t>(0), 10,
487 false));
488 EXPECT_EQ("32767", WriteIntegerToString(
489 static_cast</**/ ::std::int16_t>(32767), 10, false));
490
491 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::uint16_t>(0), 10,
492 true));
493 EXPECT_EQ("999", WriteIntegerToString(static_cast</**/ ::std::uint16_t>(999),
494 10, true));
495 EXPECT_EQ("1_000", WriteIntegerToString(
496 static_cast</**/ ::std::uint16_t>(1000), 10, true));
497 EXPECT_EQ("65_535", WriteIntegerToString(
498 static_cast</**/ ::std::uint16_t>(65535), 10, true));
499 EXPECT_EQ("-32_768", WriteIntegerToString(
500 static_cast</**/ ::std::int16_t>(-32768), 10, true));
501 EXPECT_EQ("-1_000", WriteIntegerToString(
502 static_cast</**/ ::std::int16_t>(-1000), 10, true));
503 EXPECT_EQ("-999", WriteIntegerToString(static_cast</**/ ::std::int16_t>(-999),
504 10, true));
505 EXPECT_EQ(
506 "0", WriteIntegerToString(static_cast</**/ ::std::int16_t>(0), 10, true));
507 EXPECT_EQ("32_767", WriteIntegerToString(
508 static_cast</**/ ::std::int16_t>(32767), 10, true));
509
510 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::uint32_t>(0), 10,
511 false));
512 EXPECT_EQ("1000000",
513 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(1000000), 10,
514 false));
515 EXPECT_EQ("4294967295",
516 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(4294967295),
517 10, false));
518 EXPECT_EQ("-2147483648",
519 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-2147483648),
520 10, false));
521 EXPECT_EQ("-100000",
522 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-100000), 10,
523 false));
524 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::int32_t>(0), 10,
525 false));
526 EXPECT_EQ("2147483647",
527 WriteIntegerToString(static_cast</**/ ::std::int32_t>(2147483647),
528 10, false));
529
530 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::uint32_t>(0), 10,
531 true));
532 EXPECT_EQ("999_999",
533 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(999999), 10,
534 true));
535 EXPECT_EQ("1_000_000",
536 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(1000000), 10,
537 true));
538 EXPECT_EQ("4_294_967_295",
539 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(4294967295U),
540 10, true));
541 EXPECT_EQ("-2_147_483_648",
542 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-2147483648L),
543 10, true));
544 EXPECT_EQ("-999_999",
545 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-999999), 10,
546 true));
547 EXPECT_EQ("-1_000_000",
548 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-1000000), 10,
549 true));
550 EXPECT_EQ(
551 "0", WriteIntegerToString(static_cast</**/ ::std::int32_t>(0), 10, true));
552 EXPECT_EQ("2_147_483_647",
553 WriteIntegerToString(static_cast</**/ ::std::int32_t>(2147483647),
554 10, true));
555
556 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::uint64_t>(0), 10,
557 false));
558 EXPECT_EQ("1000000",
559 WriteIntegerToString(static_cast</**/ ::std::uint64_t>(1000000), 10,
560 false));
561 EXPECT_EQ("18446744073709551615",
562 WriteIntegerToString(
563 static_cast</**/ ::std::uint64_t>(18446744073709551615UL), 10,
564 false));
565 EXPECT_EQ("-9223372036854775808",
566 WriteIntegerToString(
567 static_cast</**/ ::std::int64_t>(-9223372036854775807L - 1), 10,
568 false));
569 EXPECT_EQ("-100000",
570 WriteIntegerToString(static_cast</**/ ::std::int64_t>(-100000), 10,
571 false));
572 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::int64_t>(0), 10,
573 false));
574 EXPECT_EQ(
575 "9223372036854775807",
576 WriteIntegerToString(
577 static_cast</**/ ::std::int64_t>(9223372036854775807L), 10, false));
578
579 EXPECT_EQ("0", WriteIntegerToString(static_cast</**/ ::std::uint64_t>(0), 10,
580 true));
581 EXPECT_EQ("1_000_000",
582 WriteIntegerToString(static_cast</**/ ::std::uint64_t>(1000000), 10,
583 true));
584 EXPECT_EQ(
585 "18_446_744_073_709_551_615",
586 WriteIntegerToString(
587 static_cast</**/ ::std::uint64_t>(18446744073709551615UL), 10, true));
588 EXPECT_EQ("-9_223_372_036_854_775_808",
589 WriteIntegerToString(
590 static_cast</**/ ::std::int64_t>(-9223372036854775807L - 1), 10,
591 true));
592 EXPECT_EQ("-100_000",
593 WriteIntegerToString(static_cast</**/ ::std::int64_t>(-100000), 10,
594 true));
595 EXPECT_EQ(
596 "0", WriteIntegerToString(static_cast</**/ ::std::int64_t>(0), 10, true));
597 EXPECT_EQ(
598 "9_223_372_036_854_775_807",
599 WriteIntegerToString(
600 static_cast</**/ ::std::int64_t>(9223372036854775807L), 10, true));
601 }
602
TEST(WriteIntegerToTextStream,Binary)603 TEST(WriteIntegerToTextStream, Binary) {
604 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(0), 2,
605 false));
606 EXPECT_EQ("0b1100100", WriteIntegerToString(
607 static_cast</**/ ::std::uint8_t>(100), 2, false));
608 EXPECT_EQ("0b11111111", WriteIntegerToString(
609 static_cast</**/ ::std::uint8_t>(255), 2, false));
610 EXPECT_EQ(
611 "-0b10000000",
612 WriteIntegerToString(static_cast</**/ ::std::int8_t>(-128), 2, false));
613 EXPECT_EQ("-0b1100100", WriteIntegerToString(
614 static_cast</**/ ::std::int8_t>(-100), 2, false));
615 EXPECT_EQ("0b0",
616 WriteIntegerToString(static_cast</**/ ::std::int8_t>(0), 2, false));
617 EXPECT_EQ("0b1100100", WriteIntegerToString(
618 static_cast</**/ ::std::int8_t>(100), 2, false));
619 EXPECT_EQ("0b1111111", WriteIntegerToString(
620 static_cast</**/ ::std::int8_t>(127), 2, false));
621
622 EXPECT_EQ("0b0",
623 WriteIntegerToString(static_cast</**/ ::std::uint8_t>(0), 2, true));
624 EXPECT_EQ("0b1100100", WriteIntegerToString(
625 static_cast</**/ ::std::uint8_t>(100), 2, true));
626 EXPECT_EQ("0b11111111", WriteIntegerToString(
627 static_cast</**/ ::std::uint8_t>(255), 2, true));
628 EXPECT_EQ("-0b10000000", WriteIntegerToString(
629 static_cast</**/ ::std::int8_t>(-128), 2, true));
630 EXPECT_EQ("-0b1100100", WriteIntegerToString(
631 static_cast</**/ ::std::int8_t>(-100), 2, true));
632 EXPECT_EQ("0b0",
633 WriteIntegerToString(static_cast</**/ ::std::int8_t>(0), 2, true));
634 EXPECT_EQ("0b1100100", WriteIntegerToString(
635 static_cast</**/ ::std::int8_t>(100), 2, true));
636 EXPECT_EQ("0b1111111", WriteIntegerToString(
637 static_cast</**/ ::std::int8_t>(127), 2, true));
638
639 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::uint16_t>(0), 2,
640 false));
641 EXPECT_EQ(
642 "0b1111101000",
643 WriteIntegerToString(static_cast</**/ ::std::uint16_t>(1000), 2, false));
644 EXPECT_EQ(
645 "0b1111111111111111",
646 WriteIntegerToString(static_cast</**/ ::std::uint16_t>(65535), 2, false));
647 EXPECT_EQ(
648 "-0b1000000000000000",
649 WriteIntegerToString(static_cast</**/ ::std::int16_t>(-32768), 2, false));
650 EXPECT_EQ(
651 "-0b10011100010000",
652 WriteIntegerToString(static_cast</**/ ::std::int16_t>(-10000), 2, false));
653 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::int16_t>(0), 2,
654 false));
655 EXPECT_EQ(
656 "0b111111111111111",
657 WriteIntegerToString(static_cast</**/ ::std::int16_t>(32767), 2, false));
658
659 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::uint16_t>(0), 2,
660 true));
661 EXPECT_EQ(
662 "0b11_11101000",
663 WriteIntegerToString(static_cast</**/ ::std::uint16_t>(1000), 2, true));
664 EXPECT_EQ(
665 "0b11111111_11111111",
666 WriteIntegerToString(static_cast</**/ ::std::uint16_t>(65535), 2, true));
667 EXPECT_EQ(
668 "-0b10000000_00000000",
669 WriteIntegerToString(static_cast</**/ ::std::int16_t>(-32768), 2, true));
670 EXPECT_EQ(
671 "-0b11_11101000",
672 WriteIntegerToString(static_cast</**/ ::std::int16_t>(-1000), 2, true));
673 EXPECT_EQ(
674 "-0b11_11100111",
675 WriteIntegerToString(static_cast</**/ ::std::int16_t>(-999), 2, true));
676 EXPECT_EQ("0b0",
677 WriteIntegerToString(static_cast</**/ ::std::int16_t>(0), 2, true));
678 EXPECT_EQ(
679 "0b1111111_11111111",
680 WriteIntegerToString(static_cast</**/ ::std::int16_t>(32767), 2, true));
681
682 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::uint32_t>(0), 2,
683 false));
684 EXPECT_EQ("0b11110100001001000000",
685 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(1000000), 2,
686 false));
687 EXPECT_EQ("0b11111111111111111111111111111111",
688 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(4294967295),
689 2, false));
690 EXPECT_EQ("-0b10000000000000000000000000000000",
691 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-2147483648),
692 2, false));
693 EXPECT_EQ("-0b11000011010100000",
694 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-100000), 2,
695 false));
696 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::int32_t>(0), 2,
697 false));
698 EXPECT_EQ("0b1111111111111111111111111111111",
699 WriteIntegerToString(static_cast</**/ ::std::int32_t>(2147483647),
700 2, false));
701
702 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::uint32_t>(0), 2,
703 true));
704 EXPECT_EQ("0b1111_01000010_01000000",
705 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(1000000), 2,
706 true));
707 EXPECT_EQ("0b11111111_11111111_11111111_11111111",
708 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(4294967295U),
709 2, true));
710 EXPECT_EQ("-0b10000000_00000000_00000000_00000000",
711 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-2147483648L),
712 2, true));
713 EXPECT_EQ("-0b1111_01000010_01000000",
714 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-1000000), 2,
715 true));
716 EXPECT_EQ("0b0",
717 WriteIntegerToString(static_cast</**/ ::std::int32_t>(0), 2, true));
718 EXPECT_EQ("0b1111111_11111111_11111111_11111111",
719 WriteIntegerToString(static_cast</**/ ::std::int32_t>(2147483647),
720 2, true));
721
722 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::uint64_t>(0), 2,
723 false));
724 EXPECT_EQ("0b11110100001001000000",
725 WriteIntegerToString(static_cast</**/ ::std::uint64_t>(1000000), 2,
726 false));
727 EXPECT_EQ(
728 "0b1111111111111111111111111111111111111111111111111111111111111111",
729 WriteIntegerToString(
730 static_cast</**/ ::std::uint64_t>(18446744073709551615UL), 2, false));
731 EXPECT_EQ(
732 "-0b1000000000000000000000000000000000000000000000000000000000000000",
733 WriteIntegerToString(
734 static_cast</**/ ::std::int64_t>(-9223372036854775807L - 1), 2,
735 false));
736 EXPECT_EQ("-0b11000011010100000",
737 WriteIntegerToString(static_cast</**/ ::std::int64_t>(-100000), 2,
738 false));
739 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::int64_t>(0), 2,
740 false));
741 EXPECT_EQ(
742 "0b111111111111111111111111111111111111111111111111111111111111111",
743 WriteIntegerToString(
744 static_cast</**/ ::std::int64_t>(9223372036854775807L), 2, false));
745
746 EXPECT_EQ("0b0", WriteIntegerToString(static_cast</**/ ::std::uint64_t>(0), 2,
747 true));
748 EXPECT_EQ("0b1111_01000010_01000000",
749 WriteIntegerToString(static_cast</**/ ::std::uint64_t>(1000000), 2,
750 true));
751 EXPECT_EQ(
752 "0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_"
753 "11111111",
754 WriteIntegerToString(
755 static_cast</**/ ::std::uint64_t>(18446744073709551615UL), 2, true));
756 EXPECT_EQ(
757 "-0b10000000_00000000_00000000_00000000_00000000_00000000_00000000_"
758 "00000000",
759 WriteIntegerToString(
760 static_cast</**/ ::std::int64_t>(-9223372036854775807L - 1), 2,
761 true));
762 EXPECT_EQ(
763 "-0b1_10000110_10100000",
764 WriteIntegerToString(static_cast</**/ ::std::int64_t>(-100000), 2, true));
765 EXPECT_EQ("0b0",
766 WriteIntegerToString(static_cast</**/ ::std::int64_t>(0), 2, true));
767 EXPECT_EQ(
768 "0b1111111_11111111_11111111_11111111_11111111_11111111_11111111_"
769 "11111111",
770 WriteIntegerToString(
771 static_cast</**/ ::std::int64_t>(9223372036854775807L), 2, true));
772 }
773
TEST(WriteIntegerToTextStream,Hexadecimal)774 TEST(WriteIntegerToTextStream, Hexadecimal) {
775 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(0), 16,
776 false));
777 EXPECT_EQ("0x64", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(100),
778 16, false));
779 EXPECT_EQ("0xff", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(255),
780 16, false));
781 EXPECT_EQ("-0x80", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-128),
782 16, false));
783 EXPECT_EQ("-0x64", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-100),
784 16, false));
785 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::int8_t>(0), 16,
786 false));
787 EXPECT_EQ("0x64", WriteIntegerToString(static_cast</**/ ::std::int8_t>(100),
788 16, false));
789 EXPECT_EQ("0x7f", WriteIntegerToString(static_cast</**/ ::std::int8_t>(127),
790 16, false));
791
792 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(0), 16,
793 true));
794 EXPECT_EQ("0x64", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(100),
795 16, true));
796 EXPECT_EQ("0xff", WriteIntegerToString(static_cast</**/ ::std::uint8_t>(255),
797 16, true));
798 EXPECT_EQ("-0x80", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-128),
799 16, true));
800 EXPECT_EQ("-0x64", WriteIntegerToString(static_cast</**/ ::std::int8_t>(-100),
801 16, true));
802 EXPECT_EQ("0x0",
803 WriteIntegerToString(static_cast</**/ ::std::int8_t>(0), 16, true));
804 EXPECT_EQ("0x64", WriteIntegerToString(static_cast</**/ ::std::int8_t>(100),
805 16, true));
806 EXPECT_EQ("0x7f", WriteIntegerToString(static_cast</**/ ::std::int8_t>(127),
807 16, true));
808
809 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint16_t>(0),
810 16, false));
811 EXPECT_EQ("0x3e8", WriteIntegerToString(
812 static_cast</**/ ::std::uint16_t>(1000), 16, false));
813 EXPECT_EQ("0xffff", WriteIntegerToString(
814 static_cast</**/ ::std::uint16_t>(65535), 16, false));
815 EXPECT_EQ("-0x8000",
816 WriteIntegerToString(static_cast</**/ ::std::int16_t>(-32768), 16,
817 false));
818 EXPECT_EQ("-0x2710",
819 WriteIntegerToString(static_cast</**/ ::std::int16_t>(-10000), 16,
820 false));
821 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::int16_t>(0), 16,
822 false));
823 EXPECT_EQ("0x7fff", WriteIntegerToString(
824 static_cast</**/ ::std::int16_t>(32767), 16, false));
825
826 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint16_t>(0),
827 16, true));
828 EXPECT_EQ("0x3e8", WriteIntegerToString(
829 static_cast</**/ ::std::uint16_t>(1000), 16, true));
830 EXPECT_EQ("0xffff", WriteIntegerToString(
831 static_cast</**/ ::std::uint16_t>(65535), 16, true));
832 EXPECT_EQ("-0x8000", WriteIntegerToString(
833 static_cast</**/ ::std::int16_t>(-32768), 16, true));
834 EXPECT_EQ("-0x3e8", WriteIntegerToString(
835 static_cast</**/ ::std::int16_t>(-1000), 16, true));
836 EXPECT_EQ("-0x3e7", WriteIntegerToString(
837 static_cast</**/ ::std::int16_t>(-999), 16, true));
838 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::int16_t>(0), 16,
839 true));
840 EXPECT_EQ("0x7fff", WriteIntegerToString(
841 static_cast</**/ ::std::int16_t>(32767), 16, true));
842
843 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint32_t>(0),
844 16, false));
845 EXPECT_EQ("0xf4240",
846 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(1000000), 16,
847 false));
848 EXPECT_EQ("0xffffffff",
849 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(4294967295),
850 16, false));
851 EXPECT_EQ("-0x80000000",
852 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-2147483648),
853 16, false));
854 EXPECT_EQ("-0x186a0",
855 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-100000), 16,
856 false));
857 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::int32_t>(0), 16,
858 false));
859 EXPECT_EQ("0x7fffffff",
860 WriteIntegerToString(static_cast</**/ ::std::int32_t>(2147483647),
861 16, false));
862
863 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint32_t>(0),
864 16, true));
865 EXPECT_EQ("0xf_4240",
866 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(1000000), 16,
867 true));
868 EXPECT_EQ("0xffff_ffff",
869 WriteIntegerToString(static_cast</**/ ::std::uint32_t>(4294967295U),
870 16, true));
871 EXPECT_EQ("-0x8000_0000",
872 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-2147483648L),
873 16, true));
874 EXPECT_EQ("-0xf_4240",
875 WriteIntegerToString(static_cast</**/ ::std::int32_t>(-1000000), 16,
876 true));
877 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::int32_t>(0), 16,
878 true));
879 EXPECT_EQ("0x7fff_ffff",
880 WriteIntegerToString(static_cast</**/ ::std::int32_t>(2147483647),
881 16, true));
882
883 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint64_t>(0),
884 16, false));
885 EXPECT_EQ("0xf4240",
886 WriteIntegerToString(static_cast</**/ ::std::uint64_t>(1000000), 16,
887 false));
888 EXPECT_EQ("0xffffffffffffffff",
889 WriteIntegerToString(
890 static_cast</**/ ::std::uint64_t>(18446744073709551615UL), 16,
891 false));
892 EXPECT_EQ("-0x8000000000000000",
893 WriteIntegerToString(
894 static_cast</**/ ::std::int64_t>(-9223372036854775807L - 1), 16,
895 false));
896 EXPECT_EQ("-0x186a0",
897 WriteIntegerToString(static_cast</**/ ::std::int64_t>(-100000), 16,
898 false));
899 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::int64_t>(0), 16,
900 false));
901 EXPECT_EQ(
902 "0x7fffffffffffffff",
903 WriteIntegerToString(
904 static_cast</**/ ::std::int64_t>(9223372036854775807L), 16, false));
905
906 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::uint64_t>(0),
907 16, true));
908 EXPECT_EQ("0xf_4240",
909 WriteIntegerToString(static_cast</**/ ::std::uint64_t>(1000000), 16,
910 true));
911 EXPECT_EQ(
912 "0xffff_ffff_ffff_ffff",
913 WriteIntegerToString(
914 static_cast</**/ ::std::uint64_t>(18446744073709551615UL), 16, true));
915 EXPECT_EQ("-0x8000_0000_0000_0000",
916 WriteIntegerToString(
917 static_cast</**/ ::std::int64_t>(-9223372036854775807L - 1), 16,
918 true));
919 EXPECT_EQ("-0x1_86a0",
920 WriteIntegerToString(static_cast</**/ ::std::int64_t>(-100000), 16,
921 true));
922 EXPECT_EQ("0x0", WriteIntegerToString(static_cast</**/ ::std::int64_t>(0), 16,
923 true));
924 EXPECT_EQ(
925 "0x7fff_ffff_ffff_ffff",
926 WriteIntegerToString(
927 static_cast</**/ ::std::int64_t>(9223372036854775807L), 16, true));
928 }
929
930 // Small helper function for the various WriteFloatToTextStream tests; just sets
931 // up a stream, forwards its arguments to WriteFloatToTextStream, and then
932 // returns the text from the stream.
933 template <typename Arg0, typename... Args>
WriteFloatToString(Arg0 && arg0,Args &&...args)934 ::std::string WriteFloatToString(Arg0 &&arg0, Args &&... args) {
935 TextOutputStream stream;
936 WriteFloatToTextStream(::std::forward<Arg0>(arg0), &stream,
937 ::std::forward<Args>(args)...);
938 return stream.Result();
939 }
940
TEST(WriteFloatToTextStream,RegularNumbers)941 TEST(WriteFloatToTextStream, RegularNumbers) {
942 EXPECT_EQ("0", WriteFloatToString(0.0, TextOutputOptions()));
943 EXPECT_EQ("1", WriteFloatToString(1.0, TextOutputOptions()));
944 EXPECT_EQ("1.5", WriteFloatToString(1.5, TextOutputOptions()));
945 // TODO(bolms): Figure out how to get minimal-length output.
946 EXPECT_EQ("1.6000000000000001", WriteFloatToString(1.6, TextOutputOptions()));
947 EXPECT_EQ("123456789", WriteFloatToString(123456789.0, TextOutputOptions()));
948 EXPECT_EQ("12345678901234568",
949 WriteFloatToString(12345678901234567.0, TextOutputOptions()));
950 EXPECT_EQ("-12345678901234568",
951 WriteFloatToString(-12345678901234567.0, TextOutputOptions()));
952 EXPECT_EQ("-1.2345678901234568e+17",
953 WriteFloatToString(-123456789012345678.0, TextOutputOptions()));
954 EXPECT_EQ("4.9406564584124654e-324",
955 WriteFloatToString(::std::numeric_limits<double>::denorm_min(),
956 TextOutputOptions()));
957 EXPECT_EQ("1.7976931348623157e+308",
958 WriteFloatToString(::std::numeric_limits<double>::max(),
959 TextOutputOptions()));
960
961 EXPECT_EQ("0", WriteFloatToString(0.0f, TextOutputOptions()));
962 EXPECT_EQ("1", WriteFloatToString(1.0f, TextOutputOptions()));
963 EXPECT_EQ("1.5", WriteFloatToString(1.5f, TextOutputOptions()));
964 EXPECT_EQ("1.60000002", WriteFloatToString(1.6f, TextOutputOptions()));
965 EXPECT_EQ("123456792", WriteFloatToString(123456789.0f, TextOutputOptions()));
966 EXPECT_EQ("1.23456784e+16",
967 WriteFloatToString(12345678901234567.0f, TextOutputOptions()));
968 EXPECT_EQ("-1.23456784e+16",
969 WriteFloatToString(-12345678901234567.0f, TextOutputOptions()));
970 EXPECT_EQ("-1.00000003e+16",
971 WriteFloatToString(-10000000000000000.0f, TextOutputOptions()));
972 EXPECT_EQ("1.40129846e-45",
973 WriteFloatToString(::std::numeric_limits<float>::denorm_min(),
974 TextOutputOptions()));
975 EXPECT_EQ("3.40282347e+38",
976 WriteFloatToString(::std::numeric_limits<float>::max(),
977 TextOutputOptions()));
978 }
979
TEST(WriteFloatToTextStream,Infinities)980 TEST(WriteFloatToTextStream, Infinities) {
981 EXPECT_EQ("Inf", WriteFloatToString(2 * ::std::numeric_limits<double>::max(),
982 TextOutputOptions()));
983 EXPECT_EQ("Inf", WriteFloatToString(2 * ::std::numeric_limits<float>::max(),
984 TextOutputOptions()));
985 EXPECT_EQ("-Inf",
986 WriteFloatToString(-2 * ::std::numeric_limits<double>::max(),
987 TextOutputOptions()));
988 EXPECT_EQ("-Inf", WriteFloatToString(-2 * ::std::numeric_limits<float>::max(),
989 TextOutputOptions()));
990 }
991
992 // C++ does not provide great low-level manipulation for NaNs, so we resort to
993 // this mess.
MakeNanDouble(::std::uint64_t payload,int sign)994 double MakeNanDouble(::std::uint64_t payload, int sign) {
995 payload |= 0x7ff0000000000000UL;
996 if (sign < 0) {
997 payload |= 0x8000000000000000UL;
998 }
999 double result;
1000 ::std::memcpy(&result, &payload, sizeof result);
1001 return result;
1002 }
1003
MakeNanFloat(::std::uint32_t payload,int sign)1004 float MakeNanFloat(::std::uint32_t payload, int sign) {
1005 payload |= 0x7f800000U;
1006 if (sign < 0) {
1007 payload |= 0x80000000U;
1008 }
1009 float result;
1010 ::std::memcpy(&result, &payload, sizeof result);
1011 return result;
1012 }
1013
TEST(WriteFloatToTextStream,Nans)1014 TEST(WriteFloatToTextStream, Nans) {
1015 EXPECT_EQ("NaN(0x1)",
1016 WriteFloatToString(MakeNanDouble(1, 0), TextOutputOptions()));
1017 EXPECT_EQ("NaN(0x1)",
1018 WriteFloatToString(MakeNanFloat(1, 0), TextOutputOptions()));
1019 EXPECT_EQ("NaN(0x10000)",
1020 WriteFloatToString(MakeNanDouble(0x10000, 0), TextOutputOptions()));
1021 EXPECT_EQ("NaN(0x7fffff)", WriteFloatToString(MakeNanFloat(0x7fffffU, 0),
1022 TextOutputOptions()));
1023 EXPECT_EQ("NaN(0xfffffffffffff)",
1024 WriteFloatToString(MakeNanDouble(0xfffffffffffffUL, 0),
1025 TextOutputOptions()));
1026 EXPECT_EQ("-NaN(0x7fffff)", WriteFloatToString(MakeNanFloat(0x7fffffU, -1),
1027 TextOutputOptions()));
1028 EXPECT_EQ("-NaN(0xfffffffffffff)",
1029 WriteFloatToString(MakeNanDouble(0xfffffffffffffUL, -1),
1030 TextOutputOptions()));
1031 EXPECT_EQ("NaN(0x10000)",
1032 WriteFloatToString(MakeNanFloat(0x10000, 0), TextOutputOptions()));
1033 EXPECT_EQ("-NaN(0x1)",
1034 WriteFloatToString(MakeNanDouble(1, -1), TextOutputOptions()));
1035 EXPECT_EQ("-NaN(0x1)",
1036 WriteFloatToString(MakeNanFloat(1, -1), TextOutputOptions()));
1037 EXPECT_EQ("-NaN(0x10000)", WriteFloatToString(MakeNanDouble(0x10000, -1),
1038 TextOutputOptions()));
1039 EXPECT_EQ("-NaN(0x10000)",
1040 WriteFloatToString(MakeNanFloat(0x10000, -1), TextOutputOptions()));
1041 EXPECT_EQ("-NaN(0x1_0000)",
1042 WriteFloatToString(MakeNanDouble(0x10000, -1),
1043 TextOutputOptions().WithDigitGrouping(true)));
1044 EXPECT_EQ("-NaN(0x1_0000)",
1045 WriteFloatToString(MakeNanFloat(0x10000, -1),
1046 TextOutputOptions().WithDigitGrouping(true)));
1047 }
1048
TEST(DecodeFloat,RegularNumbers)1049 TEST(DecodeFloat, RegularNumbers) {
1050 double double_result;
1051 EXPECT_TRUE(DecodeFloat("0", &double_result));
1052 EXPECT_EQ(0.0, double_result);
1053 EXPECT_FALSE(::std::signbit(double_result));
1054 EXPECT_TRUE(DecodeFloat("-0", &double_result));
1055 EXPECT_EQ(0.0, double_result);
1056 EXPECT_TRUE(::std::signbit(double_result));
1057 EXPECT_TRUE(DecodeFloat("0.0", &double_result));
1058 EXPECT_EQ(0.0, double_result);
1059 EXPECT_TRUE(DecodeFloat("0.0e100", &double_result));
1060 EXPECT_EQ(0.0, double_result);
1061 EXPECT_TRUE(DecodeFloat("0x0.0p100", &double_result));
1062 EXPECT_EQ(0.0, double_result);
1063 EXPECT_TRUE(DecodeFloat("1", &double_result));
1064 EXPECT_EQ(1.0, double_result);
1065 EXPECT_TRUE(DecodeFloat("1.5", &double_result));
1066 EXPECT_EQ(1.5, double_result);
1067 EXPECT_TRUE(DecodeFloat("1.6", &double_result));
1068 EXPECT_EQ(1.6, double_result);
1069 EXPECT_TRUE(DecodeFloat("1.6000000000000001", &double_result));
1070 EXPECT_EQ(1.6, double_result);
1071 EXPECT_TRUE(DecodeFloat("123456789", &double_result));
1072 EXPECT_EQ(123456789.0, double_result);
1073 EXPECT_TRUE(DecodeFloat("-1.234567890123458e+17", &double_result));
1074 EXPECT_EQ(-1.234567890123458e+17, double_result);
1075 EXPECT_TRUE(DecodeFloat("4.9406564584124654e-324", &double_result));
1076 EXPECT_EQ(4.9406564584124654e-324, double_result);
1077 EXPECT_TRUE(DecodeFloat("1.7976931348623157e+308", &double_result));
1078 EXPECT_EQ(1.7976931348623157e+308, double_result);
1079 EXPECT_TRUE(DecodeFloat(
1080 "000000000000000000000000000004.9406564584124654e-324", &double_result));
1081 EXPECT_EQ(4.9406564584124654e-324, double_result);
1082
1083 float float_result;
1084 EXPECT_TRUE(DecodeFloat("0", &float_result));
1085 EXPECT_EQ(0.0f, float_result);
1086 EXPECT_FALSE(::std::signbit(float_result));
1087 EXPECT_TRUE(DecodeFloat("-0", &float_result));
1088 EXPECT_EQ(0.0f, float_result);
1089 EXPECT_TRUE(::std::signbit(float_result));
1090 EXPECT_TRUE(DecodeFloat("0.0", &float_result));
1091 EXPECT_EQ(0.0f, float_result);
1092 EXPECT_TRUE(DecodeFloat("0.0e100", &float_result));
1093 EXPECT_EQ(0.0f, float_result);
1094 EXPECT_TRUE(DecodeFloat("0x0.0p100", &float_result));
1095 EXPECT_EQ(0.0f, float_result);
1096 EXPECT_TRUE(DecodeFloat("1", &float_result));
1097 EXPECT_EQ(1.0f, float_result);
1098 EXPECT_TRUE(DecodeFloat("1.5", &float_result));
1099 EXPECT_EQ(1.5f, float_result);
1100 EXPECT_TRUE(DecodeFloat("1.6", &float_result));
1101 EXPECT_EQ(1.6f, float_result);
1102 EXPECT_TRUE(DecodeFloat("1.6000000000000001", &float_result));
1103 EXPECT_EQ(1.6f, float_result);
1104 EXPECT_TRUE(DecodeFloat("123456789", &float_result));
1105 EXPECT_EQ(123456789.0f, float_result);
1106 EXPECT_TRUE(DecodeFloat("-1.23456784e+16", &float_result));
1107 EXPECT_EQ(-1.23456784e+16f, float_result);
1108 EXPECT_TRUE(DecodeFloat("1.40129846e-45", &float_result));
1109 EXPECT_EQ(1.40129846e-45f, float_result);
1110 EXPECT_TRUE(DecodeFloat("3.40282347e+38", &float_result));
1111 EXPECT_EQ(3.40282347e+38f, float_result);
1112
1113 // TODO(bolms): "_"-grouped numbers, like "123_456.789", should probably be
1114 // allowed.
1115 }
1116
TEST(DecodeFloat,BadValues)1117 TEST(DecodeFloat, BadValues) {
1118 double result;
1119 float float_result;
1120
1121 // No text is not a value.
1122 EXPECT_FALSE(DecodeFloat("", &result));
1123
1124 // Trailing characters after "Inf" are not allowed.
1125 EXPECT_FALSE(DecodeFloat("INF+", &result));
1126 EXPECT_FALSE(DecodeFloat("Infinity", &result));
1127
1128 // Trailing characters after "NaN" are not allowed.
1129 EXPECT_FALSE(DecodeFloat("NaN(", &result));
1130 EXPECT_FALSE(DecodeFloat("NaN(0]", &result));
1131 EXPECT_FALSE(DecodeFloat("NaNaNaNa", &result));
1132
1133 // Non-number NaN payloads are not allowed.
1134 EXPECT_FALSE(DecodeFloat("NaN()", &result));
1135 EXPECT_FALSE(DecodeFloat("NaN(x)", &result));
1136 EXPECT_FALSE(DecodeFloat("NaN(0x)", &result));
1137
1138 // Negative NaN payloads are not allowed.
1139 EXPECT_FALSE(DecodeFloat("NaN(-1)", &result));
1140 EXPECT_FALSE(DecodeFloat("NaN(-0)", &result));
1141
1142 // NaN with zero payload is infinity, and is thus not allowed.
1143 EXPECT_FALSE(DecodeFloat("NaN(0)", &result));
1144 EXPECT_FALSE(DecodeFloat("-NaN(0)", &result));
1145
1146 // NaN double payloads must be no more than 52 bits.
1147 EXPECT_FALSE(DecodeFloat("NaN(0x10_0000_0000_0000)", &result));
1148 EXPECT_FALSE(DecodeFloat("NaN(0x8000_0000_0000_0000)", &result));
1149 EXPECT_FALSE(DecodeFloat("NaN(0x1_0000_0000_0000_0000)", &result));
1150
1151 // NaN float payloads must be no more than 23 bits.
1152 EXPECT_FALSE(DecodeFloat("NaN(0x80_0000)", &float_result));
1153 EXPECT_FALSE(DecodeFloat("NaN(0x8000_0000)", &float_result));
1154 EXPECT_FALSE(DecodeFloat("NaN(0x1_0000_0000)", &float_result));
1155
1156 // Trailing characters after regular values are not allowed.
1157 EXPECT_FALSE(DecodeFloat("0x", &result));
1158 EXPECT_FALSE(DecodeFloat("0e0a", &result));
1159 EXPECT_FALSE(DecodeFloat("0b0", &result));
1160 EXPECT_FALSE(DecodeFloat("0a", &result));
1161 EXPECT_FALSE(DecodeFloat("1..", &result));
1162
1163 // Grouping characters like "," should not be allowed.
1164 EXPECT_FALSE(DecodeFloat("123,456", &result));
1165 EXPECT_FALSE(DecodeFloat("123'456", &result));
1166 }
1167
TEST(DecodeFloat,Infinities)1168 TEST(DecodeFloat, Infinities) {
1169 double double_result;
1170 EXPECT_TRUE(DecodeFloat("Inf", &double_result));
1171 EXPECT_TRUE(::std::isinf(double_result));
1172 EXPECT_FALSE(::std::signbit(double_result));
1173 EXPECT_TRUE(DecodeFloat("-Inf", &double_result));
1174 EXPECT_TRUE(::std::isinf(double_result));
1175 EXPECT_TRUE(::std::signbit(double_result));
1176 EXPECT_TRUE(DecodeFloat("+Inf", &double_result));
1177 EXPECT_TRUE(::std::isinf(double_result));
1178 EXPECT_FALSE(::std::signbit(double_result));
1179 EXPECT_TRUE(DecodeFloat("iNF", &double_result));
1180 EXPECT_TRUE(::std::isinf(double_result));
1181 EXPECT_FALSE(::std::signbit(double_result));
1182 EXPECT_TRUE(DecodeFloat("-iNF", &double_result));
1183 EXPECT_TRUE(::std::isinf(double_result));
1184 EXPECT_TRUE(::std::signbit(double_result));
1185 EXPECT_TRUE(DecodeFloat("+iNF", &double_result));
1186 EXPECT_TRUE(::std::isinf(double_result));
1187 EXPECT_FALSE(::std::signbit(double_result));
1188 }
1189
1190 // Helper functions for converting NaNs to bit patterns, so that the exact bit
1191 // pattern result can be tested.
DoubleBitPattern(double n)1192 ::std::uint64_t DoubleBitPattern(double n) {
1193 ::std::uint64_t result;
1194 memcpy(&result, &n, sizeof(result));
1195 return result;
1196 }
1197
FloatBitPattern(float n)1198 ::std::uint32_t FloatBitPattern(float n) {
1199 ::std::uint32_t result;
1200 memcpy(&result, &n, sizeof(result));
1201 return result;
1202 }
1203
TEST(DecodeFloat,Nans)1204 TEST(DecodeFloat, Nans) {
1205 double double_result;
1206 EXPECT_TRUE(DecodeFloat("nan", &double_result));
1207 EXPECT_TRUE(::std::isnan(double_result));
1208 EXPECT_FALSE(::std::signbit(double_result));
1209 EXPECT_TRUE(DecodeFloat("-NAN", &double_result));
1210 EXPECT_TRUE(::std::isnan(double_result));
1211 EXPECT_TRUE(::std::signbit(double_result));
1212 EXPECT_TRUE(DecodeFloat("NaN(1)", &double_result));
1213 EXPECT_TRUE(::std::isnan(double_result));
1214 EXPECT_EQ(0x7ff0000000000001UL, DoubleBitPattern(double_result));
1215 EXPECT_TRUE(DecodeFloat("nAn(0x1000)", &double_result));
1216 EXPECT_TRUE(::std::isnan(double_result));
1217 EXPECT_EQ(0x7ff0000000001000UL, DoubleBitPattern(double_result));
1218 EXPECT_TRUE(DecodeFloat("NaN(0b11000011)", &double_result));
1219 EXPECT_TRUE(::std::isnan(double_result));
1220 EXPECT_EQ(0x7ff00000000000c3UL, DoubleBitPattern(double_result));
1221 EXPECT_TRUE(DecodeFloat("-NaN(0b11000011)", &double_result));
1222 EXPECT_TRUE(::std::isnan(double_result));
1223 EXPECT_EQ(0xfff00000000000c3UL, DoubleBitPattern(double_result));
1224 EXPECT_TRUE(DecodeFloat("+NaN(0b11000011)", &double_result));
1225 EXPECT_TRUE(::std::isnan(double_result));
1226 EXPECT_EQ(0x7ff00000000000c3UL, DoubleBitPattern(double_result));
1227 EXPECT_TRUE(DecodeFloat("NaN(0xf_ffff_ffff_ffff)", &double_result));
1228 EXPECT_TRUE(::std::isnan(double_result));
1229 EXPECT_EQ(0x7fffffffffffffffUL, DoubleBitPattern(double_result));
1230 EXPECT_TRUE(DecodeFloat("-NaN(0xf_ffff_ffff_ffff)", &double_result));
1231 EXPECT_TRUE(::std::isnan(double_result));
1232 EXPECT_EQ(0xffffffffffffffffUL, DoubleBitPattern(double_result));
1233
1234 float float_result;
1235 EXPECT_TRUE(DecodeFloat("nan", &float_result));
1236 EXPECT_TRUE(::std::isnan(float_result));
1237 EXPECT_FALSE(::std::signbit(float_result));
1238 EXPECT_TRUE(DecodeFloat("-NAN", &float_result));
1239 EXPECT_TRUE(::std::isnan(float_result));
1240 EXPECT_TRUE(::std::signbit(float_result));
1241 EXPECT_TRUE(DecodeFloat("NaN(1)", &float_result));
1242 EXPECT_TRUE(::std::isnan(float_result));
1243 EXPECT_EQ(0x7f800001U, FloatBitPattern(float_result));
1244 EXPECT_TRUE(DecodeFloat("nAn(0x1000)", &float_result));
1245 EXPECT_TRUE(::std::isnan(float_result));
1246 EXPECT_EQ(0x7f801000U, FloatBitPattern(float_result));
1247 EXPECT_TRUE(DecodeFloat("NaN(0b11000011)", &float_result));
1248 EXPECT_TRUE(::std::isnan(float_result));
1249 EXPECT_EQ(0x7f8000c3U, FloatBitPattern(float_result));
1250 EXPECT_TRUE(DecodeFloat("-NaN(0b11000011)", &float_result));
1251 EXPECT_TRUE(::std::isnan(float_result));
1252 EXPECT_EQ(0xff8000c3U, FloatBitPattern(float_result));
1253 EXPECT_TRUE(DecodeFloat("+NaN(0b11000011)", &float_result));
1254 EXPECT_TRUE(::std::isnan(float_result));
1255 EXPECT_EQ(0x7f8000c3U, FloatBitPattern(float_result));
1256 EXPECT_TRUE(DecodeFloat("NaN(0x7f_ffff)", &float_result));
1257 EXPECT_TRUE(::std::isnan(float_result));
1258 EXPECT_EQ(0x7fffffffU, FloatBitPattern(float_result));
1259 EXPECT_TRUE(DecodeFloat("-NaN(0x7f_ffff)", &float_result));
1260 EXPECT_TRUE(::std::isnan(float_result));
1261 EXPECT_EQ(0xffffffffU, FloatBitPattern(float_result));
1262 }
1263
1264 } // namespace test
1265 } // namespace support
1266 } // namespace emboss
1267