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"