| # -*- coding: utf-8 -*- |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| import libscanbuild.compilation as sut |
| import unittest |
| |
| |
| class CompilerTest(unittest.TestCase): |
| def test_is_compiler_call(self): |
| self.assertIsNotNone(sut.compiler_language(["clang"])) |
| self.assertIsNotNone(sut.compiler_language(["clang-3.6"])) |
| self.assertIsNotNone(sut.compiler_language(["clang++"])) |
| self.assertIsNotNone(sut.compiler_language(["clang++-3.5.1"])) |
| self.assertIsNotNone(sut.compiler_language(["cc"])) |
| self.assertIsNotNone(sut.compiler_language(["c++"])) |
| self.assertIsNotNone(sut.compiler_language(["gcc"])) |
| self.assertIsNotNone(sut.compiler_language(["g++"])) |
| self.assertIsNotNone(sut.compiler_language(["/usr/local/bin/gcc"])) |
| self.assertIsNotNone(sut.compiler_language(["/usr/local/bin/g++"])) |
| self.assertIsNotNone(sut.compiler_language(["/usr/local/bin/clang"])) |
| self.assertIsNotNone(sut.compiler_language(["armv7_neno-linux-gnueabi-g++"])) |
| |
| self.assertIsNone(sut.compiler_language([])) |
| self.assertIsNone(sut.compiler_language([""])) |
| self.assertIsNone(sut.compiler_language(["ld"])) |
| self.assertIsNone(sut.compiler_language(["as"])) |
| self.assertIsNone(sut.compiler_language(["/usr/local/bin/compiler"])) |
| |
| |
| class SplitTest(unittest.TestCase): |
| def test_detect_cxx_from_compiler_name(self): |
| def test(cmd): |
| result = sut.split_command([cmd, "-c", "src.c"]) |
| self.assertIsNotNone(result, "wrong input for test") |
| return result.compiler == "c++" |
| |
| self.assertFalse(test("cc")) |
| self.assertFalse(test("gcc")) |
| self.assertFalse(test("clang")) |
| |
| self.assertTrue(test("c++")) |
| self.assertTrue(test("g++")) |
| self.assertTrue(test("g++-5.3.1")) |
| self.assertTrue(test("clang++")) |
| self.assertTrue(test("clang++-3.7.1")) |
| self.assertTrue(test("armv7_neno-linux-gnueabi-g++")) |
| |
| def test_action(self): |
| self.assertIsNotNone(sut.split_command(["clang", "source.c"])) |
| self.assertIsNotNone(sut.split_command(["clang", "-c", "source.c"])) |
| self.assertIsNotNone( |
| sut.split_command(["clang", "-c", "source.c", "-MF", "a.d"]) |
| ) |
| |
| self.assertIsNone(sut.split_command(["clang", "-E", "source.c"])) |
| self.assertIsNone(sut.split_command(["clang", "-c", "-E", "source.c"])) |
| self.assertIsNone(sut.split_command(["clang", "-c", "-M", "source.c"])) |
| self.assertIsNone(sut.split_command(["clang", "-c", "-MM", "source.c"])) |
| |
| def test_source_file(self): |
| def test(expected, cmd): |
| self.assertEqual(expected, sut.split_command(cmd).files) |
| |
| test(["src.c"], ["clang", "src.c"]) |
| test(["src.c"], ["clang", "-c", "src.c"]) |
| test(["src.C"], ["clang", "-x", "c", "src.C"]) |
| test(["src.cpp"], ["clang++", "-c", "src.cpp"]) |
| test(["s1.c", "s2.c"], ["clang", "-c", "s1.c", "s2.c"]) |
| test(["s1.c", "s2.c"], ["cc", "s1.c", "s2.c", "-ldep", "-o", "a.out"]) |
| test(["src.c"], ["clang", "-c", "-I", "./include", "src.c"]) |
| test(["src.c"], ["clang", "-c", "-I", "/opt/me/include", "src.c"]) |
| test(["src.c"], ["clang", "-c", "-D", "config=file.c", "src.c"]) |
| |
| self.assertIsNone(sut.split_command(["cc", "this.o", "that.o", "-o", "a.out"])) |
| self.assertIsNone(sut.split_command(["cc", "this.o", "-lthat", "-o", "a.out"])) |
| |
| def test_filter_flags(self): |
| def test(expected, flags): |
| command = ["clang", "-c", "src.c"] + flags |
| self.assertEqual(expected, sut.split_command(command).flags) |
| |
| def same(expected): |
| test(expected, expected) |
| |
| def filtered(flags): |
| test([], flags) |
| |
| same([]) |
| same(["-I", "/opt/me/include", "-DNDEBUG", "-ULIMITS"]) |
| same(["-O", "-O2"]) |
| same(["-m32", "-mmms"]) |
| same(["-Wall", "-Wno-unused", "-g", "-funroll-loops"]) |
| |
| filtered([]) |
| filtered(["-lclien", "-L/opt/me/lib", "-L", "/opt/you/lib"]) |
| filtered(["-static"]) |
| filtered(["-MD", "-MT", "something"]) |
| filtered(["-MMD", "-MF", "something"]) |
| |
| |
| class SourceClassifierTest(unittest.TestCase): |
| def test_sources(self): |
| self.assertIsNone(sut.classify_source("file.o")) |
| self.assertIsNone(sut.classify_source("file.exe")) |
| self.assertIsNone(sut.classify_source("/path/file.o")) |
| self.assertIsNone(sut.classify_source("clang")) |
| |
| self.assertEqual("c", sut.classify_source("file.c")) |
| self.assertEqual("c", sut.classify_source("./file.c")) |
| self.assertEqual("c", sut.classify_source("/path/file.c")) |
| self.assertEqual("c++", sut.classify_source("file.c", False)) |
| self.assertEqual("c++", sut.classify_source("./file.c", False)) |
| self.assertEqual("c++", sut.classify_source("/path/file.c", False)) |