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