From ea6a069e6e593d97513e86fc761cf789a9714c22 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Wed, 22 Apr 2015 10:23:07 -0700 Subject: Add missing operators for CFX_WideString 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 | 5 ++ core/src/fxcrt/fx_basic_wstring_unittest.cpp | 97 +++++++++++++++++++--------- 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; + } +} -- cgit v1.2.3