Chromium Code Reviews| Index: util/stdlib/string_number_conversion_test.cc |
| diff --git a/util/stdlib/string_number_conversion_test.cc b/util/stdlib/string_number_conversion_test.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ef1376c76700dce3595cdbfeca728d7f9780a4d7 |
| --- /dev/null |
| +++ b/util/stdlib/string_number_conversion_test.cc |
| @@ -0,0 +1,218 @@ |
| +// Copyright 2014 The Crashpad Authors. All rights reserved. |
| +// |
| +// Licensed under the Apache License, Version 2.0 (the "License"); |
| +// you may not use this file except in compliance with the License. |
| +// You may obtain a copy of the License at |
| +// |
| +// http://www.apache.org/licenses/LICENSE-2.0 |
| +// |
| +// Unless required by applicable law or agreed to in writing, software |
| +// distributed under the License is distributed on an "AS IS" BASIS, |
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| +// See the License for the specific language governing permissions and |
| +// limitations under the License. |
| + |
| +#include "util/stdlib/string_number_conversion.h" |
| + |
| +#include "base/basictypes.h" |
| +#include "gtest/gtest.h" |
| + |
| +#include <limits> |
| + |
| +namespace { |
| + |
| +using namespace crashpad; |
| + |
| +TEST(StringNumberConversion, StringToInt) { |
| + const struct { |
| + const char* string; |
| + bool valid; |
| + int value; |
| + } kTestData[] = { |
| + {"", false, 0}, |
| + {"0", true, 0}, |
| + {"1", true, 1}, |
| + {"2147483647", true, std::numeric_limits<int>::max()}, |
|
Robert Sesek
2014/09/10 16:56:54
This is going to fail on your ILP64 SPARC build...
|
| + {"2147483648", false, 0}, |
| + {"4294967295", false, 0}, |
| + {"4294967296", false, 0}, |
| + {"-1", true, -1}, |
| + {"-2147483648", true, std::numeric_limits<int>::min()}, |
| + {"-2147483649", false, 0}, |
| + {"00", true, 0}, |
| + {"01", true, 1}, |
| + {"-01", true, -1}, |
| + {"+2", true, 2}, |
| + {"0x10", true, 16}, |
| + {"-0x10", true, -16}, |
| + {"+0x20", true, 32}, |
| + {"0xf", true, 15}, |
| + {"0xg", false, 0}, |
| + {"0x7fffffff", true, std::numeric_limits<int>::max()}, |
| + {"0x7FfFfFfF", true, std::numeric_limits<int>::max()}, |
| + {"0x80000000", false, 0}, |
| + {"0xFFFFFFFF", false, 0}, |
| + {"-0x7fffffff", true, -2147483647}, |
| + {"-0x80000000", true, -2147483648}, |
| + {"-0x80000001", false, 0}, |
| + {"-0xffffffff", false, 0}, |
| + {"0x100000000", false, 0}, |
| + {"0xabcdef", true, 11259375}, |
| + {"010", true, 8}, |
| + {"-010", true, -8}, |
| + {"+020", true, 16}, |
| + {"07", true, 7}, |
| + {"08", false, 0}, |
| + {" 0", false, 0}, |
| + {"0 ", false, 0}, |
| + {" 0 ", false, 0}, |
| + {" 1", false, 0}, |
| + {"1 ", false, 0}, |
| + {" 1 ", false, 0}, |
| + {"a2", false, 0}, |
| + {"2a", false, 0}, |
| + {"2a2", false, 0}, |
| + {".0", false, 0}, |
| + {".1", false, 0}, |
| + {"-.2", false, 0}, |
| + {"+.3", false, 0}, |
| + {"1.23", false, 0}, |
| + {"-273.15", false, 0}, |
| + {"+98.6", false, 0}, |
| + {"1e1", false, 0}, |
| + {"1E1", false, 0}, |
| + {"0x123p4", false, 0}, |
| + {"infinity", false, 0}, |
| + {"NaN", false, 0}, |
| + {"-9223372036854775810", false, 0}, |
| + {"-9223372036854775809", false, 0}, |
| + {"9223372036854775808", false, 0}, |
| + {"9223372036854775809", false, 0}, |
| + {"18446744073709551615", false, 0}, |
| + {"18446744073709551616", false, 0}, |
| + }; |
| + |
| + for (size_t index = 0; index < arraysize(kTestData); ++index) { |
| + int value; |
| + bool valid = StringToNumber(kTestData[index].string, &value); |
| + if (kTestData[index].valid) { |
| + EXPECT_TRUE(valid) << "index " << index << ", string " |
| + << kTestData[index].string; |
| + if (valid) { |
| + EXPECT_EQ(kTestData[index].value, value) |
| + << "index " << index << ", string " << kTestData[index].string; |
| + } |
| + } else { |
| + EXPECT_FALSE(valid) << "index " << index << ", string " |
| + << kTestData[index].string << ", value " << value; |
| + } |
| + } |
| + |
| + // Ensure that embedded NUL characters are treated as bad input. |
| + const char input[] = "6\0006"; |
| + base::StringPiece input_string(input, arraysize(input) - 1); |
| + int output; |
| + EXPECT_FALSE(StringToNumber(input_string, &output)); |
| + |
| + // Ensure that a NUL is not required at the end of the string. |
| + EXPECT_TRUE(StringToNumber(base::StringPiece("66", 1), &output)); |
| + EXPECT_EQ(6, output); |
| +} |
| + |
| +TEST(StringNumberConversion, StringToUnsignedInt) { |
| + const struct { |
| + const char* string; |
| + bool valid; |
| + unsigned int value; |
| + } kTestData[] = { |
| + {"", false, 0}, |
| + {"0", true, 0}, |
| + {"1", true, 1}, |
| + {"2147483647", true, 2147483647}, |
| + {"2147483648", true, 2147483648}, |
| + {"4294967295", true, std::numeric_limits<unsigned int>::max()}, |
| + {"4294967296", false, 0}, |
| + {"-1", false, 0}, |
| + {"-2147483648", false, 0}, |
| + {"-2147483649", false, 0}, |
| + {"00", true, 0}, |
| + {"01", true, 1}, |
| + {"-01", false, 0}, |
| + {"+2", true, 2}, |
| + {"0x10", true, 16}, |
| + {"-0x10", false, 0}, |
| + {"+0x20", true, 32}, |
| + {"0xf", true, 15}, |
| + {"0xg", false, 0}, |
| + {"0x7fffffff", true, 0x7fffffff}, |
| + {"0x7FfFfFfF", true, 0x7fffffff}, |
| + {"0x80000000", true, 0x80000000}, |
| + {"0xFFFFFFFF", true, 0xffffffff}, |
| + {"-0x7fffffff", false, 0}, |
| + {"-0x80000000", false, 0}, |
| + {"-0x80000001", false, 0}, |
| + {"-0xffffffff", false, 0}, |
| + {"0x100000000", false, 0}, |
| + {"0xabcdef", true, 11259375}, |
| + {"010", true, 8}, |
| + {"-010", false, 0}, |
| + {"+020", true, 16}, |
| + {"07", true, 7}, |
| + {"08", false, 0}, |
| + {" 0", false, 0}, |
| + {"0 ", false, 0}, |
| + {" 0 ", false, 0}, |
| + {" 1", false, 0}, |
| + {"1 ", false, 0}, |
| + {" 1 ", false, 0}, |
| + {"a2", false, 0}, |
| + {"2a", false, 0}, |
| + {"2a2", false, 0}, |
| + {".0", false, 0}, |
| + {".1", false, 0}, |
| + {"-.2", false, 0}, |
| + {"+.3", false, 0}, |
| + {"1.23", false, 0}, |
| + {"-273.15", false, 0}, |
| + {"+98.6", false, 0}, |
| + {"1e1", false, 0}, |
| + {"1E1", false, 0}, |
| + {"0x123p4", false, 0}, |
| + {"infinity", false, 0}, |
| + {"NaN", false, 0}, |
| + {"-9223372036854775810", false, 0}, |
| + {"-9223372036854775809", false, 0}, |
| + {"9223372036854775808", false, 0}, |
| + {"9223372036854775809", false, 0}, |
| + {"18446744073709551615", false, 0}, |
| + {"18446744073709551616", false, 0}, |
| + }; |
| + |
| + for (size_t index = 0; index < arraysize(kTestData); ++index) { |
| + unsigned int value; |
| + bool valid = StringToNumber(kTestData[index].string, &value); |
| + if (kTestData[index].valid) { |
| + EXPECT_TRUE(valid) << "index " << index << ", string " |
| + << kTestData[index].string; |
| + if (valid) { |
| + EXPECT_EQ(kTestData[index].value, value) |
| + << "index " << index << ", string " << kTestData[index].string; |
| + } |
| + } else { |
| + EXPECT_FALSE(valid) << "index " << index << ", string " |
| + << kTestData[index].string << ", value " << value; |
| + } |
| + } |
| + |
| + // Ensure that embedded NUL characters are treated as bad input. |
| + const char input[] = "6\0006"; |
| + base::StringPiece input_string(input, arraysize(input) - 1); |
| + unsigned int output; |
| + EXPECT_FALSE(StringToNumber(input_string, &output)); |
| + |
| + // Ensure that a NUL is not required at the end of the string. |
| + EXPECT_TRUE(StringToNumber(base::StringPiece("66", 1), &output)); |
| + EXPECT_EQ(6u, output); |
| +} |
| + |
| +} // namespace |