# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""The matching utils unit tests."""

import os

from chromite.lib import cros_test_lib
from chromite.utils import matching


class GetMostLikelyMatchedObjectTest(cros_test_lib.TestCase):
    """GetMostLikelyMatchedObject tests."""

    def testNoSimilar(self) -> None:
        """Test no results when no similar items."""
        haystack = ["1234", "5678"]
        needle = "abcd"

        result = matching.GetMostLikelyMatchedObject(haystack, needle)
        self.assertFalse(result)

    def testSimilar(self) -> None:
        """Test similar items are found."""
        haystack = ["abce", "aecd", "1234"]
        needle = "abcd"

        result = matching.GetMostLikelyMatchedObject(
            haystack, needle, matched_score_threshold=0.6
        )
        self.assertCountEqual(["abce", "aecd"], result)

    def testSimilarThreshold(self) -> None:
        """Test the threshold is correctly applied."""
        haystack = ["abce", "aecd", "1234"]
        needle = "abcd"

        result = matching.GetMostLikelyMatchedObject(
            haystack, needle, matched_score_threshold=0.8
        )
        self.assertFalse(result)


class FindFilesMatchingTest(cros_test_lib.TempDirTestCase):
    """FindFilesMatching tests."""

    def setUp(self) -> None:
        D = cros_test_lib.Directory

        filesystem = (
            D(
                "path",
                (
                    D(
                        "to",
                        (
                            "example.txt",
                            "example.csv",
                            "thing.txt",
                            "another.csv",
                        ),
                    ),
                    D("excluded", ("example.txt",)),
                ),
            ),
        )
        cros_test_lib.CreateOnDiskHierarchy(self.tempdir, filesystem)

        base_path = os.path.join(self.tempdir, "path", "to")
        another_csv = os.path.join(base_path, "another.csv")
        example_csv = os.path.join(base_path, "example.csv")
        example_txt = os.path.join(base_path, "example.txt")
        thing_txt = os.path.join(base_path, "thing.txt")

        self.csvs = [another_csv, example_csv]
        self.txts = [example_txt, thing_txt]

        self.excluded = os.path.join(self.tempdir, "path", "excluded")

    def testFindMatching(self) -> None:
        """Simple find matching."""
        result = matching.FindFilesMatching(
            "*.csv", target=self.tempdir, cwd="/"
        )
        self.assertCountEqual(self.csvs, result)

    def testExcludeDirs(self) -> None:
        """Test the excluded directories works."""
        result = matching.FindFilesMatching(
            "*.txt", target=self.tempdir, cwd="/", exclude_dirs=(self.excluded,)
        )
        self.assertCountEqual(self.txts, result)

    def testCwd(self) -> None:
        """Test the paths change relative to the cwd."""
        result = matching.FindFilesMatching(
            "*.csv", target="path", cwd=self.tempdir
        )
        # Convert the csv paths to be relative to the tempdir.
        expected = [os.path.relpath(x, start=self.tempdir) for x in self.csvs]
        self.assertCountEqual(expected, result)
