# Copyright 2022 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Tests for pw_ide.cpp"""

import json
from pathlib import Path
from typing import cast, Dict, List, Optional, Tuple, TypedDict, Union
import unittest
from unittest.mock import ANY, Mock, patch

# pylint: disable=protected-access
from pw_ide.cpp import (
    _COMPDB_FILE_PREFIX,
    _COMPDB_FILE_SEPARATOR,
    _COMPDB_FILE_EXTENSION,
    _COMPDB_CACHE_DIR_PREFIX,
    _COMPDB_CACHE_DIR_SEPARATOR,
    path_to_executable,
    aggregate_compilation_database_targets,
    compdb_generate_cache_path,
    compdb_generate_file_path,
    compdb_target_from_path,
    CppCompilationDatabase,
    CppCompilationDatabasesMap,
    CppCompileCommand,
    CppCompileCommandDict,
    CppIdeFeaturesState,
    infer_target,
    _infer_target_pos,
    InvalidTargetException,
)

from pw_ide.exceptions import UnresolvablePathException
from pw_ide.symlinks import set_symlink

from test_cases import PwIdeTestCase


class TestCompDbGenerateFilePath(unittest.TestCase):
    """Tests compdb_generate_file_path"""
    def test_with_target_includes_target(self) -> None:
        name = 'foo'
        actual = str(compdb_generate_file_path('foo'))
        expected = (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}'
                    f'{name}{_COMPDB_FILE_EXTENSION}')
        self.assertEqual(actual, expected)

    def test_without_target_omits_target(self) -> None:
        actual = str(compdb_generate_file_path())
        expected = f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_EXTENSION}'
        self.assertEqual(actual, expected)


class TestCompDbGenerateCachePath(unittest.TestCase):
    """Tests compdb_generate_cache_path"""
    def test_with_target_includes_target(self) -> None:
        name = 'foo'
        actual = str(compdb_generate_cache_path('foo'))
        expected = (f'{_COMPDB_CACHE_DIR_PREFIX}'
                    f'{_COMPDB_CACHE_DIR_SEPARATOR}{name}')
        self.assertEqual(actual, expected)

    def test_without_target_omits_target(self) -> None:
        actual = str(compdb_generate_cache_path())
        expected = f'{_COMPDB_CACHE_DIR_PREFIX}'
        self.assertEqual(actual, expected)


class _CompDbTargetFromPathTestCase(TypedDict):
    path: str
    target: Optional[str]


class TestCompDbTargetFromPath(unittest.TestCase):
    """Tests compdb_target_from_path"""
    def run_test(self, path: Path, expected_target: Optional[str]) -> None:
        target = compdb_target_from_path(path)
        self.assertEqual(target, expected_target)

    def test_correct_target_from_path(self) -> None:
        """Test that the expected target is extracted from the file path."""
        cases: List[_CompDbTargetFromPathTestCase] = [
            {
                'path':
                (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}'
                 f'pw_strict_host_clang_debug{_COMPDB_FILE_EXTENSION}'),
                'target':
                'pw_strict_host_clang_debug'
            },
            {
                'path': (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}'
                         f'stm32f429i_disc1_debug{_COMPDB_FILE_EXTENSION}'),
                'target':
                'stm32f429i_disc1_debug'
            },
            {
                'path': (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}'
                         f'{_COMPDB_FILE_EXTENSION}'),
                'target':
                None
            },
            {
                'path': 'foompile_barmmands.json',
                'target': None
            },
            {
                'path': 'foompile_barmmands_target_x.json',
                'target': None
            },
            {
                'path': '',
                'target': None
            },
        ]

        for case in cases:
            self.run_test(Path(case['path']), case['target'])


