char_iterator_unittest.cc revision 7f92e4ca7bcb209f5d9b38cacaf3a1c6cbe493aa
1// Copyright (c) 2010 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/char_iterator.h"
6
7#include "base/utf_string_conversions.h"
8#include "testing/gtest/include/gtest/gtest.h"
9
10TEST(CharIteratorsTest, TestUTF8) {
11  std::string empty("");
12  base::UTF8CharIterator empty_iter(&empty);
13  ASSERT_TRUE(empty_iter.end());
14  ASSERT_EQ(0, empty_iter.array_pos());
15  ASSERT_EQ(0, empty_iter.char_pos());
16  ASSERT_FALSE(empty_iter.Advance());
17
18  std::string str("s\303\273r");  // [u with circumflex]
19  base::UTF8CharIterator iter(&str);
20  ASSERT_FALSE(iter.end());
21  ASSERT_EQ(0, iter.array_pos());
22  ASSERT_EQ(0, iter.char_pos());
23  ASSERT_EQ('s', iter.get());
24  ASSERT_TRUE(iter.Advance());
25
26  ASSERT_FALSE(iter.end());
27  ASSERT_EQ(1, iter.array_pos());
28  ASSERT_EQ(1, iter.char_pos());
29  ASSERT_EQ(251, iter.get());
30  ASSERT_TRUE(iter.Advance());
31
32  ASSERT_FALSE(iter.end());
33  ASSERT_EQ(3, iter.array_pos());
34  ASSERT_EQ(2, iter.char_pos());
35  ASSERT_EQ('r', iter.get());
36  ASSERT_TRUE(iter.Advance());
37
38  ASSERT_TRUE(iter.end());
39  ASSERT_EQ(4, iter.array_pos());
40  ASSERT_EQ(3, iter.char_pos());
41
42  // Don't care what it returns, but this shouldn't crash
43  iter.get();
44
45  ASSERT_FALSE(iter.Advance());
46}
47
48TEST(CharIteratorsTest, TestUTF16) {
49  string16 empty = UTF8ToUTF16("");
50  base::UTF16CharIterator empty_iter(&empty);
51  ASSERT_TRUE(empty_iter.end());
52  ASSERT_EQ(0, empty_iter.array_pos());
53  ASSERT_EQ(0, empty_iter.char_pos());
54  ASSERT_FALSE(empty_iter.Advance());
55
56  // This test string contains 4 characters:
57  //   x
58  //   u with circumflex - 2 bytes in UTF8, 1 codeword in UTF16
59  //   math double-struck A - 4 bytes in UTF8, 2 codewords in UTF16
60  //   z
61  string16 str = UTF8ToUTF16("x\303\273\360\235\224\270z");
62  base::UTF16CharIterator iter(&str);
63  ASSERT_FALSE(iter.end());
64  ASSERT_EQ(0, iter.array_pos());
65  ASSERT_EQ(0, iter.char_pos());
66  ASSERT_EQ('x', iter.get());
67  ASSERT_TRUE(iter.Advance());
68
69  ASSERT_FALSE(iter.end());
70  ASSERT_EQ(1, iter.array_pos());
71  ASSERT_EQ(1, iter.char_pos());
72  ASSERT_EQ(251, iter.get());
73  ASSERT_TRUE(iter.Advance());
74
75  ASSERT_FALSE(iter.end());
76  ASSERT_EQ(2, iter.array_pos());
77  ASSERT_EQ(2, iter.char_pos());
78  ASSERT_EQ(120120, iter.get());
79  ASSERT_TRUE(iter.Advance());
80
81  ASSERT_FALSE(iter.end());
82  ASSERT_EQ(4, iter.array_pos());
83  ASSERT_EQ(3, iter.char_pos());
84  ASSERT_EQ('z', iter.get());
85  ASSERT_TRUE(iter.Advance());
86
87  ASSERT_TRUE(iter.end());
88  ASSERT_EQ(5, iter.array_pos());
89  ASSERT_EQ(4, iter.char_pos());
90
91  // Don't care what it returns, but this shouldn't crash
92  iter.get();
93
94  ASSERT_FALSE(iter.Advance());
95}
96