mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 13:52:43 +08:00
136 lines
4.5 KiB
Python
136 lines
4.5 KiB
Python
"""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
|