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 "piecetest.hpp" 0010 0011 // test object 0012 #include <piecetable/piece.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 0022 static constexpr Address Width = End - Start + 1; 0023 0024 void PieceTest::testSimpleConstructor() 0025 { 0026 Piece piece; 0027 QVERIFY(!piece.isValid()); 0028 } 0029 0030 void PieceTest::testFullConstructor() 0031 { 0032 const AddressRange storageSection(Start, End); 0033 Piece piece(storageSection, Piece::ChangeStorage); 0034 0035 QCOMPARE(piece.start(), Start); 0036 QCOMPARE(piece.end(), storageSection.end()); 0037 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0038 QVERIFY(piece.isValid()); 0039 } 0040 0041 void PieceTest::testSplitAt() 0042 { 0043 const AddressRange storageSection(Start, End); 0044 Piece piece(storageSection, Piece::ChangeStorage); 0045 0046 // split at start 0047 Piece splitPiece = piece.splitAt(Start); 0048 QVERIFY(!piece.isValid()); 0049 QCOMPARE(splitPiece.start(), Start); 0050 QCOMPARE(splitPiece.end(), End); 0051 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0052 0053 // split at one after start 0054 piece.set(Start, End); 0055 splitPiece = piece.splitAt(Start + 1); 0056 QCOMPARE(piece.start(), Start); 0057 QCOMPARE(piece.end(), Start); 0058 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0059 QCOMPARE(splitPiece.start(), Start + 1); 0060 QCOMPARE(splitPiece.end(), End); 0061 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0062 0063 // split at mid 0064 const Address Mid = (Start + End) / 2; 0065 piece.set(Start, End); 0066 splitPiece = piece.splitAt(Mid); 0067 QCOMPARE(piece.start(), Start); 0068 QCOMPARE(piece.end(), Mid - 1); 0069 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0070 QCOMPARE(splitPiece.start(), Mid); 0071 QCOMPARE(splitPiece.end(), End); 0072 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0073 0074 // split at one before width 0075 piece.set(Start, End); 0076 splitPiece = piece.splitAt(End); 0077 QCOMPARE(piece.start(), Start); 0078 QCOMPARE(piece.end(), End - 1); 0079 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0080 QCOMPARE(splitPiece.start(), End); 0081 QCOMPARE(splitPiece.end(), End); 0082 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0083 0084 // split at start so the split is the full 0085 piece.set(Start, End); 0086 splitPiece = piece.splitAt(End + 1); 0087 QCOMPARE(piece.start(), Start); 0088 QCOMPARE(piece.end(), End); 0089 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0090 QVERIFY(!splitPiece.isValid()); 0091 } 0092 0093 void PieceTest::testSplitAtLocal() 0094 { 0095 const AddressRange storageSection(Start, End); 0096 Piece piece(storageSection, Piece::ChangeStorage); 0097 0098 // split at start 0099 Piece splitPiece = piece.splitAtLocal(0); 0100 QVERIFY(!piece.isValid()); 0101 QCOMPARE(splitPiece.start(), Start); 0102 QCOMPARE(splitPiece.end(), End); 0103 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0104 0105 // split at one after start 0106 piece.set(Start, End); 0107 splitPiece = piece.splitAtLocal(1); 0108 QCOMPARE(piece.start(), Start); 0109 QCOMPARE(piece.end(), Start); 0110 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0111 QCOMPARE(splitPiece.start(), Start + 1); 0112 QCOMPARE(splitPiece.end(), End); 0113 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0114 0115 // split at mid 0116 const Address Mid = Width / 2; 0117 piece.set(Start, End); 0118 splitPiece = piece.splitAtLocal(Mid); 0119 QCOMPARE(piece.start(), Start); 0120 QCOMPARE(piece.end(), Start + Mid - 1); 0121 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0122 QCOMPARE(splitPiece.start(), Start + Mid); 0123 QCOMPARE(splitPiece.end(), End); 0124 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0125 0126 // split at one before width 0127 piece.set(Start, End); 0128 splitPiece = piece.splitAtLocal(Width - 1); 0129 QCOMPARE(piece.start(), Start); 0130 QCOMPARE(piece.end(), End - 1); 0131 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0132 QCOMPARE(splitPiece.start(), End); 0133 QCOMPARE(splitPiece.end(), End); 0134 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0135 0136 // split at start so the split is the full 0137 piece.set(Start, End); 0138 splitPiece = piece.splitAtLocal(Width); 0139 QCOMPARE(piece.start(), Start); 0140 QCOMPARE(piece.end(), End); 0141 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0142 QVERIFY(!splitPiece.isValid()); 0143 } 0144 0145 void PieceTest::testRemove() 0146 { 0147 const Address Mid = (Start + End) / 2; 0148 const AddressRange storageSection(Start, End); 0149 Piece piece(storageSection, Piece::ChangeStorage); 0150 0151 // remove none at start 0152 AddressRange RemoveSection(Start, Start - 1); 0153 Piece splitPiece = piece.remove(RemoveSection); 0154 QVERIFY(!piece.isValid()); 0155 QCOMPARE(splitPiece.start(), Start); 0156 QCOMPARE(splitPiece.end(), End); 0157 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0158 0159 // remove one at start 0160 piece.set(Start, End); 0161 RemoveSection.set(Start, Start); 0162 splitPiece = piece.remove(RemoveSection); 0163 QVERIFY(!piece.isValid()); 0164 QCOMPARE(splitPiece.start(), Start + 1); 0165 QCOMPARE(splitPiece.end(), End); 0166 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0167 0168 // remove many at start 0169 piece.set(Start, End); 0170 RemoveSection.set(Start, Mid); 0171 splitPiece = piece.remove(RemoveSection); 0172 QVERIFY(!piece.isValid()); 0173 QCOMPARE(splitPiece.start(), Mid + 1); 0174 QCOMPARE(splitPiece.end(), End); 0175 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0176 0177 // remove all except last 0178 piece.set(Start, End); 0179 RemoveSection.set(Start, End - 1); 0180 splitPiece = piece.remove(RemoveSection); 0181 QVERIFY(!piece.isValid()); 0182 QCOMPARE(splitPiece.start(), End); 0183 QCOMPARE(splitPiece.end(), End); 0184 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0185 0186 // remove at mid 0187 piece.set(Start, End); 0188 RemoveSection.set(Mid - 1, Mid + 1); 0189 splitPiece = piece.remove(RemoveSection); 0190 QCOMPARE(piece.start(), Start); 0191 QCOMPARE(piece.end(), Mid - 2); 0192 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0193 QCOMPARE(splitPiece.start(), Mid + 2); 0194 QCOMPARE(splitPiece.end(), End); 0195 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0196 0197 // remove none at width 0198 piece.set(Start, End); 0199 RemoveSection.set(End + 1, End); 0200 splitPiece = piece.remove(RemoveSection); 0201 QCOMPARE(piece.start(), Start); 0202 QCOMPARE(piece.end(), End); 0203 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0204 QVERIFY(!splitPiece.isValid()); 0205 0206 // remove one at width 0207 piece.set(Start, End); 0208 RemoveSection.set(End, End); 0209 splitPiece = piece.remove(RemoveSection); 0210 QCOMPARE(piece.start(), Start); 0211 QCOMPARE(piece.end(), End - 1); 0212 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0213 QVERIFY(!splitPiece.isValid()); 0214 0215 // remove many at width 0216 piece.set(Start, End); 0217 RemoveSection.set(Mid, End); 0218 splitPiece = piece.remove(RemoveSection); 0219 QCOMPARE(piece.start(), Start); 0220 QCOMPARE(piece.end(), Mid - 1); 0221 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0222 QVERIFY(!splitPiece.isValid()); 0223 0224 // remove all except first 0225 piece.set(Start, End); 0226 RemoveSection.set(Start + 1, End); 0227 splitPiece = piece.remove(RemoveSection); 0228 QCOMPARE(piece.start(), Start); 0229 QCOMPARE(piece.end(), Start); 0230 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0231 QVERIFY(!splitPiece.isValid()); 0232 0233 // remove all 0234 piece.set(Start, End); 0235 RemoveSection.set(Start, End); 0236 splitPiece = piece.remove(RemoveSection); 0237 QVERIFY(!piece.isValid()); 0238 QVERIFY(!splitPiece.isValid()); 0239 } 0240 0241 void PieceTest::testRemoveLocal() 0242 { 0243 const Address Mid = Width / 2; 0244 const AddressRange storageSection(Start, End); 0245 Piece piece(storageSection, Piece::ChangeStorage); 0246 0247 // remove none at start 0248 AddressRange RemoveSection(0, 0 - 1); 0249 Piece splitPiece = piece.removeLocal(RemoveSection); 0250 QVERIFY(!piece.isValid()); 0251 QCOMPARE(splitPiece.start(), Start); 0252 QCOMPARE(splitPiece.end(), End); 0253 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0254 0255 // remove one at start 0256 piece.set(Start, End); 0257 RemoveSection.set(0, 0); 0258 splitPiece = piece.removeLocal(RemoveSection); 0259 QVERIFY(!piece.isValid()); 0260 QCOMPARE(splitPiece.start(), Start + 1); 0261 QCOMPARE(splitPiece.end(), End); 0262 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0263 0264 // remove many at start 0265 piece.set(Start, End); 0266 RemoveSection.set(0, Mid); 0267 splitPiece = piece.removeLocal(RemoveSection); 0268 QVERIFY(!piece.isValid()); 0269 QCOMPARE(splitPiece.start(), Start + Mid + 1); 0270 QCOMPARE(splitPiece.end(), End); 0271 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0272 0273 // remove all except last 0274 piece.set(Start, End); 0275 RemoveSection.set(0, Width - 2); 0276 splitPiece = piece.removeLocal(RemoveSection); 0277 QVERIFY(!piece.isValid()); 0278 QCOMPARE(splitPiece.start(), End); 0279 QCOMPARE(splitPiece.end(), End); 0280 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0281 0282 // remove at mid 0283 piece.set(Start, End); 0284 RemoveSection.set(Mid - 1, Mid + 1); 0285 splitPiece = piece.removeLocal(RemoveSection); 0286 QCOMPARE(piece.start(), Start); 0287 QCOMPARE(piece.end(), Start + Mid - 2); 0288 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0289 QCOMPARE(splitPiece.start(), Start + Mid + 2); 0290 QCOMPARE(splitPiece.end(), End); 0291 QCOMPARE(splitPiece.storageId(), (int)Piece::ChangeStorage); 0292 0293 // remove none at width 0294 piece.set(Start, End); 0295 RemoveSection.set(Width, Width - 1); 0296 splitPiece = piece.removeLocal(RemoveSection); 0297 QCOMPARE(piece.start(), Start); 0298 QCOMPARE(piece.end(), End); 0299 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0300 QVERIFY(!splitPiece.isValid()); 0301 0302 // remove one at width 0303 piece.set(Start, End); 0304 RemoveSection.set(Width - 1, Width - 1); 0305 splitPiece = piece.removeLocal(RemoveSection); 0306 QCOMPARE(piece.start(), Start); 0307 QCOMPARE(piece.end(), End - 1); 0308 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0309 QVERIFY(!splitPiece.isValid()); 0310 0311 // remove many at width 0312 piece.set(Start, End); 0313 RemoveSection.set(Mid, Width - 1); 0314 splitPiece = piece.removeLocal(RemoveSection); 0315 QCOMPARE(piece.start(), Start); 0316 QCOMPARE(piece.end(), Start + Mid - 1); 0317 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0318 QVERIFY(!splitPiece.isValid()); 0319 0320 // remove all except first 0321 piece.set(Start, End); 0322 RemoveSection.set(1, Width - 1); 0323 splitPiece = piece.removeLocal(RemoveSection); 0324 QCOMPARE(piece.start(), Start); 0325 QCOMPARE(piece.end(), Start); 0326 QCOMPARE(piece.storageId(), (int)Piece::ChangeStorage); 0327 QVERIFY(!splitPiece.isValid()); 0328 0329 // remove all 0330 piece.set(Start, End); 0331 RemoveSection.set(0, Width - 1); 0332 splitPiece = piece.removeLocal(RemoveSection); 0333 QVERIFY(!piece.isValid()); 0334 QVERIFY(!splitPiece.isValid()); 0335 } 0336 0337 } 0338 0339 QTEST_GUILESS_MAIN(KPieceTable::PieceTest) 0340 0341 #include "moc_piecetest.cpp"