// 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 "testing/gtest/include/gtest/gtest.h"

namespace blink {

class DocumentMarkerListEditorTest : public ::testing::Test {
 protected:
  DocumentMarker* CreateMarker(unsigned startOffset, unsigned endOffset) {
    return new DocumentMarker(startOffset, endOffset,
                              DocumentMarker::MatchStatus::kInactive);
  }
};

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
