File indexing completed on 2024-04-28 05:42:14

0001 // clang-format off
0002 /**
0003  * KDiff3 - Text Diff And Merge Tool
0004  *
0005  * SPDX-FileCopyrightText: 2021 Michael Reeves <reeves.87@gmail.com>
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  *
0008  */
0009 // clang-format on
0010 
0011 #include "../diff.h"
0012 #include "../fileaccess.h"
0013 #include "../options.h"
0014 
0015 #include "SourceDataMoc.h"
0016 
0017 #include <memory>
0018 
0019 #include <QString>
0020 #include <QTest>
0021 
0022 std::unique_ptr<Options> gOptions = std::make_unique<Options>();
0023 
0024 class Diff3LineMoc: public Diff3Line
0025 {
0026   public:
0027     Diff3LineMoc(const LineRef inLineA, const LineRef inLineB, const LineRef inLineC,
0028                   bool inAEqC, bool inBEqC, bool inAEqB,
0029                   bool inWhiteLineA, bool inWhiteLineB, bool inWhiteLineC)
0030     {
0031         setLineA(inLineA);
0032         setLineB(inLineB);
0033         setLineC(inLineC);
0034 
0035         bBEqC = inBEqC;
0036         bAEqC = inAEqC;
0037         bAEqB = inAEqB;
0038 
0039         bWhiteLineA = inWhiteLineA;
0040         bWhiteLineB = inWhiteLineB;
0041         bWhiteLineC = inWhiteLineC;
0042     }
0043 };
0044 
0045 class DiffTest: public QObject
0046 {
0047     Q_OBJECT;
0048   private:
0049     QTemporaryFile  testFile;
0050     FileAccess      file;
0051 
0052   private Q_SLOTS:
0053     void initTestCase()
0054     {
0055         SourceDataMoc simData;
0056 
0057         //Check assumed default values.
0058         QVERIFY(simData.isEmpty());
0059         QVERIFY(simData.isValid());
0060         QVERIFY(!simData.hasData());
0061         QVERIFY(simData.isText());
0062         QVERIFY(simData.getBuf() == nullptr);
0063         QVERIFY(!simData.isFromBuffer());
0064         QVERIFY(!simData.isIncompleteConversion());
0065         QVERIFY(simData.getErrors().isEmpty());
0066         QVERIFY(!simData.hasEOLTermiantion());
0067         //write out test file
0068         testFile.open();
0069         testFile.write(u8"//\n //\n     \t\n  D//   \t\n");
0070         testFile.close();
0071         //Verify that we actcually wrote the test file.
0072         file = FileAccess(testFile.fileName());
0073         QVERIFY(file.exists());
0074         QVERIFY(file.isFile());
0075         QVERIFY(file.isReadable());
0076         QVERIFY(file.isLocal());
0077         QVERIFY(file.size() > 0);
0078     }
0079 
0080     /*
0081         This validates that LineData records are being setup with the correct data.
0082         Only size and raw content are checked here.
0083     */
0084     void testLineData()
0085     {
0086         SourceDataMoc simData;
0087         simData.setFilename(testFile.fileName());
0088 
0089         simData.readAndPreprocess("UTF-8", true);
0090 
0091         QVERIFY(simData.getErrors().isEmpty());
0092         QVERIFY(simData.hasData());
0093         QCOMPARE(simData.getSizeLines(), 5);
0094         QCOMPARE(simData.getSizeBytes(), file.size());
0095 
0096         const std::shared_ptr<LineDataVector> &lineData = simData.getLineDataForDisplay();
0097         //Verify LineData is being setup correctly.
0098         QVERIFY(lineData != nullptr);
0099         QCOMPARE(lineData->size() - 1, 5);
0100 
0101         QVERIFY((*lineData)[0].getBuffer() != nullptr);
0102         QCOMPARE((*lineData)[0].size(), 2);
0103         QCOMPARE((*lineData)[0].getFirstNonWhiteChar(), 1);
0104         QCOMPARE((*lineData)[0].getLine(), "//");
0105 
0106         QVERIFY((*lineData)[1].getBuffer() != nullptr);
0107         QCOMPARE((*lineData)[1].size(), 3);
0108         QCOMPARE((*lineData)[1].getFirstNonWhiteChar(), 2);
0109         QCOMPARE((*lineData)[1].getLine(), " //");
0110 
0111         QVERIFY((*lineData)[2].getBuffer() != nullptr);
0112         QCOMPARE((*lineData)[2].size(), 6);
0113         QCOMPARE((*lineData)[2].getFirstNonWhiteChar(), 0);
0114         QCOMPARE((*lineData)[2].getLine(), "     \t");
0115 
0116         QVERIFY((*lineData)[3].getBuffer() != nullptr);
0117         QCOMPARE((*lineData)[3].size(), 9);
0118         QCOMPARE((*lineData)[3].getFirstNonWhiteChar(), 3);
0119         QCOMPARE((*lineData)[3].getLine(), "  D//   \t");
0120     }
0121 
0122     void testTwoWayDiffLineChanged()
0123     {
0124         SourceDataMoc simData, simData2;
0125         QTemporaryFile testFile2, testFile3;
0126         FileAccess file2;
0127 
0128         std::shared_ptr<const LineDataVector> lineData;
0129         ManualDiffHelpList manualDiffList;
0130         DiffList diffList, expectedDiffList;
0131         Diff3LineList diff3List, expectedDiff3;
0132 
0133         testFile2.open();
0134         testFile2.write(u8"1\n2\n3\n");
0135         testFile2.close();
0136         // Verify that we actcually wrote the test file.
0137         file2 = FileAccess(testFile2.fileName());
0138         QVERIFY(file2.exists());
0139         QVERIFY(file2.isFile());
0140         QVERIFY(file2.isReadable());
0141         QVERIFY(file2.size() > 0);
0142 
0143         testFile3.open();
0144         testFile3.write(u8"1\n4\n3\n");
0145         testFile3.close();
0146 
0147         simData2.setFilename(testFile2.fileName());
0148         simData.setFilename(testFile3.fileName());
0149 
0150         simData.readAndPreprocess("UTF-8", true);
0151         QVERIFY(simData.getErrors().isEmpty());
0152         QVERIFY(simData.hasData());
0153 
0154         lineData = simData.getLineDataForDisplay();
0155         QVERIFY(simData.hasData());
0156         // Verify basic line data structure.
0157         QCOMPARE(lineData->size() - 1, 4);
0158 
0159         simData2.readAndPreprocess("UTF-8", true);
0160         QVERIFY(simData2.getErrors().isEmpty());
0161         QVERIFY(simData2.hasData());
0162 
0163         manualDiffList.runDiff(simData.getLineDataForDiff(), simData.getSizeLines(), simData2.getLineDataForDiff(), simData2.getSizeLines(), diffList, e_SrcSelector::A, e_SrcSelector::B);
0164         /*
0165             Verify DiffList generated by runDiff.
0166         */
0167         expectedDiffList = {{1, 1, 1}, {2, 0, 0}};
0168         QVERIFY(expectedDiffList == diffList);
0169 
0170         /*
0171             Verify Diff3List generated by calcDiff3LineListUsingAB.
0172         */
0173         diff3List.calcDiff3LineListUsingAB(&diffList);
0174         QCOMPARE(diff3List.size(), 4);
0175         // This hard codes the known good result of the above for comparison.
0176         // In general this should not be changed unless you know what your doing.
0177         expectedDiff3 = {Diff3LineMoc(0, 0, LineRef::invalid, false, false, true, false, false, false),
0178                          Diff3LineMoc(1, 1, LineRef::invalid, false, false, false, false, false, false),
0179                          Diff3LineMoc(2, 2, LineRef::invalid, false, false, true, false, false, false),
0180                          Diff3LineMoc(3, 3, LineRef::invalid, false, false, true, false, false, false)};
0181 
0182         QVERIFY(diff3List == expectedDiff3);
0183     }
0184 
0185     void testWhiteLineComment()
0186     {
0187         SourceDataMoc simData;
0188 
0189         simData.setFilename(testFile.fileName());
0190 
0191         simData.readAndPreprocess("UTF-8", true);
0192         QVERIFY(simData.getErrors().isEmpty());
0193         QVERIFY(!simData.isEmpty());
0194         QVERIFY(simData.hasData());
0195         QCOMPARE(simData.getSizeBytes(), file.size());
0196 
0197         const std::shared_ptr<LineDataVector> &lineData = simData.getLineDataForDisplay();
0198         //Verify we actually have data.
0199         QVERIFY(lineData != nullptr);
0200         QCOMPARE(lineData->size() - 1, 5);
0201 
0202         QVERIFY(!(*lineData)[0].whiteLine());
0203         QVERIFY((*lineData)[0].isSkipable());
0204         QVERIFY((*lineData)[0].isPureComment());
0205 
0206         QVERIFY(!(*lineData)[1].whiteLine());
0207         QVERIFY(!(*lineData)[1].isPureComment());
0208         QVERIFY((*lineData)[1].isSkipable());
0209 
0210         QVERIFY((*lineData)[2].whiteLine());
0211         QVERIFY(!(*lineData)[2].isPureComment());
0212         QVERIFY((*lineData)[2].isSkipable());
0213 
0214         QVERIFY(!(*lineData)[3].whiteLine());
0215         QVERIFY(!(*lineData)[3].isPureComment());
0216         QVERIFY(!(*lineData)[3].isSkipable());
0217 
0218         QVERIFY((*lineData)[4].whiteLine());
0219         QVERIFY(!(*lineData)[4].isPureComment());
0220         QVERIFY(!(*lineData)[4].isSkipable());
0221    }
0222 
0223 };
0224 
0225 QTEST_MAIN(DiffTest);
0226 
0227 #include "DiffTest.moc"