| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/lib/fxl/strings/string_number_conversions.h" |
| |
| #include <stdint.h> |
| |
| #include <limits> |
| |
| #include <gtest/gtest.h> |
| |
| namespace fxl { |
| namespace { |
| |
| TEST(StringNumberConversionsTest, NumberToString_Basic) { |
| EXPECT_EQ("0", NumberToString<int32_t>(static_cast<int32_t>(0))); |
| EXPECT_EQ("123", NumberToString<int32_t>(static_cast<int32_t>(123))); |
| EXPECT_EQ("-456", NumberToString<int32_t>(static_cast<int32_t>(-456))); |
| |
| EXPECT_EQ("0", NumberToString<uint32_t>(static_cast<uint32_t>(0))); |
| EXPECT_EQ("123", NumberToString<uint32_t>(static_cast<uint32_t>(123))); |
| EXPECT_EQ("2309737967", NumberToString<int64_t>(static_cast<int64_t>(2309737967))); |
| EXPECT_EQ("-2309737967", NumberToString<int64_t>(static_cast<int64_t>(-2309737967ll))); |
| |
| EXPECT_EQ("0", NumberToString<int>(0)); |
| EXPECT_EQ("123", NumberToString<int>(123)); |
| EXPECT_EQ("-456", NumberToString<int>(-456)); |
| |
| EXPECT_EQ("0", NumberToString<unsigned>(0u)); |
| EXPECT_EQ("123", NumberToString<unsigned>(123u)); |
| |
| EXPECT_EQ("1", NumberToString<int>(1)); |
| EXPECT_EQ("12", NumberToString<int>(12)); |
| EXPECT_EQ("123", NumberToString<int>(123)); |
| EXPECT_EQ("1234", NumberToString<int>(1234)); |
| EXPECT_EQ("12345", NumberToString<int>(12345)); |
| EXPECT_EQ("123456", NumberToString<int>(123456)); |
| EXPECT_EQ("1234567", NumberToString<int>(1234567)); |
| EXPECT_EQ("12345678", NumberToString<int>(12345678)); |
| EXPECT_EQ("123456789", NumberToString<int>(123456789)); |
| EXPECT_EQ("-1", NumberToString<int>(-1)); |
| EXPECT_EQ("-12", NumberToString<int>(-12)); |
| EXPECT_EQ("-123", NumberToString<int>(-123)); |
| EXPECT_EQ("-1234", NumberToString<int>(-1234)); |
| EXPECT_EQ("-12345", NumberToString<int>(-12345)); |
| EXPECT_EQ("-123456", NumberToString<int>(-123456)); |
| EXPECT_EQ("-1234567", NumberToString<int>(-1234567)); |
| EXPECT_EQ("-12345678", NumberToString<int>(-12345678)); |
| EXPECT_EQ("-123456789", NumberToString<int>(-123456789)); |
| } |
| |
| TEST(StringNumberConversionsTest, NumberToString_Basic_Base16) { |
| EXPECT_EQ("0", NumberToString<int32_t>(static_cast<int32_t>(0), Base::k16)); |
| EXPECT_EQ("7B", NumberToString<int32_t>(static_cast<int32_t>(123), Base::k16)); |
| EXPECT_EQ("-1C8", NumberToString<int32_t>(static_cast<int32_t>(-456), Base::k16)); |
| |
| EXPECT_EQ("0", NumberToString<uint32_t>(static_cast<uint32_t>(0))); |
| EXPECT_EQ("123", NumberToString<uint32_t>(static_cast<uint32_t>(123))); |
| |
| EXPECT_EQ("0", NumberToString<int>(0, Base::k16)); |
| EXPECT_EQ("7B", NumberToString<int>(123, Base::k16)); |
| EXPECT_EQ("-1C8", NumberToString<int>(-456, Base::k16)); |
| |
| EXPECT_EQ("0", NumberToString<unsigned>(0u, Base::k16)); |
| EXPECT_EQ("7B", NumberToString<unsigned>(123u, Base::k16)); |
| |
| EXPECT_EQ("1", NumberToString<int64_t>(1ll, Base::k16)); |
| EXPECT_EQ("12", NumberToString<int64_t>(0x12ll, Base::k16)); |
| EXPECT_EQ("123", NumberToString<int64_t>(0x123ll, Base::k16)); |
| EXPECT_EQ("12345", NumberToString<int64_t>(0x12345ll, Base::k16)); |
| EXPECT_EQ("123456", NumberToString<int64_t>(0x123456ll, Base::k16)); |
| EXPECT_EQ("1234567", NumberToString<int64_t>(0x1234567ll, Base::k16)); |
| EXPECT_EQ("12345678", NumberToString<int64_t>(0x12345678ll, Base::k16)); |
| EXPECT_EQ("23456789", NumberToString<int64_t>(0x23456789ll, Base::k16)); |
| EXPECT_EQ("3456789A", NumberToString<int64_t>(0x3456789All, Base::k16)); |
| EXPECT_EQ("456789AB", NumberToString<int64_t>(0x456789ABll, Base::k16)); |
| EXPECT_EQ("56789ABC", NumberToString<int64_t>(0x56789ABCll, Base::k16)); |
| EXPECT_EQ("6789ABCD", NumberToString<int64_t>(0x6789ABCDll, Base::k16)); |
| EXPECT_EQ("789ABCDE", NumberToString<int64_t>(0x789ABCDEll, Base::k16)); |
| EXPECT_EQ("89ABCDEF", NumberToString<int64_t>(0x89ABCDEFll, Base::k16)); |
| EXPECT_EQ("-1", NumberToString<int64_t>(-1ll, Base::k16)); |
| EXPECT_EQ("-12", NumberToString<int64_t>(-0x12ll, Base::k16)); |
| EXPECT_EQ("-123", NumberToString<int64_t>(-0x123ll, Base::k16)); |
| EXPECT_EQ("-12345", NumberToString<int64_t>(-0x12345ll, Base::k16)); |
| EXPECT_EQ("-123456", NumberToString<int64_t>(-0x123456ll, Base::k16)); |
| EXPECT_EQ("-1234567", NumberToString<int64_t>(-0x1234567ll, Base::k16)); |
| EXPECT_EQ("-12345678", NumberToString<int64_t>(-0x12345678ll, Base::k16)); |
| EXPECT_EQ("-23456789", NumberToString<int64_t>(-0x23456789ll, Base::k16)); |
| EXPECT_EQ("-3456789A", NumberToString<int64_t>(-0x3456789All, Base::k16)); |
| EXPECT_EQ("-456789AB", NumberToString<int64_t>(-0x456789ABll, Base::k16)); |
| EXPECT_EQ("-56789ABC", NumberToString<int64_t>(-0x56789ABCll, Base::k16)); |
| EXPECT_EQ("-6789ABCD", NumberToString<int64_t>(-0x6789ABCDll, Base::k16)); |
| EXPECT_EQ("-789ABCDE", NumberToString<int64_t>(-0x789ABCDEll, Base::k16)); |
| EXPECT_EQ("-89ABCDEF", NumberToString<int64_t>(-0x89ABCDEFll, Base::k16)); |
| } |
| |
| TEST(StringNumberConversionsTest, NumberToString_StdintTypes) { |
| // int8_t |
| EXPECT_EQ("0", NumberToString<int8_t>(static_cast<int8_t>(0))); |
| EXPECT_EQ("127", NumberToString<int8_t>(std::numeric_limits<int8_t>::max())); |
| EXPECT_EQ("-128", NumberToString<int8_t>(std::numeric_limits<int8_t>::min())); |
| EXPECT_EQ("0", NumberToString<int8_t>(static_cast<int8_t>(0), Base::k16)); |
| EXPECT_EQ("7F", NumberToString<int8_t>(std::numeric_limits<int8_t>::max(), Base::k16)); |
| EXPECT_EQ("-80", NumberToString<int8_t>(std::numeric_limits<int8_t>::min(), Base::k16)); |
| |
| // uint8_t |
| EXPECT_EQ("0", NumberToString<uint8_t>(static_cast<uint8_t>(0))); |
| EXPECT_EQ("255", NumberToString<uint8_t>(std::numeric_limits<uint8_t>::max())); |
| EXPECT_EQ("0", NumberToString<uint8_t>(static_cast<uint8_t>(0), Base::k16)); |
| EXPECT_EQ("FF", NumberToString<uint8_t>(std::numeric_limits<uint8_t>::max(), Base::k16)); |
| |
| // int16_t |
| EXPECT_EQ("0", NumberToString<int16_t>(static_cast<int16_t>(0))); |
| EXPECT_EQ("32767", NumberToString<int16_t>(std::numeric_limits<int16_t>::max())); |
| EXPECT_EQ("-32768", NumberToString<int16_t>(std::numeric_limits<int16_t>::min())); |
| EXPECT_EQ("0", NumberToString<int16_t>(static_cast<int16_t>(0), Base::k16)); |
| EXPECT_EQ("7FFF", NumberToString<int16_t>(std::numeric_limits<int16_t>::max(), Base::k16)); |
| EXPECT_EQ("-8000", NumberToString<int16_t>(std::numeric_limits<int16_t>::min(), Base::k16)); |
| |
| // uint16_t |
| EXPECT_EQ("0", NumberToString<uint16_t>(static_cast<uint16_t>(0))); |
| EXPECT_EQ("65535", NumberToString<uint16_t>(std::numeric_limits<uint16_t>::max())); |
| EXPECT_EQ("0", NumberToString<uint16_t>(static_cast<uint16_t>(0), Base::k16)); |
| EXPECT_EQ("FFFF", NumberToString<uint16_t>(std::numeric_limits<uint16_t>::max(), Base::k16)); |
| |
| // int32_t |
| EXPECT_EQ("0", NumberToString<int32_t>(static_cast<int32_t>(0))); |
| EXPECT_EQ("2147483647", NumberToString<int32_t>(std::numeric_limits<int32_t>::max())); |
| EXPECT_EQ("-2147483648", NumberToString<int32_t>(std::numeric_limits<int32_t>::min())); |
| EXPECT_EQ("0", NumberToString<int32_t>(static_cast<int32_t>(0), Base::k16)); |
| EXPECT_EQ("7FFFFFFF", NumberToString<int32_t>(std::numeric_limits<int32_t>::max(), Base::k16)); |
| EXPECT_EQ("-80000000", NumberToString<int32_t>(std::numeric_limits<int32_t>::min(), Base::k16)); |
| |
| // uint32_t |
| EXPECT_EQ("0", NumberToString<uint32_t>(static_cast<uint32_t>(0))); |
| EXPECT_EQ("4294967295", NumberToString<uint32_t>(std::numeric_limits<uint32_t>::max())); |
| EXPECT_EQ("0", NumberToString<uint32_t>(static_cast<uint32_t>(0), Base::k16)); |
| EXPECT_EQ("FFFFFFFF", NumberToString<uint32_t>(std::numeric_limits<uint32_t>::max(), Base::k16)); |
| |
| // int64_t |
| EXPECT_EQ("0", NumberToString<int64_t>(static_cast<int64_t>(0))); |
| EXPECT_EQ("9223372036854775807", NumberToString<int64_t>(std::numeric_limits<int64_t>::max())); |
| EXPECT_EQ("-9223372036854775808", NumberToString<int64_t>(std::numeric_limits<int64_t>::min())); |
| EXPECT_EQ("0", NumberToString<int64_t>(static_cast<int64_t>(0), Base::k16)); |
| EXPECT_EQ("7FFFFFFFFFFFFFFF", |
| NumberToString<int64_t>(std::numeric_limits<int64_t>::max(), Base::k16)); |
| EXPECT_EQ("-8000000000000000", |
| NumberToString<int64_t>(std::numeric_limits<int64_t>::min(), Base::k16)); |
| |
| // uint64_t |
| EXPECT_EQ("0", NumberToString<uint64_t>(static_cast<uint64_t>(0))); |
| EXPECT_EQ("18446744073709551615", NumberToString<uint64_t>(std::numeric_limits<uint64_t>::max())); |
| EXPECT_EQ("0", NumberToString<uint64_t>(static_cast<uint64_t>(0), Base::k16)); |
| EXPECT_EQ("FFFFFFFFFFFFFFFF", |
| NumberToString<uint64_t>(std::numeric_limits<uint64_t>::max(), Base::k16)); |
| } |
| |
| TEST(StringNumberConversionsTest, StringToNumberWithError_Basic) { |
| { |
| int32_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("0", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("123", &number)); |
| EXPECT_EQ(123, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("-456", &number)); |
| EXPECT_EQ(-456, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("123", &number, Base::k16)); |
| EXPECT_EQ(291, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("A", &number, Base::k16)); |
| EXPECT_EQ(10, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("abCDeF", &number, Base::k16)); |
| EXPECT_EQ(11259375, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("-abCDeF", &number, Base::k16)); |
| EXPECT_EQ(-11259375, number); |
| } |
| |
| { |
| uint32_t number = 42u; |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("0", &number)); |
| EXPECT_EQ(0u, number); |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("123", &number)); |
| EXPECT_EQ(123u, number); |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("abCDeF", &number, Base::k16)); |
| EXPECT_EQ(11259375u, number); |
| } |
| |
| { |
| int number = 42; |
| EXPECT_TRUE(StringToNumberWithError<int>("0", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int>("123", &number)); |
| EXPECT_EQ(123, number); |
| EXPECT_TRUE(StringToNumberWithError<int>("-456", &number)); |
| EXPECT_EQ(-456, number); |
| EXPECT_TRUE(StringToNumberWithError<int>("-abCDeF", &number, Base::k16)); |
| EXPECT_EQ(-11259375, number); |
| } |
| |
| { |
| unsigned number = 42u; |
| EXPECT_TRUE(StringToNumberWithError<unsigned>("0", &number)); |
| EXPECT_EQ(0u, number); |
| EXPECT_TRUE(StringToNumberWithError<unsigned>("123", &number)); |
| EXPECT_EQ(123u, number); |
| EXPECT_TRUE(StringToNumberWithError<unsigned>("abCDeF", &number, Base::k16)); |
| EXPECT_EQ(11259375u, number); |
| } |
| } |
| |
| TEST(StringNumberConversionsTest, StringToNumberWithError_Errors) { |
| { |
| int32_t number = 42; |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("/", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>(":", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("A", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("0x", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("123x", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("+123", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("@", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("G", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("`", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("g", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("999999999999999", &number)); |
| EXPECT_EQ(42, number); |
| } |
| |
| { |
| uint32_t number = 42u; |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("/", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>(":", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("A", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("0x", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("123x", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("+123", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("999999999999999", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("-123", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("-0", &number)); |
| EXPECT_EQ(42u, number); |
| } |
| } |
| |
| TEST(StringNumberConversionsTest, StringToNumberWithError_LeadingZeros) { |
| { |
| int32_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("00", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("0123", &number)); |
| EXPECT_EQ(123, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("-0", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("-00", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("-0456", &number)); |
| EXPECT_EQ(-456, number); |
| } |
| |
| { |
| uint32_t number = 42u; |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("00", &number)); |
| EXPECT_EQ(0u, number); |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("0123", &number)); |
| EXPECT_EQ(123u, number); |
| } |
| } |
| |
| TEST(StringNumberConversionsTest, StringToNumberWithError_StdintTypes) { |
| { |
| int8_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<int8_t>("0", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int8_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int8_t>("127", &number)); |
| EXPECT_EQ(std::numeric_limits<int8_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<int8_t>("7f", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int8_t>::max(), number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int8_t>("-128", &number)); |
| EXPECT_EQ(std::numeric_limits<int8_t>::min(), number); |
| EXPECT_TRUE(StringToNumberWithError<int8_t>("-80", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int8_t>::min(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<int8_t>("128", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int8_t>("80", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int8_t>("-129", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int8_t>("-81", &number, Base::k16)); |
| } |
| |
| { |
| uint8_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<uint8_t>("0", &number)); |
| EXPECT_EQ(0u, number); |
| EXPECT_TRUE(StringToNumberWithError<uint8_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0u, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<uint8_t>("255", &number)); |
| EXPECT_EQ(std::numeric_limits<uint8_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<uint8_t>("ff", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<uint8_t>::max(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<uint8_t>("256", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint8_t>("100", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<uint8_t>("-1", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint8_t>("-1", &number, Base::k16)); |
| } |
| |
| { |
| int16_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<int16_t>("0", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int16_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int16_t>("32767", &number)); |
| EXPECT_EQ(std::numeric_limits<int16_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<int16_t>("7fff", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int16_t>::max(), number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int16_t>("-32768", &number)); |
| EXPECT_EQ(std::numeric_limits<int16_t>::min(), number); |
| EXPECT_TRUE(StringToNumberWithError<int16_t>("-8000", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int16_t>::min(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<int16_t>("32768", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int16_t>("8000", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int16_t>("-32769", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int16_t>("-80001", &number, Base::k16)); |
| } |
| |
| { |
| uint16_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<uint16_t>("0", &number)); |
| EXPECT_EQ(0u, number); |
| EXPECT_TRUE(StringToNumberWithError<uint16_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0u, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<uint16_t>("65535", &number)); |
| EXPECT_EQ(std::numeric_limits<uint16_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<uint16_t>("ffff", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<uint16_t>::max(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<uint16_t>("65536", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint16_t>("10000", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<uint16_t>("-1", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint16_t>("-1", &number, Base::k16)); |
| } |
| |
| { |
| int32_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("0", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("2147483647", &number)); |
| EXPECT_EQ(std::numeric_limits<int32_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("7FFFFFFF", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int32_t>::max(), number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("-2147483648", &number)); |
| EXPECT_EQ(std::numeric_limits<int32_t>::min(), number); |
| EXPECT_TRUE(StringToNumberWithError<int32_t>("-80000000", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int32_t>::min(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("2147483648", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("80000000", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("-2147483649", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int32_t>("-80000001", &number, Base::k16)); |
| } |
| |
| { |
| uint32_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("0", &number)); |
| EXPECT_EQ(0u, number); |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0u, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("4294967295", &number)); |
| EXPECT_EQ(std::numeric_limits<uint32_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<uint32_t>("FFFFFFFF", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<uint32_t>::max(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("4294967296", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("100000000", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("-1", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint32_t>("-1", &number, Base::k16)); |
| } |
| |
| { |
| int64_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<int64_t>("0", &number)); |
| EXPECT_EQ(0, number); |
| EXPECT_TRUE(StringToNumberWithError<int64_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int64_t>("9223372036854775807", &number)); |
| EXPECT_EQ(std::numeric_limits<int64_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<int64_t>("7FFFFFFFFFFFFFFF", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int64_t>::max(), number); |
| |
| EXPECT_TRUE(StringToNumberWithError<int64_t>("-9223372036854775808", &number)); |
| EXPECT_EQ(std::numeric_limits<int64_t>::min(), number); |
| EXPECT_TRUE(StringToNumberWithError<int64_t>("-8000000000000000", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<int64_t>::min(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<int64_t>("9223372036854775808", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int64_t>("8000000000000000", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<int64_t>("-9223372036854775809", &number)); |
| EXPECT_FALSE(StringToNumberWithError<int64_t>("-8000000000000001", &number, Base::k16)); |
| } |
| |
| { |
| uint64_t number = 42; |
| EXPECT_TRUE(StringToNumberWithError<uint64_t>("0", &number)); |
| EXPECT_EQ(0u, number); |
| EXPECT_TRUE(StringToNumberWithError<uint64_t>("0", &number, Base::k16)); |
| EXPECT_EQ(0u, number); |
| |
| EXPECT_TRUE(StringToNumberWithError<uint64_t>("18446744073709551615", &number)); |
| EXPECT_EQ(std::numeric_limits<uint64_t>::max(), number); |
| EXPECT_TRUE(StringToNumberWithError<uint64_t>("FFFFFFFFFFFFFFFF", &number, Base::k16)); |
| EXPECT_EQ(std::numeric_limits<uint64_t>::max(), number); |
| |
| EXPECT_FALSE(StringToNumberWithError<uint64_t>("18446744073709551616", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint64_t>("80000000000000000", &number, Base::k16)); |
| EXPECT_FALSE(StringToNumberWithError<uint64_t>("-1", &number)); |
| EXPECT_FALSE(StringToNumberWithError<uint64_t>("-1", &number, Base::k16)); |
| } |
| } |
| |
| TEST(StringNumberConversionsTest, StringToNumber_Basic) { |
| EXPECT_EQ(0, StringToNumber<int32_t>("0")); |
| EXPECT_EQ(123, StringToNumber<int32_t>("123")); |
| EXPECT_EQ(-456, StringToNumber<int32_t>("-456")); |
| EXPECT_EQ(123, StringToNumber<int32_t>("7B", Base::k16)); |
| EXPECT_EQ(-123, StringToNumber<int32_t>("-7b", Base::k16)); |
| |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("0")); |
| EXPECT_EQ(123u, StringToNumber<uint32_t>("123")); |
| EXPECT_EQ(123u, StringToNumber<uint32_t>("7b", Base::k16)); |
| |
| EXPECT_EQ(0, StringToNumber<int>("0")); |
| EXPECT_EQ(123, StringToNumber<int>("123")); |
| EXPECT_EQ(-456, StringToNumber<int>("-456")); |
| EXPECT_EQ(123, StringToNumber<int>("7B", Base::k16)); |
| EXPECT_EQ(-123, StringToNumber<int>("-7b", Base::k16)); |
| |
| EXPECT_EQ(0u, StringToNumber<unsigned>("0")); |
| EXPECT_EQ(123u, StringToNumber<unsigned>("123")); |
| EXPECT_EQ(123u, StringToNumber<unsigned>("7b", Base::k16)); |
| } |
| |
| TEST(StringNumberConversionsTest, StringToNumber_Errors) { |
| EXPECT_EQ(0, StringToNumber<int32_t>("")); |
| EXPECT_EQ(0, StringToNumber<int32_t>("/")); |
| EXPECT_EQ(0, StringToNumber<int32_t>(":")); |
| EXPECT_EQ(0, StringToNumber<int32_t>("A")); |
| EXPECT_EQ(0, StringToNumber<int32_t>("0x")); |
| EXPECT_EQ(0, StringToNumber<int32_t>("123x")); |
| EXPECT_EQ(0, StringToNumber<int32_t>("+123")); |
| EXPECT_EQ(0, StringToNumber<int32_t>("999999999999999")); |
| EXPECT_EQ(0, StringToNumber<int32_t>("", Base::k16)); |
| EXPECT_EQ(0, StringToNumber<int32_t>("/", Base::k16)); |
| EXPECT_EQ(0, StringToNumber<int32_t>(":", Base::k16)); |
| EXPECT_EQ(0, StringToNumber<int32_t>("G", Base::k16)); |
| EXPECT_EQ(0, StringToNumber<int32_t>("0x", Base::k16)); |
| EXPECT_EQ(0, StringToNumber<int32_t>("7fx", Base::k16)); |
| EXPECT_EQ(0, StringToNumber<int32_t>("+7B", Base::k16)); |
| |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("/")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>(":")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("A")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("0x")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("123x")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("+123")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("999999999999999")); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("", Base::k16)); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("/", Base::k16)); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>(":", Base::k16)); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("G", Base::k16)); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("0x", Base::k16)); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("7fx", Base::k16)); |
| EXPECT_EQ(0u, StringToNumber<uint32_t>("+7B", Base::k16)); |
| } |
| |
| } // namespace |
| } // namespace fxl |