class TestPathToExecutable(PwIdeTestCase):
    """Tests path_to_executable"""
    def test_valid_absolute_path_in_env_returns_same_path(self):
        executable_path = self.temp_dir_path / 'clang'
        query_drivers = [f'{self.temp_dir_path}/*']
        result = path_to_executable(str(executable_path.absolute()),
                                    path_globs=query_drivers)
        self.assertIsNotNone(result)
        self.assertEqual(str(result), str(executable_path.absolute()))

    def test_valid_absolute_path_outside_env_returns_same_path(self):
        executable_path = Path('/usr/bin/clang')
        query_drivers = ['/**/*']
        result = path_to_executable(str(executable_path.absolute()),
                                    path_globs=query_drivers)
        self.assertIsNotNone(result)
        self.assertEqual(str(result), str(executable_path.absolute()))

    def test_valid_relative_path_returns_same_path(self):
        executable_path = Path('../clang')
        query_drivers = [f'{self.temp_dir_path}/*']
        result = path_to_executable(str(executable_path),
                                    path_globs=query_drivers)
        self.assertIsNotNone(result)
        self.assertEqual(str(result), str(executable_path))

    def test_valid_no_path_returns_new_path(self):
        executable_path = Path('clang')
        query_drivers = [f'{self.temp_dir_path}/*']
        expected_path = self.temp_dir_path / executable_path
        self.touch_temp_file(expected_path)
        result = path_to_executable(str(executable_path),
                                    path_globs=query_drivers)
        self.assertIsNotNone(result)
        self.assertEqual(str(result), str(expected_path))

    def test_invalid_absolute_path_in_env_returns_same_path(self):
        executable_path = self.temp_dir_path / 'exe'
        query_drivers = [f'{self.temp_dir_path}/*']
        result = path_to_executable(str(executable_path.absolute()),
                                    path_globs=query_drivers)
        self.assertIsNone(result)

    def test_invalid_absolute_path_outside_env_returns_same_path(self):
        executable_path = Path('/usr/bin/exe')
        query_drivers = ['/**/*']
        result = path_to_executable(str(executable_path.absolute()),
                                    path_globs=query_drivers)
        self.assertIsNone(result)

    def test_invalid_relative_path_returns_same_path(self):
        executable_path = Path('../exe')
        query_drivers = [f'{self.temp_dir_path}/*']
        result = path_to_executable(str(executable_path),
                                    path_globs=query_drivers)
        self.assertIsNone(result)

    def test_invalid_no_path_returns_new_path(self):
        executable_path = Path('exe')
        query_drivers = [f'{self.temp_dir_path}/*']
        expected_path = self.temp_dir_path / executable_path
        self.touch_temp_file(expected_path)
        result = path_to_executable(str(executable_path),
                                    path_globs=query_drivers)
        self.assertIsNone(result)


class TestInferTarget(unittest.TestCase):
    """Tests infer_target"""
    def test_infer_target_pos(self):
        test_cases = [('?', [0]), ('*/?', [1]), ('*/*/?', [2]),
                      ('*/?/?', [1, 2])]

        for glob, result in test_cases:
            self.assertEqual(_infer_target_pos(glob), result)

    def test_infer_target(self):
        test_cases = [
            ('?', 'target/thing.o', 'target'),
            ('*/?', 'variants/target/foo/bar/thing.o', 'target'),
            ('*/*/*/*/?', 'foo/bar/baz/hi/target/obj/thing.o', 'target'),
            ('*/?/?', 'variants/target/foo/bar/thing.o', 'target_foo')
        ]

        for glob, output_path, result in test_cases:
            self.assertEqual(infer_target(glob, Path(''), Path(output_path)),
                             result)


class TestCppCompileCommand(PwIdeTestCase):
    """Tests CppCompileCommand"""
    def run_process_test_with_valid_commands(
            self, command: str, expected_executable: Optional[str]) -> None:
        compile_command = CppCompileCommand(command=command,
                                            file='',
                                            directory='')
        processed_compile_command = cast(
            CppCompileCommand,
            compile_command.process(default_path=self.temp_dir_path))
        self.assertIsNotNone(processed_compile_command)
        self.assertEqual(processed_compile_command.executable_name,
                         expected_executable)

    def run_process_test_with_invalid_commands(self, command: str) -> None:
        compile_command = CppCompileCommand(command=command,
                                            file='',
                                            directory='')

        with self.assertRaises(UnresolvablePathException):
            compile_command.process(default_path=self.temp_dir_path)

    def test_process_valid_with_gn_compile_command(self) -> None:
        """Test output against typical GN-generated compile commands."""

        cases: List[Dict[str, str]] = [
            {
                # pylint: disable=line-too-long
                'command':
                'arm-none-eabi-g++ -MMD -MF  stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d  -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_ARMV7M_ENABLE_FPU=1  -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o  stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'executable': 'arm-none-eabi-g++',
            },
            {
                # pylint: disable=line-too-long
                'command':
                '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF  pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d  -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o  pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'executable': 'clang++',
            },
        ]

        for case in cases:
            self.run_process_test_with_valid_commands(case['command'],
                                                      case['executable'])

    def test_process_invalid_with_gn_compile_command(self) -> None:
        """Test output against typical GN-generated compile commands."""

        # pylint: disable=line-too-long
        command = "python ../pw_toolchain/py/pw_toolchain/clang_tidy.py  --source-exclude 'third_party/.*' --source-exclude '.*packages/mbedtls.*' --source-exclude '.*packages/boringssl.*'  --skip-include-path 'mbedtls/include' --skip-include-path 'mbedtls' --skip-include-path 'boringssl/src/include' --skip-include-path 'boringssl' --skip-include-path 'pw_tls_client/generate_test_data' --source-file ../pw_allocator/freelist.cc --source-root '../' --export-fixes  pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o.yaml -- ../environment/cipd/packages/pigweed/bin/clang++ END_OF_INVOKER -MMD -MF  pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o.d  -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_containers/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/freelist.cc -o  pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o && touch  pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/freelist.freelist.cc.o"
        # pylint: enable=line-too-long

        compile_command = CppCompileCommand(command=command,
                                            file='',
                                            directory='')
        self.assertIsNone(
            compile_command.process(default_path=self.temp_dir_path))

    def test_process_unresolvable_with_gn_compile_command(self) -> None:
        """Test output against typical GN-generated compile commands."""

        # pylint: disable=line-too-long
        command = 'clang++ -MMD -MF  pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d  -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o  pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o'
        # pylint: enable=line-too-long

        compile_command = CppCompileCommand(command=command,
                                            file='',
                                            directory='')

        processed_compile_command = cast(CppCompileCommand,
                                         compile_command.process())
        self.assertIsNotNone(processed_compile_command)
        self.assertIsNotNone(processed_compile_command.command)
        # .split() to avoid failing on whitespace differences.
        self.assertCountEqual(
            cast(str, processed_compile_command.command).split(),
            command.split())

    def test_process_unresolvable_strict_with_gn_compile_command(self) -> None:
        """Test output against typical GN-generated compile commands."""

        # pylint: disable=line-too-long
        command = 'clang++ -MMD -MF  pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d  -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o  pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o'
        # pylint: enable=line-too-long

        compile_command = CppCompileCommand(command=command,
                                            file='',
                                            directory='')

        with self.assertRaises(UnresolvablePathException):
            compile_command.process(strict=True)

    def test_process_blank_with_gn_compile_command(self) -> None:
        """Test output against typical GN-generated compile commands."""

        command = ''
        compile_command = CppCompileCommand(command=command,
                                            file='',
                                            directory='')

        result = compile_command.process(default_path=self.temp_dir_path)
        self.assertIsNone(result)


