"""Tests for syntax highlighting module."""

from mudlib.render.highlight import highlight


def test_highlight_python_returns_ansi_codes():
    """Test that Python code returns string with ANSI escape codes."""
    code = "def foo():\n    return 42"
    result = highlight(code, language="python")
    # Should contain ANSI escape codes
    assert "\033[" in result
    # Should contain the original code somewhere
    assert "def" in result
    assert "foo" in result


def test_highlight_toml_returns_ansi_codes():
    """Test that TOML code returns string with ANSI escape codes."""
    code = '[section]\nkey = "value"'
    result = highlight(code, language="toml")
    # Should contain ANSI escape codes
    assert "\033[" in result
    # Should contain the original code somewhere
    assert "section" in result
    assert "key" in result


def test_highlight_truecolor_depth():
    """Test with color_depth=truecolor uses appropriate formatter."""
    code = "x = 1"
    result = highlight(code, language="python", color_depth="truecolor")
    # Should contain ANSI codes (either 256-color or truecolor format)
    assert "\033[" in result
    # Should contain the code
    assert "x" in result


def test_highlight_256_depth():
    """Test with color_depth=256 uses 256-color formatter."""
    code = "x = 1"
    result = highlight(code, language="python", color_depth="256")
    # Should contain ANSI codes
    assert "\033[" in result
    # Should contain the code
    assert "x" in result


def test_highlight_16_depth():
    """Test with color_depth=16 uses basic terminal formatter."""
    code = "x = 1"
    result = highlight(code, language="python", color_depth="16")
    # Should contain ANSI codes
    assert "\033[" in result
    # Should contain the code
    assert "x" in result


def test_highlight_unknown_language_returns_original():
    """Test unknown language returns original text unmodified (no crash)."""
    code = "some random text"
    result = highlight(code, language="unknown_language_xyz")
    # Should return original text unchanged
    assert result == code
    # Should not contain ANSI codes
    assert "\033[" not in result


def test_highlight_empty_string():
    """Test empty string input returns empty string."""
    result = highlight("", language="python")
    assert result == ""


def test_highlight_no_extra_trailing_newlines():
    """Test that output doesn't end with extra newlines."""
    code = "x = 1"
    result = highlight(code, language="python")
    # Pygments tends to add a trailing newline, we should strip it
    # The original code has no trailing newline, so neither should the result
    assert not result.endswith("\n\n")
    # A single trailing newline might be ok if original had one,
    # but our test input doesn't, so result shouldn't either
    assert not result.endswith("\n")


def test_highlight_with_line_numbers():
    """Test highlighting with line numbers enabled."""
    code = "def foo():\n    return 42\n    return 99"
    result = highlight(code, language="python", line_numbers=True)
    # Should contain line numbers
    assert "1" in result
    assert "2" in result
    assert "3" in result
    # Should still contain ANSI codes
    assert "\033[" in result
    # Should contain the code (split by ANSI codes, so check separately)
    assert "def" in result
    assert "foo" in result
    assert "return" in result
    assert "42" in result


def test_highlight_line_numbers_use_ansi_dim():
    """Test that line numbers use ANSI dim/gray styling."""
    code = "x = 1\ny = 2"
    result = highlight(code, language="python", line_numbers=True)
    # Line numbers should have some ANSI styling
    # We'll check that there are escape codes before the digits
    assert "\033[" in result
    # This is a bit fragile, but we can check that the result
    # starts with an escape code (for line number 1)
    lines = result.split("\n")
    # First line should start with escape code or digit
    assert lines[0][0] in ("\033", "1", " ")


def test_highlight_preserves_code_with_trailing_newline():
    """Test code with trailing newline is handled correctly."""
    code = "x = 1\n"
    result = highlight(code, language="python")
    # Should contain the code
    assert "x" in result
    # Should not accumulate extra newlines beyond what Pygments naturally adds
    # We strip the trailing newline, so even input with \n shouldn't get extra
    assert not result.endswith("\n\n")
