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