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"