File indexing completed on 2024-04-28 05:52:32

0001 /*
0002     This file is part of the Okteta Core library, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2006, 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 "addressrangetest.hpp"
0010 
0011 // test object
0012 #include <addressrange.hpp>
0013 // Qt
0014 #include <QTest>
0015 
0016 // TODO: find out how to test a template class with Qt/KDE,
0017 //  so e.g. NumberRange can be tested with more than AddressRange
0018 namespace Okteta {
0019 
0020 // local variables
0021 static constexpr Address Start = 15;
0022 static constexpr Address End = 27;
0023 
0024 static constexpr Size Width = End - Start + 1;
0025 
0026 void AddressRangeTest::testConstructorByEnd()
0027 {
0028     AddressRange addressRange(Start, End);
0029     QCOMPARE(addressRange.start(), Start);
0030     QCOMPARE(addressRange.end(),   End);
0031     QCOMPARE(addressRange.width(), Width);
0032 }
0033 
0034 void AddressRangeTest::testConstructorByWidth()
0035 {
0036     AddressRange addressRange = AddressRange::fromWidth(Start, Width);
0037 
0038     QCOMPARE(addressRange.start(), Start);
0039     QCOMPARE(addressRange.end(), End);
0040     QCOMPARE(addressRange.width(), Width);
0041 
0042     addressRange = AddressRange::fromWidth(Width);
0043 
0044     QCOMPARE(addressRange.start(), 0);
0045     QCOMPARE(addressRange.end(), Width - 1);
0046     QCOMPARE(addressRange.width(), Width);
0047 }
0048 
0049 void AddressRangeTest::testSimpleConstructor()
0050 {
0051     AddressRange addressRange;
0052     QVERIFY(addressRange.isEmpty());
0053 }
0054 
0055 void AddressRangeTest::testCopyConstructor()
0056 {
0057     const AddressRange otherAddressRange(Start, End);
0058 
0059     AddressRange addressRange(otherAddressRange);
0060     QCOMPARE(addressRange.start(), Start);
0061     QCOMPARE(addressRange.end(),   End);
0062     QCOMPARE(addressRange.width(), Width);
0063     QVERIFY(!addressRange.isEmpty());
0064 }
0065 
0066 void AddressRangeTest::testSetGetStart()
0067 {
0068     AddressRange addressRange;
0069     addressRange.setStart(Start);
0070     QCOMPARE(addressRange.start(), Start);
0071 }
0072 
0073 void AddressRangeTest::testSetGetEnd()
0074 {
0075     AddressRange addressRange;
0076     addressRange.setEnd(End);
0077     QCOMPARE(addressRange.end(), End);
0078 }
0079 
0080 void AddressRangeTest::testSetGetWidth()
0081 {
0082     AddressRange addressRange;
0083     // end, width by width
0084     addressRange.setStart(Start);
0085     addressRange.setEndByWidth(Width);
0086     QCOMPARE(addressRange.end(), End);
0087     QCOMPARE(addressRange.width(), Width);
0088     // start, width by width
0089     addressRange.setEnd(End);
0090     addressRange.setStartByWidth(Width);
0091     QCOMPARE(addressRange.start(), Start);
0092     QCOMPARE(addressRange.width(), Width);
0093 }
0094 
0095 void AddressRangeTest::testIsEmpty()
0096 {
0097     AddressRange addressRange(Start, End);
0098     QVERIFY(!addressRange.isEmpty());
0099     addressRange.unset();
0100     QVERIFY(addressRange.isEmpty());
0101 }
0102 
0103 void AddressRangeTest::testCompare()
0104 {
0105     AddressRange addressRange(Start, End);
0106     // same
0107     AddressRange otherAddressRange(Start, End);
0108     QVERIFY(addressRange == otherAddressRange);
0109     QVERIFY(!(addressRange != otherAddressRange));
0110     // different start
0111     otherAddressRange.set(Start + 1, End);
0112     QVERIFY(!(addressRange == otherAddressRange));
0113     QVERIFY(addressRange != otherAddressRange);
0114     // different end
0115     otherAddressRange.set(Start, End + 1);
0116     QVERIFY(!(addressRange == otherAddressRange));
0117     QVERIFY(addressRange != otherAddressRange);
0118 }
0119 
0120 void AddressRangeTest::testIncludes()
0121 {
0122     AddressRange addressRange(Start, End);
0123     // at start
0124     Address i = addressRange.start();
0125     QVERIFY(addressRange.includes(i));
0126     // before start
0127     --i;
0128     QVERIFY(!addressRange.includes(i));
0129     // at end
0130     i = addressRange.end();
0131     QVERIFY(addressRange.includes(i));
0132     // behind end
0133     ++i;
0134     QVERIFY(!addressRange.includes(i));
0135 }
0136 
0137 void AddressRangeTest::testLocalIndex()
0138 {
0139     AddressRange addressRange(Start, End);
0140 
0141     Address localIndex = addressRange.localIndex(Start);
0142     QCOMPARE(localIndex, 0);
0143 
0144     localIndex = addressRange.localIndex(End);
0145     QCOMPARE(localIndex, Width - 1);
0146 }
0147 
0148 void AddressRangeTest::testLocalRange()
0149 {
0150     AddressRange addressRange(Start, End);
0151 
0152     AddressRange localRange = addressRange.localRange(AddressRange(Start, End));
0153     QCOMPARE(localRange.start(), 0);
0154     QCOMPARE(localRange.end(), Width - 1);
0155 
0156     localRange = addressRange.localRange(AddressRange(Start + 1, End));
0157     QCOMPARE(localRange.start(), 1);
0158     QCOMPARE(localRange.end(), Width - 1);
0159 
0160     localRange = addressRange.localRange(AddressRange(Start, End - 1));
0161     QCOMPARE(localRange.start(), 0);
0162     QCOMPARE(localRange.end(), Width - 2);
0163 
0164     localRange = addressRange.localRange(AddressRange(Start + 1, End - 1));
0165     QCOMPARE(localRange.start(), 1);
0166     QCOMPARE(localRange.end(), Width - 2);
0167 }
0168 
0169 void AddressRangeTest::testSubRange()
0170 {
0171     AddressRange addressRange(Start, End);
0172 
0173     AddressRange subRange = addressRange.subRange(AddressRange::fromWidth(Width));
0174     QCOMPARE(subRange.start(), Start);
0175     QCOMPARE(subRange.end(), End);
0176 
0177     subRange = addressRange.subRange(AddressRange(1, Width - 1));
0178     QCOMPARE(subRange.start(), Start + 1);
0179     QCOMPARE(subRange.end(), End);
0180 
0181     subRange = addressRange.subRange(AddressRange(0, Width - 2));
0182     QCOMPARE(subRange.start(), Start);
0183     QCOMPARE(subRange.end(), End - 1);
0184 
0185     subRange = addressRange.subRange(AddressRange(1, Width - 2));
0186     QCOMPARE(subRange.start(), Start + 1);
0187     QCOMPARE(subRange.end(), End - 1);
0188 }
0189 
0190 void AddressRangeTest::testAdaptToReplacement()
0191 {
0192     // adaptToReplacement, same length, behind
0193     AddressRange addressRange(Start, End);
0194     AddressRange otherAddressRange(addressRange);
0195     addressRange.adaptToReplacement(End + 1, Width, Width);
0196     QCOMPARE(addressRange, otherAddressRange);
0197 
0198     // adaptToReplacement, same length, before
0199     addressRange.set(Start, End);
0200     otherAddressRange.set(addressRange);
0201     addressRange.adaptToReplacement(Start - 2, 1, 1);
0202     QCOMPARE(addressRange, otherAddressRange);
0203 
0204     // adaptToReplacement, same length, -1,-1
0205     addressRange.set(Start - 1, End - 1);
0206     otherAddressRange.set(Start - 1, Start - 1);
0207     addressRange.adaptToReplacement(Start, Width, Width);
0208     QCOMPARE(addressRange, otherAddressRange);
0209 
0210     // adaptToReplacement, same length, -1,0
0211     addressRange.set(Start - 1, End);
0212     otherAddressRange.set(addressRange);
0213     addressRange.adaptToReplacement(Start, Width, Width);
0214     QCOMPARE(addressRange, otherAddressRange);
0215 
0216     // adaptToReplacement, same length, -1,+1
0217     addressRange.set(Start - 1, End + 1);
0218     otherAddressRange.set(addressRange);
0219     addressRange.adaptToReplacement(Start, Width, Width);
0220     QCOMPARE(addressRange, otherAddressRange);
0221 
0222     // adaptToReplacement, same length, 0,-1
0223     addressRange.set(Start, End - 1);
0224     otherAddressRange.set(addressRange);
0225     addressRange.adaptToReplacement(Start, Width, Width);
0226     QVERIFY(!addressRange.isValid());
0227 
0228     // adaptToReplacement, same length, 0,0
0229     addressRange.set(Start, End);
0230     otherAddressRange.set(addressRange);
0231     addressRange.adaptToReplacement(Start, Width, Width);
0232     QCOMPARE(addressRange, otherAddressRange);
0233 
0234     // adaptToReplacement, same length, 0,+1
0235     addressRange.set(Start, End + 1);
0236     otherAddressRange.set(addressRange);
0237     addressRange.adaptToReplacement(Start, Width, Width);
0238     QCOMPARE(addressRange, otherAddressRange);
0239 
0240     // adaptToReplacement, same length, +1,-1
0241     addressRange.set(Start + 1, End - 1);
0242     addressRange.adaptToReplacement(Start, Width, Width);
0243     QVERIFY(!addressRange.isValid());
0244 
0245     // adaptToReplacement, same length, +1,0
0246     addressRange.set(Start + 1, End);
0247     addressRange.adaptToReplacement(Start, Width, Width);
0248     QVERIFY(!addressRange.isValid());
0249 
0250     // adaptToReplacement, same length, +1,+1
0251     addressRange.set(Start + 1, End + 1);
0252     otherAddressRange.set(End + 1, End + 1);
0253     addressRange.adaptToReplacement(Start, Width, Width);
0254     QCOMPARE(addressRange, otherAddressRange);
0255 
0256     // adaptToReplacement, less length, behind
0257     addressRange.set(Start, End);
0258     otherAddressRange.set(addressRange);
0259     addressRange.adaptToReplacement(End + 1, Width, Width - 2);
0260     QCOMPARE(addressRange, otherAddressRange);
0261 
0262     // adaptToReplacement, less length, before
0263     addressRange.set(Start, End);
0264     otherAddressRange.set(Start - 2, End - 2);
0265     addressRange.adaptToReplacement(Start - Width, Width, Width - 2);
0266     QCOMPARE(addressRange, otherAddressRange);
0267 
0268     // adaptToReplacement, less length, -1,-1
0269     addressRange.set(Start - 1, End - 1);
0270     otherAddressRange.set(Start - 1, Start - 1);
0271     addressRange.adaptToReplacement(Start, Width, Width - 2);
0272     QCOMPARE(addressRange, otherAddressRange);
0273 
0274     // adaptToReplacement, less length, -1,0
0275     addressRange.set(Start - 1, End);
0276     otherAddressRange.set(Start - 1, End - 2);
0277     addressRange.adaptToReplacement(Start, Width, Width - 2);
0278     QCOMPARE(addressRange, otherAddressRange);
0279 
0280     // adaptToReplacement, less length, -1,+1
0281     addressRange.set(Start - 1, End + 1);
0282     otherAddressRange.set(Start - 1, End - 1);
0283     addressRange.adaptToReplacement(Start, Width, Width - 2);
0284     QCOMPARE(addressRange, otherAddressRange);
0285 
0286     // adaptToReplacement, less length, 0,-1
0287     addressRange.set(Start, End - 1);
0288     addressRange.adaptToReplacement(Start, Width, Width - 2);
0289     QVERIFY(!addressRange.isValid());
0290 
0291     // adaptToReplacement, less length, 0,0
0292     addressRange.set(Start, End);
0293     otherAddressRange.set(Start, End - 2);
0294     addressRange.adaptToReplacement(Start, Width, Width - 2);
0295     QCOMPARE(addressRange, otherAddressRange);
0296 
0297     // adaptToReplacement, less length, 0,+1
0298     addressRange.set(Start, End + 1);
0299     otherAddressRange.set(Start, End - 1);
0300     addressRange.adaptToReplacement(Start, Width, Width - 2);
0301     QCOMPARE(addressRange, otherAddressRange);
0302 
0303     // adaptToReplacement, less length, +1,-1
0304     addressRange.set(Start + 1, End - 1);
0305     addressRange.adaptToReplacement(Start, Width, Width - 2);
0306     QVERIFY(!addressRange.isValid());
0307 
0308     // adaptToReplacement, less length, +1,0
0309     addressRange.set(Start + 1, End);
0310     addressRange.adaptToReplacement(Start, Width, Width - 2);
0311     QVERIFY(!addressRange.isValid());
0312 
0313     // adaptToReplacement, less length, +1,+1
0314     addressRange.set(Start + 1, End + 1);
0315     otherAddressRange.set(End - 1, End - 1);
0316     addressRange.adaptToReplacement(Start, Width, Width - 2);
0317     QCOMPARE(addressRange, otherAddressRange);
0318 
0319     // adaptToReplacement, greater length, behind
0320     addressRange.set(Start, End);
0321     otherAddressRange.set(addressRange);
0322     addressRange.adaptToReplacement(End + 1, Width, Width + 2);
0323     QCOMPARE(addressRange, otherAddressRange);
0324 
0325     // adaptToReplacement, greater length, before
0326     addressRange.set(Start, End);
0327     otherAddressRange.set(Start + 2, End + 2);
0328     addressRange.adaptToReplacement(Start - Width, Width, Width + 2);
0329     QCOMPARE(addressRange, otherAddressRange);
0330 
0331     // adaptToReplacement, greater length, -1,-1
0332     addressRange.set(Start - 1, End - 1);
0333     otherAddressRange.set(Start - 1, Start - 1);
0334     addressRange.adaptToReplacement(Start, Width, Width + 2);
0335     QCOMPARE(addressRange, otherAddressRange);
0336 
0337     // adaptToReplacement, greater length, -1,0
0338     addressRange.set(Start - 1, End);
0339     otherAddressRange.set(Start - 1, End + 2);
0340     addressRange.adaptToReplacement(Start, Width, Width + 2);
0341     QCOMPARE(addressRange, otherAddressRange);
0342 
0343     // adaptToReplacement, greater length, -1,+1
0344     addressRange.set(Start - 1, End + 1);
0345     otherAddressRange.set(Start - 1, End + 3);
0346     addressRange.adaptToReplacement(Start, Width, Width + 2);
0347     QCOMPARE(addressRange, otherAddressRange);
0348 
0349     // adaptToReplacement, greater length, 0,-1
0350     addressRange.set(Start, End - 1);
0351     addressRange.adaptToReplacement(Start, Width, Width + 2);
0352     QVERIFY(!addressRange.isValid());
0353 
0354     // adaptToReplacement, greater length, 0,0
0355     addressRange.set(Start, End);
0356     otherAddressRange.set(Start, End + 2);
0357     addressRange.adaptToReplacement(Start, Width, Width + 2);
0358     QCOMPARE(addressRange, otherAddressRange);
0359 
0360     // adaptToReplacement, greater length, 0,+1
0361     addressRange.set(Start, End + 1);
0362     otherAddressRange.set(Start, End + 3);
0363     addressRange.adaptToReplacement(Start, Width, Width + 2);
0364     QCOMPARE(addressRange, otherAddressRange);
0365 
0366     // adaptToReplacement, greater length, +1,-1
0367     addressRange.set(Start + 1, End - 1);
0368     addressRange.adaptToReplacement(Start, Width, Width + 2);
0369     QVERIFY(!addressRange.isValid());
0370 
0371     // adaptToReplacement, greater length, +1,0
0372     addressRange.set(Start + 1, End);
0373     addressRange.adaptToReplacement(Start, Width, Width + 2);
0374     QVERIFY(!addressRange.isValid());
0375 
0376     // adaptToReplacement, greater length, +1,+1
0377     addressRange.set(Start + 1, End + 1);
0378     otherAddressRange.set(End + 3, End + 3);
0379     addressRange.adaptToReplacement(Start, Width, Width + 2);
0380     QCOMPARE(addressRange, otherAddressRange);
0381 
0382     // adaptToReplacement, insert, behind
0383     addressRange.set(Start - 1, Start - 1);
0384     otherAddressRange.set(Start - 1, End);
0385     addressRange.adaptToReplacement(Start, 0, Width);
0386     QCOMPARE(addressRange, otherAddressRange);
0387 
0388     // adaptToReplacement, insert, middle
0389     addressRange.set(Start - 1, Start);
0390     otherAddressRange.set(Start - 1, End + 1);
0391     addressRange.adaptToReplacement(Start, 0, Width);
0392     QCOMPARE(addressRange, otherAddressRange);
0393 
0394     // adaptToReplacement, insert, before
0395     addressRange.set(Start, Start);
0396     otherAddressRange.set(End + 1, End + 1);
0397     addressRange.adaptToReplacement(Start, 0, Width);
0398     QCOMPARE(addressRange, otherAddressRange);
0399 }
0400 
0401 void AddressRangeTest::testSplitAt()
0402 {
0403     AddressRange addressRange(Start, End);
0404 
0405     // split at start
0406     AddressRange splitAddressRange = addressRange.splitAt(Start);
0407     QVERIFY(!addressRange.isValid());
0408     QCOMPARE(splitAddressRange.start(), Start);
0409     QCOMPARE(splitAddressRange.end(),   End);
0410 
0411     // split at one after start
0412     addressRange.set(Start, End);
0413     splitAddressRange = addressRange.splitAt(Start + 1);
0414     QCOMPARE(addressRange.start(), Start);
0415     QCOMPARE(addressRange.end(), Start);
0416     QCOMPARE(splitAddressRange.start(), Start + 1);
0417     QCOMPARE(splitAddressRange.end(),   End);
0418 
0419     // split at mid
0420     const Address Mid = (Start + End) / 2;
0421     addressRange.set(Start, End);
0422     splitAddressRange = addressRange.splitAt(Mid);
0423     QCOMPARE(addressRange.start(), Start);
0424     QCOMPARE(addressRange.end(), Mid - 1);
0425     QCOMPARE(splitAddressRange.start(), Mid);
0426     QCOMPARE(splitAddressRange.end(),   End);
0427 
0428     // split at one before end
0429     addressRange.set(Start, End);
0430     splitAddressRange = addressRange.splitAt(End);
0431     QCOMPARE(addressRange.start(), Start);
0432     QCOMPARE(addressRange.end(), End - 1);
0433     QCOMPARE(splitAddressRange.start(), End);
0434     QCOMPARE(splitAddressRange.end(),   End);
0435 
0436     // split at start so the split is the full
0437     addressRange.set(Start, End);
0438     splitAddressRange = addressRange.splitAt(End + 1);
0439     QCOMPARE(addressRange.start(), Start);
0440     QCOMPARE(addressRange.end(), End);
0441     QVERIFY(!splitAddressRange.isValid());
0442 }
0443 
0444 void AddressRangeTest::testSplitAtLocal()
0445 {
0446     AddressRange addressRange(Start, End);
0447 
0448     // split at start
0449     AddressRange splitAddressRange = addressRange.splitAtLocal(0);
0450     QVERIFY(!addressRange.isValid());
0451     QCOMPARE(splitAddressRange.start(), Start);
0452     QCOMPARE(splitAddressRange.end(),   End);
0453 
0454     // split at one after start
0455     addressRange.set(Start, End);
0456     splitAddressRange = addressRange.splitAtLocal(1);
0457     QCOMPARE(addressRange.start(), Start);
0458     QCOMPARE(addressRange.end(), Start);
0459     QCOMPARE(splitAddressRange.start(), Start + 1);
0460     QCOMPARE(splitAddressRange.end(),   End);
0461 
0462     // split at mid
0463     const Address Mid = Width / 2;
0464     addressRange.set(Start, End);
0465     splitAddressRange = addressRange.splitAtLocal(Mid);
0466     QCOMPARE(addressRange.start(), Start);
0467     QCOMPARE(addressRange.end(), Start + Mid - 1);
0468     QCOMPARE(splitAddressRange.start(), Start + Mid);
0469     QCOMPARE(splitAddressRange.end(),   End);
0470 
0471     // split at one before end
0472     addressRange.set(Start, End);
0473     splitAddressRange = addressRange.splitAtLocal(Width - 1);
0474     QCOMPARE(addressRange.start(), Start);
0475     QCOMPARE(addressRange.end(), End - 1);
0476     QCOMPARE(splitAddressRange.start(), End);
0477     QCOMPARE(splitAddressRange.end(),   End);
0478 
0479     // split at start so the split is the full
0480     addressRange.set(Start, End);
0481     splitAddressRange = addressRange.splitAtLocal(Width);
0482     QCOMPARE(addressRange.start(), Start);
0483     QCOMPARE(addressRange.end(), End);
0484     QVERIFY(!splitAddressRange.isValid());
0485 }
0486 
0487 void AddressRangeTest::testRemove()
0488 {
0489     const Address Mid = (Start + End) / 2;
0490     AddressRange addressRange(Start, End);
0491 
0492     // remove none at start
0493     AddressRange removeAddressRange(Start, Start - 1);
0494     AddressRange splitAddressRange = addressRange.remove(removeAddressRange);
0495     QVERIFY(!addressRange.isValid());
0496     QCOMPARE(splitAddressRange.start(), Start);
0497     QCOMPARE(splitAddressRange.end(),   End);
0498 
0499     // remove one at start
0500     addressRange.set(Start, End);
0501     removeAddressRange.set(Start, Start);
0502     splitAddressRange = addressRange.remove(removeAddressRange);
0503     QVERIFY(!addressRange.isValid());
0504     QCOMPARE(splitAddressRange.start(), Start + 1);
0505     QCOMPARE(splitAddressRange.end(),   End);
0506 
0507     // remove many at start
0508     addressRange.set(Start, End);
0509     removeAddressRange.set(Start, Mid);
0510     splitAddressRange = addressRange.remove(removeAddressRange);
0511     QVERIFY(!addressRange.isValid());
0512     QCOMPARE(splitAddressRange.start(), Mid + 1);
0513     QCOMPARE(splitAddressRange.end(),   End);
0514 
0515     // remove all except last
0516     addressRange.set(Start, End);
0517     removeAddressRange.set(Start, End - 1);
0518     splitAddressRange = addressRange.remove(removeAddressRange);
0519     QVERIFY(!addressRange.isValid());
0520     QCOMPARE(splitAddressRange.start(), End);
0521     QCOMPARE(splitAddressRange.end(),   End);
0522 
0523     // remove at mid
0524     addressRange.set(Start, End);
0525     removeAddressRange.set(Mid - 1, Mid + 1);
0526     splitAddressRange = addressRange.remove(removeAddressRange);
0527     QCOMPARE(addressRange.start(), Start);
0528     QCOMPARE(addressRange.end(), Mid - 2);
0529     QCOMPARE(splitAddressRange.start(), Mid + 2);
0530     QCOMPARE(splitAddressRange.end(),   End);
0531 
0532     // remove none at end
0533     addressRange.set(Start, End);
0534     removeAddressRange.set(End + 1, End);
0535     splitAddressRange = addressRange.remove(removeAddressRange);
0536     QCOMPARE(addressRange.start(), Start);
0537     QCOMPARE(addressRange.end(),   End);
0538     QVERIFY(!splitAddressRange.isValid());
0539 
0540     // remove one at end
0541     addressRange.set(Start, End);
0542     removeAddressRange.set(End, End);
0543     splitAddressRange = addressRange.remove(removeAddressRange);
0544     QCOMPARE(addressRange.start(), Start);
0545     QCOMPARE(addressRange.end(),   End - 1);
0546     QVERIFY(!splitAddressRange.isValid());
0547 
0548     // remove many at end
0549     addressRange.set(Start, End);
0550     removeAddressRange.set(Mid, End);
0551     splitAddressRange = addressRange.remove(removeAddressRange);
0552     QCOMPARE(addressRange.start(), Start);
0553     QCOMPARE(addressRange.end(),   Mid - 1);
0554     QVERIFY(!splitAddressRange.isValid());
0555 
0556     // remove all except first
0557     addressRange.set(Start, End);
0558     removeAddressRange.set(Start + 1, End);
0559     splitAddressRange = addressRange.remove(removeAddressRange);
0560     QCOMPARE(addressRange.start(), Start);
0561     QCOMPARE(addressRange.end(),   Start);
0562     QVERIFY(!splitAddressRange.isValid());
0563 
0564     // remove all
0565     addressRange.set(Start, End);
0566     removeAddressRange.set(Start, End);
0567     splitAddressRange = addressRange.remove(removeAddressRange);
0568     QVERIFY(!addressRange.isValid());
0569     QVERIFY(!splitAddressRange.isValid());
0570 }
0571 
0572 void AddressRangeTest::testRemoveLocal()
0573 {
0574     const Address Mid = Width / 2;
0575     AddressRange addressRange(Start, End);
0576 
0577     // remove none at start
0578     AddressRange removeAddressRange(0, 0 - 1);
0579     AddressRange splitAddressRange = addressRange.removeLocal(removeAddressRange);
0580     QVERIFY(!addressRange.isValid());
0581     QCOMPARE(splitAddressRange.start(), Start);
0582     QCOMPARE(splitAddressRange.end(),   End);
0583 
0584     // remove one at start
0585     addressRange.set(Start, End);
0586     removeAddressRange.set(0, 0);
0587     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0588     QVERIFY(!addressRange.isValid());
0589     QCOMPARE(splitAddressRange.start(), Start + 1);
0590     QCOMPARE(splitAddressRange.end(),   End);
0591 
0592     // remove many at start
0593     addressRange.set(Start, End);
0594     removeAddressRange.set(0, Mid);
0595     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0596     QVERIFY(!addressRange.isValid());
0597     QCOMPARE(splitAddressRange.start(), Start + Mid + 1);
0598     QCOMPARE(splitAddressRange.end(),   End);
0599 
0600     // remove all except last
0601     addressRange.set(Start, End);
0602     removeAddressRange.set(0, Width - 2);
0603     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0604     QVERIFY(!addressRange.isValid());
0605     QCOMPARE(splitAddressRange.start(), End);
0606     QCOMPARE(splitAddressRange.end(),   End);
0607 
0608     // remove at mid
0609     addressRange.set(Start, End);
0610     removeAddressRange.set(Mid - 1, Mid + 1);
0611     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0612     QCOMPARE(addressRange.start(), Start);
0613     QCOMPARE(addressRange.end(), Start + Mid - 2);
0614     QCOMPARE(splitAddressRange.start(), Start + Mid + 2);
0615     QCOMPARE(splitAddressRange.end(),   End);
0616 
0617     // remove none at end
0618     addressRange.set(Start, End);
0619     removeAddressRange.set(Width, Width - 1);
0620     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0621     QCOMPARE(addressRange.start(), Start);
0622     QCOMPARE(addressRange.end(),   End);
0623     QVERIFY(!splitAddressRange.isValid());
0624 
0625     // remove one at end
0626     addressRange.set(Start, End);
0627     removeAddressRange.set(Width - 1, Width - 1);
0628     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0629     QCOMPARE(addressRange.start(), Start);
0630     QCOMPARE(addressRange.end(),   End - 1);
0631     QVERIFY(!splitAddressRange.isValid());
0632 
0633     // remove many at end
0634     addressRange.set(Start, End);
0635     removeAddressRange.set(Mid, Width - 1);
0636     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0637     QCOMPARE(addressRange.start(), Start);
0638     QCOMPARE(addressRange.end(),   Start + Mid - 1);
0639     QVERIFY(!splitAddressRange.isValid());
0640 
0641     // remove all except first
0642     addressRange.set(Start, End);
0643     removeAddressRange.set(1, Width - 1);
0644     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0645     QCOMPARE(addressRange.start(), Start);
0646     QCOMPARE(addressRange.end(),   Start);
0647     QVERIFY(!splitAddressRange.isValid());
0648 
0649     // remove all
0650     addressRange.set(Start, End);
0651     removeAddressRange.set(0, Width - 1);
0652     splitAddressRange = addressRange.removeLocal(removeAddressRange);
0653     QVERIFY(!addressRange.isValid());
0654     QVERIFY(!splitAddressRange.isValid());
0655 }
0656 
0657 void AddressRangeTest::testStartForInclude()
0658 {
0659     // testStartForInclude, same length, start at start
0660     const AddressRange addressRange(Start, End);
0661     AddressRange otherAddressRange(addressRange);
0662     QCOMPARE(addressRange.startForInclude(otherAddressRange), otherAddressRange.start());
0663 
0664     // testStartForInclude, same length, start before start
0665     otherAddressRange.moveBy(-1);
0666     QCOMPARE(addressRange.startForInclude(otherAddressRange), otherAddressRange.start());
0667 
0668     // testStartForInclude, same length, end behind end
0669     otherAddressRange.moveBy(2);
0670     QCOMPARE(addressRange.startForInclude(otherAddressRange), otherAddressRange.start());
0671 
0672     // testStartForInclude, smaller length, start at start
0673     otherAddressRange.set(Start, End - 1);
0674     Size Diff = addressRange.width() - otherAddressRange.width();
0675     QCOMPARE(addressRange.startForInclude(otherAddressRange), otherAddressRange.start());
0676 
0677     // testStartForInclude, smaller length, start before start
0678     otherAddressRange.moveBy(-1);
0679     QCOMPARE(addressRange.startForInclude(otherAddressRange), otherAddressRange.start());
0680 
0681     // testStartForInclude, smaller length, end behind end
0682     otherAddressRange.moveBy(2);
0683     QCOMPARE(addressRange.startForInclude(otherAddressRange), otherAddressRange.start() - Diff);
0684 
0685 /* // undefined in startForInclude
0686     // testStartForInclude, greater length, start at start
0687     otherAddressRange.set( Start, End+1 );
0688     Diff = addressRange.width() - otherAddressRange.width();
0689     QCOMPARE( addressRange.startForInclude(otherAddressRange), otherAddressRange.start() );
0690 
0691     // testStartForInclude, smaller length, start before start
0692     otherAddressRange.moveBy( -1 );
0693     QCOMPARE( addressRange.startForInclude(otherAddressRange), otherAddressRange.start() );
0694 
0695     // testStartForInclude, smaller length, end behind end
0696     otherAddressRange.moveBy( 2 );
0697     QCOMPARE( addressRange.startForInclude(otherAddressRange), otherAddressRange.start()-Diff );
0698  */
0699 }
0700 
0701 void AddressRangeTest::testIsJoinable()
0702 {
0703     // testStartForInclude, same length, start at start
0704     const AddressRange addressRange(Start, End);
0705     AddressRange otherAddressRange(addressRange);
0706     QVERIFY(addressRange.isJoinable(otherAddressRange));
0707 
0708     // adaptToReplacement, insert, before
0709     otherAddressRange.set(End + 1, End + Width);
0710     QVERIFY(addressRange.isJoinable(otherAddressRange));
0711 
0712     // Overlapping, right shifted
0713     otherAddressRange.set(Start + 1, End + 1);
0714     QVERIFY(addressRange.isJoinable(otherAddressRange));
0715 
0716     // Overlapping, left shifted
0717     otherAddressRange.set(Start - 1, End - 1);
0718     QVERIFY(addressRange.isJoinable(otherAddressRange));
0719 
0720     // Overlapping, 1 includes 2
0721     otherAddressRange.set(Start + 1, End - 1);
0722     QVERIFY(addressRange.isJoinable(otherAddressRange));
0723 
0724     // Overlapping, 2 includes 1
0725     otherAddressRange.set(Start - 1, End + 1);
0726     QVERIFY(addressRange.isJoinable(otherAddressRange));
0727 
0728     // Overlapping, identic
0729     otherAddressRange.set(addressRange);
0730     QVERIFY(addressRange.isJoinable(otherAddressRange));
0731 
0732     // Coupled, first, then second
0733     otherAddressRange.set(End + 1, End + Width);
0734     QVERIFY(addressRange.isJoinable(otherAddressRange));
0735 
0736     // Coupled, second, then first
0737     QVERIFY(otherAddressRange.isJoinable(addressRange));
0738 
0739     // NonOverlapping, first, then second
0740     otherAddressRange.set(End + 2, End + Width + 1);
0741     QVERIFY(!addressRange.isJoinable(otherAddressRange));
0742 
0743     // NonOverlapping, second, then first
0744     QVERIFY(!otherAddressRange.isJoinable(addressRange));
0745 }
0746 
0747 }
0748 
0749 QTEST_GUILESS_MAIN(Okteta::AddressRangeTest)
0750 
0751 #include "moc_addressrangetest.cpp"