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 "../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"