#!/usr/bin/env vpython
# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


"""Tests for compile_db."""

import sys
import unittest

import compile_db


# Input compile DB.
_TEST_COMPILE_DB = [
    # Verifies that gomacc.exe is removed.
    {
        'command': r'C:\gomacc.exe C:\clang-cl.exe /blah',
    },
    # Verifies a goma path containing a space.
    {
        'command': r'"C:\Program Files\gomacc.exe" C:\clang-cl.exe /blah',
    },
    # Includes a string define.
    {
        'command': r'clang-cl.exe /blah "-DCR_CLANG_REVISION=\"346388-1\""',
    },
    # Includes a string define with a space in it.
    {
        'command': r'clang-cl.exe /blah -D"MY_DEFINE=\"MY VALUE\""',
    },
]

# Expected compile DB after processing for windows.
_EXPECTED_COMPILE_DB = [
    {
        'command': r'C:\clang-cl.exe --driver-mode=cl /blah',
    },
    {
        'command': r'C:\clang-cl.exe --driver-mode=cl /blah',
    },
    {
        'command': r'clang-cl.exe --driver-mode=cl /blah '
                   r'"-DCR_CLANG_REVISION=\"346388-1\""',
    },
    {
        'command': r'clang-cl.exe --driver-mode=cl /blah '
                   r'-D"MY_DEFINE=\"MY VALUE\""',
    },
]


class CompileDbTest(unittest.TestCase):

  def setUp(self):
    self.maxDiff = None

  def testProcessNotOnWindows(self):
    sys.platform = 'linux2'
    processed_compile_db = compile_db.ProcessCompileDatabase(
        _TEST_COMPILE_DB, [])

    # Assert no changes were made.
    try:
      # assertItemsEqual is renamed assertCountEqual in Python3.
      self.assertCountEqual(processed_compile_db, _TEST_COMPILE_DB)
    except AttributeError:
      self.assertItemsEqual(processed_compile_db, _TEST_COMPILE_DB)

  def testProcessForWindows_HostPlatformBased(self):
    sys.platform = 'win32'
    processed_compile_db = compile_db.ProcessCompileDatabase(
        _TEST_COMPILE_DB, [])

    # Check each entry individually to improve readability of the output.
    for actual, expected in zip(processed_compile_db, _EXPECTED_COMPILE_DB):
      self.assertDictEqual(actual, expected)

  def testProcessForWindows_TargetOsBased(self):
    sys.platform = 'linux2'
    processed_compile_db = compile_db.ProcessCompileDatabase(_TEST_COMPILE_DB,
                                                             [],
                                                             target_os='win')

    # Check each entry individually to improve readability of the output.
    for actual, expected in zip(processed_compile_db, _EXPECTED_COMPILE_DB):
      self.assertDictEqual(actual, expected)

  def testFrontendArgsFiltered(self):
    sys.platform = 'linux2'
    input_db = [{
        'command':
        r'clang -g -Xclang -fuse-ctor-homing -funroll-loops test.cc'
    }]
    self.assertEquals(compile_db.ProcessCompileDatabase(input_db, []),
                      [{
                          'command': r'clang -g -funroll-loops test.cc'
                      }])

  def testGomaccPathFiltered(self):
    sys.platform = 'linux2'
    input_db = [{
        'command':
        r'clang -g --gomacc-path /path/to/gomacc -funroll-loops test.cc'
    }]
    self.assertEquals(compile_db.ProcessCompileDatabase(input_db, []),
                      [{
                          'command': r'clang -g -funroll-loops test.cc'
                      }])

  def testProfileSampleUseFiltered(self):
    sys.platform = 'linux2'
    input_db = [{
        'command':
        r'clang -g -fprofile-sample-use=../path/to.prof -funroll-loops test.cc'
    }]
    self.assertEquals(compile_db.ProcessCompileDatabase(input_db, []),
                      [{
                          'command': r'clang -g -funroll-loops test.cc'
                      }])

  def testFilterArgs(self):
    sys.platform = 'linux2'
    input_db = [{'command': r'clang -g -ffile-compilation-dir=. -O3 test.cc'}]
    self.assertEquals(
        compile_db.ProcessCompileDatabase(
            input_db,
            ['-ffile-compilation-dir=.', '-frandom-flag-that-does-not-exist']),
        [{
            'command': r'clang -g -O3 test.cc'
        }])


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