From 5e9066cbfa252b84d49f8b4adba445ba7761e81f Mon Sep 17 00:00:00 2001 From: dsinclair Date: Mon, 9 Jan 2017 13:43:07 -0800 Subject: Add CFDE_TxtEdtBuf tests This CL adds a set of unit tests for the text edit buffer. It fixes up a few bugs found adding the tests and removes the unused ::Optimize method. Review-Url: https://codereview.chromium.org/2614383003 --- xfa/fde/cfde_txtedtbuf_unittest.cpp | 199 ++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 xfa/fde/cfde_txtedtbuf_unittest.cpp (limited to 'xfa/fde/cfde_txtedtbuf_unittest.cpp') diff --git a/xfa/fde/cfde_txtedtbuf_unittest.cpp b/xfa/fde/cfde_txtedtbuf_unittest.cpp new file mode 100644 index 0000000000..7228b2ad03 --- /dev/null +++ b/xfa/fde/cfde_txtedtbuf_unittest.cpp @@ -0,0 +1,199 @@ +// Copyright 2017 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 "xfa/fde/cfde_txtedtbuf.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/test_support.h" +#include "third_party/base/ptr_util.h" + +class CFDE_TxtEdtBufTest : public testing::Test { + public: + void SetUp() override { + buf_ = pdfium::MakeUnique(); + buf_->SetChunkSizeForTesting(5); + } + size_t ChunkCount() const { return buf_->m_Chunks.GetSize(); } + + std::unique_ptr buf_; +}; + +TEST_F(CFDE_TxtEdtBufTest, SetTextLessThenChunkSize) { + buf_->SetText(L"Hi"); + EXPECT_EQ(1UL, ChunkCount()); + EXPECT_EQ(2, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(2, res.GetLength()); + EXPECT_EQ(L"Hi", res); +} + +TEST_F(CFDE_TxtEdtBufTest, InsertAppendChunk) { + buf_->SetText(L"Hi"); + + CFX_WideString end = L" World"; + buf_->Insert(2, end.c_str(), end.GetLength()); + EXPECT_EQ(3UL, ChunkCount()); + EXPECT_EQ(8, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(8, res.GetLength()); + EXPECT_EQ(L"Hi World", res); +} + +TEST_F(CFDE_TxtEdtBufTest, InsertPrependChunk) { + buf_->SetText(L"Hi"); + + CFX_WideString end = L"World "; + buf_->Insert(0, end.c_str(), end.GetLength()); + EXPECT_EQ(3UL, ChunkCount()); + EXPECT_EQ(8, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"World Hi", res); + EXPECT_EQ(8, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, InsertBetweenChunks) { + buf_->SetText(L"Hello World"); + EXPECT_EQ(3UL, ChunkCount()); + + CFX_WideString inst = L"there "; + buf_->Insert(6, inst.c_str(), inst.GetLength()); + EXPECT_EQ(5UL, ChunkCount()); + EXPECT_EQ(17, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"Hello there World", res); + EXPECT_EQ(17, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, SetText) { + buf_->SetText(L"Hello World"); + EXPECT_EQ(11, buf_->GetTextLength()); + + buf_->SetText(L"Hi"); + // Don't remove chunks on setting shorter text. + EXPECT_EQ(3UL, ChunkCount()); + EXPECT_EQ(2, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"Hi", res); + EXPECT_EQ(2, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, DeleteMiddleText) { + buf_->SetText(L"Hello there World"); + buf_->Delete(6, 6); + EXPECT_EQ(4UL, ChunkCount()); + EXPECT_EQ(11, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"Hello World", res); + EXPECT_EQ(11, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, DeleteEndText) { + buf_->SetText(L"Hello World"); + buf_->Delete(5, 6); + EXPECT_EQ(1UL, ChunkCount()); + EXPECT_EQ(5, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"Hello", res); + EXPECT_EQ(5, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, DeleteStartText) { + buf_->SetText(L"Hello World"); + buf_->Delete(0, 6); + EXPECT_EQ(2UL, ChunkCount()); + EXPECT_EQ(5, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"World", res); + EXPECT_EQ(5, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, DeleteAllText) { + buf_->SetText(L"Hello World"); + buf_->Delete(0, 11); + EXPECT_EQ(0UL, ChunkCount()); + EXPECT_EQ(0, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"", res); + EXPECT_EQ(0, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, ClearWithRelease) { + buf_->SetText(L"Hello World"); + buf_->Clear(true); + EXPECT_EQ(0UL, ChunkCount()); + EXPECT_EQ(0, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"", res); + EXPECT_EQ(0, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, ClearWithoutRelease) { + buf_->SetText(L"Hello World"); + buf_->Clear(false); + EXPECT_EQ(3UL, ChunkCount()); + EXPECT_EQ(0, buf_->GetTextLength()); + + CFX_WideString res = buf_->GetText(); + EXPECT_EQ(L"", res); + EXPECT_EQ(0, res.GetLength()); +} + +TEST_F(CFDE_TxtEdtBufTest, GetCharByIndex) { + buf_->SetText(L"Hello world"); + EXPECT_EQ(L"e", CFX_WideString(buf_->GetCharByIndex(1))); + EXPECT_EQ(L"o", CFX_WideString(buf_->GetCharByIndex(7))); +} + +TEST_F(CFDE_TxtEdtBufTest, GetRange) { + buf_->SetText(L"Hello World"); + EXPECT_EQ(L"", buf_->GetRange(1, 0)); + EXPECT_EQ(L"ello", buf_->GetRange(1, 4)); + EXPECT_EQ(L"lo Wo", buf_->GetRange(3, 5)); +} + +#ifndef NDEBUG +using CFDE_TxtEdtBufTestDeathTest = CFDE_TxtEdtBufTest; + +TEST_F(CFDE_TxtEdtBufTestDeathTest, InsertBadIndexes) { + CFX_WideString inst = L"there "; + + buf_->SetText(L"Hi"); + EXPECT_DEATH(buf_->Insert(-4, inst.c_str(), inst.GetLength()), "Assertion"); + EXPECT_DEATH(buf_->Insert(9999, inst.c_str(), inst.GetLength()), "Assertion"); + EXPECT_DEATH(buf_->Insert(1, inst.c_str(), -6), "Assertion"); +} + +TEST_F(CFDE_TxtEdtBufTestDeathTest, DeleteWithBadIdx) { + buf_->SetText(L"Hi"); + EXPECT_DEATH(buf_->Delete(-10, 4), "Assertion"); + EXPECT_DEATH(buf_->Delete(1, -5), "Assertion"); + EXPECT_DEATH(buf_->Delete(5, 1), "Assertion"); + EXPECT_DEATH(buf_->Delete(0, 10000), "Assertion"); +} + +TEST_F(CFDE_TxtEdtBufTestDeathTest, GetCharByIndex) { + buf_->SetText(L"Hi"); + EXPECT_DEATH(buf_->GetCharByIndex(-1), "Assertion"); + EXPECT_DEATH(buf_->GetCharByIndex(100), "Assertion"); +} + +TEST_F(CFDE_TxtEdtBufTestDeathTest, GetRange) { + buf_->SetText(L"Hi"); + EXPECT_DEATH(buf_->GetRange(1, -1), "Assertion"); + EXPECT_DEATH(buf_->GetRange(-1, 1), "Assertion"); + EXPECT_DEATH(buf_->GetRange(10, 1), "Assertion"); + EXPECT_DEATH(buf_->GetRange(1, 100), "Assertion"); +} + +#endif // NDEBUG -- cgit v1.2.3