# -*- 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))