1 /*!
2  * \copyright Copyright (c) 2018-2021 Governikus GmbH & Co. KG, Germany
3  */
4 
5 #include "ResourceLoader.h"
6 
7 #include <QDirIterator>
8 #include <QFileInfo>
9 #include <QtTest>
10 
11 using namespace governikus;
12 
13 class test_QmlFileStructure
14 	: public QObject
15 {
16 	Q_OBJECT
17 
18 	private:
19 		QStringList mQmlFiles;
20 
21 	private Q_SLOTS:
initTestCase()22 		void initTestCase()
23 		{
24 			ResourceLoader::getInstance().init();
25 
26 			QDirIterator iterator(QStringLiteral(":"), {QStringLiteral("*.qml")}, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
27 			while (iterator.hasNext())
28 			{
29 				const auto& file = iterator.next();
30 				if (!file.endsWith(QStringLiteral("main.qml")))
31 				{
32 					mQmlFiles += file;
33 				}
34 			}
35 		}
36 
37 
qmlFileStructureIsSane_data()38 		void qmlFileStructureIsSane_data()
39 		{
40 			QTest::addColumn<QFileInfo>("qmlFile");
41 
42 			for (const QString& file : qAsConst(mQmlFiles))
43 			{
44 				const QFileInfo info(file);
45 				QTest::newRow(info.fileName().toLatin1().data()) << info;
46 			}
47 		}
48 
49 
qmlFileStructureIsSane()50 		void qmlFileStructureIsSane()
51 		{
52 			QFETCH(QFileInfo, qmlFile);
53 
54 			QDir dir = qmlFile.dir();
55 			while (dir.dirName().startsWith(QChar('+')))
56 			{
57 				dir.cdUp();
58 				const QString fileInParentFolder = dir.path() + QDir::separator() + qmlFile.fileName();
59 				QVERIFY(!mQmlFiles.contains(fileInParentFolder));
60 			}
61 		}
62 
63 
avoidMultipleDeviceFiles_data()64 		void avoidMultipleDeviceFiles_data()
65 		{
66 			QTest::addColumn<QFileInfo>("qmlFile");
67 
68 			for (const QString& file : qAsConst(mQmlFiles))
69 			{
70 				if (file.contains(QLatin1String("+phone")) || file.contains(QLatin1String("+tablet")))
71 				{
72 					const QFileInfo info(file);
73 					QTest::newRow(info.fileName().toLatin1().data()) << info;
74 				}
75 			}
76 		}
77 
78 
avoidMultipleDeviceFiles()79 		void avoidMultipleDeviceFiles()
80 		{
81 			QFETCH(QFileInfo, qmlFile);
82 
83 			QDir dir = qmlFile.dir();
84 			const auto& device = dir.dirName();
85 			dir.cdUp();
86 
87 			const auto& parentFolder = dir.dirName();
88 			if (parentFolder == QLatin1String("+android") || parentFolder == QLatin1String("+ios"))
89 			{
90 				dir.cdUp();
91 				dir.cd(device);
92 				const QString fileInParentFolder = dir.path() + QDir::separator() + qmlFile.fileName();
93 				QVERIFY(!mQmlFiles.contains(fileInParentFolder));
94 				return;
95 			}
96 
97 			const QString file = QDir::separator() + device + QDir::separator() + qmlFile.fileName();
98 			QVERIFY(!mQmlFiles.contains(dir.path() + QDir::separator() + QStringLiteral("+android") + file));
99 			QVERIFY(!mQmlFiles.contains(dir.path() + QDir::separator() + QStringLiteral("+ios") + file));
100 		}
101 
102 
103 };
104 
105 QTEST_GUILESS_MAIN(test_QmlFileStructure)
106 #include "test_QmlFileStructure.moc"
107