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

"""Tests for cros_query.py."""

from unittest import mock

from chromite.cli.cros import cros_query
from chromite.lib import build_query
from chromite.lib import commandline


def test_compile_filter():
    """Test the compile_filter function."""
    board_foo = build_query.Board("foo")
    board_bar = build_query.Board("bar")
    flt = cros_query.compile_filter("name == 'foo'")
    assert flt(board_foo)
    assert not flt(board_bar)


def test_filter_globals():
    """Test compiled filters have access to a limited set of globals."""
    board_foo = build_query.Board("foo")
    board_bar = build_query.Board("bar")
    board_foobar = build_query.Board("foobar")
    flt = cros_query.compile_filter("any(x == 'o' for x in name)")
    assert flt(board_foo)
    assert not flt(board_bar)
    assert flt(board_foobar)


class FakeProfile(build_query.Profile):
    """Fake profile for testing purposes."""

    def __init__(self, name, overlay_name, parents):
        # pylint: disable=super-init-not-called
        self.name = name
        self.overlay = mock.Mock()
        self.overlay.name = overlay_name
        self.parents = parents

    @classmethod
    def find_all(cls, board=None, overlays=""):
        yield CHIPSET_LAKELAKE
        yield BASEBOARD_MALTEER
        yield MALTEER
        yield CHIPSET_LAKELAKE_PRIVATE
        yield BASEBOARD_MALTEER_PRIVATE
        yield CHEETS_PRIVATE
        yield MALTEER_PRIVATE

    def some_method(self, arg):
        """Fake method for testing output format functionality."""
        return f"{self.name} {arg}"


# Some fake profiles for testing.
CHIPSET_LAKELAKE = FakeProfile("base", "chipset-lakelake", [])
BASEBOARD_MALTEER = FakeProfile("base", "baseboard-malteer", [CHIPSET_LAKELAKE])
MALTEER = FakeProfile("base", "malteer", [BASEBOARD_MALTEER])
CHIPSET_LAKELAKE_PRIVATE = FakeProfile(
    "base", "chipset-lakelake-private", [CHIPSET_LAKELAKE]
)
BASEBOARD_MALTEER_PRIVATE = FakeProfile(
    "base",
    "baseboard-malteer-private",
    [BASEBOARD_MALTEER, CHIPSET_LAKELAKE_PRIVATE],
)
CHEETS_PRIVATE = FakeProfile("android", "cheets-private", [])
MALTEER_PRIVATE = FakeProfile(
    "base",
    "malteer-private",
    [MALTEER, BASEBOARD_MALTEER_PRIVATE, CHEETS_PRIVATE],
)


def test_tree(capsys):
    """Test the tree_result functionality."""
    cros_query.tree_result(MALTEER_PRIVATE, str)
    captured = capsys.readouterr()
    assert (
        captured.out
        == """\
malteer-private:base
├─malteer:base
│ ╰─baseboard-malteer:base
│   ╰─chipset-lakelake:base
├─baseboard-malteer-private:base
│ ├─baseboard-malteer:base
│ │ ╰─chipset-lakelake:base
│ ╰─chipset-lakelake-private:base
│   ╰─chipset-lakelake:base
╰─cheets-private:android
"""
    )


def _run_cros_query(args):
    """Helper to run cros query with the given arguments."""
    parser = commandline.ArgumentParser(filter=True)
    cros_query.QueryCommand.AddParser(parser)
    opts = parser.parse_args(args)
    cmd = cros_query.QueryCommand(opts)
    return cmd.Run()


def test_query_profiles(capsys, monkeypatch):
    """Test querying profiles with a filter."""
    monkeypatch.setattr(cros_query, "QUERY_TARGETS", {"profiles": FakeProfile})
    _run_cros_query(["profiles", "-f", "'malteer' in overlay.name"])
    captured = capsys.readouterr()
    assert (
        captured.out
        == """\
baseboard-malteer:base
malteer:base
baseboard-malteer-private:base
malteer-private:base
"""
    )


def test_query_profiles_alt_format(capsys, monkeypatch):
    """Test querying profiles with -o formatting argument."""
    monkeypatch.setattr(cros_query, "QUERY_TARGETS", {"profiles": FakeProfile})
    _run_cros_query(
        [
            "profiles",
            "-f",
            "'malteer' in overlay.name",
            "-o",
            "{overlay.name} {some_method('ohea')}",
        ]
    )
    captured = capsys.readouterr()
    assert (
        captured.out
        == """\
baseboard-malteer base ohea
malteer base ohea
baseboard-malteer-private base ohea
malteer-private base ohea
"""
    )
