1 // Copyright 2017 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 "xfa/fde/cfde_txtedtbuf.h"
6 
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "testing/test_support.h"
9 #include "third_party/base/ptr_util.h"
10 
11 class CFDE_TxtEdtBufTest : public testing::Test {
12  public:
SetUp()13   void SetUp() override {
14     buf_ = pdfium::MakeUnique<CFDE_TxtEdtBuf>();
15     buf_->SetChunkSizeForTesting(5);
16   }
ChunkCount() const17   size_t ChunkCount() const { return buf_->m_chunks.size(); }
18 
19   std::unique_ptr<CFDE_TxtEdtBuf> buf_;
20 };
21 
TEST_F(CFDE_TxtEdtBufTest,SetTextLessThenChunkSize)22 TEST_F(CFDE_TxtEdtBufTest, SetTextLessThenChunkSize) {
23   buf_->SetText(L"Hi");
24   EXPECT_EQ(1UL, ChunkCount());
25   EXPECT_EQ(2, buf_->GetTextLength());
26 
27   CFX_WideString res = buf_->GetText();
28   EXPECT_EQ(2, res.GetLength());
29   EXPECT_EQ(L"Hi", res);
30 }
31 
TEST_F(CFDE_TxtEdtBufTest,InsertAppendChunk)32 TEST_F(CFDE_TxtEdtBufTest, InsertAppendChunk) {
33   buf_->SetText(L"Hi");
34 
35   CFX_WideString end = L" World";
36   buf_->Insert(2, end.c_str(), end.GetLength());
37   EXPECT_EQ(3UL, ChunkCount());
38   EXPECT_EQ(8, buf_->GetTextLength());
39 
40   CFX_WideString res = buf_->GetText();
41   EXPECT_EQ(8, res.GetLength());
42   EXPECT_EQ(L"Hi World", res);
43 }
44 
TEST_F(CFDE_TxtEdtBufTest,InsertPrependChunk)45 TEST_F(CFDE_TxtEdtBufTest, InsertPrependChunk) {
46   buf_->SetText(L"Hi");
47 
48   CFX_WideString end = L"World ";
49   buf_->Insert(0, end.c_str(), end.GetLength());
50   EXPECT_EQ(3UL, ChunkCount());
51   EXPECT_EQ(8, buf_->GetTextLength());
52 
53   CFX_WideString res = buf_->GetText();
54   EXPECT_EQ(L"World Hi", res);
55   EXPECT_EQ(8, res.GetLength());
56 }
57 
TEST_F(CFDE_TxtEdtBufTest,InsertBetweenChunks)58 TEST_F(CFDE_TxtEdtBufTest, InsertBetweenChunks) {
59   buf_->SetText(L"Hello World");
60   EXPECT_EQ(3UL, ChunkCount());
61 
62   CFX_WideString inst = L"there ";
63   buf_->Insert(6, inst.c_str(), inst.GetLength());
64   EXPECT_EQ(5UL, ChunkCount());
65   EXPECT_EQ(17, buf_->GetTextLength());
66 
67   CFX_WideString res = buf_->GetText();
68   EXPECT_EQ(L"Hello there World", res);
69   EXPECT_EQ(17, res.GetLength());
70 }
71 
TEST_F(CFDE_TxtEdtBufTest,SetText)72 TEST_F(CFDE_TxtEdtBufTest, SetText) {
73   buf_->SetText(L"Hello World");
74   EXPECT_EQ(11, buf_->GetTextLength());
75 
76   buf_->SetText(L"Hi");
77   // Don't remove chunks on setting shorter text.
78   EXPECT_EQ(3UL, ChunkCount());
79   EXPECT_EQ(2, buf_->GetTextLength());
80 
81   CFX_WideString res = buf_->GetText();
82   EXPECT_EQ(L"Hi", res);
83   EXPECT_EQ(2, res.GetLength());
84 }
85 
TEST_F(CFDE_TxtEdtBufTest,DeleteMiddleText)86 TEST_F(CFDE_TxtEdtBufTest, DeleteMiddleText) {
87   buf_->SetText(L"Hello there World");
88   buf_->Delete(6, 6);
89   EXPECT_EQ(4UL, ChunkCount());
90   EXPECT_EQ(11, buf_->GetTextLength());
91 
92   CFX_WideString res = buf_->GetText();
93   EXPECT_EQ(L"Hello World", res);
94   EXPECT_EQ(11, res.GetLength());
95 }
96 
TEST_F(CFDE_TxtEdtBufTest,DeleteEndText)97 TEST_F(CFDE_TxtEdtBufTest, DeleteEndText) {
98   buf_->SetText(L"Hello World");
99   buf_->Delete(5, 6);
100   EXPECT_EQ(1UL, ChunkCount());
101   EXPECT_EQ(5, buf_->GetTextLength());
102 
103   CFX_WideString res = buf_->GetText();
104   EXPECT_EQ(L"Hello", res);
105   EXPECT_EQ(5, res.GetLength());
106 }
107 
TEST_F(CFDE_TxtEdtBufTest,DeleteStartText)108 TEST_F(CFDE_TxtEdtBufTest, DeleteStartText) {
109   buf_->SetText(L"Hello World");
110   buf_->Delete(0, 6);
111   EXPECT_EQ(2UL, ChunkCount());
112   EXPECT_EQ(5, buf_->GetTextLength());
113 
114   CFX_WideString res = buf_->GetText();
115   EXPECT_EQ(L"World", res);
116   EXPECT_EQ(5, res.GetLength());
117 }
118 
TEST_F(CFDE_TxtEdtBufTest,DeleteAllText)119 TEST_F(CFDE_TxtEdtBufTest, DeleteAllText) {
120   buf_->SetText(L"Hello World");
121   buf_->Delete(0, 11);
122   EXPECT_EQ(0UL, ChunkCount());
123   EXPECT_EQ(0, buf_->GetTextLength());
124 
125   CFX_WideString res = buf_->GetText();
126   EXPECT_EQ(L"", res);
127   EXPECT_EQ(0, res.GetLength());
128 }
129 
TEST_F(CFDE_TxtEdtBufTest,ClearWithRelease)130 TEST_F(CFDE_TxtEdtBufTest, ClearWithRelease) {
131   buf_->SetText(L"Hello World");
132   buf_->Clear(true);
133   EXPECT_EQ(0UL, ChunkCount());
134   EXPECT_EQ(0, buf_->GetTextLength());
135 
136   CFX_WideString res = buf_->GetText();
137   EXPECT_EQ(L"", res);
138   EXPECT_EQ(0, res.GetLength());
139 }
140 
TEST_F(CFDE_TxtEdtBufTest,ClearWithoutRelease)141 TEST_F(CFDE_TxtEdtBufTest, ClearWithoutRelease) {
142   buf_->SetText(L"Hello World");
143   buf_->Clear(false);
144   EXPECT_EQ(3UL, ChunkCount());
145   EXPECT_EQ(0, buf_->GetTextLength());
146 
147   CFX_WideString res = buf_->GetText();
148   EXPECT_EQ(L"", res);
149   EXPECT_EQ(0, res.GetLength());
150 }
151 
TEST_F(CFDE_TxtEdtBufTest,GetCharByIndex)152 TEST_F(CFDE_TxtEdtBufTest, GetCharByIndex) {
153   buf_->SetText(L"Hello world");
154   EXPECT_EQ(L"e", CFX_WideString(buf_->GetCharByIndex(1)));
155   EXPECT_EQ(L"o", CFX_WideString(buf_->GetCharByIndex(7)));
156 }
157 
TEST_F(CFDE_TxtEdtBufTest,GetRange)158 TEST_F(CFDE_TxtEdtBufTest, GetRange) {
159   buf_->SetText(L"Hello World");
160   EXPECT_EQ(L"", buf_->GetRange(1, 0));
161   EXPECT_EQ(L"ello", buf_->GetRange(1, 4));
162   EXPECT_EQ(L"lo Wo", buf_->GetRange(3, 5));
163 }
164 
165 #ifndef NDEBUG
166 using CFDE_TxtEdtBufTestDeathTest = CFDE_TxtEdtBufTest;
167 
TEST_F(CFDE_TxtEdtBufTestDeathTest,InsertBadIndexes)168 TEST_F(CFDE_TxtEdtBufTestDeathTest, InsertBadIndexes) {
169   CFX_WideString inst = L"there ";
170 
171   buf_->SetText(L"Hi");
172   EXPECT_DEATH(buf_->Insert(-4, inst.c_str(), inst.GetLength()), "Assertion");
173   EXPECT_DEATH(buf_->Insert(9999, inst.c_str(), inst.GetLength()), "Assertion");
174   EXPECT_DEATH(buf_->Insert(1, inst.c_str(), -6), "Assertion");
175 }
176 
TEST_F(CFDE_TxtEdtBufTestDeathTest,DeleteWithBadIdx)177 TEST_F(CFDE_TxtEdtBufTestDeathTest, DeleteWithBadIdx) {
178   buf_->SetText(L"Hi");
179   EXPECT_DEATH(buf_->Delete(-10, 4), "Assertion");
180   EXPECT_DEATH(buf_->Delete(1, -5), "Assertion");
181   EXPECT_DEATH(buf_->Delete(5, 1), "Assertion");
182   EXPECT_DEATH(buf_->Delete(0, 10000), "Assertion");
183 }
184 
TEST_F(CFDE_TxtEdtBufTestDeathTest,GetCharByIndex)185 TEST_F(CFDE_TxtEdtBufTestDeathTest, GetCharByIndex) {
186   buf_->SetText(L"Hi");
187   EXPECT_DEATH(buf_->GetCharByIndex(-1), "Assertion");
188   EXPECT_DEATH(buf_->GetCharByIndex(100), "Assertion");
189 }
190 
TEST_F(CFDE_TxtEdtBufTestDeathTest,GetRange)191 TEST_F(CFDE_TxtEdtBufTestDeathTest, GetRange) {
192   buf_->SetText(L"Hi");
193   EXPECT_DEATH(buf_->GetRange(1, -1), "Assertion");
194   EXPECT_DEATH(buf_->GetRange(-1, 1), "Assertion");
195   EXPECT_DEATH(buf_->GetRange(10, 1), "Assertion");
196   EXPECT_DEATH(buf_->GetRange(1, 100), "Assertion");
197 }
198 
199 #endif  // NDEBUG
200