diff options
Diffstat (limited to 'tools/scan-build-py/tests/unit/test_command.py')
-rw-r--r-- | tools/scan-build-py/tests/unit/test_command.py | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/tools/scan-build-py/tests/unit/test_command.py b/tools/scan-build-py/tests/unit/test_command.py new file mode 100644 index 0000000000..9a6aae65c6 --- /dev/null +++ b/tools/scan-build-py/tests/unit/test_command.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. + +import libscanbuild.command as sut +from . import fixtures +import unittest + + +class ParseTest(unittest.TestCase): + + def test_action(self): + def test(expected, cmd): + opts = sut.classify_parameters(cmd) + self.assertEqual(expected, opts['action']) + + Link = sut.Action.Link + test(Link, ['clang', 'source.c']) + + Compile = sut.Action.Compile + test(Compile, ['clang', '-c', 'source.c']) + test(Compile, ['clang', '-c', 'source.c', '-MF', 'source.d']) + + Preprocess = sut.Action.Ignored + test(Preprocess, ['clang', '-E', 'source.c']) + test(Preprocess, ['clang', '-c', '-E', 'source.c']) + test(Preprocess, ['clang', '-c', '-M', 'source.c']) + test(Preprocess, ['clang', '-c', '-MM', 'source.c']) + + def test_optimalizations(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('compile_options', []) + + self.assertEqual(['-O'], test(['clang', '-c', 'source.c', '-O'])) + self.assertEqual(['-O1'], test(['clang', '-c', 'source.c', '-O1'])) + self.assertEqual(['-Os'], test(['clang', '-c', 'source.c', '-Os'])) + self.assertEqual(['-O2'], test(['clang', '-c', 'source.c', '-O2'])) + self.assertEqual(['-O3'], test(['clang', '-c', 'source.c', '-O3'])) + + def test_language(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('language') + + self.assertEqual(None, test(['clang', '-c', 'source.c'])) + self.assertEqual('c', test(['clang', '-c', 'source.c', '-x', 'c'])) + self.assertEqual('cpp', test(['clang', '-c', 'source.c', '-x', 'cpp'])) + + def test_output(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('output') + + self.assertEqual(None, test(['clang', '-c', 'source.c'])) + self.assertEqual('source.o', + test(['clang', '-c', '-o', 'source.o', 'source.c'])) + + def test_arch(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('archs_seen', []) + + eq = self.assertEqual + + eq([], test(['clang', '-c', 'source.c'])) + eq(['mips'], + test(['clang', '-c', 'source.c', '-arch', 'mips'])) + eq(['mips', 'i386'], + test(['clang', '-c', 'source.c', '-arch', 'mips', '-arch', 'i386'])) + + def test_input_file(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('files', []) + + eq = self.assertEqual + + eq(['src.c'], test(['clang', 'src.c'])) + eq(['src.c'], test(['clang', '-c', 'src.c'])) + eq(['s1.c', 's2.c'], test(['clang', '-c', 's1.c', 's2.c'])) + + def test_include(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('compile_options', []) + + eq = self.assertEqual + + eq([], test(['clang', '-c', 'src.c'])) + eq(['-include', '/usr/local/include'], + test(['clang', '-c', 'src.c', '-include', '/usr/local/include'])) + eq(['-I.'], + test(['clang', '-c', 'src.c', '-I.'])) + eq(['-I', '.'], + test(['clang', '-c', 'src.c', '-I', '.'])) + eq(['-I/usr/local/include'], + test(['clang', '-c', 'src.c', '-I/usr/local/include'])) + eq(['-I', '/usr/local/include'], + test(['clang', '-c', 'src.c', '-I', '/usr/local/include'])) + eq(['-I/opt', '-I', '/opt/otp/include'], + test(['clang', '-c', 'src.c', '-I/opt', '-I', '/opt/otp/include'])) + eq(['-isystem', '/path'], + test(['clang', '-c', 'src.c', '-isystem', '/path'])) + eq(['-isystem=/path'], + test(['clang', '-c', 'src.c', '-isystem=/path'])) + + def test_define(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('compile_options', []) + + eq = self.assertEqual + + eq([], test(['clang', '-c', 'src.c'])) + eq(['-DNDEBUG'], + test(['clang', '-c', 'src.c', '-DNDEBUG'])) + eq(['-UNDEBUG'], + test(['clang', '-c', 'src.c', '-UNDEBUG'])) + eq(['-Dvar1=val1', '-Dvar2=val2'], + test(['clang', '-c', 'src.c', '-Dvar1=val1', '-Dvar2=val2'])) + eq(['-Dvar="val ues"'], + test(['clang', '-c', 'src.c', '-Dvar="val ues"'])) + + def test_ignored_flags(self): + def test(flags): + cmd = ['clang', 'src.o'] + opts = sut.classify_parameters(cmd + flags) + self.assertEqual(['src.o'], opts.get('compile_options')) + + test([]) + test(['-lrt', '-L/opt/company/lib']) + test(['-static']) + test(['-Wnoexcept', '-Wall']) + test(['-mtune=i386', '-mcpu=i386']) + + def test_compile_only_flags(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('compile_options', []) + + eq = self.assertEqual + + eq(['-std=C99'], + test(['clang', '-c', 'src.c', '-std=C99'])) + eq(['-nostdinc'], + test(['clang', '-c', 'src.c', '-nostdinc'])) + eq(['-isystem', '/image/debian'], + test(['clang', '-c', 'src.c', '-isystem', '/image/debian'])) + eq(['-iprefix', '/usr/local'], + test(['clang', '-c', 'src.c', '-iprefix', '/usr/local'])) + eq(['-iquote=me'], + test(['clang', '-c', 'src.c', '-iquote=me'])) + eq(['-iquote', 'me'], + test(['clang', '-c', 'src.c', '-iquote', 'me'])) + + def test_compile_and_link_flags(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('compile_options', []) + + eq = self.assertEqual + + eq(['-fsinged-char'], + test(['clang', '-c', 'src.c', '-fsinged-char'])) + eq(['-fPIC'], + test(['clang', '-c', 'src.c', '-fPIC'])) + eq(['-stdlib=libc++'], + test(['clang', '-c', 'src.c', '-stdlib=libc++'])) + eq(['--sysroot', '/'], + test(['clang', '-c', 'src.c', '--sysroot', '/'])) + eq(['-isysroot', '/'], + test(['clang', '-c', 'src.c', '-isysroot', '/'])) + eq([], + test(['clang', '-c', 'src.c', '-fsyntax-only'])) + eq([], + test(['clang', '-c', 'src.c', '-sectorder', 'a', 'b', 'c'])) + + def test_detect_cxx_from_compiler_name(self): + def test(cmd): + opts = sut.classify_parameters(cmd) + return opts.get('c++') + + eq = self.assertEqual + + eq(False, test(['cc', '-c', 'src.c'])) + eq(True, test(['c++', '-c', 'src.c'])) + eq(False, test(['clang', '-c', 'src.c'])) + eq(True, test(['clang++', '-c', 'src.c'])) + eq(False, test(['gcc', '-c', 'src.c'])) + eq(True, test(['g++', '-c', 'src.c'])) |