File indexing completed on 2024-12-08 05:12:17
0001 /* This file is part of Kairo Timer 0002 0003 SPDX-FileCopyrightText: 2016 (c) Kevin Ottens <ervin@kde.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 0007 */ 0008 0009 #include <QtTest> 0010 0011 #include <memory> 0012 0013 #include "circuitlistmodel.h" 0014 0015 static_assert(std::is_base_of<QAbstractItemModel, CircuitListModel>::value, "Should be an item model"); 0016 0017 class CircuitListModelTest : public QObject 0018 { 0019 Q_OBJECT 0020 private: 0021 QDir storageDir() const 0022 { 0023 auto path = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); 0024 return {path}; 0025 } 0026 0027 void writeInFile(const QString &fileName, const QString &fileContent) 0028 { 0029 auto dir = storageDir(); 0030 auto file = std::make_unique<QFile>(dir.path() + '/' + fileName); 0031 if (file->open(QFile::WriteOnly)) { 0032 auto stream = std::make_unique<QTextStream>(file.get()); 0033 *stream << fileContent; 0034 } 0035 QTest::qWait(20); 0036 } 0037 0038 void deleteFile(const QString &fileName) 0039 { 0040 QFile::remove(storageDir().path() + '/' + fileName); 0041 QTest::qWait(20); 0042 } 0043 0044 private slots: 0045 void initTestCase() 0046 { 0047 QCoreApplication::setApplicationName("circuitlistmodeltest"); 0048 QStandardPaths::setTestModeEnabled(true); 0049 cleanupTestCase(); 0050 } 0051 0052 void cleanupTestCase() 0053 { 0054 auto dir = storageDir(); 0055 if (dir.exists()) { 0056 dir.removeRecursively(); 0057 dir.rmpath(".."); 0058 } 0059 } 0060 0061 void shouldHaveDefaultStateAndCreateStorageDir() 0062 { 0063 // GIVEN 0064 auto dir = storageDir(); 0065 QVERIFY(!dir.exists()); 0066 auto model = std::make_unique<CircuitListModel>(); 0067 0068 // THEN 0069 QVERIFY(dir.exists()); 0070 QCOMPARE(model->path(), dir.path()); 0071 QCOMPARE(model->rowCount(), 0); 0072 QCOMPARE(model->roleNames().value(Qt::DisplayRole), QByteArray("display")); 0073 QCOMPARE(model->roleNames().value(CircuitListModel::FilePathRole), QByteArray("filePath")); 0074 } 0075 0076 void shouldListCircuitsInStorageDir() 0077 { 0078 // GIVEN 0079 auto model = std::make_unique<CircuitListModel>(); 0080 auto spy = std::make_unique<QSignalSpy>(model.get(), &CircuitListModel::modelReset); 0081 0082 // WHEN 0083 writeInFile("foo.kairo", "---\nname: Foo Circuit\n---\n[]\n"); 0084 0085 // THEN 0086 QCOMPARE(spy->size(), 1); 0087 QCOMPARE(model->path(), storageDir().path()); 0088 QCOMPARE(model->rowCount(), 1); 0089 QCOMPARE(model->rowCount(model->index(0, 0)), 0); 0090 QCOMPARE(model->data(model->index(0, 0)).toString(), QString("Foo Circuit")); 0091 QCOMPARE(model->data(model->index(0, 0), CircuitListModel::FilePathRole).toString(), 0092 storageDir().path() + '/' + "foo.kairo"); 0093 spy->clear(); 0094 0095 // WHEN 0096 writeInFile("ignored.json", "---\nname: Ignored file (not .kairo)\n---\n[]\n"); 0097 0098 // THEN 0099 QCOMPARE(spy->size(), 0); 0100 QCOMPARE(model->path(), storageDir().path()); 0101 QCOMPARE(model->rowCount(), 1); 0102 QCOMPARE(model->rowCount(model->index(0, 0)), 0); 0103 QCOMPARE(model->data(model->index(0, 0)).toString(), QString("Foo Circuit")); 0104 QCOMPARE(model->data(model->index(0, 0), CircuitListModel::FilePathRole).toString(), 0105 storageDir().path() + '/' + "foo.kairo"); 0106 spy->clear(); 0107 0108 // WHEN 0109 writeInFile("bar.kairo", "---\nname: ZBar\n---\n[]\n"); 0110 0111 // THEN 0112 QCOMPARE(spy->size(), 1); 0113 QCOMPARE(model->path(), storageDir().path()); 0114 QCOMPARE(model->rowCount(), 2); 0115 QCOMPARE(model->rowCount(model->index(0, 0)), 0); 0116 QCOMPARE(model->rowCount(model->index(1, 0)), 0); 0117 QCOMPARE(model->data(model->index(0, 0)).toString(), QString("Foo Circuit")); 0118 QCOMPARE(model->data(model->index(0, 0), CircuitListModel::FilePathRole).toString(), 0119 storageDir().path() + '/' + "foo.kairo"); 0120 QCOMPARE(model->data(model->index(1, 0)).toString(), QString("ZBar")); 0121 QCOMPARE(model->data(model->index(1, 0), CircuitListModel::FilePathRole).toString(), 0122 storageDir().path() + '/' + "bar.kairo"); 0123 spy->clear(); 0124 0125 // WHEN 0126 writeInFile("zab.kairo", "---\nname: Baz Circuit\n---\n[]\n"); 0127 0128 // THEN 0129 QCOMPARE(spy->size(), 1); 0130 QCOMPARE(model->path(), storageDir().path()); 0131 QCOMPARE(model->rowCount(), 3); 0132 QCOMPARE(model->rowCount(model->index(0, 0)), 0); 0133 QCOMPARE(model->rowCount(model->index(1, 0)), 0); 0134 QCOMPARE(model->rowCount(model->index(2, 0)), 0); 0135 QCOMPARE(model->data(model->index(0, 0)).toString(), QString("Baz Circuit")); 0136 QCOMPARE(model->data(model->index(0, 0), CircuitListModel::FilePathRole).toString(), 0137 storageDir().path() + '/' + "zab.kairo"); 0138 QCOMPARE(model->data(model->index(1, 0)).toString(), QString("Foo Circuit")); 0139 QCOMPARE(model->data(model->index(1, 0), CircuitListModel::FilePathRole).toString(), 0140 storageDir().path() + '/' + "foo.kairo"); 0141 QCOMPARE(model->data(model->index(2, 0)).toString(), QString("ZBar")); 0142 QCOMPARE(model->data(model->index(2, 0), CircuitListModel::FilePathRole).toString(), 0143 storageDir().path() + '/' + "bar.kairo"); 0144 spy->clear(); 0145 0146 // WHEN 0147 deleteFile("foo.kairo"); 0148 0149 // THEN 0150 QCOMPARE(spy->size(), 1); 0151 QCOMPARE(model->path(), storageDir().path()); 0152 QCOMPARE(model->rowCount(), 2); 0153 QCOMPARE(model->rowCount(model->index(0, 0)), 0); 0154 QCOMPARE(model->rowCount(model->index(1, 0)), 0); 0155 QCOMPARE(model->data(model->index(0, 0)).toString(), QString("Baz Circuit")); 0156 QCOMPARE(model->data(model->index(0, 0), CircuitListModel::FilePathRole).toString(), 0157 storageDir().path() + '/' + "zab.kairo"); 0158 QCOMPARE(model->data(model->index(1, 0)).toString(), QString("ZBar")); 0159 QCOMPARE(model->data(model->index(1, 0), CircuitListModel::FilePathRole).toString(), 0160 storageDir().path() + '/' + "bar.kairo"); 0161 spy->clear(); 0162 0163 // WHEN 0164 deleteFile("bar.kairo"); 0165 0166 // THEN 0167 QCOMPARE(spy->size(), 1); 0168 QCOMPARE(model->path(), storageDir().path()); 0169 QCOMPARE(model->rowCount(), 1); 0170 QCOMPARE(model->rowCount(model->index(0, 0)), 0); 0171 QCOMPARE(model->data(model->index(0, 0)).toString(), QString("Baz Circuit")); 0172 QCOMPARE(model->data(model->index(0, 0), CircuitListModel::FilePathRole).toString(), 0173 storageDir().path() + '/' + "zab.kairo"); 0174 spy->clear(); 0175 0176 // WHEN 0177 deleteFile("zab.kairo"); 0178 0179 // THEN 0180 QCOMPARE(spy->size(), 1); 0181 QCOMPARE(model->path(), storageDir().path()); 0182 QCOMPARE(model->rowCount(), 0); 0183 spy->clear(); 0184 } 0185 0186 void shouldLoadCircuits() 0187 { 0188 // GIVEN 0189 auto model = std::make_unique<CircuitListModel>(); 0190 writeInFile("foo.kairo", "---\nname: Foo Circuit\n---\n[{\"text\": \"foo\"},{\"text\": \"foo\", \"duration\": 800}]\n"); 0191 writeInFile("bar.kairo", "---\nname: Bar Circuit\n---\n[{\"text\": \"bar\", \"duration\": 4000},{\"text\": \"bar\"}]\n"); 0192 0193 // WHEN 0194 auto circuit = model->loadCircuit(0); 0195 0196 // THEN 0197 auto expected = CircuitModel{"Bar Circuit",{{"bar", 4000}, {"bar"}}}; 0198 QCOMPARE(circuit, expected); 0199 0200 // WHEN 0201 circuit = model->loadCircuit(1); 0202 0203 // THEN 0204 expected = CircuitModel{"Foo Circuit",{{"foo"}, {"foo", 800}}}; 0205 QCOMPARE(circuit, expected); 0206 } 0207 }; 0208 0209 QTEST_MAIN(CircuitListModelTest) 0210 0211 #include "circuitlistmodeltest.moc"