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