Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / editing / SurroundingTextTest.cpp
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/editing/SurroundingText.h"
7
8 #include "core/dom/Position.h"
9 #include "core/dom/Range.h"
10 #include "core/dom/Text.h"
11 #include "core/editing/VisibleSelection.h"
12 #include "core/html/HTMLElement.h"
13 #include "core/testing/DummyPageHolder.h"
14 #include <gtest/gtest.h>
15
16 using namespace blink;
17
18 namespace {
19
20 class SurroundingTextTest : public ::testing::Test {
21 protected:
22     Document& document() const { return m_dummyPageHolder->document(); }
23     void setHTML(const String&);
24     VisibleSelection select(int offset) { return select(offset, offset); }
25     VisibleSelection select(int start, int end);
26
27 private:
28     virtual void SetUp() OVERRIDE;
29
30     OwnPtr<DummyPageHolder> m_dummyPageHolder;
31 };
32
33 void SurroundingTextTest::SetUp()
34 {
35     m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600));
36 }
37
38 void SurroundingTextTest::setHTML(const String& content)
39 {
40     document().body()->setInnerHTML(content, ASSERT_NO_EXCEPTION);
41 }
42
43 VisibleSelection SurroundingTextTest::select(int start, int end)
44 {
45     Element* element = document().getElementById("selection");
46     VisibleSelection selection;
47     selection.setBase(Position(toText(element->firstChild()), start));
48     selection.setExtent(Position(toText(element->firstChild()), end));
49     return selection;
50 }
51
52 TEST_F(SurroundingTextTest, BasicCaretSelection)
53 {
54     setHTML(String("<p id='selection'>foo bar</p>"));
55
56     {
57         VisibleSelection selection = select(0);
58         SurroundingText surroundingText(selection.start(), 1);
59
60         EXPECT_EQ("f", surroundingText.content());
61         EXPECT_EQ(0u, surroundingText.startOffsetInContent());
62         EXPECT_EQ(0u, surroundingText.endOffsetInContent());
63     }
64
65     {
66         VisibleSelection selection = select(0);
67         SurroundingText surroundingText(selection.start(), 5);
68
69         // maxlength/2 is used on the left and right.
70         EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace());
71         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
72         EXPECT_EQ(1u, surroundingText.endOffsetInContent());
73     }
74
75     {
76         VisibleSelection selection = select(0);
77         SurroundingText surroundingText(selection.start(), 42);
78
79         EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace());
80         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
81         EXPECT_EQ(1u, surroundingText.endOffsetInContent());
82     }
83
84     {
85         // FIXME: if the selection is at the end of the text, SurroundingText
86         // will return nothing.
87         VisibleSelection selection = select(7);
88         SurroundingText surroundingText(selection.start(), 42);
89
90         EXPECT_EQ(0u, surroundingText.content().length());
91         EXPECT_EQ(0u, surroundingText.startOffsetInContent());
92         EXPECT_EQ(0u, surroundingText.endOffsetInContent());
93     }
94
95     {
96         VisibleSelection selection = select(6);
97         SurroundingText surroundingText(selection.start(), 2);
98
99         EXPECT_EQ("ar", surroundingText.content());
100         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
101         EXPECT_EQ(1u, surroundingText.endOffsetInContent());
102     }
103
104     {
105         VisibleSelection selection = select(6);
106         SurroundingText surroundingText(selection.start(), 42);
107
108         EXPECT_EQ("foo bar", surroundingText.content().simplifyWhiteSpace());
109         EXPECT_EQ(7u, surroundingText.startOffsetInContent());
110         EXPECT_EQ(7u, surroundingText.endOffsetInContent());
111     }
112 }
113
114 TEST_F(SurroundingTextTest, BasicRangeSelection)
115 {
116     setHTML(String("<p id='selection'>Lorem ipsum dolor sit amet</p>"));
117
118     {
119         VisibleSelection selection = select(0, 5);
120         SurroundingText surroundingText(*selection.firstRange(), 1);
121
122         EXPECT_EQ("Lorem ", surroundingText.content());
123         EXPECT_EQ(0u, surroundingText.startOffsetInContent());
124         EXPECT_EQ(5u, surroundingText.endOffsetInContent());
125     }
126
127     {
128         VisibleSelection selection = select(0, 5);
129         SurroundingText surroundingText(*selection.firstRange(), 5);
130
131         EXPECT_EQ("Lorem ip", surroundingText.content().simplifyWhiteSpace());
132         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
133         EXPECT_EQ(6u, surroundingText.endOffsetInContent());
134     }
135
136     {
137         VisibleSelection selection = select(0, 5);
138         SurroundingText surroundingText(*selection.firstRange(), 42);
139
140         EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace());
141         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
142         EXPECT_EQ(6u, surroundingText.endOffsetInContent());
143     }
144
145     {
146         VisibleSelection selection = select(6, 11);
147         SurroundingText surroundingText(*selection.firstRange(), 2);
148
149         EXPECT_EQ(" ipsum ", surroundingText.content());
150         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
151         EXPECT_EQ(6u, surroundingText.endOffsetInContent());
152     }
153
154     {
155         VisibleSelection selection = select(6, 11);
156         SurroundingText surroundingText(*selection.firstRange(), 42);
157
158         EXPECT_EQ("Lorem ipsum dolor sit amet", surroundingText.content().simplifyWhiteSpace());
159         EXPECT_EQ(7u, surroundingText.startOffsetInContent());
160         EXPECT_EQ(12u, surroundingText.endOffsetInContent());
161     }
162 }
163
164 TEST_F(SurroundingTextTest, TreeCaretSelection)
165 {
166     setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>"));
167
168     {
169         VisibleSelection selection = select(0);
170         SurroundingText surroundingText(selection.start(), 1);
171
172         EXPECT_EQ("f", surroundingText.content());
173         EXPECT_EQ(0u, surroundingText.startOffsetInContent());
174         EXPECT_EQ(0u, surroundingText.endOffsetInContent());
175     }
176
177     {
178         VisibleSelection selection = select(0);
179         SurroundingText surroundingText(selection.start(), 5);
180
181         EXPECT_EQ("foo", surroundingText.content().simplifyWhiteSpace());
182         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
183         EXPECT_EQ(1u, surroundingText.endOffsetInContent());
184     }
185
186     {
187         VisibleSelection selection = select(0);
188         SurroundingText surroundingText(selection.start(), 1337);
189
190         EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
191         EXPECT_EQ(20u, surroundingText.startOffsetInContent());
192         EXPECT_EQ(20u, surroundingText.endOffsetInContent());
193     }
194
195     {
196         VisibleSelection selection = select(6);
197         SurroundingText surroundingText(selection.start(), 2);
198
199         EXPECT_EQ("ar", surroundingText.content());
200         EXPECT_EQ(1u, surroundingText.startOffsetInContent());
201         EXPECT_EQ(1u, surroundingText.endOffsetInContent());
202     }
203
204     {
205         VisibleSelection selection = select(6);
206         SurroundingText surroundingText(selection.start(), 1337);
207
208         EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
209         EXPECT_EQ(26u, surroundingText.startOffsetInContent());
210         EXPECT_EQ(26u, surroundingText.endOffsetInContent());
211     }
212 }
213
214 TEST_F(SurroundingTextTest, TreeRangeSelection)
215 {
216     setHTML(String("<div>This is outside of <p id='selection'>foo bar</p> the selected node</div>"));
217
218     {
219         VisibleSelection selection = select(0, 1);
220         SurroundingText surroundingText(*selection.firstRange(), 1);
221
222         EXPECT_EQ("fo", surroundingText.content().simplifyWhiteSpace());
223         EXPECT_EQ(0u, surroundingText.startOffsetInContent());
224         EXPECT_EQ(1u, surroundingText.endOffsetInContent());
225     }
226
227     {
228         VisibleSelection selection = select(0, 3);
229         SurroundingText surroundingText(*selection.firstRange(), 12);
230
231         EXPECT_EQ("e of foo bar", surroundingText.content().simplifyWhiteSpace());
232         EXPECT_EQ(5u, surroundingText.startOffsetInContent());
233         EXPECT_EQ(8u, surroundingText.endOffsetInContent());
234     }
235
236     {
237         VisibleSelection selection = select(0, 3);
238         SurroundingText surroundingText(*selection.firstRange(), 1337);
239
240         EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
241         EXPECT_EQ(20u, surroundingText.startOffsetInContent());
242         EXPECT_EQ(23u, surroundingText.endOffsetInContent());
243     }
244
245     {
246         VisibleSelection selection = select(4, 7);
247         SurroundingText surroundingText(*selection.firstRange(), 12);
248
249         EXPECT_EQ("foo bar the se", surroundingText.content().simplifyWhiteSpace());
250         EXPECT_EQ(5u, surroundingText.startOffsetInContent());
251         EXPECT_EQ(8u, surroundingText.endOffsetInContent());
252     }
253
254     {
255         VisibleSelection selection = select(0, 7);
256         SurroundingText surroundingText(*selection.firstRange(), 1337);
257
258         EXPECT_EQ("This is outside of foo bar the selected node", surroundingText.content().simplifyWhiteSpace());
259         EXPECT_EQ(20u, surroundingText.startOffsetInContent());
260         EXPECT_EQ(27u, surroundingText.endOffsetInContent());
261     }
262 }
263
264 } // anonymous namespace