| Index: base/strings/utf_offset_string_conversions_unittest.cc
|
| diff --git a/base/strings/utf_offset_string_conversions_unittest.cc b/base/strings/utf_offset_string_conversions_unittest.cc
|
| index 5786bdf4873c9ad593d3a07e7a0969239dfe81d5..b50e1b69bfc2346e2c5d6d3901f9af86714801f4 100644
|
| --- a/base/strings/utf_offset_string_conversions_unittest.cc
|
| +++ b/base/strings/utf_offset_string_conversions_unittest.cc
|
| @@ -162,6 +162,64 @@ TEST(UTFOffsetStringConversionsTest, AdjustOffsets) {
|
| }
|
| }
|
|
|
| +TEST(UTFOffsetStringConversionsTest, UnadjustOffsets) {
|
| + // Imagine we have strings as shown in the following cases where the
|
| + // X's represent encoded characters.
|
| + // 1: abcXXXdef ==> abcXdef
|
| + {
|
| + std::vector<size_t> offsets;
|
| + for (size_t t = 0; t <= 7; ++t)
|
| + offsets.push_back(t);
|
| + OffsetAdjuster::Adjustments adjustments;
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(3, 3, 1));
|
| + OffsetAdjuster::UnadjustOffsets(adjustments, &offsets);
|
| + size_t expected_1[] = {0, 1, 2, 3, 6, 7, 8, 9};
|
| + EXPECT_EQ(offsets.size(), arraysize(expected_1));
|
| + for (size_t i = 0; i < arraysize(expected_1); ++i)
|
| + EXPECT_EQ(expected_1[i], offsets[i]);
|
| + }
|
| +
|
| + // 2: XXXaXXXXbcXXXXXXXdefXXX ==> XaXXbcXXXXdefX
|
| + {
|
| + std::vector<size_t> offsets;
|
| + for (size_t t = 0; t <= 14; ++t)
|
| + offsets.push_back(t);
|
| + OffsetAdjuster::Adjustments adjustments;
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(0, 3, 1));
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(4, 4, 2));
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(10, 7, 4));
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(20, 3, 1));
|
| + OffsetAdjuster::UnadjustOffsets(adjustments, &offsets);
|
| + size_t expected_2[] = {
|
| + 0, 3, 4, kNpos, 8, 9, 10, kNpos, kNpos, kNpos, 17, 18, 19, 20, 23
|
| + };
|
| + EXPECT_EQ(offsets.size(), arraysize(expected_2));
|
| + for (size_t i = 0; i < arraysize(expected_2); ++i)
|
| + EXPECT_EQ(expected_2[i], offsets[i]);
|
| + }
|
| +
|
| + // 3: XXXaXXXXbcdXXXeXX ==> aXXXXbcdXXXe
|
| + {
|
| + std::vector<size_t> offsets;
|
| + for (size_t t = 0; t <= 12; ++t)
|
| + offsets.push_back(t);
|
| + OffsetAdjuster::Adjustments adjustments;
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(0, 3, 0));
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(4, 4, 4));
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(11, 3, 3));
|
| + adjustments.push_back(OffsetAdjuster::Adjustment(15, 2, 0));
|
| + OffsetAdjuster::UnadjustOffsets(adjustments, &offsets);
|
| + size_t expected_3[] = {
|
| + 0, // this could just as easily be 3
|
| + 4, kNpos, kNpos, kNpos, 8, 9, 10, 11, kNpos, kNpos, 14,
|
| + 15 // this could just as easily be 17
|
| + };
|
| + EXPECT_EQ(offsets.size(), arraysize(expected_3));
|
| + for (size_t i = 0; i < arraysize(expected_3); ++i)
|
| + EXPECT_EQ(expected_3[i], offsets[i]);
|
| + }
|
| +}
|
| +
|
| // MergeSequentialAdjustments is used by net/base/escape.{h,cc} and
|
| // net/base/net_util.{h,cc}. The two tests EscapeTest.AdjustOffset and
|
| // NetUtilTest.FormatUrlWithOffsets test its behavior extensively. This
|
|
|