File indexing completed on 2024-05-05 05:55:38

0001 /*
0002     This file is part of the Okteta Core library, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2008 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "revertablepiecetabletest.hpp"
0010 
0011 // test object
0012 #include <piecetable/revertablepiecetable.hpp>
0013 // Qt
0014 #include <QTest>
0015 
0016 namespace KPieceTable {
0017 
0018 // local variables
0019 static constexpr Address Start = 15;
0020 static constexpr Address End = 27;
0021 static constexpr Size HalfBaseSize = 50;
0022 static constexpr Size BaseSize = 2 * HalfBaseSize;
0023 
0024 static constexpr Size Width = End - Start + 1;
0025 
0026 static constexpr Address ChangeStart = 0;
0027 static constexpr Address ChangeEnd = ChangeStart + Width - 1;
0028 
0029 void RevertablePieceTableTest::testSimpleConstructor()
0030 {
0031     RevertablePieceTable pieceTable;
0032     QCOMPARE(pieceTable.size(), 0);
0033     QCOMPARE(pieceTable.changesCount(), 0);
0034     QCOMPARE(pieceTable.appliedChangesCount(), 0);
0035 }
0036 
0037 void RevertablePieceTableTest::testInit()
0038 {
0039     RevertablePieceTable pieceTable;
0040 
0041     pieceTable.init(BaseSize);
0042     int storageId;
0043     int storageOffset;
0044 
0045     QCOMPARE(pieceTable.size(), BaseSize);
0046     QCOMPARE(pieceTable.changesCount(), 0);
0047     QCOMPARE(pieceTable.appliedChangesCount(), 0);
0048 
0049     bool result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0050     QVERIFY(result);
0051     QCOMPARE(storageOffset, 0);
0052     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0053 
0054     result = pieceTable.getStorageData(&storageId, &storageOffset, Start);
0055     QVERIFY(result);
0056     QCOMPARE(storageOffset, Start);
0057     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0058 
0059     result = pieceTable.getStorageData(&storageId, &storageOffset, End);
0060     QVERIFY(result);
0061     QCOMPARE(storageOffset, End);
0062     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0063 
0064     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - 1);
0065     QVERIFY(result);
0066     QCOMPARE(storageOffset, BaseSize - 1);
0067     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0068 
0069     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize);
0070     QVERIFY(!result);
0071 }
0072 
0073 static void fillWithSize(RevertablePieceTable* pieceTable, int count)
0074 {
0075     int dummy;
0076     pieceTable->init(0);
0077     for (int i = 0; i < count; ++i) {
0078         pieceTable->insert(0, BaseSize, &dummy);
0079     }
0080 }
0081 
0082 void RevertablePieceTableTest::testInsert()
0083 {
0084     RevertablePieceTable pieceTable;
0085 
0086     int storageId;
0087     int storageOffset;
0088     bool result;
0089 
0090     // inserting to empty
0091     pieceTable.init(0);
0092     pieceTable.insert(0, Width, &storageOffset);
0093 
0094     QCOMPARE(pieceTable.size(), Width);
0095     QCOMPARE(pieceTable.changesCount(), 1);
0096     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0097     QCOMPARE(storageOffset, ChangeStart);
0098 
0099     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0100     QVERIFY(result);
0101     QCOMPARE(storageOffset, ChangeStart);
0102     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0103 
0104     result = pieceTable.getStorageData(&storageId, &storageOffset, Width - 1);
0105     QVERIFY(result);
0106     QCOMPARE(storageOffset, ChangeEnd);
0107     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0108 
0109     result = pieceTable.getStorageData(&storageId, &storageOffset, Width);
0110     QVERIFY(!result);
0111 
0112     // inserting one at the begin
0113     pieceTable.init(BaseSize);
0114     pieceTable.insert(0, Width, &storageOffset);
0115 
0116     QCOMPARE(pieceTable.size(), BaseSize + Width);
0117     QCOMPARE(pieceTable.changesCount(), 1);
0118     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0119     QCOMPARE(storageOffset, ChangeStart);
0120 
0121     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0122     QVERIFY(result);
0123     QCOMPARE(storageOffset, ChangeStart);
0124     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0125 
0126     result = pieceTable.getStorageData(&storageId, &storageOffset, Width - 1);
0127     QVERIFY(result);
0128     QCOMPARE(storageOffset, ChangeEnd);
0129     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0130 
0131     result = pieceTable.getStorageData(&storageId, &storageOffset, Width);
0132     QVERIFY(result);
0133     QCOMPARE(storageOffset, 0);
0134     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0135 
0136     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize + Width - 1);
0137     QVERIFY(result);
0138     QCOMPARE(storageOffset, BaseSize - 1);
0139     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0140 
0141     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize + Width);
0142     QVERIFY(!result);
0143 
0144     // inserting one in the middle
0145     pieceTable.init(BaseSize);
0146     pieceTable.insert(Start, Width, &storageOffset);
0147 
0148     QCOMPARE(pieceTable.size(), BaseSize + Width);
0149     QCOMPARE(pieceTable.changesCount(), 1);
0150     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0151     QCOMPARE(storageOffset, ChangeStart);
0152 
0153     result = pieceTable.getStorageData(&storageId, &storageOffset, Start - 1);
0154     QVERIFY(result);
0155     QCOMPARE(storageOffset, Start - 1);
0156     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0157 
0158     result = pieceTable.getStorageData(&storageId, &storageOffset, Start);
0159     QVERIFY(result);
0160     QCOMPARE(storageOffset, ChangeStart);
0161     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0162 
0163     result = pieceTable.getStorageData(&storageId, &storageOffset, End);
0164     QVERIFY(result);
0165     QCOMPARE(storageOffset, ChangeEnd);
0166     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0167 
0168     result = pieceTable.getStorageData(&storageId, &storageOffset, End + 1);
0169     QVERIFY(result);
0170     QCOMPARE(storageOffset, Start);
0171     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0172 
0173     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize + Width - 1);
0174     QVERIFY(result);
0175     QCOMPARE(storageOffset, BaseSize - 1);
0176     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0177 
0178     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize + Width);
0179     QVERIFY(!result);
0180 
0181     // inserting one at the end
0182     pieceTable.init(BaseSize);
0183     pieceTable.insert(BaseSize, Width, &storageOffset);
0184 
0185     QCOMPARE(pieceTable.size(), BaseSize + Width);
0186     QCOMPARE(pieceTable.changesCount(), 1);
0187     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0188     QCOMPARE(storageOffset, ChangeStart);
0189 
0190     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - 1);
0191     QVERIFY(result);
0192     QCOMPARE(storageOffset, BaseSize - 1);
0193     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0194 
0195     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize);
0196     QVERIFY(result);
0197     QCOMPARE(storageOffset, ChangeStart);
0198     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0199 
0200     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize + Width - 1);
0201     QVERIFY(result);
0202     QCOMPARE(storageOffset, ChangeEnd);
0203     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0204 
0205     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize + Width);
0206     QVERIFY(!result);
0207 
0208     // inserting a lot:
0209     // inserting before, after and in another inserted section, two recursions
0210     // 121110  8 7 6  4 3 2
0211     // \/\/\/ \/\/\/ \/\/\/
0212     //  |-9-|  |-5-|  |-1-|
0213     //  \  /   \  /   \  /
0214     //   \/     \/     \/
0215     //    |-----0-------|
0216     // TODO: do this also in forward sequences
0217     pieceTable.init(BaseSize);   // 0
0218     const int Mid = BaseSize / 2;
0219     int changeStarts[13];
0220     pieceTable.insert(BaseSize, BaseSize, &storageOffset);   // 1
0221     changeStarts[1] = storageOffset;
0222     pieceTable.insert(BaseSize + BaseSize, BaseSize, &storageOffset); // 2
0223     changeStarts[2] = storageOffset;
0224     pieceTable.insert(BaseSize + Mid, BaseSize, &storageOffset); // 3
0225     changeStarts[3] = storageOffset;
0226     pieceTable.insert(BaseSize, BaseSize, &storageOffset);   // 4
0227     changeStarts[4] = storageOffset;
0228 
0229     pieceTable.insert(Mid, BaseSize, &storageOffset);   // 5
0230     changeStarts[5] = storageOffset;
0231     pieceTable.insert(Mid + BaseSize, BaseSize, &storageOffset); // 6
0232     changeStarts[6] = storageOffset;
0233     pieceTable.insert(Mid + Mid, BaseSize, &storageOffset); // 7
0234     changeStarts[7] = storageOffset;
0235     pieceTable.insert(Mid, BaseSize, &storageOffset);   // 8
0236     changeStarts[8] = storageOffset;
0237 
0238     pieceTable.insert(0, BaseSize, &storageOffset);   // 9
0239     changeStarts[9] = storageOffset;
0240     pieceTable.insert(BaseSize, BaseSize, &storageOffset);   // 10
0241     changeStarts[10] = storageOffset;
0242     pieceTable.insert(Mid, BaseSize, &storageOffset);   // 11
0243     changeStarts[11] = storageOffset;
0244     pieceTable.insert(0, BaseSize, &storageOffset);   // 12
0245     changeStarts[12] = storageOffset;
0246 
0247     // test
0248     QCOMPARE(pieceTable.size(), BaseSize + 12 * BaseSize);
0249     QCOMPARE(pieceTable.changesCount(), 9);   // 9+10, 5+6, 1+2 are merged
0250     QCOMPARE(pieceTable.appliedChangesCount(), 9);
0251     QCOMPARE(storageOffset, 11 * BaseSize);
0252 
0253     // all borders
0254     // 12: begin
0255     int byteArrayOffset = 0;
0256     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0257     QVERIFY(result);
0258     QCOMPARE(storageOffset, changeStarts[12]);
0259     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0260 
0261     // 12: end
0262     byteArrayOffset += BaseSize;
0263     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0264     QVERIFY(result);
0265     QCOMPARE(storageOffset, changeStarts[12] + BaseSize - 1);
0266     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0267     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0268     QVERIFY(result);
0269     QCOMPARE(storageOffset, changeStarts[9]);
0270     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0271 
0272     // 11: begin
0273     byteArrayOffset += HalfBaseSize;
0274     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0275     QVERIFY(result);
0276     QCOMPARE(storageOffset, changeStarts[9] + HalfBaseSize - 1);
0277     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0278     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0279     QVERIFY(result);
0280     QCOMPARE(storageOffset, changeStarts[11]);
0281     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0282 
0283     // 11: end
0284     byteArrayOffset += BaseSize;
0285     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0286     QVERIFY(result);
0287     QCOMPARE(storageOffset, changeStarts[11] + BaseSize - 1);
0288     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0289     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0290     QVERIFY(result);
0291     QCOMPARE(storageOffset, changeStarts[9] + HalfBaseSize);
0292     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0293 
0294     // 10: begin
0295     byteArrayOffset += HalfBaseSize;
0296     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0297     QVERIFY(result);
0298     QCOMPARE(storageOffset, changeStarts[9] + BaseSize - 1);
0299     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0300     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0301     QVERIFY(result);
0302     QCOMPARE(storageOffset, changeStarts[10]);
0303     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0304 
0305     // 10: end
0306     byteArrayOffset += BaseSize;
0307     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0308     QVERIFY(result);
0309     QCOMPARE(storageOffset, changeStarts[10] + BaseSize - 1);
0310     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0311     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0312     QVERIFY(result);
0313     QCOMPARE(storageOffset, 0);
0314     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0315 
0316     // 8: begin
0317     byteArrayOffset += HalfBaseSize;
0318     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0319     QVERIFY(result);
0320     QCOMPARE(storageOffset, HalfBaseSize - 1);
0321     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0322     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0323     QVERIFY(result);
0324     QCOMPARE(storageOffset, changeStarts[8]);
0325     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0326 
0327     // 8: end
0328     byteArrayOffset += BaseSize;
0329     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0330     QVERIFY(result);
0331     QCOMPARE(storageOffset, changeStarts[8] + BaseSize - 1);
0332     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0333     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0334     QVERIFY(result);
0335     QCOMPARE(storageOffset, changeStarts[5]);
0336     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0337 
0338     // 7: begin
0339     byteArrayOffset += HalfBaseSize;
0340     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0341     QVERIFY(result);
0342     QCOMPARE(storageOffset, changeStarts[5] + HalfBaseSize - 1);
0343     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0344     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0345     QVERIFY(result);
0346     QCOMPARE(storageOffset, changeStarts[7]);
0347     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0348 
0349     // 7: end
0350     byteArrayOffset += BaseSize;
0351     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0352     QVERIFY(result);
0353     QCOMPARE(storageOffset, changeStarts[7] + BaseSize - 1);
0354     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0355     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0356     QVERIFY(result);
0357     QCOMPARE(storageOffset, changeStarts[5] + HalfBaseSize);
0358     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0359 
0360     // 6: begin
0361     byteArrayOffset += HalfBaseSize;
0362     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0363     QVERIFY(result);
0364     QCOMPARE(storageOffset, changeStarts[5] + BaseSize - 1);
0365     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0366     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0367     QVERIFY(result);
0368     QCOMPARE(storageOffset, changeStarts[6]);
0369     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0370 
0371     // 6: end
0372     byteArrayOffset += BaseSize;
0373     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0374     QVERIFY(result);
0375     QCOMPARE(storageOffset, changeStarts[6] + BaseSize - 1);
0376     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0377     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0378     QVERIFY(result);
0379     QCOMPARE(storageOffset, HalfBaseSize);
0380     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0381 
0382     // 4: begin
0383     byteArrayOffset += HalfBaseSize;
0384     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0385     QVERIFY(result);
0386     QCOMPARE(storageOffset, BaseSize - 1);
0387     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0388     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0389     QVERIFY(result);
0390     QCOMPARE(storageOffset, changeStarts[4]);
0391     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0392 
0393     // 4: end
0394     byteArrayOffset += BaseSize;
0395     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0396     QVERIFY(result);
0397     QCOMPARE(storageOffset, changeStarts[4] + BaseSize - 1);
0398     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0399     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0400     QVERIFY(result);
0401     QCOMPARE(storageOffset, changeStarts[1]);
0402     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0403 
0404     // 3: begin
0405     byteArrayOffset += HalfBaseSize;
0406     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0407     QVERIFY(result);
0408     QCOMPARE(storageOffset, changeStarts[1] + HalfBaseSize - 1);
0409     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0410     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0411     QVERIFY(result);
0412     QCOMPARE(storageOffset, changeStarts[3]);
0413     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0414 
0415     // 3: end
0416     byteArrayOffset += BaseSize;
0417     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0418     QVERIFY(result);
0419     QCOMPARE(storageOffset, changeStarts[3] + BaseSize - 1);
0420     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0421     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0422     QVERIFY(result);
0423     QCOMPARE(storageOffset, changeStarts[1] + HalfBaseSize);
0424     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0425 
0426     // 2: begin
0427     byteArrayOffset += HalfBaseSize;
0428     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0429     QVERIFY(result);
0430     QCOMPARE(storageOffset, changeStarts[1] + BaseSize - 1);
0431     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0432     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0433     QVERIFY(result);
0434     QCOMPARE(storageOffset, changeStarts[2]);
0435     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0436 
0437     // 2: end
0438     byteArrayOffset += BaseSize;
0439     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset - 1);
0440     QVERIFY(result);
0441     QCOMPARE(storageOffset, changeStarts[2] + BaseSize - 1);
0442     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0443 
0444     result = pieceTable.getStorageData(&storageId, &storageOffset, byteArrayOffset);
0445     QVERIFY(!result);
0446 }
0447 
0448 void RevertablePieceTableTest::testRemove()
0449 {
0450     RevertablePieceTable pieceTable;
0451 
0452     int changeStarts[6];
0453     int storageId;
0454     int storageOffset;
0455     bool result;
0456 
0457     // removing at begin
0458     pieceTable.init(BaseSize);
0459     pieceTable.remove(AddressRange(0, Start - 1));
0460 
0461     QCOMPARE(pieceTable.size(), BaseSize - Start);
0462     QCOMPARE(pieceTable.changesCount(), 1);
0463     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0464 
0465     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0466     QVERIFY(result);
0467     QCOMPARE(storageOffset, Start);
0468     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0469 
0470     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - Start - 1);
0471     QVERIFY(result);
0472     QCOMPARE(storageOffset, BaseSize - 1);
0473     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0474 
0475     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - Start);
0476     QVERIFY(!result);
0477 
0478     // removing at middle
0479     pieceTable.init(BaseSize);
0480     pieceTable.remove(AddressRange(Start, End));
0481 
0482     QCOMPARE(pieceTable.size(), BaseSize - Width);
0483     QCOMPARE(pieceTable.changesCount(), 1);
0484     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0485 
0486     result = pieceTable.getStorageData(&storageId, &storageOffset, Start - 1);
0487     QVERIFY(result);
0488     QCOMPARE(storageOffset, Start - 1);
0489     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0490 
0491     result = pieceTable.getStorageData(&storageId, &storageOffset, Start);
0492     QVERIFY(result);
0493     QCOMPARE(storageOffset, End + 1);
0494     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0495 
0496     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - Width - 1);
0497     QVERIFY(result);
0498     QCOMPARE(storageOffset, BaseSize - 1);
0499     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0500 
0501     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - Width);
0502     QVERIFY(!result);
0503 
0504     // removing at end
0505     pieceTable.init(BaseSize);
0506     pieceTable.remove(AddressRange(End + 1, BaseSize - 1));
0507 
0508     QCOMPARE(pieceTable.size(), End + 1);
0509     QCOMPARE(pieceTable.changesCount(), 1);
0510     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0511 
0512     result = pieceTable.getStorageData(&storageId, &storageOffset, End);
0513     QVERIFY(result);
0514     QCOMPARE(storageOffset, End);
0515     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0516 
0517     result = pieceTable.getStorageData(&storageId, &storageOffset, End + 1);
0518     QVERIFY(!result);
0519 
0520     // removing all
0521     pieceTable.init(BaseSize);
0522     pieceTable.remove(AddressRange::fromWidth(BaseSize));
0523 
0524     QCOMPARE(pieceTable.size(), 0);
0525     QCOMPARE(pieceTable.changesCount(), 1);
0526     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0527 
0528     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0529     QVERIFY(!result);
0530 
0531     // removing a lot:
0532     const int pieceCount = 5;
0533     const int mid = (pieceCount + 1) / 2;
0534     const int midPieceOffset = BaseSize * (mid - 1);
0535     const int fullSize = pieceCount * BaseSize;
0536     // for this five equally sized pieces are inserted, reverse to offset in ChangeStore
0537     for (int i = 0; i < pieceCount; ++i) {
0538         changeStarts[pieceCount - i] = BaseSize * i;
0539     }
0540 
0541     // removing inside a piece in the middle
0542     fillWithSize(&pieceTable, pieceCount);
0543     pieceTable.remove(AddressRange::fromWidth(midPieceOffset + Start, Width));
0544 
0545     QCOMPARE(pieceTable.size(), fullSize - Width);
0546     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0547     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0548 
0549     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset + Start - 1);
0550     QVERIFY(result);
0551     QCOMPARE(storageOffset, changeStarts[mid] + Start - 1);
0552     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0553 
0554     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset + Start);
0555     QVERIFY(result);
0556     QCOMPARE(storageOffset, changeStarts[mid] + End + 1);
0557     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0558 
0559     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - Width - 1);
0560     QVERIFY(result);
0561     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0562     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0563 
0564     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - Width);
0565     QVERIFY(!result);
0566 
0567     // removing start of a piece in the middle
0568     fillWithSize(&pieceTable, pieceCount);
0569     pieceTable.remove(AddressRange::fromWidth(midPieceOffset, Start));
0570 
0571     QCOMPARE(pieceTable.size(), fullSize - Start);
0572     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0573     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0574 
0575     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset - 1);
0576     QVERIFY(result);
0577     QCOMPARE(storageOffset, changeStarts[mid - 1] + BaseSize - 1);
0578     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0579 
0580     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset);
0581     QVERIFY(result);
0582     QCOMPARE(storageOffset, changeStarts[mid] + Start);
0583     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0584 
0585     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - Start - 1);
0586     QVERIFY(result);
0587     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0588     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0589 
0590     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - Start);
0591     QVERIFY(!result);
0592 
0593     // removing end of a piece in the middle
0594     fillWithSize(&pieceTable, pieceCount);
0595     pieceTable.remove(AddressRange::fromWidth(midPieceOffset + End + 1, BaseSize - (End + 1)));
0596 
0597     QCOMPARE(pieceTable.size(), fullSize - (BaseSize - End - 1));
0598     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0599     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0600 
0601     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset + End);
0602     QVERIFY(result);
0603     QCOMPARE(storageOffset, changeStarts[mid] + End);
0604     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0605 
0606     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset + End + 1);
0607     QVERIFY(result);
0608     QCOMPARE(storageOffset, changeStarts[mid + 1]);
0609     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0610 
0611     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - (BaseSize - End - 1) - 1);
0612     QVERIFY(result);
0613     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0614     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0615 
0616     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - (BaseSize - End - 1));
0617     QVERIFY(!result);
0618 
0619     // removing whole piece in the middle
0620     fillWithSize(&pieceTable, pieceCount);
0621     pieceTable.remove(AddressRange::fromWidth(midPieceOffset, BaseSize));
0622 
0623     QCOMPARE(pieceTable.size(), fullSize - BaseSize);
0624     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0625     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0626 
0627     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset - 1);
0628     QVERIFY(result);
0629     QCOMPARE(storageOffset, changeStarts[mid - 1] + BaseSize - 1);
0630     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0631 
0632     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset);
0633     QVERIFY(result);
0634     QCOMPARE(storageOffset, changeStarts[mid + 1]);
0635     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0636 
0637     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - 1);
0638     QVERIFY(result);
0639     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0640     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0641 
0642     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize);
0643     QVERIFY(!result);
0644 
0645     // removing whole piece and start of next in the middke
0646     fillWithSize(&pieceTable, pieceCount);
0647     pieceTable.remove(AddressRange::fromWidth(midPieceOffset, BaseSize + Start));
0648 
0649     QCOMPARE(pieceTable.size(), fullSize - BaseSize - Start);
0650     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0651     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0652 
0653     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset - 1);
0654     QVERIFY(result);
0655     QCOMPARE(storageOffset, changeStarts[mid - 1] + BaseSize - 1);
0656     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0657 
0658     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset);
0659     QVERIFY(result);
0660     QCOMPARE(storageOffset, changeStarts[mid + 1] + Start);
0661     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0662 
0663     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - Start - 1);
0664     QVERIFY(result);
0665     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0666     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0667 
0668     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - Start);
0669     QVERIFY(!result);
0670 
0671     // removing whole piece and end of previous in the middle
0672     fillWithSize(&pieceTable, pieceCount);
0673     pieceTable.remove(AddressRange::fromWidth(midPieceOffset - (BaseSize - End - 1), BaseSize + BaseSize - (End + 1)));
0674 
0675     QCOMPARE(pieceTable.size(), fullSize - BaseSize - (BaseSize - End - 1));
0676     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0677     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0678 
0679     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset - (BaseSize - End - 1) - 1);
0680     QVERIFY(result);
0681     QCOMPARE(storageOffset, changeStarts[mid - 1] + End);
0682     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0683 
0684     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset - (BaseSize - End - 1));
0685     QVERIFY(result);
0686     QCOMPARE(storageOffset, changeStarts[mid + 1]);
0687     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0688 
0689     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - (BaseSize - End - 1) - 1);
0690     QVERIFY(result);
0691     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0692     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0693 
0694     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - (BaseSize - End - 1));
0695     QVERIFY(!result);
0696 
0697     // removing end of previous, whole and start of next in the middle
0698     fillWithSize(&pieceTable, pieceCount);
0699     pieceTable.remove(AddressRange::fromWidth(midPieceOffset - (BaseSize - End - 1), Start + BaseSize + BaseSize - (End + 1)));
0700 
0701     QCOMPARE(pieceTable.size(), fullSize - BaseSize - (BaseSize - End - 1) - Start);
0702     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0703     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0704 
0705     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset - (BaseSize - End - 1) - 1);
0706     QVERIFY(result);
0707     QCOMPARE(storageOffset, changeStarts[mid - 1] + BaseSize - (BaseSize - End - 1) - 1);
0708     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0709 
0710     result = pieceTable.getStorageData(&storageId, &storageOffset, midPieceOffset - (BaseSize - End - 1));
0711     QVERIFY(result);
0712     QCOMPARE(storageOffset, changeStarts[mid + 1] + Start);
0713     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0714 
0715     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - (BaseSize - End - 1) - Start - 1);
0716     QVERIFY(result);
0717     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0718     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0719 
0720     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - (BaseSize - End - 1) - Start);
0721     QVERIFY(!result);
0722 
0723     // removing start of piece at start
0724     fillWithSize(&pieceTable, pieceCount);
0725     pieceTable.remove(AddressRange::fromWidth(Start));
0726 
0727     QCOMPARE(pieceTable.size(), fullSize - Start);
0728     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0729     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0730 
0731     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0732     QVERIFY(result);
0733     QCOMPARE(storageOffset, changeStarts[1] + Start);
0734     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0735 
0736     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - Start - 1);
0737     QVERIFY(result);
0738     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0739     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0740 
0741     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - Start);
0742     QVERIFY(!result);
0743 
0744     // removing whole piece at start
0745     fillWithSize(&pieceTable, pieceCount);
0746     pieceTable.remove(AddressRange::fromWidth(BaseSize));
0747 
0748     QCOMPARE(pieceTable.size(), fullSize - BaseSize);
0749     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0750     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0751 
0752     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0753     QVERIFY(result);
0754     QCOMPARE(storageOffset, changeStarts[2]);
0755     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0756 
0757     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - 1);
0758     QVERIFY(result);
0759     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0760     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0761 
0762     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize);
0763     QVERIFY(!result);
0764 
0765     // removing whole piece and start of next at start
0766     fillWithSize(&pieceTable, pieceCount);
0767     pieceTable.remove(AddressRange::fromWidth(BaseSize + Start));
0768 
0769     QCOMPARE(pieceTable.size(), fullSize - BaseSize - Start);
0770     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0771     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0772 
0773     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0774     QVERIFY(result);
0775     QCOMPARE(storageOffset, changeStarts[2] + Start);
0776     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0777 
0778     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - Start - 1);
0779     QVERIFY(result);
0780     QCOMPARE(storageOffset, changeStarts[pieceCount] + BaseSize - 1);
0781     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0782 
0783     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - Start);
0784     QVERIFY(!result);
0785 
0786     // removing end of piece at end
0787     fillWithSize(&pieceTable, pieceCount);
0788     pieceTable.remove(AddressRange::fromWidth(fullSize - BaseSize + End + 1, BaseSize - (End + 1)));
0789 
0790     QCOMPARE(pieceTable.size(), fullSize - (BaseSize - End - 1));
0791     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0792     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0793 
0794     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize + End);
0795     QVERIFY(result);
0796     QCOMPARE(storageOffset, changeStarts[pieceCount] + End);
0797     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0798 
0799     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - (BaseSize - End - 1));
0800     QVERIFY(!result);
0801 
0802     // removing whole piece at end
0803     fillWithSize(&pieceTable, pieceCount);
0804     pieceTable.remove(AddressRange::fromWidth(fullSize - BaseSize, BaseSize));
0805 
0806     QCOMPARE(pieceTable.size(), fullSize - BaseSize);
0807     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0808     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0809 
0810     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - 1);
0811     QVERIFY(result);
0812     QCOMPARE(storageOffset, changeStarts[pieceCount - 1] + BaseSize - 1);
0813     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0814 
0815     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize);
0816     QVERIFY(!result);
0817 
0818     // removing whole piece and end of previous at end
0819     fillWithSize(&pieceTable, pieceCount);
0820     pieceTable.remove(AddressRange::fromWidth(fullSize - BaseSize - (BaseSize - End - 1), BaseSize + BaseSize - (End + 1)));
0821 
0822     QCOMPARE(pieceTable.size(), fullSize - BaseSize - (BaseSize - End - 1));
0823     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0824     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0825 
0826     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - (BaseSize - End - 1) - 1);
0827     QVERIFY(result);
0828     QCOMPARE(storageOffset, changeStarts[pieceCount - 1] + End);
0829     QCOMPARE(storageId, (int)Piece::ChangeStorage);
0830 
0831     result = pieceTable.getStorageData(&storageId, &storageOffset, fullSize - BaseSize - (BaseSize - End - 1));
0832     QVERIFY(!result);
0833 
0834     // removing all
0835     fillWithSize(&pieceTable, pieceCount);
0836     pieceTable.remove(AddressRange::fromWidth(fullSize));
0837 
0838     QCOMPARE(pieceTable.size(), 0);
0839     QCOMPARE(pieceTable.changesCount(), pieceCount + 1);
0840     QCOMPARE(pieceTable.appliedChangesCount(), pieceCount + 1);
0841 
0842     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0843     QVERIFY(!result);
0844 }
0845 
0846 void RevertablePieceTableTest::testSwap()
0847 {
0848     RevertablePieceTable pieceTable;
0849 
0850     int storageId;
0851     int storageOffset;
0852     bool result;
0853 
0854     // moving end at begin
0855     pieceTable.init(BaseSize);
0856     pieceTable.swap(0, AddressRange::fromWidth(End + 1, BaseSize - (End + 1)));
0857 
0858     QCOMPARE(pieceTable.size(), BaseSize);
0859     QCOMPARE(pieceTable.changesCount(), 1);
0860     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0861 
0862     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0863     QVERIFY(result);
0864     QCOMPARE(storageOffset, End + 1);
0865     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0866 
0867     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - End - 2);
0868     QVERIFY(result);
0869     QCOMPARE(storageOffset, BaseSize - 1);
0870     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0871 
0872     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - End - 1);
0873     QVERIFY(result);
0874     QCOMPARE(storageOffset, 0);
0875     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0876 
0877     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - 1);
0878     QVERIFY(result);
0879     QCOMPARE(storageOffset, End);
0880     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0881 
0882     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize);
0883     QVERIFY(!result);
0884 
0885     // moving end at mid
0886     pieceTable.init(BaseSize);
0887     pieceTable.swap(Start, AddressRange::fromWidth(End + 1, BaseSize - (End + 1)));
0888 
0889     QCOMPARE(pieceTable.size(), BaseSize);
0890     QCOMPARE(pieceTable.changesCount(), 1);
0891     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0892 
0893     result = pieceTable.getStorageData(&storageId, &storageOffset, Start - 1);
0894     QVERIFY(result);
0895     QCOMPARE(storageOffset, Start - 1);
0896     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0897 
0898     QCOMPARE(pieceTable.size(), BaseSize);
0899     result = pieceTable.getStorageData(&storageId, &storageOffset, Start);
0900     QVERIFY(result);
0901     QCOMPARE(storageOffset, End + 1);
0902     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0903 
0904     result = pieceTable.getStorageData(&storageId, &storageOffset, Start + BaseSize - End - 2);
0905     QVERIFY(result);
0906     QCOMPARE(storageOffset, BaseSize - 1);
0907     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0908 
0909     result = pieceTable.getStorageData(&storageId, &storageOffset, Start + BaseSize - End - 1);
0910     QVERIFY(result);
0911     QCOMPARE(storageOffset, Start);
0912     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0913 
0914     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize - 1);
0915     QVERIFY(result);
0916     QCOMPARE(storageOffset, End);
0917     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0918 
0919     result = pieceTable.getStorageData(&storageId, &storageOffset, BaseSize);
0920     QVERIFY(!result);
0921 
0922     // moving mid at begin
0923     pieceTable.init(BaseSize);
0924     pieceTable.swap(0, AddressRange::fromWidth(Start, Width));
0925 
0926     QCOMPARE(pieceTable.size(), BaseSize);
0927     QCOMPARE(pieceTable.changesCount(), 1);
0928     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0929 
0930     QCOMPARE(pieceTable.size(), BaseSize);
0931     result = pieceTable.getStorageData(&storageId, &storageOffset, 0);
0932     QVERIFY(result);
0933     QCOMPARE(storageOffset, Start);
0934     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0935 
0936     result = pieceTable.getStorageData(&storageId, &storageOffset, Width - 1);
0937     QVERIFY(result);
0938     QCOMPARE(storageOffset, End);
0939     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0940 
0941     result = pieceTable.getStorageData(&storageId, &storageOffset, Width);
0942     QVERIFY(result);
0943     QCOMPARE(storageOffset, 0);
0944     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0945 
0946     result = pieceTable.getStorageData(&storageId, &storageOffset, End);
0947     QVERIFY(result);
0948     QCOMPARE(storageOffset, Start - 1);
0949     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0950 
0951     result = pieceTable.getStorageData(&storageId, &storageOffset, End + 1);
0952     QVERIFY(result);
0953     QCOMPARE(storageOffset, End + 1);
0954     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0955 
0956     // moving mid at mid
0957     pieceTable.init(BaseSize);
0958     int mid = (End + Start) / 2;
0959     pieceTable.swap(Start, AddressRange::fromWidth(mid, End - mid + 1));
0960 
0961     QCOMPARE(pieceTable.size(), BaseSize);
0962     QCOMPARE(pieceTable.changesCount(), 1);
0963     QCOMPARE(pieceTable.appliedChangesCount(), 1);
0964 
0965     result = pieceTable.getStorageData(&storageId, &storageOffset, Start - 1);
0966     QVERIFY(result);
0967     QCOMPARE(storageOffset, Start - 1);
0968     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0969 
0970     result = pieceTable.getStorageData(&storageId, &storageOffset, Start);
0971     QVERIFY(result);
0972     QCOMPARE(storageOffset, mid);
0973     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0974 
0975     result = pieceTable.getStorageData(&storageId, &storageOffset, Start + End - mid);
0976     QVERIFY(result);
0977     QCOMPARE(storageOffset, End);
0978     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0979 
0980     result = pieceTable.getStorageData(&storageId, &storageOffset, Start + End - mid + 1);
0981     QVERIFY(result);
0982     QCOMPARE(storageOffset, Start);
0983     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0984 
0985     result = pieceTable.getStorageData(&storageId, &storageOffset, End);
0986     QVERIFY(result);
0987     QCOMPARE(storageOffset, mid - 1);
0988     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0989 
0990     result = pieceTable.getStorageData(&storageId, &storageOffset, End + 1);
0991     QVERIFY(result);
0992     QCOMPARE(storageOffset, End + 1);
0993     QCOMPARE(storageId, (int)Piece::OriginalStorage);
0994 
0995     // moving a lot:
0996     const int pieceCount = 5;
0997     const int fullSize = pieceCount * BaseSize;
0998 
0999     // moving start of piece at start
1000     fillWithSize(&pieceTable, pieceCount);
1001     pieceTable.swap(Start, AddressRange::fromWidth(mid, End - mid + 1));
1002 
1003     QCOMPARE(pieceTable.size(), fullSize);
1004     // TODO: add other tests
1005 }
1006 
1007 }
1008 
1009 QTEST_GUILESS_MAIN(KPieceTable::RevertablePieceTableTest)
1010 
1011 #include "moc_revertablepiecetabletest.cpp"