#include "gtest/gtest.h" #include #include "lldb/Utility/StringExtractor.h" namespace { class StringExtractorTest : public ::testing::Test {}; } // namespace TEST_F(StringExtractorTest, InitEmpty) { llvm::StringRef kEmptyString = ""; StringExtractor ex(kEmptyString); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(kEmptyString, ex.GetStringRef()); ASSERT_EQ(true, ex.Empty()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, InitMisc) { llvm::StringRef kInitMiscString = "Hello, StringExtractor!"; StringExtractor ex(kInitMiscString); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(kInitMiscString, ex.GetStringRef()); ASSERT_EQ(false, ex.Empty()); ASSERT_EQ(kInitMiscString.size(), ex.GetBytesLeft()); ASSERT_EQ(kInitMiscString[0], *ex.Peek()); } TEST_F(StringExtractorTest, DecodeHexU8_Underflow) { llvm::StringRef kEmptyString = ""; StringExtractor ex(kEmptyString); ASSERT_EQ(-1, ex.DecodeHexU8()); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(true, ex.Empty()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, DecodeHexU8_Underflow2) { StringExtractor ex("1"); ASSERT_EQ(-1, ex.DecodeHexU8()); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(1u, ex.GetBytesLeft()); ASSERT_EQ('1', *ex.Peek()); } TEST_F(StringExtractorTest, DecodeHexU8_InvalidHex) { llvm::StringRef kInvalidHex = "xa"; StringExtractor ex(kInvalidHex); ASSERT_EQ(-1, ex.DecodeHexU8()); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(2u, ex.GetBytesLeft()); ASSERT_EQ('x', *ex.Peek()); } TEST_F(StringExtractorTest, DecodeHexU8_InvalidHex2) { llvm::StringRef kInvalidHex = "ax"; StringExtractor ex(kInvalidHex); ASSERT_EQ(-1, ex.DecodeHexU8()); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(2u, ex.GetBytesLeft()); ASSERT_EQ('a', *ex.Peek()); } TEST_F(StringExtractorTest, DecodeHexU8_Exact) { llvm::StringRef kValidHexPair = "12"; StringExtractor ex(kValidHexPair); ASSERT_EQ(0x12, ex.DecodeHexU8()); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2u, ex.GetFilePos()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, DecodeHexU8_Extra) { llvm::StringRef kValidHexPair = "1234"; StringExtractor ex(kValidHexPair); ASSERT_EQ(0x12, ex.DecodeHexU8()); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2u, ex.GetFilePos()); ASSERT_EQ(2u, ex.GetBytesLeft()); ASSERT_EQ('3', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Underflow) { llvm::StringRef kEmptyString = ""; StringExtractor ex(kEmptyString); ASSERT_EQ(0xab, ex.GetHexU8(0xab)); ASSERT_EQ(false, ex.IsGood()); ASSERT_EQ(UINT64_MAX, ex.GetFilePos()); ASSERT_EQ(true, ex.Empty()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Underflow2) { llvm::StringRef kOneNibble = "1"; StringExtractor ex(kOneNibble); ASSERT_EQ(0xbc, ex.GetHexU8(0xbc)); ASSERT_EQ(false, ex.IsGood()); ASSERT_EQ(UINT64_MAX, ex.GetFilePos()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_InvalidHex) { llvm::StringRef kInvalidHex = "xx"; StringExtractor ex(kInvalidHex); ASSERT_EQ(0xcd, ex.GetHexU8(0xcd)); ASSERT_EQ(false, ex.IsGood()); ASSERT_EQ(UINT64_MAX, ex.GetFilePos()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Exact) { llvm::StringRef kValidHexPair = "12"; StringExtractor ex(kValidHexPair); ASSERT_EQ(0x12, ex.GetHexU8(0x12)); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2u, ex.GetFilePos()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Extra) { llvm::StringRef kValidHexPair = "1234"; StringExtractor ex(kValidHexPair); ASSERT_EQ(0x12, ex.GetHexU8(0x12)); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2u, ex.GetFilePos()); ASSERT_EQ(2u, ex.GetBytesLeft()); ASSERT_EQ('3', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Underflow_NoEof) { llvm::StringRef kEmptyString = ""; StringExtractor ex(kEmptyString); const bool kSetEofOnFail = false; ASSERT_EQ(0xab, ex.GetHexU8(0xab, kSetEofOnFail)); ASSERT_EQ(false, ex.IsGood()); // this result seems inconsistent with // kSetEofOnFail == false ASSERT_EQ(UINT64_MAX, ex.GetFilePos()); ASSERT_EQ(true, ex.Empty()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Underflow2_NoEof) { llvm::StringRef kOneNibble = "1"; StringExtractor ex(kOneNibble); const bool kSetEofOnFail = false; ASSERT_EQ(0xbc, ex.GetHexU8(0xbc, kSetEofOnFail)); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(1u, ex.GetBytesLeft()); ASSERT_EQ('1', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_InvalidHex_NoEof) { llvm::StringRef kInvalidHex = "xx"; StringExtractor ex(kInvalidHex); const bool kSetEofOnFail = false; ASSERT_EQ(0xcd, ex.GetHexU8(0xcd, kSetEofOnFail)); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(0u, ex.GetFilePos()); ASSERT_EQ(2u, ex.GetBytesLeft()); ASSERT_EQ('x', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Exact_NoEof) { llvm::StringRef kValidHexPair = "12"; StringExtractor ex(kValidHexPair); const bool kSetEofOnFail = false; ASSERT_EQ(0x12, ex.GetHexU8(0x12, kSetEofOnFail)); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2u, ex.GetFilePos()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, GetHexU8_Extra_NoEof) { llvm::StringRef kValidHexPair = "1234"; StringExtractor ex(kValidHexPair); const bool kSetEofOnFail = false; ASSERT_EQ(0x12, ex.GetHexU8(0x12, kSetEofOnFail)); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2u, ex.GetFilePos()); ASSERT_EQ(2u, ex.GetBytesLeft()); ASSERT_EQ('3', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexBytes) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789xyzw"; const size_t kValidHexPairs = 8; StringExtractor ex(kHexEncodedBytes); uint8_t dst[kValidHexPairs]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytes(dst, 0xde)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); EXPECT_EQ(0x89, dst[7]); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2 * kValidHexPairs, ex.GetFilePos()); ASSERT_EQ(false, ex.Empty()); ASSERT_EQ(4u, ex.GetBytesLeft()); ASSERT_EQ('x', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexBytes_FullString) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789"; const size_t kValidHexPairs = 8; StringExtractor ex(kHexEncodedBytes); uint8_t dst[kValidHexPairs]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytes(dst, 0xde)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); EXPECT_EQ(0x89, dst[7]); } TEST_F(StringExtractorTest, GetHexBytes_OddPair) { llvm::StringRef kHexEncodedBytes = "abcdef012345678w"; const size_t kValidHexPairs = 7; StringExtractor ex(kHexEncodedBytes); uint8_t dst[8]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytes(dst, 0xde)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); // This one should be invalid EXPECT_EQ(0xde, dst[7]); } TEST_F(StringExtractorTest, GetHexBytes_OddPair2) { llvm::StringRef kHexEncodedBytes = "abcdef012345678"; const size_t kValidHexPairs = 7; StringExtractor ex(kHexEncodedBytes); uint8_t dst[8]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytes(dst, 0xde)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); EXPECT_EQ(0xde, dst[7]); } TEST_F(StringExtractorTest, GetHexBytes_Underflow) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789xyzw"; const size_t kValidHexPairs = 8; StringExtractor ex(kHexEncodedBytes); uint8_t dst[12]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytes(dst, 0xde)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); EXPECT_EQ(0x89, dst[7]); // these bytes should be filled with fail_fill_value 0xde EXPECT_EQ(0xde, dst[8]); EXPECT_EQ(0xde, dst[9]); EXPECT_EQ(0xde, dst[10]); EXPECT_EQ(0xde, dst[11]); ASSERT_EQ(false, ex.IsGood()); ASSERT_EQ(UINT64_MAX, ex.GetFilePos()); ASSERT_EQ(false, ex.Empty()); ASSERT_EQ(0u, ex.GetBytesLeft()); ASSERT_EQ(nullptr, ex.Peek()); } TEST_F(StringExtractorTest, GetHexBytes_Partial) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789xyzw"; const size_t kReadBytes = 4; StringExtractor ex(kHexEncodedBytes); uint8_t dst[12]; memset(dst, 0xab, sizeof(dst)); ASSERT_EQ( kReadBytes, ex.GetHexBytes(llvm::MutableArrayRef(dst, kReadBytes), 0xde)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); // these bytes should be unchanged EXPECT_EQ(0xab, dst[4]); EXPECT_EQ(0xab, dst[5]); EXPECT_EQ(0xab, dst[6]); EXPECT_EQ(0xab, dst[7]); EXPECT_EQ(0xab, dst[8]); EXPECT_EQ(0xab, dst[9]); EXPECT_EQ(0xab, dst[10]); EXPECT_EQ(0xab, dst[11]); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(kReadBytes * 2, ex.GetFilePos()); ASSERT_EQ(false, ex.Empty()); ASSERT_EQ(12u, ex.GetBytesLeft()); ASSERT_EQ('2', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexBytesAvail) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789xyzw"; const size_t kValidHexPairs = 8; StringExtractor ex(kHexEncodedBytes); uint8_t dst[kValidHexPairs]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail(dst)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); EXPECT_EQ(0x89, dst[7]); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(2 * kValidHexPairs, ex.GetFilePos()); ASSERT_EQ(false, ex.Empty()); ASSERT_EQ(4u, ex.GetBytesLeft()); ASSERT_EQ('x', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexBytesAvail_FullString) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789"; const size_t kValidHexPairs = 8; StringExtractor ex(kHexEncodedBytes); uint8_t dst[kValidHexPairs]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail(dst)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); EXPECT_EQ(0x89, dst[7]); } TEST_F(StringExtractorTest, GetHexBytesAvail_OddPair) { llvm::StringRef kHexEncodedBytes = "abcdef012345678w"; const size_t kValidHexPairs = 7; StringExtractor ex(kHexEncodedBytes); uint8_t dst[8]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail(dst)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); } TEST_F(StringExtractorTest, GetHexBytesAvail_OddPair2) { llvm::StringRef kHexEncodedBytes = "abcdef012345678"; const size_t kValidHexPairs = 7; StringExtractor ex(kHexEncodedBytes); uint8_t dst[8]; ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail(dst)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); } TEST_F(StringExtractorTest, GetHexBytesAvail_Underflow) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789xyzw"; const size_t kValidHexPairs = 8; StringExtractor ex(kHexEncodedBytes); uint8_t dst[12]; memset(dst, 0xef, sizeof(dst)); ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail(dst)); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); EXPECT_EQ(0x23, dst[4]); EXPECT_EQ(0x45, dst[5]); EXPECT_EQ(0x67, dst[6]); EXPECT_EQ(0x89, dst[7]); // these bytes should be unchanged EXPECT_EQ(0xef, dst[8]); EXPECT_EQ(0xef, dst[9]); EXPECT_EQ(0xef, dst[10]); EXPECT_EQ(0xef, dst[11]); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(kValidHexPairs * 2, ex.GetFilePos()); ASSERT_EQ(false, ex.Empty()); ASSERT_EQ(4u, ex.GetBytesLeft()); ASSERT_EQ('x', *ex.Peek()); } TEST_F(StringExtractorTest, GetHexBytesAvail_Partial) { llvm::StringRef kHexEncodedBytes = "abcdef0123456789xyzw"; const size_t kReadBytes = 4; StringExtractor ex(kHexEncodedBytes); uint8_t dst[12]; memset(dst, 0xab, sizeof(dst)); ASSERT_EQ(kReadBytes, ex.GetHexBytesAvail( llvm::MutableArrayRef(dst, kReadBytes))); EXPECT_EQ(0xab, dst[0]); EXPECT_EQ(0xcd, dst[1]); EXPECT_EQ(0xef, dst[2]); EXPECT_EQ(0x01, dst[3]); // these bytes should be unchanged EXPECT_EQ(0xab, dst[4]); EXPECT_EQ(0xab, dst[5]); EXPECT_EQ(0xab, dst[6]); EXPECT_EQ(0xab, dst[7]); EXPECT_EQ(0xab, dst[8]); EXPECT_EQ(0xab, dst[9]); EXPECT_EQ(0xab, dst[10]); EXPECT_EQ(0xab, dst[11]); ASSERT_EQ(true, ex.IsGood()); ASSERT_EQ(kReadBytes * 2, ex.GetFilePos()); ASSERT_EQ(false, ex.Empty()); ASSERT_EQ(12u, ex.GetBytesLeft()); ASSERT_EQ('2', *ex.Peek()); } TEST_F(StringExtractorTest, GetNameColonValueSuccess) { llvm::StringRef kNameColonPairs = "key1:value1;key2:value2;"; StringExtractor ex(kNameColonPairs); llvm::StringRef name; llvm::StringRef value; EXPECT_TRUE(ex.GetNameColonValue(name, value)); EXPECT_EQ("key1", name); EXPECT_EQ("value1", value); EXPECT_TRUE(ex.GetNameColonValue(name, value)); EXPECT_EQ("key2", name); EXPECT_EQ("value2", value); EXPECT_EQ(0u, ex.GetBytesLeft()); } TEST_F(StringExtractorTest, GetNameColonValueContainsColon) { llvm::StringRef kNameColonPairs = "key1:value1:value2;key2:value3;"; StringExtractor ex(kNameColonPairs); llvm::StringRef name; llvm::StringRef value; EXPECT_TRUE(ex.GetNameColonValue(name, value)); EXPECT_EQ("key1", name); EXPECT_EQ("value1:value2", value); EXPECT_TRUE(ex.GetNameColonValue(name, value)); EXPECT_EQ("key2", name); EXPECT_EQ("value3", value); EXPECT_EQ(0u, ex.GetBytesLeft()); } TEST_F(StringExtractorTest, GetNameColonValueNoSemicolon) { llvm::StringRef kNameColonPairs = "key1:value1"; StringExtractor ex(kNameColonPairs); llvm::StringRef name; llvm::StringRef value; EXPECT_FALSE(ex.GetNameColonValue(name, value)); EXPECT_EQ(0u, ex.GetBytesLeft()); } TEST_F(StringExtractorTest, GetNameColonValueNoColon) { llvm::StringRef kNameColonPairs = "key1value1;"; StringExtractor ex(kNameColonPairs); llvm::StringRef name; llvm::StringRef value; EXPECT_FALSE(ex.GetNameColonValue(name, value)); EXPECT_EQ(0u, ex.GetBytesLeft()); } TEST_F(StringExtractorTest, GetU32LittleEndian) { StringExtractor ex(""); EXPECT_EQ(0x0ull, ex.GetHexMaxU32(true, 0)); ex.Reset("0"); EXPECT_EQ(0x0ull, ex.GetHexMaxU32(true, 1)); ex.Reset("1"); EXPECT_EQ(0x1ull, ex.GetHexMaxU32(true, 0)); ex.Reset("01"); EXPECT_EQ(0x1ull, ex.GetHexMaxU32(true, 0)); ex.Reset("001"); EXPECT_EQ(0x100ull, ex.GetHexMaxU32(true, 0)); ex.Reset("12"); EXPECT_EQ(0x12ull, ex.GetHexMaxU32(true, 0)); ex.Reset("123"); EXPECT_EQ(0x312ull, ex.GetHexMaxU32(true, 0)); ex.Reset("1203"); EXPECT_EQ(0x312ull, ex.GetHexMaxU32(true, 0)); ex.Reset("1234"); EXPECT_EQ(0x3412ull, ex.GetHexMaxU32(true, 0)); ex.Reset("12340"); EXPECT_EQ(0x3412ull, ex.GetHexMaxU32(true, 0)); ex.Reset("123400"); EXPECT_EQ(0x3412ull, ex.GetHexMaxU32(true, 0)); ex.Reset("12345670"); EXPECT_EQ(0x70563412ull, ex.GetHexMaxU32(true, 0)); ex.Reset("123456701"); EXPECT_EQ(0ull, ex.GetHexMaxU32(true, 0)); } TEST_F(StringExtractorTest, GetU32BigEndian) { StringExtractor ex(""); EXPECT_EQ(0x0ull, ex.GetHexMaxU32(false, 0)); ex.Reset("0"); EXPECT_EQ(0x0ull, ex.GetHexMaxU32(false, 1)); ex.Reset("1"); EXPECT_EQ(0x1ull, ex.GetHexMaxU32(false, 0)); ex.Reset("01"); EXPECT_EQ(0x1ull, ex.GetHexMaxU32(false, 0)); ex.Reset("001"); EXPECT_EQ(0x1ull, ex.GetHexMaxU32(false, 0)); ex.Reset("12"); EXPECT_EQ(0x12ull, ex.GetHexMaxU32(false, 0)); ex.Reset("123"); EXPECT_EQ(0x123ull, ex.GetHexMaxU32(false, 0)); ex.Reset("1203"); EXPECT_EQ(0x1203ull, ex.GetHexMaxU32(false, 0)); ex.Reset("1234"); EXPECT_EQ(0x1234ull, ex.GetHexMaxU32(false, 0)); ex.Reset("12340"); EXPECT_EQ(0x12340ull, ex.GetHexMaxU32(false, 0)); ex.Reset("123400"); EXPECT_EQ(0x123400ull, ex.GetHexMaxU32(false, 0)); ex.Reset("12345670"); EXPECT_EQ(0x12345670ull, ex.GetHexMaxU32(false, 0)); ex.Reset("123456700"); EXPECT_EQ(0ull, ex.GetHexMaxU32(false, 0)); } TEST_F(StringExtractorTest, GetU64LittleEndian) { StringExtractor ex(""); EXPECT_EQ(0x0ull, ex.GetHexMaxU64(true, 0)); ex.Reset("0"); EXPECT_EQ(0x0ull, ex.GetHexMaxU64(true, 1)); ex.Reset("1"); EXPECT_EQ(0x1ull, ex.GetHexMaxU64(true, 0)); ex.Reset("01"); EXPECT_EQ(0x1ull, ex.GetHexMaxU64(true, 0)); ex.Reset("001"); EXPECT_EQ(0x100ull, ex.GetHexMaxU64(true, 0)); ex.Reset("12"); EXPECT_EQ(0x12ull, ex.GetHexMaxU64(true, 0)); ex.Reset("123"); EXPECT_EQ(0x312ull, ex.GetHexMaxU64(true, 0)); ex.Reset("1203"); EXPECT_EQ(0x312ull, ex.GetHexMaxU64(true, 0)); ex.Reset("1234"); EXPECT_EQ(0x3412ull, ex.GetHexMaxU64(true, 0)); ex.Reset("12340"); EXPECT_EQ(0x3412ull, ex.GetHexMaxU64(true, 0)); ex.Reset("123400"); EXPECT_EQ(0x3412ull, ex.GetHexMaxU64(true, 0)); ex.Reset("123456789ABCDEF0"); EXPECT_EQ(0xF0DEBC9A78563412ULL, ex.GetHexMaxU64(true, 0)); ex.Reset("123456789ABCDEF01"); EXPECT_EQ(0ull, ex.GetHexMaxU64(true, 0)); } TEST_F(StringExtractorTest, GetU64BigEndian) { StringExtractor ex(""); EXPECT_EQ(0x0ull, ex.GetHexMaxU64(false, 0)); ex.Reset("0"); EXPECT_EQ(0x0ull, ex.GetHexMaxU64(false, 1)); ex.Reset("1"); EXPECT_EQ(0x1ull, ex.GetHexMaxU64(false, 0)); ex.Reset("01"); EXPECT_EQ(0x1ull, ex.GetHexMaxU64(false, 0)); ex.Reset("001"); EXPECT_EQ(0x1ull, ex.GetHexMaxU64(false, 0)); ex.Reset("12"); EXPECT_EQ(0x12ull, ex.GetHexMaxU64(false, 0)); ex.Reset("123"); EXPECT_EQ(0x123ull, ex.GetHexMaxU64(false, 0)); ex.Reset("1203"); EXPECT_EQ(0x1203ull, ex.GetHexMaxU64(false, 0)); ex.Reset("1234"); EXPECT_EQ(0x1234ull, ex.GetHexMaxU64(false, 0)); ex.Reset("12340"); EXPECT_EQ(0x12340ull, ex.GetHexMaxU64(false, 0)); ex.Reset("123400"); EXPECT_EQ(0x123400ull, ex.GetHexMaxU64(false, 0)); ex.Reset("123456789ABCDEF0"); EXPECT_EQ(0x123456789ABCDEF0ULL, ex.GetHexMaxU64(false, 0)); ex.Reset("123456789ABCDEF000"); EXPECT_EQ(0ull, ex.GetHexMaxU64(false, 0)); }