1 /*
2 This file is part of the Okteta Core library, made within the KDE community.
3
4 SPDX-FileCopyrightText: 2008 Friedrich W. H. Kossebau <kossebau@kde.org>
5
6 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7 */
8
9 #include "piecetest.hpp"
10
11 // test object
12 #include <piecetable/piece.hpp>
13 // Qt
14 #include <QTest>
15
16 namespace KPieceTable {
17
18 // local variables
19 static constexpr Address Start = 15;
20 static constexpr Address End = 27;
21
22 static constexpr Address Width = End - Start + 1;
23
testSimpleConstructor()24 void PieceTest::testSimpleConstructor()
25 {
26 Piece piece;
27 QVERIFY(!piece.isValid());
28 }
29
testFullConstructor()30 void PieceTest::testFullConstructor()
31 {
32 const AddressRange storageSection(Start, End);
33 Piece piece(storageSection, Piece::ChangeStorage);
34
35 QCOMPARE(piece.start(), Start);
36 QCOMPARE(piece.end(), storageSection.end());
37 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
38 QVERIFY(piece.isValid());
39 }
40
testSplitAt()41 void PieceTest::testSplitAt()
42 {
43 const AddressRange storageSection(Start, End);
44 Piece piece(storageSection, Piece::ChangeStorage);
45
46 // split at start
47 Piece splitPiece = piece.splitAt(Start);
48 QVERIFY(!piece.isValid());
49 QCOMPARE(splitPiece.start(), Start);
50 QCOMPARE(splitPiece.end(), End);
51 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
52
53 // split at one after start
54 piece.set(Start, End);
55 splitPiece = piece.splitAt(Start + 1);
56 QCOMPARE(piece.start(), Start);
57 QCOMPARE(piece.end(), Start);
58 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
59 QCOMPARE(splitPiece.start(), Start + 1);
60 QCOMPARE(splitPiece.end(), End);
61 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
62
63 // split at mid
64 const Address Mid = (Start + End) / 2;
65 piece.set(Start, End);
66 splitPiece = piece.splitAt(Mid);
67 QCOMPARE(piece.start(), Start);
68 QCOMPARE(piece.end(), Mid - 1);
69 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
70 QCOMPARE(splitPiece.start(), Mid);
71 QCOMPARE(splitPiece.end(), End);
72 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
73
74 // split at one before width
75 piece.set(Start, End);
76 splitPiece = piece.splitAt(End);
77 QCOMPARE(piece.start(), Start);
78 QCOMPARE(piece.end(), End - 1);
79 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
80 QCOMPARE(splitPiece.start(), End);
81 QCOMPARE(splitPiece.end(), End);
82 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
83
84 // split at start so the split is the full
85 piece.set(Start, End);
86 splitPiece = piece.splitAt(End + 1);
87 QCOMPARE(piece.start(), Start);
88 QCOMPARE(piece.end(), End);
89 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
90 QVERIFY(!splitPiece.isValid());
91 }
92
testSplitAtLocal()93 void PieceTest::testSplitAtLocal()
94 {
95 const AddressRange storageSection(Start, End);
96 Piece piece(storageSection, Piece::ChangeStorage);
97
98 // split at start
99 Piece splitPiece = piece.splitAtLocal(0);
100 QVERIFY(!piece.isValid());
101 QCOMPARE(splitPiece.start(), Start);
102 QCOMPARE(splitPiece.end(), End);
103 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
104
105 // split at one after start
106 piece.set(Start, End);
107 splitPiece = piece.splitAtLocal(1);
108 QCOMPARE(piece.start(), Start);
109 QCOMPARE(piece.end(), Start);
110 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
111 QCOMPARE(splitPiece.start(), Start + 1);
112 QCOMPARE(splitPiece.end(), End);
113 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
114
115 // split at mid
116 const Address Mid = Width / 2;
117 piece.set(Start, End);
118 splitPiece = piece.splitAtLocal(Mid);
119 QCOMPARE(piece.start(), Start);
120 QCOMPARE(piece.end(), Start + Mid - 1);
121 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
122 QCOMPARE(splitPiece.start(), Start + Mid);
123 QCOMPARE(splitPiece.end(), End);
124 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
125
126 // split at one before width
127 piece.set(Start, End);
128 splitPiece = piece.splitAtLocal(Width - 1);
129 QCOMPARE(piece.start(), Start);
130 QCOMPARE(piece.end(), End - 1);
131 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
132 QCOMPARE(splitPiece.start(), End);
133 QCOMPARE(splitPiece.end(), End);
134 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
135
136 // split at start so the split is the full
137 piece.set(Start, End);
138 splitPiece = piece.splitAtLocal(Width);
139 QCOMPARE(piece.start(), Start);
140 QCOMPARE(piece.end(), End);
141 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
142 QVERIFY(!splitPiece.isValid());
143 }
144
testRemove()145 void PieceTest::testRemove()
146 {
147 const Address Mid = (Start + End) / 2;
148 const AddressRange storageSection(Start, End);
149 Piece piece(storageSection, Piece::ChangeStorage);
150
151 // remove none at start
152 AddressRange RemoveSection(Start, Start - 1);
153 Piece splitPiece = piece.remove(RemoveSection);
154 QVERIFY(!piece.isValid());
155 QCOMPARE(splitPiece.start(), Start);
156 QCOMPARE(splitPiece.end(), End);
157 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
158
159 // remove one at start
160 piece.set(Start, End);
161 RemoveSection.set(Start, Start);
162 splitPiece = piece.remove(RemoveSection);
163 QVERIFY(!piece.isValid());
164 QCOMPARE(splitPiece.start(), Start + 1);
165 QCOMPARE(splitPiece.end(), End);
166 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
167
168 // remove many at start
169 piece.set(Start, End);
170 RemoveSection.set(Start, Mid);
171 splitPiece = piece.remove(RemoveSection);
172 QVERIFY(!piece.isValid());
173 QCOMPARE(splitPiece.start(), Mid + 1);
174 QCOMPARE(splitPiece.end(), End);
175 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
176
177 // remove all except last
178 piece.set(Start, End);
179 RemoveSection.set(Start, End - 1);
180 splitPiece = piece.remove(RemoveSection);
181 QVERIFY(!piece.isValid());
182 QCOMPARE(splitPiece.start(), End);
183 QCOMPARE(splitPiece.end(), End);
184 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
185
186 // remove at mid
187 piece.set(Start, End);
188 RemoveSection.set(Mid - 1, Mid + 1);
189 splitPiece = piece.remove(RemoveSection);
190 QCOMPARE(piece.start(), Start);
191 QCOMPARE(piece.end(), Mid - 2);
192 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
193 QCOMPARE(splitPiece.start(), Mid + 2);
194 QCOMPARE(splitPiece.end(), End);
195 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
196
197 // remove none at width
198 piece.set(Start, End);
199 RemoveSection.set(End + 1, End);
200 splitPiece = piece.remove(RemoveSection);
201 QCOMPARE(piece.start(), Start);
202 QCOMPARE(piece.end(), End);
203 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
204 QVERIFY(!splitPiece.isValid());
205
206 // remove one at width
207 piece.set(Start, End);
208 RemoveSection.set(End, End);
209 splitPiece = piece.remove(RemoveSection);
210 QCOMPARE(piece.start(), Start);
211 QCOMPARE(piece.end(), End - 1);
212 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
213 QVERIFY(!splitPiece.isValid());
214
215 // remove many at width
216 piece.set(Start, End);
217 RemoveSection.set(Mid, End);
218 splitPiece = piece.remove(RemoveSection);
219 QCOMPARE(piece.start(), Start);
220 QCOMPARE(piece.end(), Mid - 1);
221 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
222 QVERIFY(!splitPiece.isValid());
223
224 // remove all except first
225 piece.set(Start, End);
226 RemoveSection.set(Start + 1, End);
227 splitPiece = piece.remove(RemoveSection);
228 QCOMPARE(piece.start(), Start);
229 QCOMPARE(piece.end(), Start);
230 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
231 QVERIFY(!splitPiece.isValid());
232
233 // remove all
234 piece.set(Start, End);
235 RemoveSection.set(Start, End);
236 splitPiece = piece.remove(RemoveSection);
237 QVERIFY(!piece.isValid());
238 QVERIFY(!splitPiece.isValid());
239 }
240
testRemoveLocal()241 void PieceTest::testRemoveLocal()
242 {
243 const Address Mid = Width / 2;
244 const AddressRange storageSection(Start, End);
245 Piece piece(storageSection, Piece::ChangeStorage);
246
247 // remove none at start
248 AddressRange RemoveSection(0, 0 - 1);
249 Piece splitPiece = piece.removeLocal(RemoveSection);
250 QVERIFY(!piece.isValid());
251 QCOMPARE(splitPiece.start(), Start);
252 QCOMPARE(splitPiece.end(), End);
253 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
254
255 // remove one at start
256 piece.set(Start, End);
257 RemoveSection.set(0, 0);
258 splitPiece = piece.removeLocal(RemoveSection);
259 QVERIFY(!piece.isValid());
260 QCOMPARE(splitPiece.start(), Start + 1);
261 QCOMPARE(splitPiece.end(), End);
262 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
263
264 // remove many at start
265 piece.set(Start, End);
266 RemoveSection.set(0, Mid);
267 splitPiece = piece.removeLocal(RemoveSection);
268 QVERIFY(!piece.isValid());
269 QCOMPARE(splitPiece.start(), Start + Mid + 1);
270 QCOMPARE(splitPiece.end(), End);
271 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
272
273 // remove all except last
274 piece.set(Start, End);
275 RemoveSection.set(0, Width - 2);
276 splitPiece = piece.removeLocal(RemoveSection);
277 QVERIFY(!piece.isValid());
278 QCOMPARE(splitPiece.start(), End);
279 QCOMPARE(splitPiece.end(), End);
280 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
281
282 // remove at mid
283 piece.set(Start, End);
284 RemoveSection.set(Mid - 1, Mid + 1);
285 splitPiece = piece.removeLocal(RemoveSection);
286 QCOMPARE(piece.start(), Start);
287 QCOMPARE(piece.end(), Start + Mid - 2);
288 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
289 QCOMPARE(splitPiece.start(), Start + Mid + 2);
290 QCOMPARE(splitPiece.end(), End);
291 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage);
292
293 // remove none at width
294 piece.set(Start, End);
295 RemoveSection.set(Width, Width - 1);
296 splitPiece = piece.removeLocal(RemoveSection);
297 QCOMPARE(piece.start(), Start);
298 QCOMPARE(piece.end(), End);
299 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
300 QVERIFY(!splitPiece.isValid());
301
302 // remove one at width
303 piece.set(Start, End);
304 RemoveSection.set(Width - 1, Width - 1);
305 splitPiece = piece.removeLocal(RemoveSection);
306 QCOMPARE(piece.start(), Start);
307 QCOMPARE(piece.end(), End - 1);
308 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
309 QVERIFY(!splitPiece.isValid());
310
311 // remove many at width
312 piece.set(Start, End);
313 RemoveSection.set(Mid, Width - 1);
314 splitPiece = piece.removeLocal(RemoveSection);
315 QCOMPARE(piece.start(), Start);
316 QCOMPARE(piece.end(), Start + Mid - 1);
317 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
318 QVERIFY(!splitPiece.isValid());
319
320 // remove all except first
321 piece.set(Start, End);
322 RemoveSection.set(1, Width - 1);
323 splitPiece = piece.removeLocal(RemoveSection);
324 QCOMPARE(piece.start(), Start);
325 QCOMPARE(piece.end(), Start);
326 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage);
327 QVERIFY(!splitPiece.isValid());
328
329 // remove all
330 piece.set(Start, End);
331 RemoveSection.set(0, Width - 1);
332 splitPiece = piece.removeLocal(RemoveSection);
333 QVERIFY(!piece.isValid());
334 QVERIFY(!splitPiece.isValid());
335 }
336
337 }
338
339 QTEST_GUILESS_MAIN(KPieceTable::PieceTest)
340