1 /*
2 SPDX-FileCopyrightText: 2014 Sergey Kalinichev <kalinichev.so.0@gmail.com>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7 #include "test_custommake.h"
8
9 #include <QFile>
10 #include <QTextStream>
11 #include <QDebug>
12 #include <QTemporaryDir>
13
14 #include <tests/autotestshell.h>
15 #include <tests/testcore.h>
16
17 #include "../makefileresolver.h"
18
19 #include <QTest>
20
21 using namespace KDevelop;
22
23 namespace {
createFile(QFile & file)24 void createFile( QFile& file )
25 {
26 file.remove();
27 if ( !file.open( QIODevice::ReadWrite ) ) {
28 qFatal("Cannot create the file %s", file.fileName().toUtf8().data());
29 }
30 }
31 }
32
initTestCase()33 void TestCustomMake::initTestCase()
34 {
35 AutoTestShell::init();
36 TestCore::initialize(Core::NoUi);
37 }
38
cleanupTestCase()39 void TestCustomMake::cleanupTestCase()
40 {
41 TestCore::shutdown();
42 }
43
testIncludeDirectories()44 void TestCustomMake::testIncludeDirectories()
45 {
46 QTemporaryDir tempDir;
47 {
48 QFile file( tempDir.path() + "/Makefile" );
49 createFile( file );
50 QFile testfile( tempDir.path() + "/testfile.cpp" );
51 createFile(testfile);
52 QTextStream stream1( &file );
53 stream1 << "testfile.o:\n\t g++ testfile.cpp -I/testFile1 -I /testFile2 -isystem /testFile3 --include-dir=/testFile4 -o testfile";
54 }
55
56 MakeFileResolver mf;
57 auto result = mf.resolveIncludePath(tempDir.path() + "/testfile.cpp");
58 if (!result.success) {
59 qDebug() << result.errorMessage << result.longErrorMessage;
60 QFAIL("Failed to resolve include path.");
61 }
62 QCOMPARE(result.paths.size(), 4);
63 QVERIFY(result.paths.contains(Path("/testFile1")));
64 QVERIFY(result.paths.contains(Path("/testFile2")));
65 QVERIFY(result.paths.contains(Path("/testFile3")));
66 QVERIFY(result.paths.contains(Path("/testFile4")));
67 }
68
testFrameworkDirectories()69 void TestCustomMake::testFrameworkDirectories()
70 {
71 QTemporaryDir tempDir;
72 int expectedPaths = 2;
73 {
74 QFile file( tempDir.path() + "/Makefile" );
75 createFile( file );
76 QFile testfile( tempDir.path() + "/testfile.cpp" );
77 createFile(testfile);
78 QTextStream stream1( &file );
79 stream1 << "testfile.o:\n\t clang++ testfile.cpp -iframework /System/Library/Frameworks -F/Library/Frameworks -o testfile";
80 }
81
82 MakeFileResolver mf;
83 auto result = mf.resolveIncludePath(tempDir.path() + "/testfile.cpp");
84 if (!result.success) {
85 qDebug() << result.errorMessage << result.longErrorMessage;
86 QFAIL("Failed to resolve include path.");
87 }
88 QCOMPARE(result.frameworkDirectories.size(), expectedPaths);
89 QVERIFY(result.frameworkDirectories.contains(Path("/System/Library/Frameworks")));
90 QVERIFY(result.frameworkDirectories.contains(Path("/Library/Frameworks")));
91 }
92
testDefines()93 void TestCustomMake::testDefines()
94 {
95 MakeFileResolver mf;
96 const auto result = mf.processOutput("-DFOO -DFOO=\\\"foo\\\" -DBAR=ASDF -DLALA=1 -DMEH="
97 " -DSTR=\"\\\"foo \\\\\\\" bar\\\"\" -DEND"
98 " -DX=1 -UX", QString());
99 QCOMPARE(result.defines.value("FOO", "not found"), QString("\"foo\""));
100 QCOMPARE(result.defines.value("BAR", "not found"), QString("ASDF"));
101 QCOMPARE(result.defines.value("LALA", "not found"), QString("1"));
102 QCOMPARE(result.defines.value("MEH", "not found"), QString());
103 QCOMPARE(result.defines.value("STR", "not found"), QString("\"foo \\\" bar\""));
104 QCOMPARE(result.defines.value("END", "not found"), QString());
105 QCOMPARE(result.defines.value("X", "not found"), QString("not found"));
106 }
107
108 QTEST_GUILESS_MAIN(TestCustomMake)
109
110 #include "moc_test_custommake.cpp"
111