"""Test input manipulating logic."""

import sys
from io import StringIO

from langchain.input import ChainedInput, get_color_mapping


def test_chained_input_not_verbose() -> None:
    """Test chained input logic."""
    old_stdout = sys.stdout
    sys.stdout = mystdout = StringIO()
    chained_input = ChainedInput("foo")
    sys.stdout = old_stdout
    output = mystdout.getvalue()
    assert output == ""
    assert chained_input.input == "foo"

    old_stdout = sys.stdout
    sys.stdout = mystdout = StringIO()
    chained_input.add("bar")
    sys.stdout = old_stdout
    output = mystdout.getvalue()
    assert output == ""
    assert chained_input.input == "foobar"


def test_chained_input_verbose() -> None:
    """Test chained input logic, making sure verbose doesn't mess it up."""
    old_stdout = sys.stdout
    sys.stdout = mystdout = StringIO()
    chained_input = ChainedInput("foo", verbose=True)
    sys.stdout = old_stdout
    output = mystdout.getvalue()
    assert output == "foo"
    assert chained_input.input == "foo"

    old_stdout = sys.stdout
    sys.stdout = mystdout = StringIO()
    chained_input.add("bar")
    sys.stdout = old_stdout
    output = mystdout.getvalue()
    assert output == "bar"
    assert chained_input.input == "foobar"

    old_stdout = sys.stdout
    sys.stdout = mystdout = StringIO()
    chained_input.add("baz", color="blue")
    sys.stdout = old_stdout
    output = mystdout.getvalue()
    assert output == "\x1b[36;1m\x1b[1;3mbaz\x1b[0m"
    assert chained_input.input == "foobarbaz"


def test_get_color_mapping() -> None:
    """Test getting of color mapping."""
    # Test on few inputs.
    items = ["foo", "bar"]
    output = get_color_mapping(items)
    expected_output = {"foo": "blue", "bar": "yellow"}
    assert output == expected_output

    # Test on a lot of inputs.
    items = [f"foo-{i}" for i in range(20)]
    output = get_color_mapping(items)
    assert len(output) == 20


def test_get_color_mapping_excluded_colors() -> None:
    """Test getting of color mapping with excluded colors."""
    items = ["foo", "bar"]
    output = get_color_mapping(items, excluded_colors=["blue"])
    expected_output = {"foo": "yellow", "bar": "pink"}
    assert output == expected_output
