Add missing operators for CFX_WideString
authorTom Sepez <tsepez@chromium.org>
Wed, 22 Apr 2015 17:23:07 +0000 (10:23 -0700)
committerTom Sepez <tsepez@chromium.org>
Wed, 22 Apr 2015 17:23:07 +0000 (10:23 -0700)
Part 4 of 4.

BUG=pdfium:142
R=brucedawson@chromium.org, thestig@chromium.org

Review URL: https://codereview.chromium.org/1084293003

core/include/fxcrt/fx_string.h
core/src/fxcrt/fx_basic_wstring_unittest.cpp

index 4db83e3..dd8752e 100644 (file)
@@ -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;
index c6e5c2f..9575dfd 100644 (file)
@@ -1,29 +1,68 @@
-\feff// Copyright 2014 PDFium Authors. All rights reserved.\r
-// Use of this source code is governed by a BSD-style license that can be\r
-// found in the LICENSE file.\r
-\r
-#include "testing/gtest/include/gtest/gtest.h"\r
-#include "../../../testing/fx_string_testhelpers.h"\r
-#include "../../include/fxcrt/fx_basic.h"\r
-\r
-#define ByteStringLiteral(str) CFX_ByteString(FX_BSTRC(str))\r
-\r
-TEST(fxcrt, WideStringUTF16LE_Encode) {\r
-  struct UTF16LEEncodeCase {\r
-    CFX_WideString ws;\r
-    CFX_ByteString bs;\r
-  } utf16le_encode_cases[] = {\r
-    { L"", ByteStringLiteral("\0\0") },\r
-    { L"abc", ByteStringLiteral("a\0b\0c\0\0\0") },\r
-    { L"abcdef", ByteStringLiteral("a\0b\0c\0d\0e\0f\0\0\0") },\r
-    { L"abc\0def", ByteStringLiteral("a\0b\0c\0\0\0") },\r
-    { L"\xaabb\xccdd", ByteStringLiteral("\xbb\xaa\xdd\xcc\0\0") },\r
-    { L"\x3132\x6162", ByteStringLiteral("\x32\x31\x62\x61\0\0") },\r
-  };\r
-\r
-  for (size_t i = 0; i < FX_ArraySize(utf16le_encode_cases); ++i) {\r
-    EXPECT_EQ(utf16le_encode_cases[i].bs,\r
-        utf16le_encode_cases[i].ws.UTF16LE_Encode())\r
-        << " for case number " << i;\r
-  }\r
-}\r
+// 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;
+  }
+}