Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gfx/render_text.h" | 5 #include "ui/gfx/render_text.h" |
| 6 | 6 |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| 11 namespace gfx { | 11 namespace gfx { |
| 12 | 12 |
| 13 class RenderTextTest : public testing::Test { | 13 class RenderTextTest : public testing::Test { |
| 14 }; | 14 }; |
| 15 | 15 |
| 16 TEST_F(RenderTextTest, DefaultStyle) { | 16 TEST_F(RenderTextTest, DefaultStyle) { |
| 17 // Defaults to empty text with no styles. | 17 // Defaults to empty text with no styles. |
| 18 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); | 18 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 19 EXPECT_TRUE(render_text->text().empty()); | 19 EXPECT_TRUE(render_text->text().empty()); |
| 20 EXPECT_TRUE(render_text->style_ranges().empty()); | 20 EXPECT_TRUE(render_text->style_ranges().empty()); |
| 21 | 21 |
| 22 // Test that the built-in default style is applied for new text. | 22 // Test that the built-in default style is applied for new text. |
| 23 render_text->SetText(ASCIIToUTF16("abc")); | 23 render_text->SetText(ASCIIToUTF16("abc")); |
| 24 EXPECT_EQ(1U, render_text->style_ranges().size()); | 24 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 25 gfx::StyleRange style; | 25 StyleRange style; |
| 26 EXPECT_EQ(style.font.GetFontName(), | 26 EXPECT_EQ(style.font.GetFontName(), |
| 27 render_text->style_ranges()[0].font.GetFontName()); | 27 render_text->style_ranges()[0].font.GetFontName()); |
| 28 EXPECT_EQ(style.foreground, render_text->style_ranges()[0].foreground); | 28 EXPECT_EQ(style.foreground, render_text->style_ranges()[0].foreground); |
| 29 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | 29 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); |
| 30 EXPECT_EQ(style.strike, render_text->style_ranges()[0].strike); | 30 EXPECT_EQ(style.strike, render_text->style_ranges()[0].strike); |
| 31 EXPECT_EQ(style.underline, render_text->style_ranges()[0].underline); | 31 EXPECT_EQ(style.underline, render_text->style_ranges()[0].underline); |
| 32 | 32 |
| 33 // Test that clearing the text also clears the styles. | 33 // Test that clearing the text also clears the styles. |
| 34 render_text->SetText(string16()); | 34 render_text->SetText(string16()); |
| 35 EXPECT_TRUE(render_text->text().empty()); | 35 EXPECT_TRUE(render_text->text().empty()); |
| 36 EXPECT_TRUE(render_text->style_ranges().empty()); | 36 EXPECT_TRUE(render_text->style_ranges().empty()); |
| 37 } | 37 } |
| 38 | 38 |
| 39 TEST_F(RenderTextTest, CustomDefaultStyle) { | 39 TEST_F(RenderTextTest, CustomDefaultStyle) { |
| 40 // Test a custom default style. | 40 // Test a custom default style. |
| 41 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); | 41 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 42 gfx::StyleRange color; | 42 StyleRange color; |
| 43 color.foreground = SK_ColorRED; | 43 color.foreground = SK_ColorRED; |
| 44 render_text->set_default_style(color); | 44 render_text->set_default_style(color); |
| 45 render_text->SetText(ASCIIToUTF16("abc")); | 45 render_text->SetText(ASCIIToUTF16("abc")); |
| 46 EXPECT_EQ(1U, render_text->style_ranges().size()); | 46 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 47 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); | 47 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); |
| 48 | 48 |
| 49 // Test that the custom default style persists across clearing text. | 49 // Test that the custom default style persists across clearing text. |
| 50 render_text->SetText(string16()); | 50 render_text->SetText(string16()); |
| 51 EXPECT_TRUE(render_text->style_ranges().empty()); | 51 EXPECT_TRUE(render_text->style_ranges().empty()); |
| 52 render_text->SetText(ASCIIToUTF16("abc")); | 52 render_text->SetText(ASCIIToUTF16("abc")); |
| 53 EXPECT_EQ(1U, render_text->style_ranges().size()); | 53 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 54 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); | 54 EXPECT_EQ(color.foreground, render_text->style_ranges()[0].foreground); |
| 55 | 55 |
| 56 // Test ApplyDefaultStyle after setting a new default. | 56 // Test ApplyDefaultStyle after setting a new default. |
| 57 gfx::StyleRange strike; | 57 StyleRange strike; |
| 58 strike.strike = true; | 58 strike.strike = true; |
| 59 render_text->set_default_style(strike); | 59 render_text->set_default_style(strike); |
| 60 render_text->ApplyDefaultStyle(); | 60 render_text->ApplyDefaultStyle(); |
| 61 EXPECT_EQ(1U, render_text->style_ranges().size()); | 61 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 62 EXPECT_EQ(true, render_text->style_ranges()[0].strike); | 62 EXPECT_EQ(true, render_text->style_ranges()[0].strike); |
| 63 EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground); | 63 EXPECT_EQ(strike.foreground, render_text->style_ranges()[0].foreground); |
| 64 } | 64 } |
| 65 | 65 |
| 66 TEST_F(RenderTextTest, ApplyStyleRange) { | 66 TEST_F(RenderTextTest, ApplyStyleRange) { |
| 67 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); | 67 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 68 render_text->SetText(ASCIIToUTF16("01234")); | 68 render_text->SetText(ASCIIToUTF16("01234")); |
| 69 EXPECT_EQ(1U, render_text->style_ranges().size()); | 69 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 70 | 70 |
| 71 // Test ApplyStyleRange (no-op on empty range). | 71 // Test ApplyStyleRange (no-op on empty range). |
| 72 gfx::StyleRange empty; | 72 StyleRange empty; |
| 73 empty.range = ui::Range(1, 1); | 73 empty.range = ui::Range(1, 1); |
| 74 render_text->ApplyStyleRange(empty); | 74 render_text->ApplyStyleRange(empty); |
| 75 EXPECT_EQ(1U, render_text->style_ranges().size()); | 75 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 76 | 76 |
| 77 // Test ApplyStyleRange (no-op on invalid range). | 77 // Test ApplyStyleRange (no-op on invalid range). |
| 78 gfx::StyleRange invalid; | 78 StyleRange invalid; |
| 79 invalid.range = ui::Range::InvalidRange(); | 79 invalid.range = ui::Range::InvalidRange(); |
| 80 render_text->ApplyStyleRange(invalid); | 80 render_text->ApplyStyleRange(invalid); |
| 81 EXPECT_EQ(1U, render_text->style_ranges().size()); | 81 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 82 | 82 |
| 83 // Apply a style with a range contained by an existing range. | 83 // Apply a style with a range contained by an existing range. |
| 84 gfx::StyleRange underline; | 84 StyleRange underline; |
| 85 underline.underline = true; | 85 underline.underline = true; |
| 86 underline.range = ui::Range(2, 3); | 86 underline.range = ui::Range(2, 3); |
| 87 render_text->ApplyStyleRange(underline); | 87 render_text->ApplyStyleRange(underline); |
| 88 EXPECT_EQ(3U, render_text->style_ranges().size()); | 88 EXPECT_EQ(3U, render_text->style_ranges().size()); |
| 89 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | 89 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); |
| 90 EXPECT_FALSE(render_text->style_ranges()[0].underline); | 90 EXPECT_FALSE(render_text->style_ranges()[0].underline); |
| 91 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); | 91 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); |
| 92 EXPECT_TRUE(render_text->style_ranges()[1].underline); | 92 EXPECT_TRUE(render_text->style_ranges()[1].underline); |
| 93 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); | 93 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); |
| 94 EXPECT_FALSE(render_text->style_ranges()[2].underline); | 94 EXPECT_FALSE(render_text->style_ranges()[2].underline); |
| 95 | 95 |
| 96 // Apply a style with a range equal to another range. | 96 // Apply a style with a range equal to another range. |
| 97 gfx::StyleRange color; | 97 StyleRange color; |
| 98 color.foreground = SK_ColorWHITE; | 98 color.foreground = SK_ColorWHITE; |
| 99 color.range = ui::Range(2, 3); | 99 color.range = ui::Range(2, 3); |
| 100 render_text->ApplyStyleRange(color); | 100 render_text->ApplyStyleRange(color); |
| 101 EXPECT_EQ(3U, render_text->style_ranges().size()); | 101 EXPECT_EQ(3U, render_text->style_ranges().size()); |
| 102 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | 102 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); |
| 103 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[0].foreground); | 103 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[0].foreground); |
| 104 EXPECT_FALSE(render_text->style_ranges()[0].underline); | 104 EXPECT_FALSE(render_text->style_ranges()[0].underline); |
| 105 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); | 105 EXPECT_EQ(ui::Range(2, 3), render_text->style_ranges()[1].range); |
| 106 EXPECT_EQ(SK_ColorWHITE, render_text->style_ranges()[1].foreground); | 106 EXPECT_EQ(SK_ColorWHITE, render_text->style_ranges()[1].foreground); |
| 107 EXPECT_FALSE(render_text->style_ranges()[1].underline); | 107 EXPECT_FALSE(render_text->style_ranges()[1].underline); |
| 108 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); | 108 EXPECT_EQ(ui::Range(3, 5), render_text->style_ranges()[2].range); |
| 109 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[2].foreground); | 109 EXPECT_NE(SK_ColorWHITE, render_text->style_ranges()[2].foreground); |
| 110 EXPECT_FALSE(render_text->style_ranges()[2].underline); | 110 EXPECT_FALSE(render_text->style_ranges()[2].underline); |
| 111 | 111 |
| 112 // Apply a style with a range containing an existing range. | 112 // Apply a style with a range containing an existing range. |
| 113 // This new style also overlaps portions of neighboring ranges. | 113 // This new style also overlaps portions of neighboring ranges. |
| 114 gfx::StyleRange strike; | 114 StyleRange strike; |
| 115 strike.strike = true; | 115 strike.strike = true; |
| 116 strike.range = ui::Range(1, 4); | 116 strike.range = ui::Range(1, 4); |
| 117 render_text->ApplyStyleRange(strike); | 117 render_text->ApplyStyleRange(strike); |
| 118 EXPECT_EQ(3U, render_text->style_ranges().size()); | 118 EXPECT_EQ(3U, render_text->style_ranges().size()); |
| 119 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); | 119 EXPECT_EQ(ui::Range(0, 1), render_text->style_ranges()[0].range); |
| 120 EXPECT_FALSE(render_text->style_ranges()[0].strike); | 120 EXPECT_FALSE(render_text->style_ranges()[0].strike); |
| 121 EXPECT_EQ(ui::Range(1, 4), render_text->style_ranges()[1].range); | 121 EXPECT_EQ(ui::Range(1, 4), render_text->style_ranges()[1].range); |
| 122 EXPECT_TRUE(render_text->style_ranges()[1].strike); | 122 EXPECT_TRUE(render_text->style_ranges()[1].strike); |
| 123 EXPECT_EQ(ui::Range(4, 5), render_text->style_ranges()[2].range); | 123 EXPECT_EQ(ui::Range(4, 5), render_text->style_ranges()[2].range); |
| 124 EXPECT_FALSE(render_text->style_ranges()[2].strike); | 124 EXPECT_FALSE(render_text->style_ranges()[2].strike); |
| 125 | 125 |
| 126 // Apply a style overlapping all ranges. | 126 // Apply a style overlapping all ranges. |
| 127 gfx::StyleRange strike_underline; | 127 StyleRange strike_underline; |
| 128 strike_underline.strike = true; | 128 strike_underline.strike = true; |
| 129 strike_underline.underline = true; | 129 strike_underline.underline = true; |
| 130 strike_underline.range = ui::Range(0, render_text->text().length()); | 130 strike_underline.range = ui::Range(0, render_text->text().length()); |
| 131 render_text->ApplyStyleRange(strike_underline); | 131 render_text->ApplyStyleRange(strike_underline); |
| 132 EXPECT_EQ(1U, render_text->style_ranges().size()); | 132 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 133 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); | 133 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); |
| 134 EXPECT_TRUE(render_text->style_ranges()[0].underline); | 134 EXPECT_TRUE(render_text->style_ranges()[0].underline); |
| 135 EXPECT_TRUE(render_text->style_ranges()[0].strike); | 135 EXPECT_TRUE(render_text->style_ranges()[0].strike); |
| 136 | 136 |
| 137 // Apply the default style. | 137 // Apply the default style. |
| 138 render_text->ApplyDefaultStyle(); | 138 render_text->ApplyDefaultStyle(); |
| 139 EXPECT_EQ(1U, render_text->style_ranges().size()); | 139 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 140 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); | 140 EXPECT_EQ(ui::Range(0, 5), render_text->style_ranges()[0].range); |
| 141 EXPECT_FALSE(render_text->style_ranges()[0].underline); | 141 EXPECT_FALSE(render_text->style_ranges()[0].underline); |
| 142 EXPECT_FALSE(render_text->style_ranges()[0].strike); | 142 EXPECT_FALSE(render_text->style_ranges()[0].strike); |
| 143 } | 143 } |
| 144 | 144 |
| 145 TEST_F(RenderTextTest, StyleRangesAdjust) { | 145 TEST_F(RenderTextTest, StyleRangesAdjust) { |
| 146 // Test that style ranges adjust to the text size. | 146 // Test that style ranges adjust to the text size. |
| 147 scoped_ptr<gfx::RenderText> render_text(gfx::RenderText::CreateRenderText()); | 147 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); |
| 148 render_text->SetText(ASCIIToUTF16("abcdef")); | 148 render_text->SetText(ASCIIToUTF16("abcdef")); |
| 149 EXPECT_EQ(1U, render_text->style_ranges().size()); | 149 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 150 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); | 150 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); |
| 151 | 151 |
| 152 // Test that the range is clipped to the length of shorter text. | 152 // Test that the range is clipped to the length of shorter text. |
| 153 render_text->SetText(ASCIIToUTF16("abc")); | 153 render_text->SetText(ASCIIToUTF16("abc")); |
| 154 EXPECT_EQ(1U, render_text->style_ranges().size()); | 154 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 155 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); | 155 EXPECT_EQ(ui::Range(0, 3), render_text->style_ranges()[0].range); |
| 156 | 156 |
| 157 // Test that the last range extends to the length of longer text. | 157 // Test that the last range extends to the length of longer text. |
| 158 gfx::StyleRange strike; | 158 StyleRange strike; |
| 159 strike.strike = true; | 159 strike.strike = true; |
| 160 strike.range = ui::Range(2, 3); | 160 strike.range = ui::Range(2, 3); |
| 161 render_text->ApplyStyleRange(strike); | 161 render_text->ApplyStyleRange(strike); |
| 162 render_text->SetText(ASCIIToUTF16("abcdefghi")); | 162 render_text->SetText(ASCIIToUTF16("abcdefghi")); |
| 163 EXPECT_EQ(2U, render_text->style_ranges().size()); | 163 EXPECT_EQ(2U, render_text->style_ranges().size()); |
| 164 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | 164 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); |
| 165 EXPECT_EQ(ui::Range(2, 9), render_text->style_ranges()[1].range); | 165 EXPECT_EQ(ui::Range(2, 9), render_text->style_ranges()[1].range); |
| 166 EXPECT_TRUE(render_text->style_ranges()[1].strike); | 166 EXPECT_TRUE(render_text->style_ranges()[1].strike); |
| 167 | 167 |
| 168 // Test that ranges are removed if they're outside the range of shorter text. | 168 // Test that ranges are removed if they're outside the range of shorter text. |
| 169 render_text->SetText(ASCIIToUTF16("ab")); | 169 render_text->SetText(ASCIIToUTF16("ab")); |
| 170 EXPECT_EQ(1U, render_text->style_ranges().size()); | 170 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 171 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); | 171 EXPECT_EQ(ui::Range(0, 2), render_text->style_ranges()[0].range); |
| 172 EXPECT_FALSE(render_text->style_ranges()[0].strike); | 172 EXPECT_FALSE(render_text->style_ranges()[0].strike); |
| 173 | 173 |
| 174 // Test that previously removed ranges don't return. | 174 // Test that previously removed ranges don't return. |
| 175 render_text->SetText(ASCIIToUTF16("abcdef")); | 175 render_text->SetText(ASCIIToUTF16("abcdef")); |
| 176 EXPECT_EQ(1U, render_text->style_ranges().size()); | 176 EXPECT_EQ(1U, render_text->style_ranges().size()); |
| 177 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); | 177 EXPECT_EQ(ui::Range(0, 6), render_text->style_ranges()[0].range); |
| 178 EXPECT_FALSE(render_text->style_ranges()[0].strike); | 178 EXPECT_FALSE(render_text->style_ranges()[0].strike); |
| 179 } | 179 } |
| 180 | 180 |
| 181 void RunMoveCursorLeftRightTest(RenderText* render_text, | |
| 182 const std::vector<SelectionModel>& expected, | |
| 183 int num_of_selection_entry, | |
| 184 bool move_right) { | |
| 185 for (int i = 0; i <= num_of_selection_entry; ++i) { | |
|
msw
2011/09/14 02:43:48
num_of_selection_entry is no longer needed, you ca
xji
2011/09/15 23:38:13
Done.
| |
| 186 int index = std::min(i, num_of_selection_entry - 1); | |
| 187 SelectionModel sel = expected[index]; | |
| 188 EXPECT_TRUE(render_text->selection_model().Equals(sel)); | |
| 189 | |
| 190 if (move_right) | |
| 191 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 192 else | |
| 193 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 194 } | |
| 195 | |
| 196 SelectionModel sel = expected[num_of_selection_entry - 1]; | |
|
msw
2011/09/14 02:43:48
I'm confused why you have this section of code in
xji
2011/09/15 23:38:13
The above loop checks move by character.
This one
msw
2011/09/16 17:39:08
Ah, I missed that, thanks.
| |
| 197 if (move_right) | |
| 198 render_text->MoveCursorRight(LINE_BREAK, false); | |
| 199 else | |
| 200 render_text->MoveCursorLeft(LINE_BREAK, false); | |
| 201 EXPECT_TRUE(render_text->selection_model().Equals(sel)); | |
| 202 } | |
| 203 | |
| 204 TEST_F(RenderTextTest, MoveCursorLeftRight) { | |
|
msw
2011/09/14 02:43:48
You should split this test up for each different t
xji
2011/09/15 23:38:13
Done.
| |
| 205 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
| 206 | |
| 207 // Pure LTR. | |
| 208 render_text->SetText(ASCIIToUTF16("abc")); | |
| 209 // left_to_right saves the expected SelectionModel when moving cursor | |
|
msw
2011/09/14 02:43:48
|left_to_right| is now |ltr|.
xji
2011/09/15 23:38:13
Done.
| |
| 210 // from left to right. | |
| 211 std::vector<SelectionModel> ltr; | |
| 212 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 213 ltr.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
| 214 ltr.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
| 215 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
|
msw
2011/09/14 02:43:48
As an example of my above suggestions to check the
xji
2011/09/15 23:38:13
Done.
| |
| 216 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
| 217 | |
| 218 std::vector<SelectionModel> rtl; | |
| 219 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 220 rtl.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
| 221 rtl.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
| 222 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
|
msw
2011/09/14 02:43:48
similarly, add an extra (0,0,leading).
xji
2011/09/15 23:38:13
Done.
| |
| 223 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
| 224 | |
| 225 // Pure RTL. | |
| 226 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); | |
| 227 rtl.clear(); | |
| 228 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 229 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
| 230 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
| 231 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 232 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
| 233 | |
| 234 ltr.clear(); | |
| 235 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 236 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
| 237 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
| 238 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 239 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
| 240 | |
| 241 // LTR-RTL | |
| 242 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | |
| 243 // The last one is the expected END position. | |
| 244 rtl.clear(); | |
|
msw
2011/09/14 02:43:48
This isn't necessarily important, but you flipped
xji
2011/09/15 23:38:13
Done.
| |
| 245 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 246 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
| 247 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
| 248 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 249 rtl.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | |
| 250 rtl.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | |
| 251 rtl.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | |
| 252 rtl.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
| 253 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), true); | |
| 254 | |
| 255 ltr.clear(); | |
| 256 ltr.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
| 257 ltr.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | |
| 258 ltr.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | |
| 259 ltr.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
| 260 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
| 261 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
| 262 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 263 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), false); | |
| 264 | |
| 265 // RTL-LTR | |
| 266 render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc")); | |
| 267 rtl.clear(); | |
| 268 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 269 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
| 270 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
| 271 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 272 rtl.push_back(SelectionModel(5, 5, SelectionModel::LEADING)); | |
| 273 rtl.push_back(SelectionModel(4, 4, SelectionModel::LEADING)); | |
| 274 rtl.push_back(SelectionModel(3, 3, SelectionModel::LEADING)); | |
| 275 rtl.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
| 276 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
| 277 | |
| 278 ltr.clear(); | |
| 279 ltr.push_back(SelectionModel(6, 3, SelectionModel::LEADING)); | |
| 280 ltr.push_back(SelectionModel(4, 3, SelectionModel::TRAILING)); | |
| 281 ltr.push_back(SelectionModel(5, 4, SelectionModel::TRAILING)); | |
| 282 ltr.push_back(SelectionModel(6, 5, SelectionModel::TRAILING)); | |
| 283 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
| 284 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
| 285 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 286 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
| 287 | |
| 288 // LTR-RTL-LTR. | |
| 289 render_text->SetText(WideToUTF16(L"a"L"\x05d1"L"b")); | |
| 290 ltr.clear(); | |
| 291 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 292 ltr.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
| 293 ltr.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
| 294 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 295 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
| 296 | |
| 297 rtl.clear(); | |
| 298 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 299 rtl.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
| 300 rtl.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
| 301 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 302 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
| 303 | |
| 304 // RTL-LTR-RTL. | |
| 305 render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1")); | |
| 306 rtl.clear(); | |
| 307 rtl.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 308 rtl.push_back(SelectionModel(1, 0, SelectionModel::TRAILING)); | |
| 309 rtl.push_back(SelectionModel(1, 1, SelectionModel::LEADING)); | |
| 310 rtl.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 311 RunMoveCursorLeftRightTest(render_text.get(), rtl, rtl.size(), false); | |
| 312 | |
| 313 ltr.clear(); | |
| 314 ltr.push_back(SelectionModel(3, 2, SelectionModel::TRAILING)); | |
| 315 ltr.push_back(SelectionModel(2, 2, SelectionModel::LEADING)); | |
| 316 ltr.push_back(SelectionModel(2, 1, SelectionModel::TRAILING)); | |
| 317 ltr.push_back(SelectionModel(0, 0, SelectionModel::LEADING)); | |
| 318 RunMoveCursorLeftRightTest(render_text.get(), ltr, ltr.size(), true); | |
| 319 } | |
| 320 | |
| 321 TEST_F(RenderTextTest, MoveCursorLeftRight_ComplexScript) { | |
| 322 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
| 323 | |
| 324 render_text->SetText(WideToUTF16(L"\x0915\x093f\x0915\x094d\x0915")); | |
| 325 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
| 326 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 327 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
| 328 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 329 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
| 330 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 331 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 332 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 333 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 334 | |
| 335 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 336 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
| 337 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 338 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
| 339 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 340 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
| 341 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 342 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
| 343 } | |
| 344 | |
| 345 TEST_F(RenderTextTest, MoveCursorLeftRightWithSelection) { | |
| 346 scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); | |
| 347 render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); | |
| 348 // Left arrow on select ranging (6, 4). | |
| 349 render_text->MoveCursorRight(LINE_BREAK, false); | |
| 350 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
| 351 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 352 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
| 353 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 354 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 355 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 356 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
| 357 render_text->MoveCursorRight(CHARACTER_BREAK, true); | |
| 358 EXPECT_EQ(6U, render_text->GetSelectionStart()); | |
| 359 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 360 render_text->MoveCursorRight(CHARACTER_BREAK, true); | |
| 361 EXPECT_EQ(6U, render_text->GetSelectionStart()); | |
| 362 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
| 363 render_text->MoveCursorLeft(CHARACTER_BREAK, false); | |
| 364 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
| 365 | |
| 366 // Right arrow on select ranging (4, 6). | |
| 367 render_text->MoveCursorLeft(LINE_BREAK, false); | |
| 368 EXPECT_EQ(0U, render_text->GetCursorPosition()); | |
| 369 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 370 EXPECT_EQ(1U, render_text->GetCursorPosition()); | |
| 371 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 372 EXPECT_EQ(2U, render_text->GetCursorPosition()); | |
| 373 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 374 EXPECT_EQ(3U, render_text->GetCursorPosition()); | |
| 375 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 376 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 377 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 378 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
| 379 render_text->MoveCursorLeft(CHARACTER_BREAK, true); | |
| 380 EXPECT_EQ(4U, render_text->GetSelectionStart()); | |
| 381 EXPECT_EQ(5U, render_text->GetCursorPosition()); | |
| 382 render_text->MoveCursorLeft(CHARACTER_BREAK, true); | |
| 383 EXPECT_EQ(4U, render_text->GetSelectionStart()); | |
| 384 EXPECT_EQ(6U, render_text->GetCursorPosition()); | |
| 385 render_text->MoveCursorRight(CHARACTER_BREAK, false); | |
| 386 EXPECT_EQ(4U, render_text->GetCursorPosition()); | |
| 387 } | |
| 388 | |
| 181 } // namespace gfx | 389 } // namespace gfx |
| OLD | NEW |