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

import json
import tempfile
import unittest
import sys
from pathlib import Path

sys.path.insert(0, Path(__file__).parent)
import gn_ninja_outputs

_NINJA_OUTPUTS = {
    "//:foo": ["obj/foo.stamp"],
    "//:bar": [
        "obj/bar.output",
        "obj/bar.stamp",
    ],
    "//:zoo": [
        "obj/zoo.output",
        "obj/zoo.stamp",
    ],
    "//:zoo(//toolchain:secondary)": [
        "secondary/obj/zoo.output",
        "secondary/obj/zoo.stamp",
    ],
}


class TestNinjaOutputsDatabase(unittest.TestCase):
    def setUp(self):
        self._inputs_json_file = tempfile.NamedTemporaryFile(
            mode="wt", suffix=".json"
        )
        self.inputs_json = Path(self._inputs_json_file.name)
        json.dump(_NINJA_OUTPUTS, self._inputs_json_file)
        self._inputs_json_file.flush()

    def run_tests(self, db):
        self.assertEqual([], db.gn_label_to_paths("//:unknown"))
        for label, paths in _NINJA_OUTPUTS.items():
            self.assertListEqual(
                paths,
                db.gn_label_to_paths(label),
                f"When querying label {label}",
            )

        self.assertEqual("", db.path_to_gn_label("unknown_path"))
        for label, paths in _NINJA_OUTPUTS.items():
            for path in paths:
                self.assertEqual(
                    label,
                    db.path_to_gn_label(path),
                    f"When querying path {path}",
                )

        self.assertListEqual(sorted(_NINJA_OUTPUTS.keys()), db.get_labels())

        expected_paths = sorted(
            path for sublist in _NINJA_OUTPUTS.values() for path in sublist
        )
        self.assertListEqual(expected_paths, db.get_paths())

    def run_tests_for_class(self, db_class):
        db = db_class()
        db.load_from_json(self.inputs_json)
        self.run_tests(db)

        database_file = tempfile.NamedTemporaryFile(suffix=".database")
        database_path = Path(database_file.name)
        db.save_to_file(database_path)

        db = db_class()
        db.load_from_file(database_path)
        self.run_tests(db)

    def test_json_database(self):
        self.run_tests_for_class(gn_ninja_outputs.NinjaOutputsJSON)

    def test_tabular_database(self):
        self.run_tests_for_class(gn_ninja_outputs.NinjaOutputsTabular)

    def test_sqlite_database(self):
        self.run_tests_for_class(gn_ninja_outputs.NinjaOutputsSqlite3)

    def test_marshal_database(self):
        self.run_tests_for_class(gn_ninja_outputs.NinjaOutputsMarshal)


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