class TestCppCompilationDatabase(PwIdeTestCase):
    """Tests CppCompilationDatabase"""
    def setUp(self):
        self.build_dir = Path('/pigweed/pigweed/out')

        self.fixture: List[CppCompileCommandDict] = [
            {
                # pylint: disable=line-too-long
                'command':
                'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'directory': '/pigweed/pigweed/out',
                'file': '../pw_allocator/block.cc',
            },
            {
                # pylint: disable=line-too-long
                'command':
                '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'directory': '/pigweed/pigweed/out',
                'file': '../pw_allocator/block.cc',
            },
        ]

        self.expected: List[CppCompileCommandDict] = [
            {
                **self.fixture[0],
                # pylint: disable=line-too-long
                'output':
                'stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
            },
            {
                **self.fixture[1],
                # pylint: disable=line-too-long
                'output':
                'pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
            },
        ]

        self.fixture_merge_1 = [
            {
                # pylint: disable=line-too-long
                'command':
                'g++ -MMD -MF  pw_strict_host_gcc_debug/obj/pw_allocator/block.block.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o  pw_strict_host_gcc_debug/obj/pw_allocator/block.block.cc.o',
                'directory':
                '/pigweed/pigweed/out',
                'file':
                '../pw_allocator/block.cc',
                'output':
                'pw_strict_host_gcc_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
            },
            {
                # pylint: disable=line-too-long
                'command':
                'g++ -MMD -MF  pw_strict_host_gcc_debug/obj/pw_allocator/freelist.freelist.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=//pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_containers/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_span/public -I../pw_status/public -c ../pw_allocator/freelist.cc -o  pw_strict_host_gcc_debug/obj/pw_allocator/freelist.freelist.cc.o',
                'directory':
                '/pigweed/pigweed/out',
                'file':
                '../pw_allocator/freelist.cc',
                'output':
                'pw_strict_host_gcc_debug/obj/pw_allocator/freelist.freelist.cc.o',
                # pylint: enable=line-too-long
            },
        ]

        self.fixture_merge_2 = [
            {
                # pylint: disable=line-too-long
                'command':
                'g++ -MMD -MF  pw_strict_host_gcc_debug/obj/pw_base64/pw_base64.base64.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true  -I../pw_base64/public -I../pw_string/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_span/public -c ../pw_base64/base64.cc -o  pw_strict_host_gcc_debug/obj/pw_base64/pw_base64.base64.cc.o',
                'directory':
                '/pigweed/pigweed/out',
                'file':
                '../pw_base64/base64.cc',
                'output':
                'pw_strict_host_gcc_debug/obj/pw_base64/pw_base64.base64.cc.o',
                # pylint: enable=line-too-long
            },
            {
                # pylint: disable=line-too-long
                'command':
                'g++ -MMD -MF  pw_strict_host_gcc_debug/obj/pw_checksum/pw_checksum.crc32.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_checksum/public -I../pw_bytes/public -I../pw_containers/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_preprocessor/public -I../pw_span/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_status/public -c ../pw_checksum/crc32.cc -o  pw_strict_host_gcc_debug/obj/pw_checksum/pw_checksum.crc32.cc.o',
                'directory':
                'pigweed/pigweed/out',
                'file':
                '../pw_checksum/crc32.cc',
                'output':
                'pw_strict_host_gcc_debug/obj/pw_checksum/pw_checksum.crc32.cc.o',
                # pylint: enable=line-too-long
            },
        ]

        return super().setUp()

    def test_merge(self):
        compdb1 = CppCompilationDatabase.load(self.fixture_merge_1,
                                              self.build_dir)
        compdb2 = CppCompilationDatabase.load(self.fixture_merge_2,
                                              self.build_dir)
        compdb1.merge(compdb2)
        result = [compile_command.as_dict() for compile_command in compdb1]
        expected = [*self.fixture_merge_1, *self.fixture_merge_2]
        self.assertCountEqual(result, expected)

    def test_merge_no_dupes(self):
        compdb1 = CppCompilationDatabase.load(self.fixture_merge_1,
                                              self.build_dir)
        fixture_combo = [*self.fixture_merge_1, *self.fixture_merge_2]
        compdb2 = CppCompilationDatabase.load(fixture_combo, self.build_dir)
        compdb1.merge(compdb2)
        result = [compile_command.as_dict() for compile_command in compdb1]
        expected = [*self.fixture_merge_1, *self.fixture_merge_2]
        self.assertCountEqual(result, expected)

    def test_load_from_dicts(self):
        compdb = CppCompilationDatabase.load(self.fixture, self.build_dir)
        self.assertCountEqual(compdb.as_dicts(), self.expected)

    def test_load_from_json(self):
        compdb = CppCompilationDatabase.load(json.dumps(self.fixture),
                                             self.build_dir)
        self.assertCountEqual(compdb.as_dicts(), self.expected)

    def test_load_from_path(self):
        with self.make_temp_file(
                f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_EXTENSION}',
                json.dumps(self.fixture)) as (_, file_path):
            path = file_path

        compdb = CppCompilationDatabase.load(path, self.build_dir)
        self.assertCountEqual(compdb.as_dicts(), self.expected)

    def test_load_from_file_handle(self):
        with self.make_temp_file(
                f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_EXTENSION}',
                json.dumps(self.fixture)) as (file, _):
            compdb = CppCompilationDatabase.load(file, self.build_dir)

        self.assertCountEqual(compdb.as_dicts(), self.expected)

    def test_process(self):
        """Test processing against a typical sample of raw output from GN."""

        targets = [
            'pw_strict_host_clang_debug',
            'stm32f429i_disc1_debug',
            'isosceles_debug',
        ]

        settings = self.make_ide_settings(targets=targets)

        raw_db: List[CppCompileCommandDict] = [
            {
                # pylint: disable=line-too-long
                'command':
                'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1  -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'directory': str(self.build_dir),
                'file': '../pw_allocator/block.cc'
            },
            {
                # pylint: disable=line-too-long
                'command':
                '../environment/cipd/packages/pigweed/bin/isosceles-clang++ -MMD -MF isosceles_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o isosceles_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'directory': str(self.build_dir),
                'file': '../pw_allocator/block.cc'
            },
            {
                # pylint: disable=line-too-long
                'command':
                '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o  pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'directory': str(self.build_dir),
                'file': '../pw_allocator/block.cc'
            },
            {
                # pylint: disable=line-too-long
                'command':
                "python ../pw_toolchain/py/pw_toolchain/clang_tidy.py --source-exclude 'third_party/.*' --source-exclude '.*packages/mbedtls.*' --source-exclude '.*packages/boringssl.*' --skip-include-path 'mbedtls/include' --skip-include-path 'mbedtls' --skip-include-path 'boringssl/src/include' --skip-include-path 'boringssl' --skip-include-path 'pw_tls_client/generate_test_data' --source-file ../pw_allocator/block.cc --source-root '../' --export-fixes  pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.yaml -- ../environment/cipd/packages/pigweed/bin/clang++ END_OF_INVOKER -MMD -MF pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o && touch pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o",
                # pylint: enable=line-too-long
                'directory': str(self.build_dir),
                'file': '../pw_allocator/block.cc',
            },
        ]

        expected_compdbs = {
            'isosceles_debug': [
                {
                    # pylint: disable=line-too-long
                    'command':
                    # Ensures path format matches OS (e.g. Windows)
                    f'{Path("../environment/cipd/packages/pigweed/bin/isosceles-clang++")} -MMD -MF isosceles_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o isosceles_debug/obj/pw_allocator/block.block.cc.o',
                    # pylint: enable=line-too-long
                    'directory': str(self.build_dir),
                    'file': '../pw_allocator/block.cc',
                    'output':
                    'isosceles_debug/obj/pw_allocator/block.block.cc.o',
                },
            ],
            'pw_strict_host_clang_debug': [
                {
                    # pylint: disable=line-too-long
                    'command':
                    # Ensures path format matches OS (e.g. Windows)
                    f'{Path("../environment/cipd/packages/pigweed/bin/clang++")} -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o',
                    # pylint: enable=line-too-long
                    'directory':
                    str(self.build_dir),
                    'file':
                    '../pw_allocator/block.cc',
                    # pylint: disable=line-too-long
                    'output':
                    'pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o',
                    # pylint: enable=line-too-long
                },
            ],
            'stm32f429i_disc1_debug': [
                {
                    # pylint: disable=line-too-long
                    'command':
                    # Ensures this test avoids the unpathed compiler search
                    f'{self.temp_dir_path / "arm-none-eabi-g++"} -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o',
                    # pylint: enable=line-too-long
                    'directory':
                    str(self.build_dir),
                    'file':
                    '../pw_allocator/block.cc',
                    'output':
                    'stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o',
                },
            ],
        }

        compdbs = CppCompilationDatabase.load(
            raw_db,
            build_dir=self.build_dir).process(settings,
                                              default_path=self.temp_dir_path)
        compdbs_as_dicts = {
            target: compdb.as_dicts()
            for target, compdb in compdbs.items()
        }

        self.assertCountEqual(list(compdbs_as_dicts.keys()),
                              list(expected_compdbs.keys()))
        self.assertDictEqual(compdbs_as_dicts, expected_compdbs)


