# 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.

"""Test the gerrit module."""

import pytest

from chromite.scripts import gerrit


def test_main_usage() -> None:
    """Basic tests for the main help."""
    # Missing subcommand is an error.
    with pytest.raises(SystemExit) as excinfo:
        gerrit.main([])
    assert excinfo.value.code != 0

    with pytest.raises(SystemExit) as excinfo:
        gerrit.main(["--help"])
    assert excinfo.value.code == 0

    actions = gerrit._GetActions()  # pylint: disable=protected-access
    # Don't track exactly how many actions there are, just make sure we have a
    # reasonable return value.
    assert len(actions) > 20
    assert "help" in actions
    assert "search" in actions

    # Check help for all subcommands.
    for action in actions:
        with pytest.raises(SystemExit) as excinfo:
            gerrit.main(["help", action])
        assert excinfo.value.code == 0

    gerrit.main(["help-all"])


DATA_PROCESS_ADD_REMOVE_LISTS = (
    # No inputs means no outputs.
    ([], set(), set()),
    (["a"], {"a"}, set()),
    (["~a"], set(), {"a"}),
    (["a", "~a"], set(), {"a"}),
    (["~a", "a"], {"a"}, set()),
    (["a", "b", "c", "~d"], {"a", "b", "c"}, {"d"}),
    (["-a", "a"], {"a"}, set()),
)


@pytest.mark.parametrize(
    "items, exp_add, exp_remove", DATA_PROCESS_ADD_REMOVE_LISTS
)
def test_process_add_remove_lists(items, exp_add, exp_remove) -> None:
    """Test process_add_remove_lists behavior."""
    add, remove = gerrit.process_add_remove_lists(items)
    assert add == exp_add and remove == exp_remove


def test_process_add_remove_lists_invalid() -> None:
    """Test validation errors."""
    # Never accept the empty string.
    with pytest.raises(SystemExit) as excinfo:
        gerrit.process_add_remove_lists([""])
    assert excinfo.value.code != 0
