Chromium Code Reviews| Index: third_party/WebKit/Source/core/editing/markers/DocumentMarkerListTest.cpp |
| diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListTest.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListTest.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..163ccab63eccd7146d71860d89027ec5507d24ad |
| --- /dev/null |
| +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListTest.cpp |
| @@ -0,0 +1,373 @@ |
| +// Copyright 2017 The Chromium 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 "core/editing/markers/DocumentMarkerList.h" |
| + |
| +#include "platform/heap/Handle.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace blink { |
| + |
| +class DocumentMarkerListForTesting : public DocumentMarkerList { |
| + public: |
| + DocumentMarkerListForTesting() {} |
| + |
| + DocumentMarker::MarkerType allowedMarkerType() const final { |
| + return DocumentMarker::Composition; |
| + } |
| + |
| + protected: |
| + bool markerListIsSorted() const final { return false; } |
| +}; |
| + |
| +class SortedDocumentMarkerListForTesting : public DocumentMarkerList { |
| + public: |
| + SortedDocumentMarkerListForTesting() {} |
| + |
| + DocumentMarker::MarkerType allowedMarkerType() const final { |
| + return DocumentMarker::Composition; |
| + } |
| + |
| + protected: |
| + bool markerListIsSorted() const final { return true; } |
| +}; |
| + |
| +class DocumentMarkerListTest : public ::testing::Test { |
| + protected: |
| + DocumentMarkerListTest() |
| + : m_markerList(new DocumentMarkerListForTesting()), |
| + m_sortedMarkerList(new SortedDocumentMarkerListForTesting()) {} |
| + |
| + DocumentMarker* createMarker(unsigned startOffset, unsigned endOffset) { |
| + return new DocumentMarker(startOffset, endOffset, Color::black, false, |
| + Color::black); |
| + } |
| + |
| + Persistent<DocumentMarkerListForTesting> m_markerList; |
| + Persistent<SortedDocumentMarkerListForTesting> m_sortedMarkerList; |
| +}; |
| + |
| +TEST_F(DocumentMarkerListTest, |
| + RemoveMarkersSortedDoRemovePartiallyOverlapping) { |
|
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
|
| + m_sortedMarkerList->add(createMarker(0, 5)); |
| + m_sortedMarkerList->add(createMarker(10, 15)); |
| + m_sortedMarkerList->add(createMarker(20, 25)); |
| + m_sortedMarkerList->add(createMarker(30, 35)); |
| + m_sortedMarkerList->add(createMarker(40, 45)); |
| + |
| + EXPECT_EQ(5u, m_sortedMarkerList->size()); |
| + |
| + // test no-op remove |
| + EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(100, 100, true)); |
| + EXPECT_EQ(5u, m_sortedMarkerList->size()); |
| + |
| + // remove middle marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(20, 2, true)); |
| + EXPECT_EQ(4u, m_sortedMarkerList->size()); |
| + |
| + EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); |
| + EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); |
| + EXPECT_EQ(15u, m_sortedMarkerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_sortedMarkerList->at(2)->startOffset()); |
| + EXPECT_EQ(35u, m_sortedMarkerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(40u, m_sortedMarkerList->at(3)->startOffset()); |
| + EXPECT_EQ(45u, m_sortedMarkerList->at(3)->endOffset()); |
| + |
| + // remove middle two markers |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(13, 19, true)); |
| + EXPECT_EQ(2u, m_sortedMarkerList->size()); |
| + |
| + EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); |
| + EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(40u, m_sortedMarkerList->at(1)->startOffset()); |
| + EXPECT_EQ(45u, m_sortedMarkerList->at(1)->endOffset()); |
| +} |
| + |
| +TEST_F(DocumentMarkerListTest, |
| + RemoveMarkersUnsortedDoRemovePartiallyOverlapping) { |
|
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
|
| + m_markerList->add(createMarker(40, 45)); |
| + m_markerList->add(createMarker(30, 35)); |
| + m_markerList->add(createMarker(20, 25)); |
| + m_markerList->add(createMarker(10, 15)); |
| + m_markerList->add(createMarker(0, 5)); |
| + |
| + EXPECT_EQ(5u, m_markerList->size()); |
| + |
| + // test no-op remove |
| + EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, |
| + m_markerList->removeMarkers(100, 100, true)); |
| + EXPECT_EQ(5u, m_markerList->size()); |
| + |
| + // remove middle marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_markerList->removeMarkers(20, 2, true)); |
| + EXPECT_EQ(4u, m_markerList->size()); |
| + |
| + EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_markerList->at(1)->startOffset()); |
| + EXPECT_EQ(35u, m_markerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_markerList->at(2)->startOffset()); |
| + EXPECT_EQ(15u, m_markerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(0u, m_markerList->at(3)->startOffset()); |
| + EXPECT_EQ(5u, m_markerList->at(3)->endOffset()); |
| + |
| + // remove middle two markers |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_markerList->removeMarkers(13, 19, true)); |
| + EXPECT_EQ(2u, m_markerList->size()); |
| + |
| + EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(0u, m_markerList->at(1)->startOffset()); |
| + EXPECT_EQ(5u, m_markerList->at(1)->endOffset()); |
| +} |
| + |
| +TEST_F(DocumentMarkerListTest, |
| + RemoveMarkersSortedDontRemovePartiallyOverlapping) { |
|
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
|
| + m_sortedMarkerList->add(createMarker(0, 5)); |
| + m_sortedMarkerList->add(createMarker(10, 15)); |
| + m_sortedMarkerList->add(createMarker(20, 25)); |
| + m_sortedMarkerList->add(createMarker(30, 35)); |
| + m_sortedMarkerList->add(createMarker(40, 45)); |
| + |
| + EXPECT_EQ(5u, m_sortedMarkerList->size()); |
| + |
| + // test no-op remove |
| + EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(100, 100, false)); |
| + EXPECT_EQ(5u, m_sortedMarkerList->size()); |
| + |
| + // remove chunk from beginning of middle marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(20, 2, false)); |
| + EXPECT_EQ(5u, m_sortedMarkerList->size()); |
| + |
| + EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); |
| + EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); |
| + EXPECT_EQ(15u, m_sortedMarkerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(22u, m_sortedMarkerList->at(2)->startOffset()); |
| + EXPECT_EQ(25u, m_sortedMarkerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_sortedMarkerList->at(3)->startOffset()); |
| + EXPECT_EQ(35u, m_sortedMarkerList->at(3)->endOffset()); |
| + |
| + EXPECT_EQ(40u, m_sortedMarkerList->at(4)->startOffset()); |
| + EXPECT_EQ(45u, m_sortedMarkerList->at(4)->endOffset()); |
| + |
| + // remove chunk from end of second marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(13, 2, false)); |
| + EXPECT_EQ(5u, m_sortedMarkerList->size()); |
| + |
| + EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); |
| + EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); |
| + EXPECT_EQ(13u, m_sortedMarkerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(22u, m_sortedMarkerList->at(2)->startOffset()); |
| + EXPECT_EQ(25u, m_sortedMarkerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_sortedMarkerList->at(3)->startOffset()); |
| + EXPECT_EQ(35u, m_sortedMarkerList->at(3)->endOffset()); |
| + |
| + EXPECT_EQ(40u, m_sortedMarkerList->at(4)->startOffset()); |
| + EXPECT_EQ(45u, m_sortedMarkerList->at(4)->endOffset()); |
| + |
| + // remove chunk from middle of fourth marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(31, 1, false)); |
| + EXPECT_EQ(6u, m_sortedMarkerList->size()); |
| + |
| + EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); |
| + EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); |
| + EXPECT_EQ(13u, m_sortedMarkerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(22u, m_sortedMarkerList->at(2)->startOffset()); |
| + EXPECT_EQ(25u, m_sortedMarkerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_sortedMarkerList->at(3)->startOffset()); |
| + EXPECT_EQ(31u, m_sortedMarkerList->at(3)->endOffset()); |
| + |
| + EXPECT_EQ(32u, m_sortedMarkerList->at(4)->startOffset()); |
| + EXPECT_EQ(35u, m_sortedMarkerList->at(4)->endOffset()); |
| + |
| + EXPECT_EQ(40u, m_sortedMarkerList->at(5)->startOffset()); |
| + EXPECT_EQ(45u, m_sortedMarkerList->at(5)->endOffset()); |
| + |
| + // remove middle four markers |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_sortedMarkerList->removeMarkers(10, 25, false)); |
| + EXPECT_EQ(2u, m_sortedMarkerList->size()); |
| + |
| + EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); |
| + EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(40u, m_sortedMarkerList->at(1)->startOffset()); |
| + EXPECT_EQ(45u, m_sortedMarkerList->at(1)->endOffset()); |
| +} |
| + |
| +TEST_F(DocumentMarkerListTest, |
| + RemoveMarkersUnsortedDontRemovePartiallyOverlapping) { |
|
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
|
| + m_markerList->add(createMarker(40, 45)); |
| + m_markerList->add(createMarker(30, 35)); |
| + m_markerList->add(createMarker(20, 25)); |
| + m_markerList->add(createMarker(10, 15)); |
| + m_markerList->add(createMarker(0, 5)); |
| + |
| + EXPECT_EQ(5u, m_markerList->size()); |
| + |
| + // test no-op remove |
| + EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, |
| + m_markerList->removeMarkers(100, 100, false)); |
| + EXPECT_EQ(5u, m_markerList->size()); |
| + |
| + // remove chunk from beginning of middle marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_markerList->removeMarkers(20, 2, false)); |
| + EXPECT_EQ(5u, m_markerList->size()); |
| + |
| + EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_markerList->at(1)->startOffset()); |
| + EXPECT_EQ(35u, m_markerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_markerList->at(2)->startOffset()); |
| + EXPECT_EQ(15u, m_markerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(0u, m_markerList->at(3)->startOffset()); |
| + EXPECT_EQ(5u, m_markerList->at(3)->endOffset()); |
| + |
| + EXPECT_EQ(22u, m_markerList->at(4)->startOffset()); |
| + EXPECT_EQ(25u, m_markerList->at(4)->endOffset()); |
| + |
| + // remove chunk from end of middle marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_markerList->removeMarkers(13, 2, false)); |
| + EXPECT_EQ(5u, m_markerList->size()); |
| + |
| + EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_markerList->at(1)->startOffset()); |
| + EXPECT_EQ(35u, m_markerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(0u, m_markerList->at(2)->startOffset()); |
| + EXPECT_EQ(5u, m_markerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(22u, m_markerList->at(3)->startOffset()); |
| + EXPECT_EQ(25u, m_markerList->at(3)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_markerList->at(4)->startOffset()); |
| + EXPECT_EQ(13u, m_markerList->at(4)->endOffset()); |
| + |
| + // remove chunk from middle of second marker |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_markerList->removeMarkers(31, 1, false)); |
| + EXPECT_EQ(6u, m_markerList->size()); |
| + |
| + EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(0u, m_markerList->at(1)->startOffset()); |
| + EXPECT_EQ(5u, m_markerList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(22u, m_markerList->at(2)->startOffset()); |
| + EXPECT_EQ(25u, m_markerList->at(2)->endOffset()); |
| + |
| + EXPECT_EQ(10u, m_markerList->at(3)->startOffset()); |
| + EXPECT_EQ(13u, m_markerList->at(3)->endOffset()); |
| + |
| + EXPECT_EQ(30u, m_markerList->at(4)->startOffset()); |
| + EXPECT_EQ(31u, m_markerList->at(4)->endOffset()); |
| + |
| + EXPECT_EQ(32u, m_markerList->at(5)->startOffset()); |
| + EXPECT_EQ(35u, m_markerList->at(5)->endOffset()); |
| + |
| + // remove all markers except 0 to 5 and 40 to 45 |
| + EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, |
| + m_markerList->removeMarkers(5, 35, false)); |
| + EXPECT_EQ(2u, m_markerList->size()); |
| + |
| + EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(0u, m_markerList->at(1)->startOffset()); |
| + EXPECT_EQ(5u, m_markerList->at(1)->endOffset()); |
| +} |
| + |
| +TEST_F(DocumentMarkerListTest, ShiftMarkersNoChange) { |
| + m_markerList->add(createMarker(0, 5)); |
| + |
| + EXPECT_EQ(false, m_markerList->shiftMarkers(10, 0, 5)); |
|
Xiaocheng
2017/03/27 22:38:20
The result is an enum.
|
| + EXPECT_EQ(1u, m_markerList->size()); |
| + |
| + EXPECT_EQ(0u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(5u, m_markerList->at(0)->endOffset()); |
| +} |
| + |
| +TEST_F(DocumentMarkerListTest, ShiftMarkersMarkerShifted) { |
| + m_markerList->add(createMarker(0, 5)); |
| + |
| + EXPECT_EQ(true, m_markerList->shiftMarkers(0, 0, 5)); |
|
Xiaocheng
2017/03/27 22:38:20
The result is an enum.
|
| + EXPECT_EQ(1u, m_markerList->size()); |
| + |
| + EXPECT_EQ(5u, m_markerList->at(0)->startOffset()); |
| + EXPECT_EQ(10u, m_markerList->at(0)->endOffset()); |
| +} |
| + |
| +TEST_F(DocumentMarkerListTest, ShiftMarkersMarkerRemoved) { |
| + m_markerList->add(createMarker(0, 5)); |
| + |
| + EXPECT_EQ(true, m_markerList->shiftMarkers(0, 5, 0)); |
| + EXPECT_EQ(0u, m_markerList->size()); |
| +} |
| + |
| +TEST_F(DocumentMarkerListTest, CopyMarkers) { |
| + m_markerList->add(createMarker(1, 2)); |
| + m_markerList->add(createMarker(3, 4)); |
| + m_markerList->add(createMarker(5, 6)); |
| + m_markerList->add(createMarker(7, 8)); |
| + |
| + DocumentMarkerListForTesting* dstList = new DocumentMarkerListForTesting(); |
| + |
| + // Copy all markers that intersect the range 2 through 5, i.e. the first three |
| + m_markerList->copyMarkers(2, 4, dstList, -1); |
|
Xiaocheng
2017/03/27 22:38:20
Please check return value.
|
| + |
| + EXPECT_EQ(3u, dstList->size()); |
| + |
| + // Markers are clamped to the range 2 through 5, so the first and third |
| + // markers are now length 0 |
| + // TODO(rlanday): should we change this behavior to remove the zero-length |
| + // markers? |
| + EXPECT_EQ(1u, dstList->at(0)->startOffset()); |
| + EXPECT_EQ(1u, dstList->at(0)->endOffset()); |
| + |
| + EXPECT_EQ(2u, dstList->at(1)->startOffset()); |
| + EXPECT_EQ(3u, dstList->at(1)->endOffset()); |
| + |
| + EXPECT_EQ(4u, dstList->at(2)->startOffset()); |
| + EXPECT_EQ(4u, dstList->at(2)->endOffset()); |
| +} |
| + |
| +} // namespace blink |