Index: ui/gfx/render_text_unittest.cc |
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc |
index bd0b24c8695d80d2969e0c712a70d8b22d77711c..8ac129cbfaf781c162e9006db1995774d0eaeaad 100644 |
--- a/ui/gfx/render_text_unittest.cc |
+++ b/ui/gfx/render_text_unittest.cc |
@@ -8,6 +8,7 @@ |
#include "base/utf_string_conversions.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/base/l10n/l10n_util.h" |
+#include "ui/gfx/text_constants.h" |
#if defined(OS_WIN) |
#include "base/win/windows_version.h" |
@@ -21,6 +22,15 @@ namespace gfx { |
namespace { |
+// Various weak, LTR, RTL, and Bidi string cases with three characters each. |
+const wchar_t kWeak[] = L" . "; |
+const wchar_t kLtr[] = L"abc"; |
+const wchar_t kLtrRtl[] = L"a"L"\x5d0\x5d1"; |
+const wchar_t kLtrRtlLtr[] = L"a"L"\x5d1"L"b"; |
+const wchar_t kRtl[] = L"\x5d0\x5d1\x5d2"; |
+const wchar_t kRtlLtr[] = L"\x5d0\x5d1"L"a"; |
+const wchar_t kRtlLtrRtl[] = L"\x5d0"L"a"L"\x5d1"; |
+ |
// Checks whether |range| contains |index|. This is not the same as calling |
// |range.Contains(ui::Range(index))| - as that would return true when |
// |index| == |range.end()|. |
@@ -219,12 +229,12 @@ TEST_F(RenderTextTest, ApplyStyleRange) { |
static void SetTextWith2ExtraStyles(RenderText* render_text) { |
render_text->SetText(ASCIIToUTF16("abcdefghi")); |
- gfx::StyleRange strike; |
+ StyleRange strike; |
strike.strike = true; |
strike.range = ui::Range(0, 3); |
render_text->ApplyStyleRange(strike); |
- gfx::StyleRange underline; |
+ StyleRange underline; |
underline.underline = true; |
underline.range = ui::Range(3, 6); |
render_text->ApplyStyleRange(underline); |
@@ -383,39 +393,54 @@ TEST_F(RenderTextTest, PasswordCensorship) { |
} |
TEST_F(RenderTextTest, GetTextDirection) { |
- const bool was_rtl = base::i18n::IsRTL(); |
- // Ensure that text direction is set by the first strong character direction. |
+ struct { |
+ const wchar_t* text; |
+ const base::i18n::TextDirection text_direction; |
+ } cases[] = { |
+ // Blank strings and those with no/weak directionality default to LTR. |
+ { L"", base::i18n::LEFT_TO_RIGHT }, |
+ { kWeak, base::i18n::LEFT_TO_RIGHT }, |
+ // Strings that begin with strong LTR characters. |
+ { kLtr, base::i18n::LEFT_TO_RIGHT }, |
+ { kLtrRtl, base::i18n::LEFT_TO_RIGHT }, |
+ { kLtrRtlLtr, base::i18n::LEFT_TO_RIGHT }, |
+ // Strings that begin with strong RTL characters. |
+ { kRtl, base::i18n::RIGHT_TO_LEFT }, |
+ { kRtlLtr, base::i18n::RIGHT_TO_LEFT }, |
+ { kRtlLtrRtl, base::i18n::RIGHT_TO_LEFT }, |
+ }; |
+ |
scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); |
+ const bool was_rtl = base::i18n::IsRTL(); |
+ |
for (size_t i = 0; i < 2; ++i) { |
// Toggle the application default text direction (to try each direction). |
SetRTL(!base::i18n::IsRTL()); |
+ const base::i18n::TextDirection ui_direction = base::i18n::IsRTL() ? |
+ base::i18n::RIGHT_TO_LEFT : base::i18n::LEFT_TO_RIGHT; |
- // Blank strings (and those without directionality) default to LTR. |
- render_text->SetText(string16()); |
- EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection()); |
- render_text->SetText(ASCIIToUTF16(" ")); |
- EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection()); |
- |
- // Pure LTR. |
- render_text->SetText(ASCIIToUTF16("abc")); |
- EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection()); |
- // LTR-RTL |
- render_text->SetText(WideToUTF16(L"abc\x05d0\x05d1\x05d2")); |
- EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection()); |
- // LTR-RTL-LTR. |
- render_text->SetText(WideToUTF16(L"a"L"\x05d1"L"b")); |
- EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, render_text->GetTextDirection()); |
- // Pure RTL. |
- render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2")); |
- EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection()); |
- // RTL-LTR |
- render_text->SetText(WideToUTF16(L"\x05d0\x05d1\x05d2"L"abc")); |
- EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection()); |
- // RTL-LTR-RTL. |
- render_text->SetText(WideToUTF16(L"\x05d0"L"a"L"\x05d1")); |
- EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, render_text->GetTextDirection()); |
+ // Ensure that directionality modes yield the correct text directions. |
+ for (size_t j = 0; j < ARRAYSIZE_UNSAFE(cases); j++) { |
+ render_text->SetText(WideToUTF16(cases[j].text)); |
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT); |
+ EXPECT_EQ(render_text->GetTextDirection(), cases[j].text_direction); |
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_UI); |
+ EXPECT_EQ(render_text->GetTextDirection(), ui_direction); |
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_LTR); |
+ EXPECT_EQ(render_text->GetTextDirection(), base::i18n::LEFT_TO_RIGHT); |
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FORCE_RTL); |
+ EXPECT_EQ(render_text->GetTextDirection(), base::i18n::RIGHT_TO_LEFT); |
+ } |
} |
+ |
EXPECT_EQ(was_rtl, base::i18n::IsRTL()); |
+ |
+ // Ensure that text changes update the direction for DIRECTIONALITY_FROM_TEXT. |
+ render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT); |
+ render_text->SetText(WideToUTF16(kLtr)); |
+ EXPECT_EQ(render_text->GetTextDirection(), base::i18n::LEFT_TO_RIGHT); |
+ render_text->SetText(WideToUTF16(kRtl)); |
+ EXPECT_EQ(render_text->GetTextDirection(), base::i18n::RIGHT_TO_LEFT); |
} |
void RunMoveCursorLeftRightTest(RenderText* render_text, |
@@ -731,14 +756,8 @@ TEST_F(RenderTextTest, EdgeSelectionModels) { |
} |
TEST_F(RenderTextTest, SelectAll) { |
- const wchar_t* const cases[] = { |
- L"abc", |
- L"a"L"\x5d0\x5d1", |
- L"a"L"\x5d1"L"b", |
- L"\x5d0\x5d1\x5d2", |
- L"\x5d0\x5d1"L"a", |
- L"\x5d0"L"a"L"\x5d1", |
- }; |
+ const wchar_t* const cases[] = |
+ { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl, kRtlLtr, kRtlLtrRtl }; |
// Ensure that SelectAll respects the |reversed| argument regardless of |
// application locale and text content directionality. |
@@ -749,6 +768,11 @@ TEST_F(RenderTextTest, SelectAll) { |
for (size_t i = 0; i < 2; ++i) { |
SetRTL(!base::i18n::IsRTL()); |
+ // Test that an empty string produces an empty selection model. |
+ render_text->SetText(string16()); |
+ EXPECT_EQ(render_text->selection_model(), SelectionModel()); |
+ |
+ // Test the weak, LTR, RTL, and Bidi string cases. |
for (size_t j = 0; j < ARRAYSIZE_UNSAFE(cases); j++) { |
render_text->SetText(WideToUTF16(cases[j])); |
render_text->SelectAll(false); |