Merge to XFA: Fix issues with != and == in fx_basic_wstring
[pdfium.git] / core / src / fxcrt / fx_basic_wstring_unittest.cpp
1 // Copyright 2014 PDFium 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 "testing/gtest/include/gtest/gtest.h"
6 #include "../../../testing/fx_string_testhelpers.h"
7 #include "../../include/fxcrt/fx_basic.h"
8
9 TEST(fxcrt, WideStringOperatorSubscript) {
10     // CFX_WideString includes the NUL terminator for non-empty strings.
11     CFX_WideString abc(L"abc");
12     EXPECT_EQ(L'a', abc[0]);
13     EXPECT_EQ(L'b', abc[1]);
14     EXPECT_EQ(L'c', abc[2]);
15     EXPECT_EQ(L'\0', abc[3]);
16 }
17
18 TEST(fxcrt, WideStringOperatorLT) {
19     CFX_WideString empty;
20     CFX_WideString a(L"a");
21     CFX_WideString abc(L"\x0110qq");  // Comes before despite endianness.
22     CFX_WideString def(L"\x1001qq");  // Comes after despite endianness.
23
24     EXPECT_FALSE(empty < empty);
25     EXPECT_FALSE(a < a);
26     EXPECT_FALSE(abc < abc);
27     EXPECT_FALSE(def < def);
28
29     EXPECT_TRUE(empty < a);
30     EXPECT_FALSE(a < empty);
31
32     EXPECT_TRUE(empty < abc);
33     EXPECT_FALSE(abc < empty);
34
35     EXPECT_TRUE(empty < def);
36     EXPECT_FALSE(def < empty);
37
38     EXPECT_TRUE(a < abc);
39     EXPECT_FALSE(abc < a);
40
41     EXPECT_TRUE(a < def);
42     EXPECT_FALSE(def < a);
43
44     EXPECT_TRUE(abc < def);
45     EXPECT_FALSE(def < abc);
46 }
47
48 TEST(fxcrt, WideStringOperatorEQ) {
49     CFX_WideString wide_string(L"hello");
50     ASSERT_TRUE(wide_string == wide_string);
51
52     CFX_WideString wide_string_same1(L"hello");
53     ASSERT_TRUE(wide_string == wide_string_same1);
54     ASSERT_TRUE(wide_string_same1 == wide_string);
55
56     CFX_WideString wide_string_same2(wide_string);
57     ASSERT_TRUE(wide_string == wide_string_same2);
58     ASSERT_TRUE(wide_string_same2 == wide_string);
59
60     CFX_WideString wide_string1(L"he");
61     CFX_WideString wide_string2(L"hellp");
62     CFX_WideString wide_string3(L"hellod");
63     ASSERT_FALSE(wide_string == wide_string1);
64     ASSERT_FALSE(wide_string == wide_string2);
65     ASSERT_FALSE(wide_string == wide_string3);
66     ASSERT_FALSE(wide_string1 == wide_string);
67     ASSERT_FALSE(wide_string2 == wide_string);
68     ASSERT_FALSE(wide_string3 == wide_string);
69
70     CFX_WideStringC wide_string_c_same1(L"hello");
71     ASSERT_TRUE(wide_string == wide_string_c_same1);
72     ASSERT_TRUE(wide_string_c_same1 == wide_string);
73
74     CFX_WideStringC wide_string_c1(L"he");
75     CFX_WideStringC wide_string_c2(L"hellp");
76     CFX_WideStringC wide_string_c3(L"hellod");
77     ASSERT_FALSE(wide_string == wide_string_c1);
78     ASSERT_FALSE(wide_string == wide_string_c2);
79     ASSERT_FALSE(wide_string == wide_string_c3);
80     ASSERT_FALSE(wide_string_c1 == wide_string);
81     ASSERT_FALSE(wide_string_c2 == wide_string);
82     ASSERT_FALSE(wide_string_c3 == wide_string);
83
84     const wchar_t* c_string_same1 = L"hello";
85     ASSERT_TRUE(wide_string == c_string_same1);
86     ASSERT_TRUE(c_string_same1 == wide_string);
87
88     const wchar_t* c_string1 = L"he";
89     const wchar_t* c_string2 = L"hellp";
90     const wchar_t* c_string3 = L"hellod";
91     ASSERT_FALSE(wide_string == c_string1);
92     ASSERT_FALSE(wide_string == c_string2);
93     ASSERT_FALSE(wide_string == c_string3);
94     ASSERT_FALSE(c_string1 == wide_string);
95     ASSERT_FALSE(c_string2 == wide_string);
96     ASSERT_FALSE(c_string3 == wide_string);
97 }
98
99 TEST(fxcrt, WideStringOperatorNE) {
100     CFX_WideString wide_string(L"hello");
101     ASSERT_FALSE(wide_string != wide_string);
102
103     CFX_WideString wide_string_same1(L"hello");
104     ASSERT_FALSE(wide_string != wide_string_same1);
105     ASSERT_FALSE(wide_string_same1 != wide_string);
106
107     CFX_WideString wide_string_same2(wide_string);
108     ASSERT_FALSE(wide_string != wide_string_same2);
109     ASSERT_FALSE(wide_string_same2 != wide_string);
110
111     CFX_WideString wide_string1(L"he");
112     CFX_WideString wide_string2(L"hellp");
113     CFX_WideString wide_string3(L"hellod");
114     ASSERT_TRUE(wide_string != wide_string1);
115     ASSERT_TRUE(wide_string != wide_string2);
116     ASSERT_TRUE(wide_string != wide_string3);
117     ASSERT_TRUE(wide_string1 != wide_string);
118     ASSERT_TRUE(wide_string2 != wide_string);
119     ASSERT_TRUE(wide_string3 != wide_string);
120
121     CFX_WideStringC wide_string_c_same1(L"hello");
122     ASSERT_FALSE(wide_string != wide_string_c_same1);
123     ASSERT_FALSE(wide_string_c_same1 != wide_string);
124
125     CFX_WideStringC wide_string_c1(L"he");
126     CFX_WideStringC wide_string_c2(L"hellp");
127     CFX_WideStringC wide_string_c3(L"hellod");
128     ASSERT_TRUE(wide_string != wide_string_c1);
129     ASSERT_TRUE(wide_string != wide_string_c2);
130     ASSERT_TRUE(wide_string != wide_string_c3);
131     ASSERT_TRUE(wide_string_c1 != wide_string);
132     ASSERT_TRUE(wide_string_c2 != wide_string);
133     ASSERT_TRUE(wide_string_c3 != wide_string);
134
135     const wchar_t* c_string_same1 = L"hello";
136     ASSERT_FALSE(wide_string != c_string_same1);
137     ASSERT_FALSE(c_string_same1 != wide_string);
138
139     const wchar_t* c_string1 = L"he";
140     const wchar_t* c_string2 = L"hellp";
141     const wchar_t* c_string3 = L"hellod";
142     ASSERT_TRUE(wide_string != c_string1);
143     ASSERT_TRUE(wide_string != c_string2);
144     ASSERT_TRUE(wide_string != c_string3);
145
146     ASSERT_TRUE(c_string1 != wide_string);
147     ASSERT_TRUE(c_string2 != wide_string);
148     ASSERT_TRUE(c_string3 != wide_string);
149 }
150
151 #define ByteStringLiteral(str) CFX_ByteString(FX_BSTRC(str))
152
153 TEST(fxcrt, WideStringUTF16LE_Encode) {
154   struct UTF16LEEncodeCase {
155     CFX_WideString ws;
156     CFX_ByteString bs;
157   } utf16le_encode_cases[] = {
158     { L"", ByteStringLiteral("\0\0") },
159     { L"abc", ByteStringLiteral("a\0b\0c\0\0\0") },
160     { L"abcdef", ByteStringLiteral("a\0b\0c\0d\0e\0f\0\0\0") },
161     { L"abc\0def", ByteStringLiteral("a\0b\0c\0\0\0") },
162     { L"\xaabb\xccdd", ByteStringLiteral("\xbb\xaa\xdd\xcc\0\0") },
163     { L"\x3132\x6162", ByteStringLiteral("\x32\x31\x62\x61\0\0") },
164   };
165
166   for (size_t i = 0; i < FX_ArraySize(utf16le_encode_cases); ++i) {
167     EXPECT_EQ(utf16le_encode_cases[i].bs,
168         utf16le_encode_cases[i].ws.UTF16LE_Encode())
169         << " for case number " << i;
170   }
171 }
172
173 TEST(fxcrt, WideStringCOperatorSubscript) {
174     // CFX_WideStringC includes the NUL terminator for non-empty strings.
175     CFX_WideStringC abc(L"abc");
176     EXPECT_EQ(L'a', abc[0]);
177     EXPECT_EQ(L'b', abc[1]);
178     EXPECT_EQ(L'c', abc[2]);
179     EXPECT_EQ(L'\0', abc[3]);
180 }
181
182 TEST(fxcrt, WideStringCOperatorLT) {
183     CFX_WideStringC empty;
184     CFX_WideStringC a(L"a");
185     CFX_WideStringC abc(L"\x0110qq");  // Comes before despite endianness.
186     CFX_WideStringC def(L"\x1001qq");  // Comes after despite endianness.
187
188     EXPECT_FALSE(empty < empty);
189     EXPECT_FALSE(a < a);
190     EXPECT_FALSE(abc < abc);
191     EXPECT_FALSE(def < def);
192
193     EXPECT_TRUE(empty < a);
194     EXPECT_FALSE(a < empty);
195
196     EXPECT_TRUE(empty < abc);
197     EXPECT_FALSE(abc < empty);
198
199     EXPECT_TRUE(empty < def);
200     EXPECT_FALSE(def < empty);
201
202     EXPECT_TRUE(a < abc);
203     EXPECT_FALSE(abc < a);
204
205     EXPECT_TRUE(a < def);
206     EXPECT_FALSE(def < a);
207
208     EXPECT_TRUE(abc < def);
209     EXPECT_FALSE(def < abc);
210 }
211
212 TEST(fxcrt, WideStringCOperatorEQ) {
213     CFX_WideStringC wide_string_c(L"hello");
214     ASSERT_TRUE(wide_string_c == wide_string_c);
215
216     CFX_WideStringC wide_string_c_same1(L"hello");
217     ASSERT_TRUE(wide_string_c == wide_string_c_same1);
218     ASSERT_TRUE(wide_string_c_same1 == wide_string_c);
219
220     CFX_WideStringC wide_string_c_same2(wide_string_c);
221     ASSERT_TRUE(wide_string_c == wide_string_c_same2);
222     ASSERT_TRUE(wide_string_c_same2 == wide_string_c);
223
224     CFX_WideStringC wide_string_c1(L"he");
225     CFX_WideStringC wide_string_c2(L"hellp");
226     CFX_WideStringC wide_string_c3(L"hellod");
227     ASSERT_FALSE(wide_string_c == wide_string_c1);
228     ASSERT_FALSE(wide_string_c == wide_string_c2);
229     ASSERT_FALSE(wide_string_c == wide_string_c3);
230     ASSERT_FALSE(wide_string_c1 == wide_string_c);
231     ASSERT_FALSE(wide_string_c2 == wide_string_c);
232     ASSERT_FALSE(wide_string_c3 == wide_string_c);
233
234     CFX_WideString wide_string_same1(L"hello");
235     ASSERT_TRUE(wide_string_c == wide_string_same1);
236     ASSERT_TRUE(wide_string_same1 == wide_string_c);
237
238     CFX_WideString wide_string1(L"he");
239     CFX_WideString wide_string2(L"hellp");
240     CFX_WideString wide_string3(L"hellod");
241     ASSERT_FALSE(wide_string_c == wide_string1);
242     ASSERT_FALSE(wide_string_c == wide_string2);
243     ASSERT_FALSE(wide_string_c == wide_string3);
244     ASSERT_FALSE(wide_string1 == wide_string_c);
245     ASSERT_FALSE(wide_string2 == wide_string_c);
246     ASSERT_FALSE(wide_string3 == wide_string_c);
247
248     const wchar_t* c_string_same1 = L"hello";
249     ASSERT_TRUE(wide_string_c == c_string_same1);
250     ASSERT_TRUE(c_string_same1 == wide_string_c);
251
252     const wchar_t* c_string1 = L"he";
253     const wchar_t* c_string2 = L"hellp";
254     const wchar_t* c_string3 = L"hellod";
255     ASSERT_FALSE(wide_string_c == c_string1);
256     ASSERT_FALSE(wide_string_c == c_string2);
257     ASSERT_FALSE(wide_string_c == c_string3);
258
259     ASSERT_FALSE(c_string1 == wide_string_c);
260     ASSERT_FALSE(c_string2 == wide_string_c);
261     ASSERT_FALSE(c_string3 == wide_string_c);
262 }
263
264 TEST(fxcrt, WideStringCOperatorNE) {
265     CFX_WideStringC wide_string_c(L"hello");
266     ASSERT_FALSE(wide_string_c != wide_string_c);
267
268     CFX_WideStringC wide_string_c_same1(L"hello");
269     ASSERT_FALSE(wide_string_c != wide_string_c_same1);
270     ASSERT_FALSE(wide_string_c_same1 != wide_string_c);
271
272     CFX_WideStringC wide_string_c_same2(wide_string_c);
273     ASSERT_FALSE(wide_string_c != wide_string_c_same2);
274     ASSERT_FALSE(wide_string_c_same2 != wide_string_c);
275
276     CFX_WideStringC wide_string_c1(L"he");
277     CFX_WideStringC wide_string_c2(L"hellp");
278     CFX_WideStringC wide_string_c3(L"hellod");
279     ASSERT_TRUE(wide_string_c != wide_string_c1);
280     ASSERT_TRUE(wide_string_c != wide_string_c2);
281     ASSERT_TRUE(wide_string_c != wide_string_c3);
282     ASSERT_TRUE(wide_string_c1 != wide_string_c);
283     ASSERT_TRUE(wide_string_c2 != wide_string_c);
284     ASSERT_TRUE(wide_string_c3 != wide_string_c);
285
286     CFX_WideString wide_string_same1(L"hello");
287     ASSERT_FALSE(wide_string_c != wide_string_same1);
288     ASSERT_FALSE(wide_string_same1 != wide_string_c);
289
290     CFX_WideString wide_string1(L"he");
291     CFX_WideString wide_string2(L"hellp");
292     CFX_WideString wide_string3(L"hellod");
293     ASSERT_TRUE(wide_string_c != wide_string1);
294     ASSERT_TRUE(wide_string_c != wide_string2);
295     ASSERT_TRUE(wide_string_c != wide_string3);
296     ASSERT_TRUE(wide_string1 != wide_string_c);
297     ASSERT_TRUE(wide_string2 != wide_string_c);
298     ASSERT_TRUE(wide_string3 != wide_string_c);
299
300     const wchar_t* c_string_same1 = L"hello";
301     ASSERT_FALSE(wide_string_c != c_string_same1);
302     ASSERT_FALSE(c_string_same1 != wide_string_c);
303
304     const wchar_t* c_string1 = L"he";
305     const wchar_t* c_string2 = L"hellp";
306     const wchar_t* c_string3 = L"hellod";
307     ASSERT_TRUE(wide_string_c != c_string1);
308     ASSERT_TRUE(wide_string_c != c_string2);
309     ASSERT_TRUE(wide_string_c != c_string3);
310
311     ASSERT_TRUE(c_string1 != wide_string_c);
312     ASSERT_TRUE(c_string2 != wide_string_c);
313     ASSERT_TRUE(c_string3 != wide_string_c);
314 }