#!/usr/bin/env python2.7

"""Test internal functions within check_cfc.py."""

import check_cfc
import os
import platform
import unittest


class TestCheckCFC(unittest.TestCase):

    def test_flip_dash_g(self):
        self.assertIn('-g', check_cfc.flip_dash_g(['clang', '-c']))
        self.assertNotIn('-g', check_cfc.flip_dash_g(['clang', '-c', '-g']))
        self.assertNotIn(
            '-g', check_cfc.flip_dash_g(['clang', '-g', '-c', '-g']))

    def test_remove_dir_from_path(self):
        bin_path = r'/usr/bin'
        space_path = r'/home/user/space in path'
        superstring_path = r'/usr/bin/local'

        # Test removing last thing in path
        self.assertNotIn(
            bin_path, check_cfc.remove_dir_from_path(bin_path, bin_path))

        # Test removing one entry and leaving others
        # Also tests removing repeated path
        path_var = os.pathsep.join(
            [superstring_path, bin_path, space_path, bin_path])
        stripped_path_var = check_cfc.remove_dir_from_path(path_var, bin_path)
        self.assertIn(superstring_path, stripped_path_var)
        self.assertNotIn(bin_path, stripped_path_var.split(os.pathsep))
        self.assertIn(space_path, stripped_path_var)

        # Test removing non-canonical path
        self.assertNotIn(r'/usr//bin',
                         check_cfc.remove_dir_from_path(r'/usr//bin', bin_path))

        if platform == 'Windows':
            # Windows is case insensitive so should remove a different case
            # path
            self.assertNotIn(
                bin_path, check_cfc.remove_dir_from_path(path_var, r'/USR/BIN'))
        else:
            # Case sensitive so will not remove different case path
            self.assertIn(
                bin_path, check_cfc.remove_dir_from_path(path_var, r'/USR/BIN'))

    def test_is_output_specified(self):
        self.assertTrue(
            check_cfc.is_output_specified(['clang', '-o', 'test.o']))
        self.assertTrue(check_cfc.is_output_specified(['clang', '-otest.o']))
        self.assertFalse(
            check_cfc.is_output_specified(['clang', '-gline-tables-only']))
        # Not specified for implied output file name
        self.assertFalse(check_cfc.is_output_specified(['clang', 'test.c']))

    def test_get_output_file(self):
        self.assertEqual(
            check_cfc.get_output_file(['clang', '-o', 'test.o']), 'test.o')
        self.assertEqual(
            check_cfc.get_output_file(['clang', '-otest.o']), 'test.o')
        self.assertIsNone(
            check_cfc.get_output_file(['clang', '-gline-tables-only']))
        # Can't get output file if more than one input file
        self.assertIsNone(
            check_cfc.get_output_file(['clang', '-c', 'test.cpp', 'test2.cpp']))
        # No output file specified
        self.assertIsNone(check_cfc.get_output_file(['clang', '-c', 'test.c']))

    def test_derive_output_file(self):
        # Test getting implicit output file
        self.assertEqual(
            check_cfc.derive_output_file(['clang', '-c', 'test.c']), 'test.o')
        self.assertEqual(
            check_cfc.derive_output_file(['clang', '-c', 'test.cpp']), 'test.o')
        self.assertIsNone(check_cfc.derive_output_file(['clang', '--version']))

    def test_is_normal_compile(self):
        self.assertTrue(check_cfc.is_normal_compile(
            ['clang', '-c', 'test.cpp', '-o', 'test2.o']))
        self.assertTrue(
            check_cfc.is_normal_compile(['clang', '-c', 'test.cpp']))
        # Outputting bitcode is not a normal compile
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '-flto']))
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '-emit-llvm']))
        # Outputting preprocessed output or assembly is not a normal compile
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-E', 'test.cpp', '-o', 'test.ii']))
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-S', 'test.cpp', '-o', 'test.s']))
        # Input of preprocessed or assembly is not a "normal compile"
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', 'test.s', '-o', 'test.o']))
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', 'test.ii', '-o', 'test.o']))
        # Specifying --version and -c is not a normal compile
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '--version']))
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '--help']))
        # Outputting dependency files is not a normal compile
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', '-M', 'test.cpp']))
        self.assertFalse(
            check_cfc.is_normal_compile(['clang', '-c', '-MM', 'test.cpp']))
        # Creating a dependency file as a side effect still outputs an object file
        self.assertTrue(
            check_cfc.is_normal_compile(['clang', '-c', '-MD', 'test.cpp']))
        self.assertTrue(
            check_cfc.is_normal_compile(['clang', '-c', '-MMD', 'test.cpp']))

    def test_replace_output_file(self):
        self.assertEqual(check_cfc.replace_output_file(
            ['clang', '-o', 'test.o'], 'testg.o'), ['clang', '-o', 'testg.o'])
        self.assertEqual(check_cfc.replace_output_file(
            ['clang', '-otest.o'], 'testg.o'), ['clang', '-otestg.o'])
        with self.assertRaises(Exception):
            check_cfc.replace_output_file(['clang'], 'testg.o')

    def test_add_output_file(self):
        self.assertEqual(check_cfc.add_output_file(
            ['clang'], 'testg.o'), ['clang', '-o', 'testg.o'])

    def test_set_output_file(self):
        # Test output not specified
        self.assertEqual(
            check_cfc.set_output_file(['clang'], 'test.o'), ['clang', '-o', 'test.o'])
        # Test output is specified
        self.assertEqual(check_cfc.set_output_file(
            ['clang', '-o', 'test.o'], 'testb.o'), ['clang', '-o', 'testb.o'])

    def test_get_input_file(self):
        # No input file
        self.assertIsNone(check_cfc.get_input_file(['clang']))
        # Input C file
        self.assertEqual(
            check_cfc.get_input_file(['clang', 'test.c']), 'test.c')
        # Input C++ file
        self.assertEqual(
            check_cfc.get_input_file(['clang', 'test.cpp']), 'test.cpp')
        # Multiple input files
        self.assertIsNone(
            check_cfc.get_input_file(['clang', 'test.c', 'test2.cpp']))
        self.assertIsNone(
            check_cfc.get_input_file(['clang', 'test.c', 'test2.c']))
        # Don't handle preprocessed files
        self.assertIsNone(check_cfc.get_input_file(['clang', 'test.i']))
        self.assertIsNone(check_cfc.get_input_file(['clang', 'test.ii']))
        # Test identifying input file with quotes
        self.assertEqual(
            check_cfc.get_input_file(['clang', '"test.c"']), '"test.c"')
        self.assertEqual(
            check_cfc.get_input_file(['clang', "'test.c'"]), "'test.c'")
        # Test multiple quotes
        self.assertEqual(
            check_cfc.get_input_file(['clang', "\"'test.c'\""]), "\"'test.c'\"")

    def test_set_input_file(self):
        self.assertEqual(check_cfc.set_input_file(
            ['clang', 'test.c'], 'test.s'), ['clang', 'test.s'])

if __name__ == '__main__':
    unittest.main()
