1 // Copyright 2017 The Chromium Authors. All rights reserved.  Use of
2 // this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "third_party/blink/renderer/core/editing/markers/spell_check_marker_list_impl.h"
6 
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "third_party/blink/renderer/core/editing/markers/spelling_marker.h"
9 #include "third_party/blink/renderer/core/editing/markers/spelling_marker_list_impl.h"
10 #include "third_party/blink/renderer/platform/heap/persistent.h"
11 
12 namespace blink {
13 
14 // This test class tests functionality implemented by SpellingMarkerListImpl and
15 // also functionality implemented by its parent class SpellCheckMarkerListImpl.
16 
17 class SpellingMarkerListImplTest : public testing::Test {
18  protected:
SpellingMarkerListImplTest()19   SpellingMarkerListImplTest()
20       : marker_list_(MakeGarbageCollected<SpellingMarkerListImpl>()) {}
21 
CreateMarker(unsigned start_offset,unsigned end_offset)22   DocumentMarker* CreateMarker(unsigned start_offset, unsigned end_offset) {
23     return MakeGarbageCollected<SpellingMarker>(start_offset, end_offset,
24                                                 g_empty_string);
25   }
26 
27   Persistent<SpellingMarkerListImpl> marker_list_;
28 };
29 
30 // Test cases for functionality implemented by SpellingMarkerListImpl.
31 
TEST_F(SpellingMarkerListImplTest,MarkerType)32 TEST_F(SpellingMarkerListImplTest, MarkerType) {
33   EXPECT_EQ(DocumentMarker::kSpelling, marker_list_->MarkerType());
34 }
35 
36 // Test cases for functionality implemented by SpellCheckMarkerListImpl
37 
TEST_F(SpellingMarkerListImplTest,AddSorting)38 TEST_F(SpellingMarkerListImplTest, AddSorting) {
39   // Insert some markers in an arbitrary order and verify that the list stays
40   // sorted
41   marker_list_->Add(CreateMarker(80, 85));
42   marker_list_->Add(CreateMarker(40, 45));
43   marker_list_->Add(CreateMarker(10, 15));
44   marker_list_->Add(CreateMarker(0, 5));
45   marker_list_->Add(CreateMarker(70, 75));
46   marker_list_->Add(CreateMarker(90, 95));
47   marker_list_->Add(CreateMarker(60, 65));
48   marker_list_->Add(CreateMarker(50, 55));
49   marker_list_->Add(CreateMarker(30, 35));
50   marker_list_->Add(CreateMarker(20, 25));
51 
52   EXPECT_EQ(10u, marker_list_->GetMarkers().size());
53 
54   EXPECT_EQ(0u, marker_list_->GetMarkers()[0]->StartOffset());
55   EXPECT_EQ(5u, marker_list_->GetMarkers()[0]->EndOffset());
56 
57   EXPECT_EQ(10u, marker_list_->GetMarkers()[1]->StartOffset());
58   EXPECT_EQ(15u, marker_list_->GetMarkers()[1]->EndOffset());
59 
60   EXPECT_EQ(20u, marker_list_->GetMarkers()[2]->StartOffset());
61   EXPECT_EQ(25u, marker_list_->GetMarkers()[2]->EndOffset());
62 
63   EXPECT_EQ(30u, marker_list_->GetMarkers()[3]->StartOffset());
64   EXPECT_EQ(35u, marker_list_->GetMarkers()[3]->EndOffset());
65 
66   EXPECT_EQ(40u, marker_list_->GetMarkers()[4]->StartOffset());
67   EXPECT_EQ(45u, marker_list_->GetMarkers()[4]->EndOffset());
68 
69   EXPECT_EQ(50u, marker_list_->GetMarkers()[5]->StartOffset());
70   EXPECT_EQ(55u, marker_list_->GetMarkers()[5]->EndOffset());
71 
72   EXPECT_EQ(60u, marker_list_->GetMarkers()[6]->StartOffset());
73   EXPECT_EQ(65u, marker_list_->GetMarkers()[6]->EndOffset());
74 
75   EXPECT_EQ(70u, marker_list_->GetMarkers()[7]->StartOffset());
76   EXPECT_EQ(75u, marker_list_->GetMarkers()[7]->EndOffset());
77 
78   EXPECT_EQ(80u, marker_list_->GetMarkers()[8]->StartOffset());
79   EXPECT_EQ(85u, marker_list_->GetMarkers()[8]->EndOffset());
80 
81   EXPECT_EQ(90u, marker_list_->GetMarkers()[9]->StartOffset());
82   EXPECT_EQ(95u, marker_list_->GetMarkers()[9]->EndOffset());
83 }
84 
TEST_F(SpellingMarkerListImplTest,AddIntoEmptyList)85 TEST_F(SpellingMarkerListImplTest, AddIntoEmptyList) {
86   marker_list_->Add(CreateMarker(5, 10));
87 
88   EXPECT_EQ(1u, marker_list_->GetMarkers().size());
89 
90   EXPECT_EQ(5u, marker_list_->GetMarkers()[0]->StartOffset());
91   EXPECT_EQ(10u, marker_list_->GetMarkers()[0]->EndOffset());
92 }
93 
TEST_F(SpellingMarkerListImplTest,AddMarkerNonMerging)94 TEST_F(SpellingMarkerListImplTest, AddMarkerNonMerging) {
95   marker_list_->Add(CreateMarker(5, 10));
96   marker_list_->Add(CreateMarker(15, 20));
97 
98   EXPECT_EQ(2u, marker_list_->GetMarkers().size());
99 
100   EXPECT_EQ(5u, marker_list_->GetMarkers()[0]->StartOffset());
101   EXPECT_EQ(10u, marker_list_->GetMarkers()[0]->EndOffset());
102 
103   EXPECT_EQ(15u, marker_list_->GetMarkers()[1]->StartOffset());
104   EXPECT_EQ(20u, marker_list_->GetMarkers()[1]->EndOffset());
105 }
106 
TEST_F(SpellingMarkerListImplTest,AddMarkerMergingLater)107 TEST_F(SpellingMarkerListImplTest, AddMarkerMergingLater) {
108   marker_list_->Add(CreateMarker(5, 10));
109   marker_list_->Add(CreateMarker(0, 5));
110 
111   EXPECT_EQ(1u, marker_list_->GetMarkers().size());
112 
113   EXPECT_EQ(0u, marker_list_->GetMarkers()[0]->StartOffset());
114   EXPECT_EQ(10u, marker_list_->GetMarkers()[0]->EndOffset());
115 }
116 
TEST_F(SpellingMarkerListImplTest,AddMarkerMergingEarlier)117 TEST_F(SpellingMarkerListImplTest, AddMarkerMergingEarlier) {
118   marker_list_->Add(CreateMarker(0, 5));
119   marker_list_->Add(CreateMarker(5, 10));
120 
121   EXPECT_EQ(1u, marker_list_->GetMarkers().size());
122 
123   EXPECT_EQ(0u, marker_list_->GetMarkers()[0]->StartOffset());
124   EXPECT_EQ(10u, marker_list_->GetMarkers()[0]->EndOffset());
125 }
126 
TEST_F(SpellingMarkerListImplTest,AddMarkerMergingEarlierAndLater)127 TEST_F(SpellingMarkerListImplTest, AddMarkerMergingEarlierAndLater) {
128   marker_list_->Add(CreateMarker(0, 5));
129   marker_list_->Add(CreateMarker(10, 15));
130   marker_list_->Add(CreateMarker(5, 10));
131 
132   EXPECT_EQ(1u, marker_list_->GetMarkers().size());
133 
134   EXPECT_EQ(0u, marker_list_->GetMarkers()[0]->StartOffset());
135   EXPECT_EQ(15u, marker_list_->GetMarkers()[0]->EndOffset());
136 }
137 
TEST_F(SpellingMarkerListImplTest,RemoveMarkersUnderWords)138 TEST_F(SpellingMarkerListImplTest, RemoveMarkersUnderWords) {
139   // wor
140   marker_list_->Add(CreateMarker(0, 3));
141 
142   // word
143   marker_list_->Add(CreateMarker(4, 8));
144 
145   // words
146   marker_list_->Add(CreateMarker(9, 14));
147 
148   // word2
149   marker_list_->Add(CreateMarker(15, 20));
150 
151   marker_list_->RemoveMarkersUnderWords("wor word words word2",
152                                         {"word", "word2"});
153   EXPECT_EQ(2u, marker_list_->GetMarkers().size());
154 
155   EXPECT_EQ(0u, marker_list_->GetMarkers()[0]->StartOffset());
156   EXPECT_EQ(3u, marker_list_->GetMarkers()[0]->EndOffset());
157 
158   EXPECT_EQ(9u, marker_list_->GetMarkers()[1]->StartOffset());
159   EXPECT_EQ(14u, marker_list_->GetMarkers()[1]->EndOffset());
160 }
161 
162 }  // namespace
163