class TestCppCompilationDatabasesMap(PwIdeTestCase):
    """Tests CppCompilationDatabasesMap"""
    def setUp(self):
        self.fixture_1 = lambda target: [
            CppCompileCommand(
                **{
                    # pylint: disable=line-too-long
                    'command':
                    f'g++ -MMD -MF  {target}/obj/pw_allocator/block.block.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o  pw_strict_host_gcc_debug/obj/pw_allocator/block.block.cc.o',
                    # pylint: enable=line-too-long
                    'directory': '/pigweed/pigweed/out',
                    'file': '../pw_allocator/block.cc'
                }),
            CppCompileCommand(
                **{
                    # pylint: disable=line-too-long
                    'command':
                    f'g++ -MMD -MF  {target}/obj/pw_allocator/freelist.freelist.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=//pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_allocator/public -I../pw_containers/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_span/public -I../pw_status/public -c ../pw_allocator/freelist.cc -o  pw_strict_host_gcc_debug/obj/pw_allocator/freelist.freelist.cc.o',
                    # pylint: enable=line-too-long
                    'directory': '/pigweed/pigweed/out',
                    'file': '../pw_allocator/freelist.cc'
                }),
        ]

        self.fixture_2 = lambda target: [
            CppCompileCommand(
                **{
                    # pylint: disable=line-too-long
                    'command':
                    f'g++ -MMD -MF  {target}/obj/pw_base64/pw_base64.base64.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true  -I../pw_base64/public -I../pw_string/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_span/public -c ../pw_base64/base64.cc -o  pw_strict_host_gcc_debug/obj/pw_base64/pw_base64.base64.cc.o',
                    # pylint: enable=line-too-long
                    'directory': '/pigweed/pigweed/out',
                    'file': '../pw_base64/base64.cc'
                }),
            CppCompileCommand(
                **{
                    # pylint: disable=line-too-long
                    'command':
                    f'g++ -MMD -MF  {target}/obj/pw_checksum/pw_checksum.crc32.cc.o.d  -Wno-psabi -Og -Wshadow -Wredundant-decls -Wswitch-enum -Wpedantic -Wno-c++20-designator -Wno-gnu-zero-variadic-macro-arguments -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out  -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register  -DPW_SPAN_ENABLE_ASSERTS=true -DPW_STATUS_CFG_CHECK_IF_USED=1  -I../pw_checksum/public -I../pw_bytes/public -I../pw_containers/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_preprocessor/public -I../pw_span/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_status/public -c ../pw_checksum/crc32.cc -o  pw_strict_host_gcc_debug/obj/pw_checksum/pw_checksum.crc32.cc.o',
                    # pylint: enable=line-too-long
                    'directory': 'pigweed/pigweed/out',
                    'file': '../pw_checksum/crc32.cc'
                }),
        ]
        super().setUp()

    def test_merge_0_db_set(self):
        with self.assertRaises(ValueError):
            CppCompilationDatabasesMap.merge()

    def test_merge_1_db_set(self):
        settings = self.make_ide_settings()
        target = 'test_target'
        db_set = CppCompilationDatabasesMap(settings)
        db_set[target] = self.fixture_1(target)
        result = CppCompilationDatabasesMap.merge(db_set)
        self.assertCountEqual(result._dbs, db_set._dbs)

    def test_merge_2_db_sets_different_targets(self):
        settings = self.make_ide_settings()
        target1 = 'test_target_1'
        target2 = 'test_target_2'
        db_set1 = CppCompilationDatabasesMap(settings)
        db_set1[target1] = self.fixture_1(target1)
        db_set2 = CppCompilationDatabasesMap(settings)
        db_set2[target2] = self.fixture_2(target2)
        result = CppCompilationDatabasesMap.merge(db_set1, db_set2)
        self.assertEqual(len(result), 2)
        self.assertCountEqual(result._dbs, {**db_set1._dbs, **db_set2._dbs})

    def test_merge_2_db_sets_duplicated_targets(self):
        settings = self.make_ide_settings()
        target1 = 'test_target_1'
        target2 = 'test_target_2'
        db_set1 = CppCompilationDatabasesMap(settings)
        db_set1[target1] = self.fixture_1(target1)
        db_set2 = CppCompilationDatabasesMap(settings)
        db_set2[target2] = self.fixture_2(target2)
        db_set_combo = CppCompilationDatabasesMap.merge(db_set1, db_set2)
        result = CppCompilationDatabasesMap.merge(db_set1, db_set_combo)
        self.assertEqual(len(result), 2)
        self.assertCountEqual(result._dbs, {**db_set1._dbs, **db_set2._dbs})


