| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/strings/string_number_conversions.h" | 5 #include "base/strings/string_number_conversions.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <stddef.h> |
| 8 #include <stdint.h> | 9 #include <stdint.h> |
| 9 #include <stdio.h> | 10 #include <stdio.h> |
| 10 | 11 |
| 11 #include <cmath> | 12 #include <cmath> |
| 12 #include <limits> | 13 #include <limits> |
| 13 | 14 |
| 14 #include "base/format_macros.h" | 15 #include "base/format_macros.h" |
| 16 #include "base/macros.h" |
| 15 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 20 |
| 19 namespace base { | 21 namespace base { |
| 20 | 22 |
| 21 namespace { | 23 namespace { |
| 22 | 24 |
| 23 template <typename INT> | 25 template <typename INT> |
| 24 struct IntToStringTest { | 26 struct IntToStringTest { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 const IntToStringTest<int64_t>* test = &int64_tests[i]; | 60 const IntToStringTest<int64_t>* test = &int64_tests[i]; |
| 59 EXPECT_EQ(Int64ToString(test->num), test->sexpected); | 61 EXPECT_EQ(Int64ToString(test->num), test->sexpected); |
| 60 EXPECT_EQ(Int64ToString16(test->num), UTF8ToUTF16(test->sexpected)); | 62 EXPECT_EQ(Int64ToString16(test->num), UTF8ToUTF16(test->sexpected)); |
| 61 EXPECT_EQ(Uint64ToString(test->num), test->uexpected); | 63 EXPECT_EQ(Uint64ToString(test->num), test->uexpected); |
| 62 EXPECT_EQ(Uint64ToString16(test->num), UTF8ToUTF16(test->uexpected)); | 64 EXPECT_EQ(Uint64ToString16(test->num), UTF8ToUTF16(test->uexpected)); |
| 63 } | 65 } |
| 64 } | 66 } |
| 65 | 67 |
| 66 TEST(StringNumberConversionsTest, Uint64ToString) { | 68 TEST(StringNumberConversionsTest, Uint64ToString) { |
| 67 static const struct { | 69 static const struct { |
| 68 uint64 input; | 70 uint64_t input; |
| 69 std::string output; | 71 std::string output; |
| 70 } cases[] = { | 72 } cases[] = { |
| 71 {0, "0"}, | 73 {0, "0"}, |
| 72 {42, "42"}, | 74 {42, "42"}, |
| 73 {INT_MAX, "2147483647"}, | 75 {INT_MAX, "2147483647"}, |
| 74 {std::numeric_limits<uint64_t>::max(), "18446744073709551615"}, | 76 {std::numeric_limits<uint64_t>::max(), "18446744073709551615"}, |
| 75 }; | 77 }; |
| 76 | 78 |
| 77 for (size_t i = 0; i < arraysize(cases); ++i) | 79 for (size_t i = 0; i < arraysize(cases); ++i) |
| 78 EXPECT_EQ(cases[i].output, Uint64ToString(cases[i].input)); | 80 EXPECT_EQ(cases[i].output, Uint64ToString(cases[i].input)); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 | 291 |
| 290 string16 utf16_input = UTF8ToUTF16(input_string); | 292 string16 utf16_input = UTF8ToUTF16(input_string); |
| 291 output = 0; | 293 output = 0; |
| 292 EXPECT_FALSE(StringToInt64(utf16_input, &output)); | 294 EXPECT_FALSE(StringToInt64(utf16_input, &output)); |
| 293 EXPECT_EQ(6, output); | 295 EXPECT_EQ(6, output); |
| 294 } | 296 } |
| 295 | 297 |
| 296 TEST(StringNumberConversionsTest, StringToUint64) { | 298 TEST(StringNumberConversionsTest, StringToUint64) { |
| 297 static const struct { | 299 static const struct { |
| 298 std::string input; | 300 std::string input; |
| 299 uint64 output; | 301 uint64_t output; |
| 300 bool success; | 302 bool success; |
| 301 } cases[] = { | 303 } cases[] = { |
| 302 {"0", 0, true}, | 304 {"0", 0, true}, |
| 303 {"42", 42, true}, | 305 {"42", 42, true}, |
| 304 {"-2147483648", 0, false}, | 306 {"-2147483648", 0, false}, |
| 305 {"2147483647", INT_MAX, true}, | 307 {"2147483647", INT_MAX, true}, |
| 306 {"-2147483649", 0, false}, | 308 {"-2147483649", 0, false}, |
| 307 {"-99999999999", 0, false}, | 309 {"-99999999999", 0, false}, |
| 308 {"2147483648", UINT64_C(2147483648), true}, | 310 {"2147483648", UINT64_C(2147483648), true}, |
| 309 {"99999999999", UINT64_C(99999999999), true}, | 311 {"99999999999", UINT64_C(99999999999), true}, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 328 {"-", 0, false}, | 330 {"-", 0, false}, |
| 329 {"-9223372036854775809", 0, false}, | 331 {"-9223372036854775809", 0, false}, |
| 330 {"-99999999999999999999", 0, false}, | 332 {"-99999999999999999999", 0, false}, |
| 331 {"9223372036854775808", UINT64_C(9223372036854775808), true}, | 333 {"9223372036854775808", UINT64_C(9223372036854775808), true}, |
| 332 {"99999999999999999999", std::numeric_limits<uint64_t>::max(), false}, | 334 {"99999999999999999999", std::numeric_limits<uint64_t>::max(), false}, |
| 333 {"18446744073709551615", std::numeric_limits<uint64_t>::max(), true}, | 335 {"18446744073709551615", std::numeric_limits<uint64_t>::max(), true}, |
| 334 {"18446744073709551616", std::numeric_limits<uint64_t>::max(), false}, | 336 {"18446744073709551616", std::numeric_limits<uint64_t>::max(), false}, |
| 335 }; | 337 }; |
| 336 | 338 |
| 337 for (size_t i = 0; i < arraysize(cases); ++i) { | 339 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 338 uint64 output = 0; | 340 uint64_t output = 0; |
| 339 EXPECT_EQ(cases[i].success, StringToUint64(cases[i].input, &output)); | 341 EXPECT_EQ(cases[i].success, StringToUint64(cases[i].input, &output)); |
| 340 EXPECT_EQ(cases[i].output, output); | 342 EXPECT_EQ(cases[i].output, output); |
| 341 | 343 |
| 342 string16 utf16_input = UTF8ToUTF16(cases[i].input); | 344 string16 utf16_input = UTF8ToUTF16(cases[i].input); |
| 343 output = 0; | 345 output = 0; |
| 344 EXPECT_EQ(cases[i].success, StringToUint64(utf16_input, &output)); | 346 EXPECT_EQ(cases[i].success, StringToUint64(utf16_input, &output)); |
| 345 EXPECT_EQ(cases[i].output, output); | 347 EXPECT_EQ(cases[i].output, output); |
| 346 } | 348 } |
| 347 | 349 |
| 348 // One additional test to verify that conversion of numbers in strings with | 350 // One additional test to verify that conversion of numbers in strings with |
| 349 // embedded NUL characters. The NUL and extra data after it should be | 351 // embedded NUL characters. The NUL and extra data after it should be |
| 350 // interpreted as junk after the number. | 352 // interpreted as junk after the number. |
| 351 const char input[] = "6\06"; | 353 const char input[] = "6\06"; |
| 352 std::string input_string(input, arraysize(input) - 1); | 354 std::string input_string(input, arraysize(input) - 1); |
| 353 uint64 output; | 355 uint64_t output; |
| 354 EXPECT_FALSE(StringToUint64(input_string, &output)); | 356 EXPECT_FALSE(StringToUint64(input_string, &output)); |
| 355 EXPECT_EQ(6U, output); | 357 EXPECT_EQ(6U, output); |
| 356 | 358 |
| 357 string16 utf16_input = UTF8ToUTF16(input_string); | 359 string16 utf16_input = UTF8ToUTF16(input_string); |
| 358 output = 0; | 360 output = 0; |
| 359 EXPECT_FALSE(StringToUint64(utf16_input, &output)); | 361 EXPECT_FALSE(StringToUint64(utf16_input, &output)); |
| 360 EXPECT_EQ(6U, output); | 362 EXPECT_EQ(6U, output); |
| 361 } | 363 } |
| 362 | 364 |
| 363 TEST(StringNumberConversionsTest, StringToSizeT) { | 365 TEST(StringNumberConversionsTest, StringToSizeT) { |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 const char input[] = "0xc0ffee\0" "9"; | 603 const char input[] = "0xc0ffee\0" "9"; |
| 602 std::string input_string(input, arraysize(input) - 1); | 604 std::string input_string(input, arraysize(input) - 1); |
| 603 int64_t output; | 605 int64_t output; |
| 604 EXPECT_FALSE(HexStringToInt64(input_string, &output)); | 606 EXPECT_FALSE(HexStringToInt64(input_string, &output)); |
| 605 EXPECT_EQ(0xc0ffee, output); | 607 EXPECT_EQ(0xc0ffee, output); |
| 606 } | 608 } |
| 607 | 609 |
| 608 TEST(StringNumberConversionsTest, HexStringToUInt64) { | 610 TEST(StringNumberConversionsTest, HexStringToUInt64) { |
| 609 static const struct { | 611 static const struct { |
| 610 std::string input; | 612 std::string input; |
| 611 uint64 output; | 613 uint64_t output; |
| 612 bool success; | 614 bool success; |
| 613 } cases[] = { | 615 } cases[] = { |
| 614 {"0", 0, true}, | 616 {"0", 0, true}, |
| 615 {"42", 66, true}, | 617 {"42", 66, true}, |
| 616 {"-42", 0, false}, | 618 {"-42", 0, false}, |
| 617 {"+42", 66, true}, | 619 {"+42", 66, true}, |
| 618 {"40acd88557b", INT64_C(4444444448123), true}, | 620 {"40acd88557b", INT64_C(4444444448123), true}, |
| 619 {"7fffffff", INT_MAX, true}, | 621 {"7fffffff", INT_MAX, true}, |
| 620 {"-80000000", 0, false}, | 622 {"-80000000", 0, false}, |
| 621 {"ffffffff", 0xffffffff, true}, | 623 {"ffffffff", 0xffffffff, true}, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 647 {"45:", 0x45, false}, | 649 {"45:", 0x45, false}, |
| 648 {"efgh", 0xef, false}, | 650 {"efgh", 0xef, false}, |
| 649 {"0xefgh", 0xef, false}, | 651 {"0xefgh", 0xef, false}, |
| 650 {"hgfe", 0, false}, | 652 {"hgfe", 0, false}, |
| 651 {"-", 0, false}, | 653 {"-", 0, false}, |
| 652 {"", 0, false}, | 654 {"", 0, false}, |
| 653 {"0x", 0, false}, | 655 {"0x", 0, false}, |
| 654 }; | 656 }; |
| 655 | 657 |
| 656 for (size_t i = 0; i < arraysize(cases); ++i) { | 658 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 657 uint64 output = 0; | 659 uint64_t output = 0; |
| 658 EXPECT_EQ(cases[i].success, HexStringToUInt64(cases[i].input, &output)); | 660 EXPECT_EQ(cases[i].success, HexStringToUInt64(cases[i].input, &output)); |
| 659 EXPECT_EQ(cases[i].output, output); | 661 EXPECT_EQ(cases[i].output, output); |
| 660 } | 662 } |
| 661 // One additional test to verify that conversion of numbers in strings with | 663 // One additional test to verify that conversion of numbers in strings with |
| 662 // embedded NUL characters. The NUL and extra data after it should be | 664 // embedded NUL characters. The NUL and extra data after it should be |
| 663 // interpreted as junk after the number. | 665 // interpreted as junk after the number. |
| 664 const char input[] = "0xc0ffee\0" "9"; | 666 const char input[] = "0xc0ffee\0" "9"; |
| 665 std::string input_string(input, arraysize(input) - 1); | 667 std::string input_string(input, arraysize(input) - 1); |
| 666 uint64 output; | 668 uint64_t output; |
| 667 EXPECT_FALSE(HexStringToUInt64(input_string, &output)); | 669 EXPECT_FALSE(HexStringToUInt64(input_string, &output)); |
| 668 EXPECT_EQ(0xc0ffeeU, output); | 670 EXPECT_EQ(0xc0ffeeU, output); |
| 669 } | 671 } |
| 670 | 672 |
| 671 TEST(StringNumberConversionsTest, HexStringToBytes) { | 673 TEST(StringNumberConversionsTest, HexStringToBytes) { |
| 672 static const struct { | 674 static const struct { |
| 673 const std::string input; | 675 const std::string input; |
| 674 const char* output; | 676 const char* output; |
| 675 size_t output_len; | 677 size_t output_len; |
| 676 bool success; | 678 bool success; |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 | 797 |
| 796 TEST(StringNumberConversionsTest, HexEncode) { | 798 TEST(StringNumberConversionsTest, HexEncode) { |
| 797 std::string hex(HexEncode(NULL, 0)); | 799 std::string hex(HexEncode(NULL, 0)); |
| 798 EXPECT_EQ(hex.length(), 0U); | 800 EXPECT_EQ(hex.length(), 0U); |
| 799 unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81}; | 801 unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81}; |
| 800 hex = HexEncode(bytes, sizeof(bytes)); | 802 hex = HexEncode(bytes, sizeof(bytes)); |
| 801 EXPECT_EQ(hex.compare("01FF02FE038081"), 0); | 803 EXPECT_EQ(hex.compare("01FF02FE038081"), 0); |
| 802 } | 804 } |
| 803 | 805 |
| 804 } // namespace base | 806 } // namespace base |
| OLD | NEW |