summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/include/fxcrt/fx_string.h5
-rw-r--r--core/src/fxcrt/fx_basic_wstring_unittest.cpp97
2 files changed, 73 insertions, 29 deletions
diff --git a/core/include/fxcrt/fx_string.h b/core/include/fxcrt/fx_string.h
index 4db83e3914..dd8752ef28 100644
--- a/core/include/fxcrt/fx_string.h
+++ b/core/include/fxcrt/fx_string.h
@@ -654,6 +654,11 @@ public:
const CFX_WideString& operator += (const CFX_WideStringC& str);
+ bool operator< (const CFX_WideString& str) const {
+ int result = wmemcmp(c_str(), str.c_str(), std::min(GetLength(), str.GetLength()));
+ return result < 0 || (result == 0 && GetLength() < str.GetLength());
+ }
+
FX_WCHAR GetAt(FX_STRSIZE nIndex) const
{
return m_pData ? m_pData->m_String[nIndex] : 0;
diff --git a/core/src/fxcrt/fx_basic_wstring_unittest.cpp b/core/src/fxcrt/fx_basic_wstring_unittest.cpp
index c6e5c2f3d0..9575dfd786 100644
--- a/core/src/fxcrt/fx_basic_wstring_unittest.cpp
+++ b/core/src/fxcrt/fx_basic_wstring_unittest.cpp
@@ -1,29 +1,68 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "../../../testing/fx_string_testhelpers.h"
-#include "../../include/fxcrt/fx_basic.h"
-
-#define ByteStringLiteral(str) CFX_ByteString(FX_BSTRC(str))
-
-TEST(fxcrt, WideStringUTF16LE_Encode) {
- struct UTF16LEEncodeCase {
- CFX_WideString ws;
- CFX_ByteString bs;
- } utf16le_encode_cases[] = {
- { L"", ByteStringLiteral("\0\0") },
- { L"abc", ByteStringLiteral("a\0b\0c\0\0\0") },
- { L"abcdef", ByteStringLiteral("a\0b\0c\0d\0e\0f\0\0\0") },
- { L"abc\0def", ByteStringLiteral("a\0b\0c\0\0\0") },
- { L"\xaabb\xccdd", ByteStringLiteral("\xbb\xaa\xdd\xcc\0\0") },
- { L"\x3132\x6162", ByteStringLiteral("\x32\x31\x62\x61\0\0") },
- };
-
- for (size_t i = 0; i < FX_ArraySize(utf16le_encode_cases); ++i) {
- EXPECT_EQ(utf16le_encode_cases[i].bs,
- utf16le_encode_cases[i].ws.UTF16LE_Encode())
- << " for case number " << i;
- }
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "../../../testing/fx_string_testhelpers.h"
+#include "../../include/fxcrt/fx_basic.h"
+
+TEST(fxcrt, WideStringOperatorSubscript) {
+ // CFX_WideString includes the NUL terminator for non-empty strings.
+ CFX_WideString abc(L"abc");
+ EXPECT_EQ(L'a', abc[0]);
+ EXPECT_EQ(L'b', abc[1]);
+ EXPECT_EQ(L'c', abc[2]);
+ EXPECT_EQ(L'\0', abc[3]);
+}
+
+TEST(fxcrt, WideStringOperatorLT) {
+ CFX_WideString empty;
+ CFX_WideString a(L"a");
+ CFX_WideString abc(L"\x0110qq"); // Comes before despite endianness.
+ CFX_WideString def(L"\x1001qq"); // Comes after despite endianness.
+
+ EXPECT_FALSE(empty < empty);
+ EXPECT_FALSE(a < a);
+ EXPECT_FALSE(abc < abc);
+ EXPECT_FALSE(def < def);
+
+ EXPECT_TRUE(empty < a);
+ EXPECT_FALSE(a < empty);
+
+ EXPECT_TRUE(empty < abc);
+ EXPECT_FALSE(abc < empty);
+
+ EXPECT_TRUE(empty < def);
+ EXPECT_FALSE(def < empty);
+
+ EXPECT_TRUE(a < abc);
+ EXPECT_FALSE(abc < a);
+
+ EXPECT_TRUE(a < def);
+ EXPECT_FALSE(def < a);
+
+ EXPECT_TRUE(abc < def);
+ EXPECT_FALSE(def < abc);
+}
+
+#define ByteStringLiteral(str) CFX_ByteString(FX_BSTRC(str))
+
+TEST(fxcrt, WideStringUTF16LE_Encode) {
+ struct UTF16LEEncodeCase {
+ CFX_WideString ws;
+ CFX_ByteString bs;
+ } utf16le_encode_cases[] = {
+ { L"", ByteStringLiteral("\0\0") },
+ { L"abc", ByteStringLiteral("a\0b\0c\0\0\0") },
+ { L"abcdef", ByteStringLiteral("a\0b\0c\0d\0e\0f\0\0\0") },
+ { L"abc\0def", ByteStringLiteral("a\0b\0c\0\0\0") },
+ { L"\xaabb\xccdd", ByteStringLiteral("\xbb\xaa\xdd\xcc\0\0") },
+ { L"\x3132\x6162", ByteStringLiteral("\x32\x31\x62\x61\0\0") },
+ };
+
+ for (size_t i = 0; i < FX_ArraySize(utf16le_encode_cases); ++i) {
+ EXPECT_EQ(utf16le_encode_cases[i].bs,
+ utf16le_encode_cases[i].ws.UTF16LE_Encode())
+ << " for case number " << i;
+ }
+}