class TestCppIdeFeaturesState(PwIdeTestCase):
    """Tests CppIdeFeaturesState"""
    def test_finds_all_compdbs(self) -> None:
        """Test that it finds all compilation databases on initalization."""

        targets = [
            'pw_strict_host_clang_debug',
            'stm32f429i_disc1_debug',
        ]

        # Simulate a dir with n compilation databases and m < n cache dirs.
        files_data: List[Tuple[Union[Path, str], str]] = \
            [(compdb_generate_file_path(target), '') for target in targets]

        files_data.append((compdb_generate_cache_path(targets[0]), ''))

        # Symlinks
        files_data.append((compdb_generate_file_path(), ''))
        files_data.append((compdb_generate_cache_path(), ''))

        expected = [
            (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}'
             f'{targets[0]}{_COMPDB_FILE_EXTENSION}',
             f'{_COMPDB_CACHE_DIR_PREFIX}{_COMPDB_CACHE_DIR_SEPARATOR}'
             f'{targets[0]}'),
            (f'{_COMPDB_FILE_PREFIX}{_COMPDB_FILE_SEPARATOR}'
             f'{targets[1]}{_COMPDB_FILE_EXTENSION}', None),
        ]

        settings = self.make_ide_settings(targets=targets)

        with self.make_temp_files(files_data):
            found_compdbs = CppIdeFeaturesState(settings)

        # Strip out the temp dir path data.
        get_name = lambda p: p.name if p is not None else None
        found_compdbs_str = [(get_name(target.compdb_file_path),
                              get_name(target.compdb_cache_path))
                             for target in found_compdbs]

        self.assertCountEqual(found_compdbs_str, expected)

    def test_finds_all_targets(self) -> None:
        """Test that it finds all targets on initalization."""
        targets = [
            'pw_strict_host_clang_debug',
            'stm32f429i_disc1_debug',
        ]

        settings = self.make_ide_settings(targets=targets)

        with self.make_temp_file(compdb_generate_file_path(
                targets[0])), self.make_temp_file(
                    compdb_generate_file_path(targets[1])):
            found_targets = CppIdeFeaturesState(settings).targets

        self.assertCountEqual(found_targets, targets)

    def test_get_target_finds_valid_target(self) -> None:
        target = 'pw_strict_host_clang_debug'
        settings = self.make_ide_settings(targets=[target])

        compdb_filename = (f'{_COMPDB_FILE_PREFIX}'
                           f'{_COMPDB_FILE_SEPARATOR}'
                           f'{target}{_COMPDB_FILE_EXTENSION}')

        symlink = self.temp_dir_path / compdb_generate_file_path()

        with self.make_temp_file(Path(compdb_filename)) as (_, compdb):
            set_symlink(compdb, symlink)

        found_target = CppIdeFeaturesState(settings).current_target
        self.assertEqual(found_target, target)

    def test_get_target_returns_none_with_no_symlink(self) -> None:
        target = 'pw_strict_host_clang_debug'
        settings = self.make_ide_settings(targets=[target])
        found_target = CppIdeFeaturesState(settings).current_target
        self.assertIsNone(found_target)

    @patch('os.readlink')
    def test_get_target_returns_none_with_bad_symlink(
            self, mock_readlink: Mock) -> None:
        target = 'pw_strict_host_clang_debug'
        settings = self.make_ide_settings(targets=[target])

        mock_readlink.return_value = (f'{_COMPDB_FILE_PREFIX}'
                                      f'{_COMPDB_FILE_SEPARATOR}'
                                      f'{target}{_COMPDB_FILE_EXTENSION}')

        found_target = CppIdeFeaturesState(settings).current_target
        self.assertIsNone(found_target)

    @patch('os.remove')
    @patch('os.mkdir')
    @patch('os.symlink')
    def test_set_target_sets_valid_target_when_no_target_set(
            self, mock_symlink: Mock, mock_mkdir: Mock,
            mock_remove: Mock) -> None:
        """Test the case where no symlinks have been set."""

        target = 'pw_strict_host_clang_debug'
        settings = self.make_ide_settings(targets=[target])
        compdb_symlink_path = compdb_generate_file_path()
        cache_symlink_path = compdb_generate_cache_path()

        with self.make_temp_file(compdb_generate_file_path(target)):
            CppIdeFeaturesState(settings).current_target = target

            mock_mkdir.assert_any_call(
                self.path_in_temp_dir(compdb_generate_cache_path(target)))

            target_and_symlink_in_temp_dir = self.paths_in_temp_dir(
                compdb_generate_file_path(target), compdb_symlink_path)
            mock_symlink.assert_any_call(*target_and_symlink_in_temp_dir, ANY)

            target_and_symlink_in_temp_dir = self.paths_in_temp_dir(
                compdb_generate_cache_path(target), cache_symlink_path)
            mock_symlink.assert_any_call(*target_and_symlink_in_temp_dir, ANY)

            mock_remove.assert_not_called()

    @patch('os.remove')
    @patch('os.mkdir')
    @patch('os.symlink')
    def test_set_target_sets_valid_target_when_target_already_set(
            self, mock_symlink: Mock, mock_mkdir: Mock,
            mock_remove: Mock) -> None:
        """Test the case where symlinks have been set, and now we're setting
        them to a different target."""

        targets = [
            'pw_strict_host_clang_debug',
            'stm32f429i_disc1_debug',
        ]

        settings = self.make_ide_settings(targets=targets)
        compdb_symlink_path = compdb_generate_file_path()
        cache_symlink_path = compdb_generate_cache_path()

        # Set the first target, which should initalize the symlinks.
        with self.make_temp_file(compdb_generate_file_path(
                targets[0])), self.make_temp_file(
                    compdb_generate_file_path(targets[1])):
            CppIdeFeaturesState(settings).current_target = targets[0]

            mock_mkdir.assert_any_call(
                self.path_in_temp_dir(compdb_generate_cache_path(targets[0])))

            mock_remove.assert_not_called()

            # Simulate symlink creation
            with self.make_temp_file(compdb_symlink_path), self.make_temp_file(
                    cache_symlink_path):

                # Set the second target, which should replace the symlinks
                CppIdeFeaturesState(settings).current_target = targets[1]

                mock_mkdir.assert_any_call(
                    self.path_in_temp_dir(
                        compdb_generate_cache_path(targets[1])))

                mock_remove.assert_any_call(
                    self.path_in_temp_dir(compdb_symlink_path))

                mock_remove.assert_any_call(
                    self.path_in_temp_dir(cache_symlink_path))

                target_and_symlink_in_temp_dir = self.paths_in_temp_dir(
                    compdb_generate_file_path(targets[1]), compdb_symlink_path)
                mock_symlink.assert_any_call(*target_and_symlink_in_temp_dir,
                                             ANY)

                target_and_symlink_in_temp_dir = self.paths_in_temp_dir(
                    compdb_generate_cache_path(targets[1]), cache_symlink_path)
                mock_symlink.assert_any_call(*target_and_symlink_in_temp_dir,
                                             ANY)

    @patch('os.remove')
    @patch('os.mkdir')
    @patch('os.symlink')
    def test_set_target_sets_valid_target_back_and_forth(
            self, mock_symlink: Mock, mock_mkdir: Mock,
            mock_remove: Mock) -> None:
        """Test the case where symlinks have been set, we set them to a second
        target, and now we're setting them back to the first target."""

        targets = [
            'pw_strict_host_clang_debug',
            'stm32f429i_disc1_debug',
        ]

        settings = self.make_ide_settings(targets=targets)
        compdb_symlink_path = compdb_generate_file_path()
        cache_symlink_path = compdb_generate_cache_path()

        # Set the first target, which should initalize the symlinks
        with self.make_temp_file(compdb_generate_file_path(
                targets[0])), self.make_temp_file(
                    compdb_generate_file_path(targets[1])):
            CppIdeFeaturesState(settings).current_target = targets[0]

            # Simulate symlink creation
            with self.make_temp_file(compdb_symlink_path), self.make_temp_file(
                    cache_symlink_path):

                # Set the second target, which should replace the symlinks
                CppIdeFeaturesState(settings).current_target = targets[1]

                # Reset mocks to clear events prior to those under test
                mock_symlink.reset_mock()
                mock_mkdir.reset_mock()
                mock_remove.reset_mock()

                # Set the first target again, which should also replace the
                # symlinks and reuse the existing cache folder
                CppIdeFeaturesState(settings).current_target = targets[0]

                mock_mkdir.assert_any_call(
                    self.path_in_temp_dir(
                        compdb_generate_cache_path(targets[0])))

                mock_remove.assert_any_call(
                    self.path_in_temp_dir(compdb_symlink_path))

                mock_remove.assert_any_call(
                    self.path_in_temp_dir(cache_symlink_path))

                target_and_symlink_in_temp_dir = self.paths_in_temp_dir(
                    compdb_generate_file_path(targets[0]), compdb_symlink_path)
                mock_symlink.assert_any_call(*target_and_symlink_in_temp_dir,
                                             ANY)

                target_and_symlink_in_temp_dir = self.paths_in_temp_dir(
                    compdb_generate_cache_path(targets[0]), cache_symlink_path)
                mock_symlink.assert_any_call(*target_and_symlink_in_temp_dir,
                                             ANY)

    @patch('os.symlink')
    def test_set_target_invalid_target_not_in_enabled_targets_raises(
            self, mock_symlink: Mock):
        target = 'pw_strict_host_clang_debug'
        settings = self.make_ide_settings(targets=[target])

        with self.make_temp_file(compdb_generate_file_path(
                target)), self.assertRaises(InvalidTargetException):
            CppIdeFeaturesState(settings).current_target = 'foo'
            mock_symlink.assert_not_called()

    @patch('os.symlink')
    def test_set_target_invalid_target_not_in_available_targets_raises(
            self, mock_symlink: Mock):
        target = 'pw_strict_host_clang_debug'
        settings = self.make_ide_settings(targets=[target])

        with self.assertRaises(InvalidTargetException):
            CppIdeFeaturesState(settings).current_target = target
            mock_symlink.assert_not_called()


