import pytest
from pytest import mark
from ra_aid.tools import read_file_tool

def test_basic_file_reading(tmp_path):
    """Test basic file reading functionality"""
    # Create a test file
    test_file = tmp_path / "test.txt"
    test_content = "Hello\nWorld\n"
    test_file.write_text(test_content)

    # Read the file
    result = read_file_tool(str(test_file))

    # Verify return format and content
    assert isinstance(result, dict)
    assert 'content' in result
    assert result['content'] == test_content

def test_no_truncation(tmp_path):
    """Test that files under max_lines are not truncated"""
    # Create a test file with content under the limit
    test_file = tmp_path / "small.txt"
    line_count = 4000  # Well under 5000 limit
    test_content = "line\n" * line_count
    test_file.write_text(test_content)

    # Read the file
    result = read_file_tool(str(test_file))

    # Verify no truncation occurred
    assert isinstance(result, dict)
    assert '[lines of output truncated]' not in result['content']
    assert len(result['content'].splitlines()) == line_count

@pytest.mark.timeout(30)
def test_with_truncation(tmp_path):
    """Test that files over max_lines are properly truncated"""
    # Create a test file exceeding the limit
    test_file = tmp_path / "large.txt"
    line_count = 6000  # Exceeds 5000 limit
    test_content = "line\n" * line_count
    test_file.write_text(test_content)

    # Read the file
    result = read_file_tool(str(test_file))

    # Verify truncation occurred correctly
    assert isinstance(result, dict)
    assert '[1000 lines of output truncated]' in result['content']
    assert len(result['content'].splitlines()) == 5001  # 5000 content lines + 1 truncation message

def test_nonexistent_file():
    """Test error handling for non-existent files"""
    with pytest.raises(FileNotFoundError):
        read_file_tool("/nonexistent/file.txt")

def test_empty_file(tmp_path):
    """Test reading an empty file"""
    # Create an empty test file
    test_file = tmp_path / "empty.txt"
    test_file.write_text("")

    # Read the file
    result = read_file_tool(str(test_file))

    # Verify return format and empty content
    assert isinstance(result, dict)
    assert 'content' in result
    assert result['content'] == ""
