Don't base Value on NT_Value.

Also use std::string instead of NT_String.

Conversions to/from the internal structures will be done at the interface.
This commit is contained in:
Peter Johnson
2015-07-16 01:38:27 -07:00
committed by Peter Johnson
parent 555725a05b
commit 9906116d23
17 changed files with 870 additions and 984 deletions

View File

@@ -7,9 +7,6 @@
#include "WireDecoder.h"
#include "StringValueTest.h"
#include "ValueTest.h"
#include "gtest/gtest.h"
#include <cfloat>
@@ -23,53 +20,46 @@ namespace ntimpl {
class WireDecoderTest : public ::testing::Test {
protected:
virtual void SetUp() {
Value v;
v_boolean.SetBoolean(true);
v_double.SetDouble(1.0);
v_string.SetString("hello");
v_raw.SetRaw("hello");
v_boolean_array.SetBooleanArray(std::vector<int>{0, 1, 0});
v_boolean_array_big.SetBooleanArray(std::vector<int>(255));
v_double_array.SetDoubleArray(std::vector<double>{0.5, 0.25});
v_double_array_big.SetDoubleArray(std::vector<double>(255));
v_boolean = Value::MakeBoolean(true);
v_double = Value::MakeDouble(1.0);
v_string = Value::MakeString(llvm::StringRef("hello"));
v_raw = Value::MakeRaw(llvm::StringRef("hello"));
v_boolean_array = Value::MakeBooleanArray(std::vector<int>{0, 1, 0});
v_boolean_array_big = Value::MakeBooleanArray(std::vector<int>(255));
v_double_array = Value::MakeDoubleArray(std::vector<double>{0.5, 0.25});
v_double_array_big = Value::MakeDoubleArray(std::vector<double>(255));
std::vector<StringValue> sa;
sa.push_back(StringValue("hello"));
sa.push_back(StringValue("goodbye"));
v_string_array.SetStringArray(sa);
std::vector<std::string> sa;
sa.push_back("hello");
sa.push_back("goodbye");
v_string_array = Value::MakeStringArray(std::move(sa));
sa.clear();
for (int i=0; i<255; ++i)
sa.push_back(StringValue("h"));
v_string_array_big.SetStringArray(sa);
sa.push_back("h");
v_string_array_big = Value::MakeStringArray(std::move(sa));
s_normal = std::string("hello");
sv_normal = StringValue(s_normal);
s_long.clear();
s_long.append(127, '*');
s_long.push_back('x');
sv_long = StringValue(s_long);
s_big2.clear();
s_big2.append(65534, '*');
s_big2.push_back('x');
sv_big2 = StringValue(s_big2);
s_big3.clear();
s_big3.append(65534, '*');
s_big3.append(3, 'x');
sv_big3 = StringValue(s_big3);
}
Value v_empty;
Value v_boolean, v_double, v_string, v_raw;
Value v_boolean_array, v_boolean_array_big;
Value v_double_array, v_double_array_big;
Value v_string_array, v_string_array_big;
std::shared_ptr<Value> v_boolean, v_double, v_string, v_raw;
std::shared_ptr<Value> v_boolean_array, v_boolean_array_big;
std::shared_ptr<Value> v_double_array, v_double_array_big;
std::shared_ptr<Value> v_string_array, v_string_array_big;
std::string s_normal, s_long, s_big2, s_big3;
StringValue sv_normal, sv_long, sv_big2, sv_big3;
};
TEST_F(WireDecoderTest, Construct) {
@@ -224,16 +214,16 @@ TEST_F(WireDecoderTest, Reset) {
TEST_F(WireDecoderTest, ReadBooleanValue2) {
raw_mem_istream is("\x01\x00", 2);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN, &val));
EXPECT_EQ(v_boolean, val);
auto val = d.ReadValue(NT_BOOLEAN);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean, *val);
Value v_false;
v_false.SetBoolean(false);
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN, &val));
EXPECT_EQ(v_false, val);
auto v_false = Value::MakeBoolean(false);
val = d.ReadValue(NT_BOOLEAN);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_false, *val);
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN, &val));
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN));
ASSERT_EQ(nullptr, d.error());
}
@@ -243,53 +233,51 @@ TEST_F(WireDecoderTest, ReadDoubleValue2) {
"\x3f\xf0\x00\x00\x00\x00\x00\x00",
16);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE, &val));
EXPECT_EQ(v_double, val);
auto val = d.ReadValue(NT_DOUBLE);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double, *val);
Value val2;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE, &val2));
EXPECT_EQ(v_double, val2);
val = d.ReadValue(NT_DOUBLE);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double, *val);
ASSERT_FALSE(d.ReadValue(NT_DOUBLE, &val));
ASSERT_FALSE(d.ReadValue(NT_DOUBLE));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadStringValue2) {
raw_mem_istream is("\x00\x05hello\x00\x03" "bye\x55", 13);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_STRING, &val));
EXPECT_EQ(v_string, val);
auto val = d.ReadValue(NT_STRING);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_string, *val);
Value val2;
Value v_bye;
v_bye.SetString("bye");
ASSERT_TRUE(d.ReadValue(NT_STRING, &val2));
EXPECT_EQ(v_bye, val2);
auto v_bye = Value::MakeString(llvm::StringRef("bye"));
val = d.ReadValue(NT_STRING);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_bye, *val);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadValue(NT_STRING, &val));
ASSERT_FALSE(d.ReadValue(NT_STRING));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadBooleanArrayValue2) {
raw_mem_istream is("\x03\x00\x01\x00\x02\x01\x00\xff", 8);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
EXPECT_EQ(v_boolean_array, val);
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean_array, *val);
Value val2;
Value v_boolean_array2;
v_boolean_array2.SetBooleanArray(std::vector<int>{1, 0});
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN_ARRAY, &val2));
EXPECT_EQ(v_boolean_array2, val2);
auto v_boolean_array2 = Value::MakeBooleanArray(std::vector<int>{1, 0});
val = d.ReadValue(NT_BOOLEAN_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean_array2, *val);
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -299,11 +287,11 @@ TEST_F(WireDecoderTest, ReadBooleanArrayBigValue2) {
s.append(255, '\x00');
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
EXPECT_EQ(v_boolean_array_big, val);
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean_array_big, *val);
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -313,15 +301,15 @@ TEST_F(WireDecoderTest, ReadDoubleArrayValue2) {
"\x3f\xd0\x00\x00\x00\x00\x00\x00\x55",
18);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
EXPECT_EQ(v_double_array, val);
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double_array, *val);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -331,26 +319,26 @@ TEST_F(WireDecoderTest, ReadDoubleArrayBigValue2) {
s.append(255*8, '\x00');
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
EXPECT_EQ(v_double_array_big, val);
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double_array_big, *val);
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadStringArrayValue2) {
raw_mem_istream is("\x02\x00\x05hello\x00\x07goodbye\x55", 18);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_STRING_ARRAY, &val));
EXPECT_EQ(v_string_array, val);
auto val = d.ReadValue(NT_STRING_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_string_array, *val);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -361,43 +349,42 @@ TEST_F(WireDecoderTest, ReadStringArrayBigValue2) {
s.append("\x00\x01h", 3);
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_STRING_ARRAY, &val));
EXPECT_EQ(v_string_array_big, val);
auto val = d.ReadValue(NT_STRING_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_string_array_big, *val);
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadValueError2) {
raw_mem_istream is("", 0);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_FALSE(d.ReadValue(NT_UNASSIGNED, &val)); // unassigned
ASSERT_FALSE(d.ReadValue(NT_UNASSIGNED)); // unassigned
ASSERT_NE(nullptr, d.error());
d.Reset();
ASSERT_FALSE(d.ReadValue(NT_RAW, &val)); // not supported
ASSERT_FALSE(d.ReadValue(NT_RAW)); // not supported
ASSERT_NE(nullptr, d.error());
d.Reset();
ASSERT_FALSE(d.ReadValue(NT_RPC, &val)); // not supported
ASSERT_FALSE(d.ReadValue(NT_RPC)); // not supported
ASSERT_NE(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadBooleanValue3) {
raw_mem_istream is("\x01\x00", 2);
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN, &val));
EXPECT_EQ(v_boolean, val);
auto val = d.ReadValue(NT_BOOLEAN);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean, *val);
Value v_false;
v_false.SetBoolean(false);
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN, &val));
EXPECT_EQ(v_false, val);
auto v_false = Value::MakeBoolean(false);
val = d.ReadValue(NT_BOOLEAN);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_false, *val);
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN, &val));
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN));
ASSERT_EQ(nullptr, d.error());
}
@@ -407,74 +394,71 @@ TEST_F(WireDecoderTest, ReadDoubleValue3) {
"\x3f\xf0\x00\x00\x00\x00\x00\x00",
16);
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE, &val));
EXPECT_EQ(v_double, val);
auto val = d.ReadValue(NT_DOUBLE);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double, *val);
Value val2;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE, &val2));
EXPECT_EQ(v_double, val2);
val = d.ReadValue(NT_DOUBLE);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double, *val);
ASSERT_FALSE(d.ReadValue(NT_DOUBLE, &val));
ASSERT_FALSE(d.ReadValue(NT_DOUBLE));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadStringValue3) {
raw_mem_istream is("\x05hello\x03" "bye\x55", 11);
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_STRING, &val));
EXPECT_EQ(v_string, val);
auto val = d.ReadValue(NT_STRING);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_string, *val);
Value val2;
Value v_bye;
v_bye.SetString("bye");
ASSERT_TRUE(d.ReadValue(NT_STRING, &val2));
EXPECT_EQ(v_bye, val2);
auto v_bye = Value::MakeString(llvm::StringRef("bye"));
val = d.ReadValue(NT_STRING);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_bye, *val);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadValue(NT_STRING, &val));
ASSERT_FALSE(d.ReadValue(NT_STRING));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadRawValue3) {
raw_mem_istream is("\x05hello\x03" "bye\x55", 11);
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_RAW, &val));
EXPECT_EQ(v_raw, val);
auto val = d.ReadValue(NT_RAW);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_raw, *val);
Value val2;
Value v_bye;
v_bye.SetRaw("bye");
ASSERT_TRUE(d.ReadValue(NT_RAW, &val2));
EXPECT_EQ(v_bye, val2);
auto v_bye = Value::MakeRaw(llvm::StringRef("bye"));
val = d.ReadValue(NT_RAW);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_bye, *val);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadValue(NT_RAW, &val));
ASSERT_FALSE(d.ReadValue(NT_RAW));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadBooleanArrayValue3) {
raw_mem_istream is("\x03\x00\x01\x00\x02\x01\x00\xff", 8);
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
EXPECT_EQ(v_boolean_array, val);
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean_array, *val);
Value val2;
Value v_boolean_array2;
v_boolean_array2.SetBooleanArray(std::vector<int>{1, 0});
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN_ARRAY, &val2));
EXPECT_EQ(v_boolean_array2, val2);
auto v_boolean_array2 = Value::MakeBooleanArray(std::vector<int>{1, 0});
val = d.ReadValue(NT_BOOLEAN_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean_array2, *val);
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -484,11 +468,11 @@ TEST_F(WireDecoderTest, ReadBooleanArrayBigValue3) {
s.append(255, '\x00');
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
EXPECT_EQ(v_boolean_array_big, val);
auto val = d.ReadValue(NT_BOOLEAN_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_boolean_array_big, *val);
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_BOOLEAN_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -498,15 +482,15 @@ TEST_F(WireDecoderTest, ReadDoubleArrayValue3) {
"\x3f\xd0\x00\x00\x00\x00\x00\x00\x55",
18);
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
EXPECT_EQ(v_double_array, val);
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double_array, *val);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -516,26 +500,26 @@ TEST_F(WireDecoderTest, ReadDoubleArrayBigValue3) {
s.append(255*8, '\x00');
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
EXPECT_EQ(v_double_array_big, val);
auto val = d.ReadValue(NT_DOUBLE_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_double_array_big, *val);
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_DOUBLE_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadStringArrayValue3) {
raw_mem_istream is("\x02\x05hello\x07goodbye\x55", 16);
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_STRING_ARRAY, &val));
EXPECT_EQ(v_string_array, val);
auto val = d.ReadValue(NT_STRING_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_string_array, *val);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
@@ -546,19 +530,18 @@ TEST_F(WireDecoderTest, ReadStringArrayBigValue3) {
s.append("\x01h", 2);
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0300u);
Value val;
ASSERT_TRUE(d.ReadValue(NT_STRING_ARRAY, &val));
EXPECT_EQ(v_string_array_big, val);
auto val = d.ReadValue(NT_STRING_ARRAY);
ASSERT_TRUE(bool(val));
EXPECT_EQ(*v_string_array_big, *val);
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY, &val));
ASSERT_FALSE(d.ReadValue(NT_STRING_ARRAY));
ASSERT_EQ(nullptr, d.error());
}
TEST_F(WireDecoderTest, ReadValueError3) {
raw_mem_istream is("", 0);
WireDecoder d(is, 0x0200u);
Value val;
ASSERT_FALSE(d.ReadValue(NT_UNASSIGNED, &val)); // unassigned
ASSERT_FALSE(d.ReadValue(NT_UNASSIGNED)); // unassigned
ASSERT_NE(nullptr, d.error());
}
@@ -573,19 +556,19 @@ TEST_F(WireDecoderTest, ReadString2) {
s.push_back('\x55');
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0200u);
StringValue sv;
ASSERT_TRUE(d.ReadString(&sv));
EXPECT_EQ(sv_normal, sv);
ASSERT_TRUE(d.ReadString(&sv));
EXPECT_EQ(sv_long, sv);
ASSERT_TRUE(d.ReadString(&sv));
EXPECT_EQ(sv_big2, sv);
std::string outs;
ASSERT_TRUE(d.ReadString(&outs));
EXPECT_EQ(s_normal, outs);
ASSERT_TRUE(d.ReadString(&outs));
EXPECT_EQ(s_long, outs);
ASSERT_TRUE(d.ReadString(&outs));
EXPECT_EQ(s_big2, outs);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadString(&sv));
ASSERT_FALSE(d.ReadString(&outs));
ASSERT_EQ(nullptr, d.error());
}
@@ -600,19 +583,19 @@ TEST_F(WireDecoderTest, ReadString3) {
s.push_back('\x55');
raw_mem_istream is(s.data(), s.size());
WireDecoder d(is, 0x0300u);
StringValue sv;
ASSERT_TRUE(d.ReadString(&sv));
EXPECT_EQ(sv_normal, sv);
ASSERT_TRUE(d.ReadString(&sv));
EXPECT_EQ(sv_long, sv);
ASSERT_TRUE(d.ReadString(&sv));
EXPECT_EQ(sv_big3, sv);
std::string outs;
ASSERT_TRUE(d.ReadString(&outs));
EXPECT_EQ(s_normal, outs);
ASSERT_TRUE(d.ReadString(&outs));
EXPECT_EQ(s_long, outs);
ASSERT_TRUE(d.ReadString(&outs));
EXPECT_EQ(s_big3, outs);
unsigned int b;
ASSERT_TRUE(d.Read8(&b));
EXPECT_EQ(0x55u, b);
ASSERT_FALSE(d.ReadString(&sv));
ASSERT_FALSE(d.ReadString(&outs));
ASSERT_EQ(nullptr, d.error());
}