File indexing completed on 2024-05-05 14:18:26
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 "../fileaccess.h" 0012 #include "SourceDataMoc.h" 0013 0014 #include <memory> 0015 0016 #include <QTemporaryFile> 0017 #include <QTest> 0018 #include <QTextCodec> 0019 0020 std::unique_ptr<Options> gOptions = std::make_unique<Options>(); 0021 0022 class DataReadTest: public QObject 0023 { 0024 Q_OBJECT; 0025 private Q_SLOTS: 0026 void initTestCase() 0027 { 0028 SourceDataMoc simData; 0029 QTemporaryFile testFile; 0030 0031 //Check assumed default values. 0032 QVERIFY(simData.isEmpty()); 0033 QVERIFY(simData.isValid()); 0034 QVERIFY(!simData.hasData()); 0035 QVERIFY(simData.isText()); 0036 QVERIFY(simData.getBuf() == nullptr); 0037 QVERIFY(!simData.isFromBuffer()); 0038 QVERIFY(!simData.isIncompleteConversion()); 0039 QVERIFY(simData.getErrors().isEmpty()); 0040 QVERIFY(!simData.hasEOLTermiantion()); 0041 //write out test file 0042 testFile.open(); 0043 testFile.write(u8"//\n //\n \t\n D// \t\n"); 0044 testFile.close(); 0045 //Verify that we actcually wrote the test file. 0046 FileAccess file = FileAccess(testFile.fileName()); 0047 QVERIFY(file.exists()); 0048 QVERIFY(file.isFile()); 0049 QVERIFY(file.isReadable()); 0050 QVERIFY(file.isLocal()); 0051 QVERIFY(file.size() > 0); 0052 // Sanity check essential functions. Failure of these makes further testing pointless. 0053 simData.setFilename(testFile.fileName()); 0054 QCOMPARE(simData.getFilename(), testFile.fileName()); 0055 QVERIFY(!simData.isFromBuffer()); 0056 QVERIFY(!simData.isEmpty()); 0057 QVERIFY(!simData.hasData()); 0058 QVERIFY(simData.isText()); 0059 QVERIFY(!simData.isDir()); 0060 0061 simData.setFilename(""); 0062 QVERIFY(simData.getFilename().isEmpty()); 0063 QVERIFY(simData.isEmpty()); 0064 QVERIFY(!simData.hasData()); 0065 QVERIFY(!simData.isFromBuffer()); 0066 QVERIFY(simData.isText()); 0067 } 0068 0069 /* 0070 Check basic ablity to read data in. 0071 */ 0072 void testRead() 0073 { 0074 QTemporaryFile testFile; 0075 SourceDataMoc simData; 0076 FileAccess file; 0077 //write out test file 0078 testFile.open(); 0079 testFile.write(u8"//\n //\n \t\n D// \t\n"); 0080 testFile.close(); 0081 file = FileAccess(testFile.fileName()); 0082 QVERIFY(file.size() > 0); 0083 0084 simData.setFilename(testFile.fileName()); 0085 simData.readAndPreprocess("UTF-8", true); 0086 QVERIFY(simData.getErrors().isEmpty()); 0087 QVERIFY(!simData.isFromBuffer()); 0088 QVERIFY(!simData.isEmpty()); 0089 QVERIFY(simData.hasData()); 0090 QVERIFY(simData.getEncoding() != nullptr); 0091 QCOMPARE(simData.getSizeLines(), 5); 0092 QCOMPARE(simData.getSizeBytes(), file.size()); 0093 } 0094 0095 void testEOLStyle() 0096 { 0097 QTemporaryFile testFile; 0098 SourceDataMoc simData; 0099 0100 testFile.open(); 0101 testFile.write(u8"//\n //\n \t\n D// \t\n"); 0102 testFile.close(); 0103 0104 simData.setFilename(testFile.fileName()); 0105 simData.readAndPreprocess("UTF-8", true); 0106 QVERIFY(simData.getErrors().isEmpty()); 0107 QVERIFY(!simData.isFromBuffer()); 0108 QVERIFY(!simData.isEmpty()); 0109 QVERIFY(simData.hasData()); 0110 0111 QVERIFY(simData.getLineEndStyle() == eLineEndStyleUnix); 0112 0113 testFile.resize(0); 0114 testFile.open(); 0115 testFile.write(u8"//\r\n //\r\n \t\r\n D// \t\r\n"); 0116 testFile.close(); 0117 0118 simData.reset(); 0119 simData.setFilename(testFile.fileName()); 0120 simData.readAndPreprocess("UTF-8", true); 0121 QVERIFY(simData.getErrors().isEmpty()); 0122 QVERIFY(!simData.isFromBuffer()); 0123 QVERIFY(!simData.isEmpty()); 0124 QVERIFY(simData.hasData()); 0125 0126 QVERIFY(simData.getLineEndStyle() == eLineEndStyleDos); 0127 0128 QTextCodec *codec = QTextCodec::codecForName("UTF-16"); 0129 testFile.resize(0); 0130 0131 testFile.open(); 0132 testFile.write(codec->fromUnicode(u8"\r\n\r\n7\r\n")); 0133 testFile.close(); 0134 0135 simData.setFilename(testFile.fileName()); 0136 simData.readAndPreprocess(codec->name(), true); 0137 QVERIFY(simData.getErrors().isEmpty()); 0138 QVERIFY(!simData.isFromBuffer()); 0139 QVERIFY(!simData.isEmpty()); 0140 QVERIFY(simData.hasData()); 0141 QCOMPARE(simData.getLineEndStyle(), eLineEndStyleDos); 0142 0143 testFile.resize(0); 0144 testFile.open(); 0145 testFile.write(codec->fromUnicode(u8"\n\n7\n")); 0146 testFile.close(); 0147 0148 simData.setFilename(testFile.fileName()); 0149 simData.readAndPreprocess(codec->name(), true); 0150 QVERIFY(simData.getErrors().isEmpty()); 0151 QVERIFY(!simData.isFromBuffer()); 0152 QVERIFY(!simData.isEmpty()); 0153 QVERIFY(simData.hasData()); 0154 QCOMPARE(simData.getLineEndStyle(), eLineEndStyleUnix); 0155 0156 codec = QTextCodec::codecForName("UTF-16LE"); 0157 testFile.resize(0); 0158 0159 testFile.open(); 0160 testFile.write(codec->fromUnicode(u8"\r\n\r\n7\r\n")); 0161 testFile.close(); 0162 0163 simData.setFilename(testFile.fileName()); 0164 simData.readAndPreprocess(codec->name(), true); 0165 QVERIFY(simData.getErrors().isEmpty()); 0166 QVERIFY(!simData.isFromBuffer()); 0167 QVERIFY(!simData.isEmpty()); 0168 QVERIFY(simData.hasData()); 0169 QCOMPARE(simData.getLineEndStyle(), eLineEndStyleDos); 0170 0171 testFile.resize(0); 0172 0173 testFile.open(); 0174 testFile.write(codec->fromUnicode(u8"\n\n7\n")); 0175 testFile.close(); 0176 0177 simData.setFilename(testFile.fileName()); 0178 simData.readAndPreprocess(codec->name(), true); 0179 QVERIFY(simData.getErrors().isEmpty()); 0180 QVERIFY(!simData.isFromBuffer()); 0181 QVERIFY(!simData.isEmpty()); 0182 QVERIFY(simData.hasData()); 0183 QCOMPARE(simData.getLineEndStyle(), eLineEndStyleUnix); 0184 0185 codec = QTextCodec::codecForName("UTF-16BE"); 0186 testFile.resize(0); 0187 0188 testFile.open(); 0189 testFile.write(codec->fromUnicode(u8"\r\n\r\n7\r\n")); 0190 testFile.close(); 0191 0192 simData.setFilename(testFile.fileName()); 0193 simData.readAndPreprocess(codec->name(), true); 0194 QVERIFY(simData.getErrors().isEmpty()); 0195 QVERIFY(!simData.isFromBuffer()); 0196 QVERIFY(!simData.isEmpty()); 0197 QVERIFY(simData.hasData()); 0198 QCOMPARE(simData.getLineEndStyle(), eLineEndStyleDos); 0199 0200 testFile.resize(0); 0201 0202 testFile.open(); 0203 testFile.write(codec->fromUnicode(u8"\n\n7\n")); 0204 testFile.close(); 0205 0206 simData.setFilename(testFile.fileName()); 0207 simData.readAndPreprocess(codec->name(), true); 0208 QVERIFY(simData.getErrors().isEmpty()); 0209 QVERIFY(!simData.isFromBuffer()); 0210 QVERIFY(!simData.isEmpty()); 0211 QVERIFY(simData.hasData()); 0212 QCOMPARE(simData.getLineEndStyle(), eLineEndStyleUnix); 0213 } 0214 0215 void trailingEOLTest() 0216 { 0217 QTemporaryFile eolTest; 0218 SourceDataMoc simData; 0219 0220 eolTest.open(); 0221 eolTest.write("\n}\n"); 0222 eolTest.close(); 0223 0224 simData.setFilename(eolTest.fileName()); 0225 simData.readAndPreprocess("UTF-8", true); 0226 0227 QVERIFY(simData.getErrors().isEmpty()); 0228 QVERIFY(!simData.isFromBuffer()); 0229 QVERIFY(!simData.isEmpty()); 0230 QVERIFY(simData.hasData()); 0231 QVERIFY(simData.getEncoding() != nullptr); 0232 0233 QVERIFY(simData.hasEOLTermiantion()); 0234 QCOMPARE(simData.getSizeLines(), 3); 0235 QCOMPARE(simData.getSizeBytes(), FileAccess(eolTest.fileName()).size()); 0236 0237 const std::shared_ptr<LineDataVector> &lineData = simData.getLineDataForDisplay(); 0238 QVERIFY(lineData != nullptr); 0239 QCOMPARE(lineData->size() - 1, 3); //Phantom line generated for last EOL mark if present 0240 0241 QVERIFY(eolTest.remove()); 0242 0243 eolTest.open(); 0244 eolTest.write("\n}"); 0245 eolTest.close(); 0246 0247 simData.setFilename(eolTest.fileName()); 0248 simData.readAndPreprocess("UTF-8", true); 0249 0250 QVERIFY(simData.getErrors().isEmpty()); 0251 0252 QVERIFY(!simData.hasEOLTermiantion()); 0253 QCOMPARE(simData.getSizeLines(), 2); 0254 QCOMPARE(simData.getSizeBytes(), FileAccess(eolTest.fileName()).size()); 0255 } 0256 }; 0257 0258 QTEST_MAIN(DataReadTest); 0259 0260 #include "datareadtest.moc"