• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# -*- coding: utf-8 -*-
2#                     The LLVM Compiler Infrastructure
3#
4# This file is distributed under the University of Illinois Open Source
5# License. See LICENSE.TXT for details.
6
7import libscanbuild.compilation as sut
8import unittest
9
10
11class CompilerTest(unittest.TestCase):
12
13    def test_is_compiler_call(self):
14        self.assertIsNotNone(sut.compiler_language(['clang']))
15        self.assertIsNotNone(sut.compiler_language(['clang-3.6']))
16        self.assertIsNotNone(sut.compiler_language(['clang++']))
17        self.assertIsNotNone(sut.compiler_language(['clang++-3.5.1']))
18        self.assertIsNotNone(sut.compiler_language(['cc']))
19        self.assertIsNotNone(sut.compiler_language(['c++']))
20        self.assertIsNotNone(sut.compiler_language(['gcc']))
21        self.assertIsNotNone(sut.compiler_language(['g++']))
22        self.assertIsNotNone(sut.compiler_language(['/usr/local/bin/gcc']))
23        self.assertIsNotNone(sut.compiler_language(['/usr/local/bin/g++']))
24        self.assertIsNotNone(sut.compiler_language(['/usr/local/bin/clang']))
25        self.assertIsNotNone(
26            sut.compiler_language(['armv7_neno-linux-gnueabi-g++']))
27
28        self.assertIsNone(sut.compiler_language([]))
29        self.assertIsNone(sut.compiler_language(['']))
30        self.assertIsNone(sut.compiler_language(['ld']))
31        self.assertIsNone(sut.compiler_language(['as']))
32        self.assertIsNone(sut.compiler_language(['/usr/local/bin/compiler']))
33
34
35class SplitTest(unittest.TestCase):
36
37    def test_detect_cxx_from_compiler_name(self):
38        def test(cmd):
39            result = sut.split_command([cmd, '-c', 'src.c'])
40            self.assertIsNotNone(result, "wrong input for test")
41            return result.compiler == 'c++'
42
43        self.assertFalse(test('cc'))
44        self.assertFalse(test('gcc'))
45        self.assertFalse(test('clang'))
46
47        self.assertTrue(test('c++'))
48        self.assertTrue(test('g++'))
49        self.assertTrue(test('g++-5.3.1'))
50        self.assertTrue(test('clang++'))
51        self.assertTrue(test('clang++-3.7.1'))
52        self.assertTrue(test('armv7_neno-linux-gnueabi-g++'))
53
54    def test_action(self):
55        self.assertIsNotNone(sut.split_command(['clang', 'source.c']))
56        self.assertIsNotNone(sut.split_command(['clang', '-c', 'source.c']))
57        self.assertIsNotNone(sut.split_command(['clang', '-c', 'source.c',
58                                                '-MF', 'a.d']))
59
60        self.assertIsNone(sut.split_command(['clang', '-E', 'source.c']))
61        self.assertIsNone(sut.split_command(['clang', '-c', '-E', 'source.c']))
62        self.assertIsNone(sut.split_command(['clang', '-c', '-M', 'source.c']))
63        self.assertIsNone(
64            sut.split_command(['clang', '-c', '-MM', 'source.c']))
65
66    def test_source_file(self):
67        def test(expected, cmd):
68            self.assertEqual(expected, sut.split_command(cmd).files)
69
70        test(['src.c'], ['clang', 'src.c'])
71        test(['src.c'], ['clang', '-c', 'src.c'])
72        test(['src.C'], ['clang', '-x', 'c', 'src.C'])
73        test(['src.cpp'], ['clang++', '-c', 'src.cpp'])
74        test(['s1.c', 's2.c'], ['clang', '-c', 's1.c', 's2.c'])
75        test(['s1.c', 's2.c'], ['cc', 's1.c', 's2.c', '-ldep', '-o', 'a.out'])
76        test(['src.c'], ['clang', '-c', '-I', './include', 'src.c'])
77        test(['src.c'], ['clang', '-c', '-I', '/opt/me/include', 'src.c'])
78        test(['src.c'], ['clang', '-c', '-D', 'config=file.c', 'src.c'])
79
80        self.assertIsNone(
81            sut.split_command(['cc', 'this.o', 'that.o', '-o', 'a.out']))
82        self.assertIsNone(
83            sut.split_command(['cc', 'this.o', '-lthat', '-o', 'a.out']))
84
85    def test_filter_flags(self):
86        def test(expected, flags):
87            command = ['clang', '-c', 'src.c'] + flags
88            self.assertEqual(expected, sut.split_command(command).flags)
89
90        def same(expected):
91            test(expected, expected)
92
93        def filtered(flags):
94            test([], flags)
95
96        same([])
97        same(['-I', '/opt/me/include', '-DNDEBUG', '-ULIMITS'])
98        same(['-O', '-O2'])
99        same(['-m32', '-mmms'])
100        same(['-Wall', '-Wno-unused', '-g', '-funroll-loops'])
101
102        filtered([])
103        filtered(['-lclien', '-L/opt/me/lib', '-L', '/opt/you/lib'])
104        filtered(['-static'])
105        filtered(['-MD', '-MT', 'something'])
106        filtered(['-MMD', '-MF', 'something'])
107
108
109class SourceClassifierTest(unittest.TestCase):
110
111    def test_sources(self):
112        self.assertIsNone(sut.classify_source('file.o'))
113        self.assertIsNone(sut.classify_source('file.exe'))
114        self.assertIsNone(sut.classify_source('/path/file.o'))
115        self.assertIsNone(sut.classify_source('clang'))
116
117        self.assertEqual('c', sut.classify_source('file.c'))
118        self.assertEqual('c', sut.classify_source('./file.c'))
119        self.assertEqual('c', sut.classify_source('/path/file.c'))
120        self.assertEqual('c++', sut.classify_source('file.c', False))
121        self.assertEqual('c++', sut.classify_source('./file.c', False))
122        self.assertEqual('c++', sut.classify_source('/path/file.c', False))
123