1 // Copyright (c) 2009 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 "base/i18n/word_iterator.h" 6 7 #include "base/string_piece.h" 8 #include "base/string_util.h" 9 #include "base/sys_string_conversions.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 TEST(WordIteratorTest, BreakWord) { 13 std::wstring str(L" foo bar! \npouet boom"); 14 WordIterator iter(str, WordIterator::BREAK_WORD); 15 ASSERT_TRUE(iter.Init()); 16 EXPECT_TRUE(iter.Advance()); 17 EXPECT_FALSE(iter.IsWord()); 18 EXPECT_EQ(L" ", iter.GetWord()); 19 EXPECT_TRUE(iter.Advance()); 20 EXPECT_TRUE(iter.IsWord()); 21 EXPECT_EQ(L"foo", iter.GetWord()); 22 EXPECT_TRUE(iter.Advance()); 23 EXPECT_FALSE(iter.IsWord()); 24 EXPECT_EQ(L" ", iter.GetWord()); 25 EXPECT_TRUE(iter.Advance()); 26 EXPECT_TRUE(iter.IsWord()); 27 EXPECT_EQ(L"bar", iter.GetWord()); 28 EXPECT_TRUE(iter.Advance()); 29 EXPECT_FALSE(iter.IsWord()); 30 EXPECT_EQ(L"!", iter.GetWord()); 31 EXPECT_TRUE(iter.Advance()); 32 EXPECT_FALSE(iter.IsWord()); 33 EXPECT_EQ(L" ", iter.GetWord()); 34 EXPECT_TRUE(iter.Advance()); 35 EXPECT_FALSE(iter.IsWord()); 36 EXPECT_EQ(L"\n", iter.GetWord()); 37 EXPECT_TRUE(iter.Advance()); 38 EXPECT_TRUE(iter.IsWord()); 39 EXPECT_EQ(L"pouet", iter.GetWord()); 40 EXPECT_TRUE(iter.Advance()); 41 EXPECT_FALSE(iter.IsWord()); 42 EXPECT_EQ(L" ", iter.GetWord()); 43 EXPECT_TRUE(iter.Advance()); 44 EXPECT_TRUE(iter.IsWord()); 45 EXPECT_EQ(L"boom", iter.GetWord()); 46 EXPECT_FALSE(iter.Advance()); 47 EXPECT_FALSE(iter.IsWord()); 48 } 49 50 TEST(WordIteratorTest, BreakLine) { 51 std::wstring str(L" foo bar! \npouet boom"); 52 WordIterator iter(str, WordIterator::BREAK_LINE); 53 ASSERT_TRUE(iter.Init()); 54 EXPECT_TRUE(iter.Advance()); 55 EXPECT_FALSE(iter.IsWord()); 56 EXPECT_EQ(L" ", iter.GetWord()); 57 EXPECT_TRUE(iter.Advance()); 58 EXPECT_FALSE(iter.IsWord()); 59 EXPECT_EQ(L"foo ", iter.GetWord()); 60 EXPECT_TRUE(iter.Advance()); 61 EXPECT_TRUE(iter.IsWord()); 62 EXPECT_EQ(L"bar! \n", iter.GetWord()); 63 EXPECT_TRUE(iter.Advance()); 64 EXPECT_FALSE(iter.IsWord()); 65 EXPECT_EQ(L"pouet ", iter.GetWord()); 66 EXPECT_TRUE(iter.Advance()); 67 EXPECT_FALSE(iter.IsWord()); 68 EXPECT_EQ(L"boom", iter.GetWord()); 69 EXPECT_FALSE(iter.Advance()); 70 EXPECT_FALSE(iter.IsWord()); 71 } 72 73 TEST(WordIteratorTest, BreakWide16) { 74 // " " 75 const std::wstring str(L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9" 76 L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2"); 77 const std::wstring word1(str.substr(0, 10)); 78 const std::wstring word2(str.substr(11, 5)); 79 WordIterator iter(str, WordIterator::BREAK_WORD); 80 ASSERT_TRUE(iter.Init()); 81 EXPECT_TRUE(iter.Advance()); 82 EXPECT_TRUE(iter.IsWord()); 83 EXPECT_EQ(word1, iter.GetWord()); 84 EXPECT_TRUE(iter.Advance()); 85 EXPECT_FALSE(iter.IsWord()); 86 EXPECT_EQ(L" ", iter.GetWord()); 87 EXPECT_TRUE(iter.Advance()); 88 EXPECT_TRUE(iter.IsWord()); 89 EXPECT_EQ(word2, iter.GetWord()); 90 EXPECT_FALSE(iter.Advance()); 91 EXPECT_FALSE(iter.IsWord()); 92 } 93 94 TEST(WordIteratorTest, BreakWide32) { 95 // U+1D49C MATHEMATICAL SCRIPT CAPITAL A 96 const char *very_wide_char = "\xF0\x9D\x92\x9C"; 97 const std::wstring str( 98 base::SysUTF8ToWide(StringPrintf("%s a", very_wide_char))); 99 #if defined(WCHAR_T_IS_UTF16) 100 const std::wstring very_wide_word(str.substr(0, 2)); 101 #elif defined(WCHAR_T_IS_UTF32) 102 const std::wstring very_wide_word(str.substr(0, 1)); 103 #endif 104 WordIterator iter(str, WordIterator::BREAK_WORD); 105 ASSERT_TRUE(iter.Init()); 106 EXPECT_TRUE(iter.Advance()); 107 EXPECT_TRUE(iter.IsWord()); 108 EXPECT_EQ(very_wide_word, iter.GetWord()); 109 EXPECT_TRUE(iter.Advance()); 110 EXPECT_FALSE(iter.IsWord()); 111 EXPECT_EQ(L" ", iter.GetWord()); 112 EXPECT_TRUE(iter.Advance()); 113 EXPECT_TRUE(iter.IsWord()); 114 EXPECT_EQ(L"a", iter.GetWord()); 115 EXPECT_FALSE(iter.Advance()); 116 EXPECT_FALSE(iter.IsWord()); 117 } 118