Spaces:
Build error
Build error
"""Tests for FileEditObservation class.""" | |
from openhands.events.event import FileEditSource | |
from openhands.events.observation.files import FileEditObservation | |
def test_file_edit_observation_basic(): | |
"""Test basic properties of FileEditObservation.""" | |
obs = FileEditObservation( | |
path='/test/file.txt', | |
prev_exist=True, | |
old_content='Hello\nWorld\n', | |
new_content='Hello\nNew World\n', | |
impl_source=FileEditSource.LLM_BASED_EDIT, | |
content='Hello\nWorld\n', # Initial content is old_content | |
) | |
assert obs.path == '/test/file.txt' | |
assert obs.prev_exist is True | |
assert obs.old_content == 'Hello\nWorld\n' | |
assert obs.new_content == 'Hello\nNew World\n' | |
assert obs.impl_source == FileEditSource.LLM_BASED_EDIT | |
assert obs.message == 'I edited the file /test/file.txt.' | |
def test_file_edit_observation_diff_cache(): | |
"""Test that diff visualization is cached.""" | |
obs = FileEditObservation( | |
path='/test/file.txt', | |
prev_exist=True, | |
old_content='Hello\nWorld\n', | |
new_content='Hello\nNew World\n', | |
impl_source=FileEditSource.LLM_BASED_EDIT, | |
content='Hello\nWorld\n', # Initial content is old_content | |
) | |
# First call should compute diff | |
diff1 = obs.visualize_diff() | |
assert obs._diff_cache is not None | |
# Second call should use cache | |
diff2 = obs.visualize_diff() | |
assert diff1 == diff2 | |
def test_file_edit_observation_no_changes(): | |
"""Test behavior when content hasn't changed.""" | |
content = 'Hello\nWorld\n' | |
obs = FileEditObservation( | |
path='/test/file.txt', | |
prev_exist=True, | |
old_content=content, | |
new_content=content, | |
impl_source=FileEditSource.LLM_BASED_EDIT, | |
content=content, # Initial content is old_content | |
) | |
diff = obs.visualize_diff() | |
assert '(no changes detected' in diff | |
def test_file_edit_observation_get_edit_groups(): | |
"""Test the get_edit_groups method.""" | |
obs = FileEditObservation( | |
path='/test/file.txt', | |
prev_exist=True, | |
old_content='Line 1\nLine 2\nLine 3\nLine 4\n', | |
new_content='Line 1\nNew Line 2\nLine 3\nNew Line 4\n', | |
impl_source=FileEditSource.LLM_BASED_EDIT, | |
content='Line 1\nLine 2\nLine 3\nLine 4\n', # Initial content is old_content | |
) | |
groups = obs.get_edit_groups(n_context_lines=1) | |
assert len(groups) > 0 | |
# Check structure of edit groups | |
for group in groups: | |
assert 'before_edits' in group | |
assert 'after_edits' in group | |
assert isinstance(group['before_edits'], list) | |
assert isinstance(group['after_edits'], list) | |
# Verify line numbers and content | |
first_group = groups[0] | |
assert any('Line 2' in line for line in first_group['before_edits']) | |
assert any('New Line 2' in line for line in first_group['after_edits']) | |
def test_file_edit_observation_new_file(): | |
"""Test behavior when editing a new file.""" | |
obs = FileEditObservation( | |
path='/test/new_file.txt', | |
prev_exist=False, | |
old_content='', | |
new_content='Hello\nWorld\n', | |
impl_source=FileEditSource.LLM_BASED_EDIT, | |
content='', # Initial content is old_content (empty for new file) | |
) | |
assert obs.prev_exist is False | |
assert obs.old_content == '' | |
assert ( | |
str(obs) | |
== '[New file /test/new_file.txt is created with the provided content.]\n' | |
) | |
# Test that trying to visualize diff for a new file works | |
diff = obs.visualize_diff() | |
assert diff is not None | |
def test_file_edit_observation_context_lines(): | |
"""Test diff visualization with different context line settings.""" | |
obs = FileEditObservation( | |
path='/test/file.txt', | |
prev_exist=True, | |
old_content='Line 1\nLine 2\nLine 3\nLine 4\nLine 5\n', | |
new_content='Line 1\nNew Line 2\nLine 3\nNew Line 4\nLine 5\n', | |
impl_source=FileEditSource.LLM_BASED_EDIT, | |
content='Line 1\nLine 2\nLine 3\nLine 4\nLine 5\n', # Initial content is old_content | |
) | |
# Test with 0 context lines | |
groups_0 = obs.get_edit_groups(n_context_lines=0) | |
# Test with 2 context lines | |
groups_2 = obs.get_edit_groups(n_context_lines=2) | |
# More context should mean more lines in the groups | |
total_lines_0 = sum( | |
len(g['before_edits']) + len(g['after_edits']) for g in groups_0 | |
) | |
total_lines_2 = sum( | |
len(g['before_edits']) + len(g['after_edits']) for g in groups_2 | |
) | |
assert total_lines_2 > total_lines_0 | |