|
|
|
@ -31,9 +31,6 @@ |
|
|
|
|
|
|
|
|
|
extern thread_local bool cord_ring; |
|
|
|
|
|
|
|
|
|
// TOOD(b/177688959): weird things happened with the original test
|
|
|
|
|
#define ASAN_BUG_177688959_FIXED false |
|
|
|
|
|
|
|
|
|
namespace absl { |
|
|
|
|
ABSL_NAMESPACE_BEGIN |
|
|
|
|
namespace { |
|
|
|
@ -340,19 +337,15 @@ std::string TestParamToString(const testing::TestParamInfo<TestParam>& info) { |
|
|
|
|
class CordRingTest : public testing::Test { |
|
|
|
|
public: |
|
|
|
|
~CordRingTest() override { |
|
|
|
|
#if ASAN_BUG_177688959_FIXED |
|
|
|
|
for (CordRep* rep : unrefs_) { |
|
|
|
|
CordRep::Unref(rep); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename CordRepType> |
|
|
|
|
CordRepType* NeedsUnref(CordRepType* rep) { |
|
|
|
|
assert(rep); |
|
|
|
|
#if ASAN_BUG_177688959_FIXED |
|
|
|
|
unrefs_.push_back(rep); |
|
|
|
|
#endif |
|
|
|
|
return rep; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -362,26 +355,16 @@ class CordRingTest : public testing::Test { |
|
|
|
|
return NeedsUnref(rep); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Unref(CordRep* rep) { |
|
|
|
|
#if !ASAN_BUG_177688959_FIXED |
|
|
|
|
CordRep::Unref(rep); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
#if ASAN_BUG_177688959_FIXED |
|
|
|
|
std::vector<CordRep*> unrefs_; |
|
|
|
|
#endif |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
class CordRingTestWithParam : public testing::TestWithParam<TestParam> { |
|
|
|
|
public: |
|
|
|
|
~CordRingTestWithParam() override { |
|
|
|
|
#if ASAN_BUG_177688959_FIXED |
|
|
|
|
for (CordRep* rep : unrefs_) { |
|
|
|
|
CordRep::Unref(rep); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CordRepRing* CreateWithCapacity(CordRep* child, size_t extra_capacity) { |
|
|
|
@ -400,9 +383,7 @@ class CordRingTestWithParam : public testing::TestWithParam<TestParam> { |
|
|
|
|
template <typename CordRepType> |
|
|
|
|
CordRepType* NeedsUnref(CordRepType* rep) { |
|
|
|
|
assert(rep); |
|
|
|
|
#if ASAN_BUG_177688959_FIXED |
|
|
|
|
unrefs_.push_back(rep); |
|
|
|
|
#endif |
|
|
|
|
return rep; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -412,43 +393,23 @@ class CordRingTestWithParam : public testing::TestWithParam<TestParam> { |
|
|
|
|
return NeedsUnref(rep); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Unref(CordRep* rep) { |
|
|
|
|
#if !ASAN_BUG_177688959_FIXED |
|
|
|
|
CordRep::Unref(rep); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename CordRepType> |
|
|
|
|
CordRepType* RefIfShared(CordRepType* rep) { |
|
|
|
|
return Shared() ? Ref(rep) : rep; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UnrefIfShared(CordRep* rep) { |
|
|
|
|
if (Shared()) Unref(rep); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename CordRepType> |
|
|
|
|
CordRepType* RefIfInputShared(CordRepType* rep) { |
|
|
|
|
return InputShared() ? Ref(rep) : rep; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UnrefIfInputShared(CordRep* rep) { |
|
|
|
|
if (InputShared()) Unref(rep); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename CordRepType> |
|
|
|
|
CordRepType* RefIfInputSharedIndirect(CordRepType* rep) { |
|
|
|
|
return InputSharedIndirect() ? Ref(rep) : rep; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UnrefIfInputSharedIndirect(CordRep* rep) { |
|
|
|
|
if (InputSharedIndirect()) Unref(rep); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
#if ASAN_BUG_177688959_FIXED |
|
|
|
|
std::vector<CordRep*> unrefs_; |
|
|
|
|
#endif |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
class CordRingCreateTest : public CordRingTestWithParam { |
|
|
|
@ -520,26 +481,26 @@ class CordRingBuildInputTest : public CordRingTestWithParam { |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(WithParam, CordRingSubTest, |
|
|
|
|
testing::ValuesIn(CordRingSubTest::CreateTestParams()), |
|
|
|
|
TestParamToString); |
|
|
|
|
INSTANTIATE_TEST_SUITE_P(WithParam, CordRingSubTest, |
|
|
|
|
testing::ValuesIn(CordRingSubTest::CreateTestParams()), |
|
|
|
|
TestParamToString); |
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P( |
|
|
|
|
INSTANTIATE_TEST_SUITE_P( |
|
|
|
|
WithParam, CordRingCreateTest, |
|
|
|
|
testing::ValuesIn(CordRingCreateTest::CreateTestParams()), |
|
|
|
|
TestParamToString); |
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P( |
|
|
|
|
INSTANTIATE_TEST_SUITE_P( |
|
|
|
|
WithParam, CordRingCreateFromTreeTest, |
|
|
|
|
testing::ValuesIn(CordRingCreateFromTreeTest::CreateTestParams()), |
|
|
|
|
TestParamToString); |
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P( |
|
|
|
|
INSTANTIATE_TEST_SUITE_P( |
|
|
|
|
WithParam, CordRingBuildTest, |
|
|
|
|
testing::ValuesIn(CordRingBuildTest::CreateTestParams()), |
|
|
|
|
TestParamToString); |
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P( |
|
|
|
|
INSTANTIATE_TEST_SUITE_P( |
|
|
|
|
WithParam, CordRingBuildInputTest, |
|
|
|
|
testing::ValuesIn(CordRingBuildInputTest::CreateTestParams()), |
|
|
|
|
TestParamToString); |
|
|
|
@ -550,7 +511,6 @@ TEST_P(CordRingCreateTest, CreateFromFlat) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size())); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1)); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateTest, CreateFromRing) { |
|
|
|
@ -559,8 +519,6 @@ TEST_P(CordRingCreateTest, CreateFromRing) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivate(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAreArray(kFoxFlats)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringRing) { |
|
|
|
@ -570,23 +528,20 @@ TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringRing) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfInputPrivate(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToString(result), string_view(kFox).substr(2, 11)); |
|
|
|
|
UnrefIfInputSharedIndirect(ring); |
|
|
|
|
UnrefIfInputShared(sub); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, CreateWithIllegalExtraCapacity) { |
|
|
|
|
CordRep* flat = NeedsUnref(MakeFlat("Hello world")); |
|
|
|
|
#if defined(ABSL_HAVE_EXCEPTIONS) |
|
|
|
|
CordRep* flat = NeedsUnref(MakeFlat("Hello world")); |
|
|
|
|
try { |
|
|
|
|
CordRepRing::Create(flat, CordRepRing::kMaxCapacity); |
|
|
|
|
GTEST_FAIL() << "expected std::length_error exception"; |
|
|
|
|
} catch (const std::length_error&) { |
|
|
|
|
} |
|
|
|
|
#elif defined(GTEST_HAS_DEATH_TEST) |
|
|
|
|
CordRep* flat = NeedsUnref(MakeFlat("Hello world")); |
|
|
|
|
EXPECT_DEATH(CordRepRing::Create(flat, CordRepRing::kMaxCapacity), ".*"); |
|
|
|
|
#endif |
|
|
|
|
Unref(flat); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringOfFlat) { |
|
|
|
@ -597,9 +552,6 @@ TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringOfFlat) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result->length, Eq(20)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1.substr(4, 20))); |
|
|
|
|
Unref(result); |
|
|
|
|
UnrefIfInputShared(flat); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateTest, CreateFromExternal) { |
|
|
|
@ -609,8 +561,6 @@ TEST_P(CordRingCreateTest, CreateFromExternal) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size())); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1)); |
|
|
|
|
Unref(result); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringOfExternal) { |
|
|
|
@ -621,9 +571,6 @@ TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringOfExternal) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result->length, Eq(24)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1.substr(1, 24))); |
|
|
|
|
Unref(result); |
|
|
|
|
UnrefIfInputShared(external); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringOfLargeExternal) { |
|
|
|
@ -637,9 +584,6 @@ TEST_P(CordRingCreateFromTreeTest, CreateFromSubstringOfLargeExternal) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result->length, Eq(str.size())); |
|
|
|
|
EXPECT_THAT(ToRawFlats(result), ElementsAre(str)); |
|
|
|
|
Unref(result); |
|
|
|
|
UnrefIfInputShared(external); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, CreateFromConcat) { |
|
|
|
@ -652,10 +596,6 @@ TEST_P(CordRingBuildInputTest, CreateFromConcat) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result->length, Eq(26)); |
|
|
|
|
EXPECT_THAT(ToString(result), Eq(kAlphabet)); |
|
|
|
|
UnrefIfInputSharedIndirect(flats[0]); |
|
|
|
|
UnrefIfInputSharedIndirect(flats[3]); |
|
|
|
|
UnrefIfInputShared(concat); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, CreateFromSubstringConcat) { |
|
|
|
@ -671,10 +611,6 @@ TEST_P(CordRingBuildInputTest, CreateFromSubstringConcat) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
ASSERT_THAT(result->length, Eq(len)); |
|
|
|
|
ASSERT_THAT(ToString(result), string_view(kAlphabet).substr(off, len)); |
|
|
|
|
UnrefIfInputSharedIndirect(flats[0]); |
|
|
|
|
UnrefIfInputSharedIndirect(flats[3]); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -689,7 +625,6 @@ TEST_P(CordRingCreateTest, Properties) { |
|
|
|
|
EXPECT_THAT(result->capacity(), Le(2 * 120 + 1)); |
|
|
|
|
EXPECT_THAT(result->entries(), Eq(1)); |
|
|
|
|
EXPECT_THAT(result->begin_pos(), Eq(0)); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateTest, EntryForNewFlat) { |
|
|
|
@ -700,7 +635,6 @@ TEST_P(CordRingCreateTest, EntryForNewFlat) { |
|
|
|
|
EXPECT_THAT(result->entry_child(0), Eq(child)); |
|
|
|
|
EXPECT_THAT(result->entry_end_pos(0), Eq(str1.length())); |
|
|
|
|
EXPECT_THAT(result->entry_data_offset(0), Eq(0)); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingCreateTest, EntryForNewFlatSubstring) { |
|
|
|
@ -712,7 +646,6 @@ TEST_P(CordRingCreateTest, EntryForNewFlatSubstring) { |
|
|
|
|
EXPECT_THAT(result->entry_child(0), Eq(child)); |
|
|
|
|
EXPECT_THAT(result->entry_end_pos(0), Eq(26)); |
|
|
|
|
EXPECT_THAT(result->entry_data_offset(0), Eq(10)); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendFlat) { |
|
|
|
@ -724,8 +657,6 @@ TEST_P(CordRingBuildTest, AppendFlat) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size() + str2.size())); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1, str2)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, PrependFlat) { |
|
|
|
@ -737,8 +668,6 @@ TEST_P(CordRingBuildTest, PrependFlat) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size() + str2.size())); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str2, str1)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendString) { |
|
|
|
@ -750,8 +679,6 @@ TEST_P(CordRingBuildTest, AppendString) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size() + str2.size())); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1, str2)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendStringHavingExtra) { |
|
|
|
@ -762,8 +689,6 @@ TEST_P(CordRingBuildTest, AppendStringHavingExtra) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size() + str2.size())); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivate(GetParam(), ring)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendStringHavingPartialExtra) { |
|
|
|
@ -790,8 +715,6 @@ TEST_P(CordRingBuildTest, AppendStringHavingPartialExtra) { |
|
|
|
|
} else { |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1, str2)); |
|
|
|
|
} |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendStringHavingExtraInSubstring) { |
|
|
|
@ -808,8 +731,6 @@ TEST_P(CordRingBuildTest, AppendStringHavingExtraInSubstring) { |
|
|
|
|
} else { |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("1234", str2)); |
|
|
|
|
} |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendStringHavingSharedExtra) { |
|
|
|
@ -839,8 +760,6 @@ TEST_P(CordRingBuildTest, AppendStringHavingSharedExtra) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(result->length, Eq(4 + str2.size())); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("1234", str2)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
|
|
|
|
|
CordRep::Unref(shared_type == 1 ? flat1 : flat); |
|
|
|
|
} |
|
|
|
@ -857,8 +776,6 @@ TEST_P(CordRingBuildTest, AppendStringWithExtra) { |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size() + str2.size() + str3.size())); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str1, StrCat(str2, str3))); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, PrependString) { |
|
|
|
@ -875,8 +792,6 @@ TEST_P(CordRingBuildTest, PrependString) { |
|
|
|
|
} |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size() + str2.size())); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str2, str1)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, PrependStringHavingExtra) { |
|
|
|
@ -893,8 +808,6 @@ TEST_P(CordRingBuildTest, PrependStringHavingExtra) { |
|
|
|
|
} else { |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str2, "1234")); |
|
|
|
|
} |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, PrependStringHavingSharedExtra) { |
|
|
|
@ -921,8 +834,6 @@ TEST_P(CordRingBuildTest, PrependStringHavingSharedExtra) { |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1a.size() + str2.size())); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(str2, str1a)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
CordRep::Unref(shared_type == 1 ? flat1 : flat); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -938,8 +849,6 @@ TEST_P(CordRingBuildTest, PrependStringWithExtra) { |
|
|
|
|
EXPECT_THAT(result->length, Eq(str1.size() + str2.size() + str3.size())); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre(StrCat(str3, str2), str1)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendPrependStringMix) { |
|
|
|
@ -950,12 +859,10 @@ TEST_P(CordRingBuildTest, AppendPrependStringMix) { |
|
|
|
|
result = CordRepRing::Prepend(result, flats[4 - i]); |
|
|
|
|
result = CordRepRing::Append(result, flats[4 + i]); |
|
|
|
|
} |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
NeedsUnref(result); |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToString(result), kFox); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendPrependStringMixWithExtra) { |
|
|
|
@ -976,8 +883,6 @@ TEST_P(CordRingBuildTest, AppendPrependStringMixWithExtra) { |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("The quick brown fox ", "jumps ", |
|
|
|
|
"over the lazy dog")); |
|
|
|
|
} |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendPrependStringMixWithPrependedExtra) { |
|
|
|
@ -998,8 +903,6 @@ TEST_P(CordRingBuildTest, AppendPrependStringMixWithPrependedExtra) { |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("The quick brown fox ", "jumps ", |
|
|
|
|
"over the lazy dog")); |
|
|
|
|
} |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingSubTest, SubRing) { |
|
|
|
@ -1011,7 +914,6 @@ TEST_P(CordRingSubTest, SubRing) { |
|
|
|
|
CordRepRing* ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
|
CordRepRing* result = CordRepRing::SubRing(ring, offset, 0); |
|
|
|
|
EXPECT_THAT(result, nullptr); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
|
|
|
|
|
for (size_t len = 1; len < all.size() - offset; ++len) { |
|
|
|
|
ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
@ -1019,8 +921,6 @@ TEST_P(CordRingSubTest, SubRing) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
ASSERT_THAT(result, EqIfPrivate(GetParam(), ring)); |
|
|
|
|
ASSERT_THAT(ToString(result), Eq(all.substr(offset, len))); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1039,7 +939,6 @@ TEST_P(CordRingSubTest, SubRingFromLargeExternal) { |
|
|
|
|
CordRepRing* ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
|
CordRepRing* result = CordRepRing::SubRing(ring, offset, 0); |
|
|
|
|
EXPECT_THAT(result, nullptr); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
|
|
|
|
|
for (size_t len = all.size() - 30; len < all.size() - offset; ++len) { |
|
|
|
|
ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
@ -1049,8 +948,6 @@ TEST_P(CordRingSubTest, SubRingFromLargeExternal) { |
|
|
|
|
auto str = ToString(result); |
|
|
|
|
ASSERT_THAT(str, SizeIs(len)); |
|
|
|
|
ASSERT_THAT(str, Eq(all.substr(offset, len))); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1063,7 +960,6 @@ TEST_P(CordRingSubTest, RemovePrefix) { |
|
|
|
|
CordRepRing* ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
|
CordRepRing* result = CordRepRing::RemovePrefix(ring, all.size()); |
|
|
|
|
EXPECT_THAT(result, nullptr); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
|
|
|
|
|
for (size_t len = 1; len < all.size(); ++len) { |
|
|
|
|
ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
@ -1071,8 +967,6 @@ TEST_P(CordRingSubTest, RemovePrefix) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivate(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToString(result), Eq(all.substr(len))); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1087,7 +981,6 @@ TEST_P(CordRingSubTest, RemovePrefixFromLargeExternal) { |
|
|
|
|
ElementsAre( |
|
|
|
|
not_a_string_view(external1->base, 1 << 20).remove_prefix(1 << 16), |
|
|
|
|
not_a_string_view(external2->base, 1 << 20))); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingSubTest, RemoveSuffix) { |
|
|
|
@ -1098,7 +991,6 @@ TEST_P(CordRingSubTest, RemoveSuffix) { |
|
|
|
|
CordRepRing* ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
|
CordRepRing* result = CordRepRing::RemoveSuffix(ring, all.size()); |
|
|
|
|
EXPECT_THAT(result, nullptr); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
|
|
|
|
|
for (size_t len = 1; len < all.size(); ++len) { |
|
|
|
|
ring = RefIfShared(FromFlats(flats, composition)); |
|
|
|
@ -1106,8 +998,6 @@ TEST_P(CordRingSubTest, RemoveSuffix) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivate(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToString(result), Eq(all.substr(0, all.size() - len))); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1121,8 +1011,6 @@ TEST_P(CordRingSubTest, AppendRing) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivate(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAreArray(kFoxFlats)); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, AppendRingWithFlatOffset) { |
|
|
|
@ -1137,9 +1025,6 @@ TEST_P(CordRingBuildInputTest, AppendRingWithFlatOffset) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("Head", "brown ", "fox ", "jumps ", |
|
|
|
|
"over ", "the ", "lazy ", "dog")); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, AppendRingWithBrokenOffset) { |
|
|
|
@ -1154,9 +1039,6 @@ TEST_P(CordRingBuildInputTest, AppendRingWithBrokenOffset) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), |
|
|
|
|
ElementsAre("Head", "umps ", "over ", "the ", "lazy ", "dog")); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, AppendRingWithFlatLength) { |
|
|
|
@ -1171,9 +1053,6 @@ TEST_P(CordRingBuildInputTest, AppendRingWithFlatLength) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("Head", "The ", "quick ", "brown ", |
|
|
|
|
"fox ", "jumps ", "over ", "the ")); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendRingWithBrokenFlatLength) { |
|
|
|
@ -1188,9 +1067,6 @@ TEST_P(CordRingBuildTest, AppendRingWithBrokenFlatLength) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("Head", "The ", "quick ", "brown ", |
|
|
|
|
"fox ", "jumps ", "ov")); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendRingMiddlePiece) { |
|
|
|
@ -1205,9 +1081,6 @@ TEST_P(CordRingBuildTest, AppendRingMiddlePiece) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), |
|
|
|
|
ElementsAre("Head", "ck ", "brown ", "fox ", "jum")); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildTest, AppendRingSinglePiece) { |
|
|
|
@ -1221,10 +1094,6 @@ TEST_P(CordRingBuildTest, AppendRingSinglePiece) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("Head", "row")); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
UnrefIfInputShared(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, AppendRingSinglePieceWithPrefix) { |
|
|
|
@ -1242,10 +1111,6 @@ TEST_P(CordRingBuildInputTest, AppendRingSinglePieceWithPrefix) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("Prepend", "Head", "row")); |
|
|
|
|
UnrefIfInputSharedIndirect(child); |
|
|
|
|
UnrefIfInputShared(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRing) { |
|
|
|
@ -1259,9 +1124,6 @@ TEST_P(CordRingBuildInputTest, PrependRing) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAreArray(kFoxFlats)); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRingWithFlatOffset) { |
|
|
|
@ -1276,10 +1138,6 @@ TEST_P(CordRingBuildInputTest, PrependRingWithFlatOffset) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("brown ", "fox ", "jumps ", "over ", |
|
|
|
|
"the ", "lazy ", "dog", "Tail")); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfInputSharedIndirect(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRingWithBrokenOffset) { |
|
|
|
@ -1293,10 +1151,6 @@ TEST_P(CordRingBuildInputTest, PrependRingWithBrokenOffset) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), |
|
|
|
|
ElementsAre("umps ", "over ", "the ", "lazy ", "dog", "Tail")); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfInputSharedIndirect(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRingWithFlatLength) { |
|
|
|
@ -1311,10 +1165,6 @@ TEST_P(CordRingBuildInputTest, PrependRingWithFlatLength) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("The ", "quick ", "brown ", "fox ", |
|
|
|
|
"jumps ", "over ", "the ", "Tail")); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfInputSharedIndirect(stripped); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRingWithBrokenFlatLength) { |
|
|
|
@ -1329,10 +1179,6 @@ TEST_P(CordRingBuildInputTest, PrependRingWithBrokenFlatLength) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("The ", "quick ", "brown ", "fox ", |
|
|
|
|
"jumps ", "ov", "Tail")); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfInputSharedIndirect(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRingMiddlePiece) { |
|
|
|
@ -1348,10 +1194,6 @@ TEST_P(CordRingBuildInputTest, PrependRingMiddlePiece) { |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), |
|
|
|
|
ElementsAre("ck ", "brown ", "fox ", "jum", "Tail")); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfInputSharedIndirect(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRingSinglePiece) { |
|
|
|
@ -1365,10 +1207,6 @@ TEST_P(CordRingBuildInputTest, PrependRingSinglePiece) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("row", "Tail")); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfInputSharedIndirect(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_P(CordRingBuildInputTest, PrependRingSinglePieceWithPrefix) { |
|
|
|
@ -1385,10 +1223,6 @@ TEST_P(CordRingBuildInputTest, PrependRingSinglePieceWithPrefix) { |
|
|
|
|
ASSERT_THAT(result, IsValidRingBuffer()); |
|
|
|
|
EXPECT_THAT(result, EqIfPrivateAndCapacity(GetParam(), ring)); |
|
|
|
|
EXPECT_THAT(ToFlats(result), ElementsAre("row", "Prepend", "Tail")); |
|
|
|
|
UnrefIfInputShared(child); |
|
|
|
|
UnrefIfInputSharedIndirect(stripped); |
|
|
|
|
UnrefIfShared(ring); |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, Find) { |
|
|
|
@ -1406,7 +1240,6 @@ TEST_F(CordRingTest, Find) { |
|
|
|
|
ASSERT_THAT(found.offset, Lt(data.length())); |
|
|
|
|
ASSERT_THAT(data[found.offset], Eq(value[i])); |
|
|
|
|
} |
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, FindWithHint) { |
|
|
|
@ -1442,7 +1275,6 @@ TEST_F(CordRingTest, FindWithHint) { |
|
|
|
|
++flat_pos; |
|
|
|
|
flat_offset += flat.length(); |
|
|
|
|
} |
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, FindInLargeRing) { |
|
|
|
@ -1464,7 +1296,6 @@ TEST_F(CordRingTest, FindInLargeRing) { |
|
|
|
|
ASSERT_THAT(pos.offset, Lt(data.length())); |
|
|
|
|
ASSERT_THAT(data[pos.offset], Eq(value[i])); |
|
|
|
|
} |
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, FindTail) { |
|
|
|
@ -1483,7 +1314,6 @@ TEST_F(CordRingTest, FindTail) { |
|
|
|
|
ASSERT_THAT(pos.offset, Lt(data.length())); |
|
|
|
|
ASSERT_THAT(data[data.length() - pos.offset - 1], Eq(value[i])); |
|
|
|
|
} |
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, FindTailWithHint) { |
|
|
|
@ -1510,7 +1340,6 @@ TEST_F(CordRingTest, FindTailWithHint) { |
|
|
|
|
ASSERT_THAT(pos.offset, Lt(data.length())); |
|
|
|
|
ASSERT_THAT(data[data.length() - pos.offset - 1], Eq(value[i])); |
|
|
|
|
} |
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, FindTailInLargeRing) { |
|
|
|
@ -1532,7 +1361,6 @@ TEST_F(CordRingTest, FindTailInLargeRing) { |
|
|
|
|
ASSERT_THAT(pos.offset, Lt(data.length())); |
|
|
|
|
ASSERT_THAT(data[data.length() - pos.offset - 1], Eq(value[i])); |
|
|
|
|
} |
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, GetCharacter) { |
|
|
|
@ -1544,7 +1372,6 @@ TEST_F(CordRingTest, GetCharacter) { |
|
|
|
|
for (int i = 0; i < value.length(); ++i) { |
|
|
|
|
ASSERT_THAT(result->GetCharacter(i), Eq(value[i])); |
|
|
|
|
} |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, GetCharacterWithSubstring) { |
|
|
|
@ -1556,7 +1383,6 @@ TEST_F(CordRingTest, GetCharacterWithSubstring) { |
|
|
|
|
for (int i = 0; i < value.length(); ++i) { |
|
|
|
|
ASSERT_THAT(result->GetCharacter(i), Eq(value[i])); |
|
|
|
|
} |
|
|
|
|
Unref(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(CordRingTest, IsFlatSingleFlat) { |
|
|
|
@ -1581,8 +1407,6 @@ TEST_F(CordRingTest, IsFlatSingleFlat) { |
|
|
|
|
EXPECT_THAT(fragment, Eq("ello")); |
|
|
|
|
EXPECT_TRUE(ring->IsFlat(6, 5, &fragment)); |
|
|
|
|
EXPECT_THAT(fragment, Eq("world")); |
|
|
|
|
|
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1619,8 +1443,6 @@ TEST_F(CordRingTest, IsFlatMultiFlat) { |
|
|
|
|
EXPECT_FALSE(ring->IsFlat(1, 18, &fragment)); |
|
|
|
|
EXPECT_FALSE(ring->IsFlat(10, 2, &fragment)); |
|
|
|
|
EXPECT_THAT(fragment, Eq("Don't touch this")); |
|
|
|
|
|
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1629,7 +1451,6 @@ TEST_F(CordRingTest, Dump) { |
|
|
|
|
auto flats = MakeSpan(kFoxFlats); |
|
|
|
|
CordRepRing* ring = NeedsUnref(FromFlats(flats, kPrepend)); |
|
|
|
|
ss << *ring; |
|
|
|
|
Unref(ring); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|