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