class TestAggregateCompilationDatabaseTargets(PwIdeTestCase):
    """Tests aggregate_compilation_database_targets"""
    def test_gets_all_legitimate_targets(self):
        """Test compilation target aggregation against a typical sample of raw
        output from GN."""

        targets = [
            'pw_strict_host_clang_debug',
            'stm32f429i_disc1_debug',
        ]

        settings = self.make_ide_settings(targets=targets)

        raw_db: List[CppCompileCommandDict] = [
            {
                # pylint: disable=line-too-long
                'command':
                'arm-none-eabi-g++ -MMD -MF stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o.d -Wno-psabi -mabi=aapcs -mthumb --sysroot=../environment/cipd/packages/arm -specs=nano.specs -specs=nosys.specs -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Og -Wshadow -Wredundant-decls -u_printf_float -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -DPW_ARMV7M_ENABLE_FPU=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/assert_compatibility_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o stm32f429i_disc1_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'directory': '/pigweed/pigweed/out',
                'file': '../pw_allocator/block.cc'
            },
            {
                # pylint: disable=line-too-long
                'command':
                '../environment/cipd/packages/pigweed/bin/clang++ -MMD -MF pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug/obj/pw_allocator/block.block.cc.o',
                # pylint: enable=line-too-long
                'directory': '/pigweed/pigweed/out',
                'file': '../pw_allocator/block.cc'
            },
            {
                # pylint: disable=line-too-long
                'command':
                "python ../pw_toolchain/py/pw_toolchain/clang_tidy.py --source-exclude 'third_party/.*' --source-exclude '.*packages/mbedtls.*' --source-exclude '.*packages/boringssl.*' --skip-include-path 'mbedtls/include' --skip-include-path 'mbedtls' --skip-include-path 'boringssl/src/include' --skip-include-path 'boringssl' --skip-include-path 'pw_tls_client/generate_test_data' --source-file ../pw_allocator/block.cc --source-root '../' --export-fixes pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.yaml -- ../environment/cipd/packages/pigweed/bin/clang++ END_OF_INVOKER -MMD -MF  pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o.d -g3 --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Og -Wshadow -Wredundant-decls -Wthread-safety -Wswitch-enum -fdiagnostics-color -g -fno-common -fno-exceptions -ffunction-sections -fdata-sections -Wall -Wextra -Wimplicit-fallthrough -Wcast-qual -Wundef -Wpointer-arith -Werror -Wno-error=cpp -Wno-error=deprecated-declarations -ffile-prefix-map=/pigweed/pigweed/out=out -ffile-prefix-map=/pigweed/pigweed/= -ffile-prefix-map=../= -ffile-prefix-map=/pigweed/pigweed/out=out -Wextra-semi -fno-rtti -Wnon-virtual-dtor -std=c++17 -Wno-register -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1 -DPW_STATUS_CFG_CHECK_IF_USED=1 -I../pw_allocator/public -I../pw_assert/public -I../pw_assert/print_and_abort_assert_public_overrides -I../pw_preprocessor/public -I../pw_assert_basic/public_overrides -I../pw_assert_basic/public -I../pw_span/public -I../pw_polyfill/public -I../pw_polyfill/standard_library_public -I../pw_status/public -c ../pw_allocator/block.cc -o pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o && touch pw_strict_host_clang_debug.static_analysis/obj/pw_allocator/block.block.cc.o",
                # pylint: enable=line-too-long
                'directory': '/pigweed/pigweed/out',
                'file': '../pw_allocator/block.cc',
            },
        ]

        root = Path('/pigweed/pigweed/out')

        aggregated_targets = aggregate_compilation_database_targets(
            raw_db, settings, root, default_path=self.temp_dir_path)

        self.assertCountEqual(aggregated_targets, targets)


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