13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be 33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file. 43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <math.h> 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <limits> 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "testing/gtest/include/gtest/gtest.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace base { 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace { 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricktemplate <typename INT> 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct IntToStringTest { 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick INT num; 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char* sexpected; 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char* uexpected; 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}; 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} // namespace 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, IntToString) { 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const IntToStringTest<int> int_tests[] = { 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { 0, "0", "0" }, 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { -1, "-1", "4294967295" }, 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { std::numeric_limits<int>::max(), "2147483647", "2147483647" }, 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { std::numeric_limits<int>::min(), "-2147483648", "2147483648" }, 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const IntToStringTest<int64> int64_tests[] = { 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { 0, "0", "0" }, 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { -1, "-1", "18446744073709551615" }, 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { std::numeric_limits<int64>::max(), 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "9223372036854775807", 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "9223372036854775807", }, 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick { std::numeric_limits<int64>::min(), 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "-9223372036854775808", 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "9223372036854775808" }, 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < arraysize(int_tests); ++i) { 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const IntToStringTest<int>* test = &int_tests[i]; 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(IntToString(test->num), test->sexpected); 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(IntToString16(test->num), UTF8ToUTF16(test->sexpected)); 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(UintToString(test->num), test->uexpected); 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(UintToString16(test->num), UTF8ToUTF16(test->uexpected)); 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < arraysize(int64_tests); ++i) { 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const IntToStringTest<int64>* test = &int64_tests[i]; 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(Int64ToString(test->num), test->sexpected); 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(Int64ToString16(test->num), UTF8ToUTF16(test->sexpected)); 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(Uint64ToString(test->num), test->uexpected); 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(Uint64ToString16(test->num), UTF8ToUTF16(test->uexpected)); 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, Uint64ToString) { 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const struct { 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick uint64 input; 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string output; 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } cases[] = { 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {0, "0"}, 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {42, "42"}, 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {INT_MAX, "2147483647"}, 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {kuint64max, "18446744073709551615"}, 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].output, Uint64ToString(cases[i].input)); 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, StringToInt) { 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const struct { 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input; 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int output; 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool success; 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } cases[] = { 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0", 0, true}, 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42", 42, true}, 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch {"42\x99", 42, false}, 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch {"\x99" "42\x99", 0, false}, 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-2147483648", INT_MIN, true}, 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"2147483647", INT_MAX, true}, 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"", 0, false}, 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {" 42", 42, false}, 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42 ", 42, false}, 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"\t\n\v\f\r 42", 42, false}, 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"blah42", 0, false}, 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42blah", 42, false}, 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"blah42blah", 0, false}, 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-273.15", -273, false}, 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+98.6", 98, false}, 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"--123", 0, false}, 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"++123", 0, false}, 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-+123", 0, false}, 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+-123", 0, false}, 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-", 0, false}, 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-2147483649", INT_MIN, false}, 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-99999999999", INT_MIN, false}, 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"2147483648", INT_MAX, false}, 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"99999999999", INT_MAX, false}, 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char* ascii_chars = cases[i].input.c_str(); 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int output = 0; 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].success, StringToInt(cases[i].input, &output)); 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].output, output); 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt(cases[i].input.begin(), 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cases[i].input.end(), 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt( 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ascii_chars, ascii_chars + cases[i].input.length(), &output)); 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 utf16_input = UTF8ToUTF16(cases[i].input); 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char16* utf16_chars = utf16_input.c_str(); 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].success, StringToInt(utf16_input, &output)); 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].output, output); 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt(utf16_input.begin(), 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick utf16_input.end(), 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt( 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick utf16_chars, utf16_chars + utf16_input.length(), &output)); 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // One additional test to verify that conversion of numbers in strings with 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // embedded NUL characters. The NUL and extra data after it should be 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // interpreted as junk after the number. 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char input[] = "6\06"; 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input_string(input, arraysize(input) - 1); 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int output; 1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(StringToInt(input_string, &output)); 1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(6, output); 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt(input_string.begin(), input_string.end(), &output)); 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt(input, input + arraysize(input), &output)); 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 utf16_input = UTF8ToUTF16(input_string); 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char16* utf16_chars = utf16_input.c_str(); 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(StringToInt(utf16_input, &output)); 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(6, output); 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt(utf16_input.begin(), utf16_input.end(), &output)); 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt(utf16_chars, 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick utf16_chars + utf16_input.length(), 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch output = 0; 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char16 negative_wide_input[] = { 0xFF4D, '4', '2', 0}; 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_FALSE(StringToInt(string16(negative_wide_input), &output)); 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(0, output); 1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, StringToInt64) { 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const struct { 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input; 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int64 output; 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool success; 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } cases[] = { 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0", 0, true}, 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42", 42, true}, 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-2147483648", INT_MIN, true}, 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"2147483647", INT_MAX, true}, 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-2147483649", GG_INT64_C(-2147483649), true}, 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-99999999999", GG_INT64_C(-99999999999), true}, 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"2147483648", GG_INT64_C(2147483648), true}, 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"99999999999", GG_INT64_C(99999999999), true}, 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"9223372036854775807", kint64max, true}, 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-9223372036854775808", kint64min, true}, 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"09", 9, true}, 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-09", -9, true}, 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"", 0, false}, 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {" 42", 42, false}, 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42 ", 42, false}, 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"0x42", 0, false}, 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"\t\n\v\f\r 42", 42, false}, 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"blah42", 0, false}, 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42blah", 42, false}, 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"blah42blah", 0, false}, 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-273.15", -273, false}, 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+98.6", 98, false}, 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"--123", 0, false}, 2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"++123", 0, false}, 2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-+123", 0, false}, 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+-123", 0, false}, 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-", 0, false}, 2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-9223372036854775809", kint64min, false}, 2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-99999999999999999999", kint64min, false}, 2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"9223372036854775808", kint64max, false}, 2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"99999999999999999999", kint64max, false}, 2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char* ascii_chars = cases[i].input.c_str(); 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int64 output = 0; 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].success, StringToInt64(cases[i].input, &output)); 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].output, output); 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt64(cases[i].input.begin(), 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cases[i].input.end(), 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt64( 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ascii_chars, ascii_chars + cases[i].input.length(), &output)); 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 utf16_input = UTF8ToUTF16(cases[i].input); 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char16* utf16_chars = utf16_input.c_str(); 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].success, StringToInt64(utf16_input, &output)); 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].output, output); 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt64(utf16_input.begin(), 234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick utf16_input.end(), 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, StringToInt64( 239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick utf16_chars, utf16_chars + utf16_input.length(), &output)); 240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // One additional test to verify that conversion of numbers in strings with 2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // embedded NUL characters. The NUL and extra data after it should be 2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // interpreted as junk after the number. 2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char input[] = "6\06"; 2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input_string(input, arraysize(input) - 1); 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int64 output; 2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(StringToInt64(input_string, &output)); 2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(6, output); 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt64(input_string.begin(), 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick input_string.end(), 254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt64(input, input + arraysize(input), &output)); 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 utf16_input = UTF8ToUTF16(input_string); 261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char16* utf16_chars = utf16_input.c_str(); 262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(StringToInt64(utf16_input, &output)); 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(6, output); 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt64(utf16_input.begin(), utf16_input.end(), &output)); 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(StringToInt64(utf16_chars, 270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick utf16_chars + utf16_input.length(), 271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(6, output); 2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, HexStringToInt) { 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const struct { 2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input; 2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int output; 2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool success; 2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } cases[] = { 2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0", 0, true}, 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42", 66, true}, 2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-42", -66, true}, 2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+42", 66, true}, 2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"7fffffff", INT_MAX, true}, 2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"80000000", INT_MIN, true}, 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"ffffffff", -1, true}, 2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"DeadBeef", 0xdeadbeef, true}, 2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0x42", 66, true}, 2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-0x42", -66, true}, 2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+0x42", 66, true}, 2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0x7fffffff", INT_MAX, true}, 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0x80000000", INT_MIN, true}, 2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0xffffffff", -1, true}, 2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0XDeadBeef", 0xdeadbeef, true}, 2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0x0f", 15, true}, 2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0f", 15, true}, 2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {" 45", 0x45, false}, 2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"\t\n\v\f\r 0x45", 0x45, false}, 3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {" 45", 0x45, false}, 3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"45 ", 0x45, false}, 302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"45:", 0x45, false}, 3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"efgh", 0xef, false}, 3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0xefgh", 0xef, false}, 3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"hgfe", 0, false}, 3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"100000000", -1, false}, // don't care about |output|, just |success| 3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-", 0, false}, 3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"", 0, false}, 3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const char* ascii_chars = cases[i].input.c_str(); 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int output = 0; 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].success, HexStringToInt(cases[i].input, &output)); 3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].output, output); 316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, HexStringToInt(cases[i].input.begin(), 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cases[i].input.end(), 319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].success, HexStringToInt( 323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ascii_chars, ascii_chars + cases[i].input.length(), &output)); 324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(cases[i].output, output); 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // One additional test to verify that conversion of numbers in strings with 3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // embedded NUL characters. The NUL and extra data after it should be 3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // interpreted as junk after the number. 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char input[] = "0xc0ffee\09"; 3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input_string(input, arraysize(input) - 1); 3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int output; 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(HexStringToInt(input_string, &output)); 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(0xc0ffee, output); 334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(HexStringToInt(input_string.begin(), 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick input_string.end(), 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output)); 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0xc0ffee, output); 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output = 0; 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(HexStringToInt(input, input + arraysize(input), &output)); 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0xc0ffee, output); 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, HexStringToBytes) { 3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const struct { 3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string input; 3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char* output; 3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick size_t output_len; 3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool success; 3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } cases[] = { 3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0", "", 0, false}, // odd number of characters fails 3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"00", "\0", 1, true}, 3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42", "\x42", 1, true}, 3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-42", "", 0, false}, // any non-hex value fails 3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+42", "", 0, false}, 3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"7fffffff", "\x7f\xff\xff\xff", 4, true}, 3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"80000000", "\x80\0\0\0", 4, true}, 3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"deadbeef", "\xde\xad\xbe\xef", 4, true}, 3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"DeadBeef", "\xde\xad\xbe\xef", 4, true}, 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0x42", "", 0, false}, // leading 0x fails (x is not hex) 3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0f", "\xf", 1, true}, 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"45 ", "\x45", 1, false}, 3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"efgh", "\xef", 1, false}, 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"", "", 0, false}, 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0123456789ABCDEF", "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 8, true}, 3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0123456789ABCDEF012345", 3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick "\x01\x23\x45\x67\x89\xAB\xCD\xEF\x01\x23\x45", 11, true}, 3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<uint8> output; 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::vector<uint8> compare; 3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].success, HexStringToBytes(cases[i].input, &output)) << 3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick i << ": " << cases[i].input; 3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t j = 0; j < cases[i].output_len; ++j) 3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick compare.push_back(static_cast<uint8>(cases[i].output[j])); 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_EQ(output.size(), compare.size()) << i << ": " << cases[i].input; 3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(std::equal(output.begin(), output.end(), compare.begin())) << 3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick i << ": " << cases[i].input; 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, StringToDouble) { 3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const struct { 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input; 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick double output; 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool success; 3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } cases[] = { 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"0", 0.0, true}, 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"42", 42.0, true}, 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-42", -42.0, true}, 3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"123.45", 123.45, true}, 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-123.45", -123.45, true}, 3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+123.45", 123.45, true}, 3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"2.99792458e8", 299792458.0, true}, 3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"149597870.691E+3", 149597870691.0, true}, 3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"6.", 6.0, true}, 3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"9e99999999999999999999", HUGE_VAL, false}, 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-9e99999999999999999999", -HUGE_VAL, false}, 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"1e-2", 0.01, true}, 402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick {"42 ", 42.0, false}, 4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {" 1e-2", 0.01, false}, 4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"1e-2 ", 0.01, false}, 4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-1E-7", -0.0000001, true}, 4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"01e02", 100, true}, 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"2.3e15", 2.3e15, true}, 4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"\t\n\v\f\r -123.45e2", -12345.0, false}, 4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+123 e4", 123.0, false}, 4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"123e ", 123.0, false}, 4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"123e", 123.0, false}, 4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {" 2.99", 2.99, false}, 4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"1e3.4", 1000.0, false}, 4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"nothing", 0.0, false}, 4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"-", 0.0, false}, 4163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"+", 0.0, false}, 4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick {"", 0.0, false}, 4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick }; 4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) { 4213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick double output; 4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(cases[i].success, StringToDouble(cases[i].input, &output)); 4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_DOUBLE_EQ(cases[i].output, output); 4243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 4253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // One additional test to verify that conversion of numbers in strings with 4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // embedded NUL characters. The NUL and extra data after it should be 4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // interpreted as junk after the number. 4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const char input[] = "3.14\0159"; 4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string input_string(input, arraysize(input) - 1); 4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick double output; 4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_FALSE(StringToDouble(input_string, &output)); 4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_DOUBLE_EQ(3.14, output); 4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(StringNumberConversionsTest, HexEncode) { 4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string hex(HexEncode(NULL, 0)); 4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(hex.length(), 0U); 4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81}; 4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick hex = HexEncode(bytes, sizeof(bytes)); 4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(hex.compare("01FF02FE038081"), 0); 4423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} // namespace base 445