blob: 30c4bdfd771b0ec2938f291d2f276b266210a46f [file] [log] [blame]
// 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/DocumentMarkerListEditor.h"
#include "core/editing/markers/TextMatchMarker.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
class DocumentMarkerListEditorTest : public ::testing::Test {
protected:
DocumentMarker* CreateMarker(unsigned startOffset, unsigned endOffset) {
return new TextMatchMarker(startOffset, endOffset,
TextMatchMarker::MatchStatus::kInactive);
}
};
TEST_F(DocumentMarkerListEditorTest, RemoveMarkersEmptyList) {
DocumentMarkerListEditor::MarkerList markers;
DocumentMarkerListEditor::RemoveMarkers(&markers, 0, 10);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest, RemoveMarkersTouchingEndpoints) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
markers.push_back(CreateMarker(10, 20));
markers.push_back(CreateMarker(20, 30));
DocumentMarkerListEditor::RemoveMarkers(&markers, 10, 10);
EXPECT_EQ(2u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(10u, markers[0]->EndOffset());
EXPECT_EQ(20u, markers[1]->StartOffset());
EXPECT_EQ(30u, markers[1]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest, RemoveMarkersOneCharacterIntoInterior) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
markers.push_back(CreateMarker(10, 20));
markers.push_back(CreateMarker(20, 30));
DocumentMarkerListEditor::RemoveMarkers(&markers, 9, 12);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_ReplaceStartOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 5, 5);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_ReplaceStartOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
// Replace with shorter text
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 5, 4);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(9u, markers[0]->EndOffset());
// Replace with longer text
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 4, 5);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(10u, markers[0]->EndOffset());
// Replace with text of same length
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 5, 5);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(10u, markers[0]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_ReplaceContainsStartOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(5, 15));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 10, 10);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_ReplaceContainsStartOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(5, 15));
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 10);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(10u, markers[0]->StartOffset());
EXPECT_EQ(15u, markers[0]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_ReplaceEndOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 5, 5, 5);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_ReplaceEndOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
// Replace with shorter text
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 5, 4);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(9u, markers[0]->EndOffset());
// Replace with longer text
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 4, 5);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(10u, markers[0]->EndOffset());
// Replace with text of same length
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 5, 5);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(10u, markers[0]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_ReplaceContainsEndOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 5, 10, 10);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_ReplaceContainsEndOfMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 10, 10);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(5u, markers[0]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_ReplaceEntireMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 10, 10);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_ReplaceEntireMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
// Replace with shorter text
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 9);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(9u, markers[0]->EndOffset());
// Replace with longer text
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 9, 10);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(10u, markers[0]->EndOffset());
// Replace with text of same length
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 10);
EXPECT_EQ(1u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(10u, markers[0]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_ReplaceTextWithMarkerAtBeginning) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 15, 15);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_ReplaceTextWithMarkerAtBeginning) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 15, 15);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_ReplaceTextWithMarkerAtEnd) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(5, 15));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 15, 15);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_ReplaceTextWithMarkerAtEnd) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(5, 15));
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 15, 15);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest, ContentDependentMarker_Deletions) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 5));
markers.push_back(CreateMarker(5, 10));
markers.push_back(CreateMarker(10, 15));
markers.push_back(CreateMarker(15, 20));
markers.push_back(CreateMarker(20, 25));
// Delete range containing the end of the second marker, the entire third
// marker, and the start of the fourth marker
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 8, 9, 0);
EXPECT_EQ(2u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(5u, markers[0]->EndOffset());
EXPECT_EQ(11u, markers[1]->StartOffset());
EXPECT_EQ(16u, markers[1]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest, ContentIndependentMarker_Deletions) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 5));
markers.push_back(CreateMarker(5, 10));
markers.push_back(CreateMarker(10, 15));
markers.push_back(CreateMarker(15, 20));
markers.push_back(CreateMarker(20, 25));
// Delete range containing the end of the second marker, the entire third
// marker, and the start of the fourth marker
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 8, 9, 0);
EXPECT_EQ(4u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(5u, markers[0]->EndOffset());
EXPECT_EQ(5u, markers[1]->StartOffset());
EXPECT_EQ(8u, markers[1]->EndOffset());
EXPECT_EQ(8u, markers[2]->StartOffset());
EXPECT_EQ(11u, markers[2]->EndOffset());
EXPECT_EQ(11u, markers[3]->StartOffset());
EXPECT_EQ(16u, markers[3]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_DeleteExactlyOnMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 0, 10, 0);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_DeleteExactlyOnMarker) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 10));
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 0, 10, 0);
EXPECT_EQ(0u, markers.size());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_InsertInMarkerInterior) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 5));
markers.push_back(CreateMarker(5, 10));
markers.push_back(CreateMarker(10, 15));
// insert in middle of second marker
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 7, 0, 5);
EXPECT_EQ(2u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(5u, markers[0]->EndOffset());
EXPECT_EQ(15u, markers[1]->StartOffset());
EXPECT_EQ(20u, markers[1]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_InsertInMarkerInterior) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 5));
markers.push_back(CreateMarker(5, 10));
markers.push_back(CreateMarker(10, 15));
// insert in middle of second marker
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 7, 0, 5);
EXPECT_EQ(3u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(5u, markers[0]->EndOffset());
EXPECT_EQ(5u, markers[1]->StartOffset());
EXPECT_EQ(15u, markers[1]->EndOffset());
EXPECT_EQ(15u, markers[2]->StartOffset());
EXPECT_EQ(20u, markers[2]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentDependentMarker_InsertBetweenMarkers) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 5));
markers.push_back(CreateMarker(5, 10));
markers.push_back(CreateMarker(10, 15));
// insert before second marker
DocumentMarkerListEditor::ShiftMarkersContentDependent(&markers, 5, 0, 5);
EXPECT_EQ(3u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(5u, markers[0]->EndOffset());
EXPECT_EQ(10u, markers[1]->StartOffset());
EXPECT_EQ(15u, markers[1]->EndOffset());
EXPECT_EQ(15u, markers[2]->StartOffset());
EXPECT_EQ(20u, markers[2]->EndOffset());
}
TEST_F(DocumentMarkerListEditorTest,
ContentIndependentMarker_InsertBetweenMarkers) {
DocumentMarkerListEditor::MarkerList markers;
markers.push_back(CreateMarker(0, 5));
markers.push_back(CreateMarker(5, 10));
markers.push_back(CreateMarker(10, 15));
// insert before second marker
DocumentMarkerListEditor::ShiftMarkersContentIndependent(&markers, 5, 0, 5);
EXPECT_EQ(3u, markers.size());
EXPECT_EQ(0u, markers[0]->StartOffset());
EXPECT_EQ(5u, markers[0]->EndOffset());
EXPECT_EQ(10u, markers[1]->StartOffset());
EXPECT_EQ(15u, markers[1]->EndOffset());
EXPECT_EQ(15u, markers[2]->StartOffset());
EXPECT_EQ(20u, markers[2]->EndOffset());
}
} // namespace blink