diff --git a/tests/tools/test_patch_parser.py b/tests/tools/test_patch_parser.py index 752c7340..77baab8d 100644 --- a/tests/tools/test_patch_parser.py +++ b/tests/tools/test_patch_parser.py @@ -1,7 +1,10 @@ """Tests for the V4A patch format parser.""" +from types import SimpleNamespace + from tools.patch_parser import ( OperationType, + apply_v4a_operations, parse_v4a_patch, ) @@ -137,3 +140,48 @@ class TestParseInvalidPatch: assert ops[0].operation == OperationType.ADD assert ops[1].operation == OperationType.DELETE assert ops[2].operation == OperationType.UPDATE + + +class TestApplyUpdate: + def test_preserves_non_prefix_pipe_characters_in_unmodified_lines(self): + patch = """\ +*** Begin Patch +*** Update File: sample.py +@@ result @@ + result = 1 +- return result ++ return result + 1 +*** End Patch""" + operations, err = parse_v4a_patch(patch) + assert err is None + + class FakeFileOps: + def __init__(self): + self.written = None + + def read_file(self, path, offset=1, limit=500): + return SimpleNamespace( + content=( + 'def run():\n' + ' cmd = "echo a | sed s/a/b/"\n' + ' result = 1\n' + ' return result' + ), + error=None, + ) + + def write_file(self, path, content): + self.written = content + return SimpleNamespace(error=None) + + file_ops = FakeFileOps() + + result = apply_v4a_operations(operations, file_ops) + + assert result.success is True + assert file_ops.written == ( + 'def run():\n' + ' cmd = "echo a | sed s/a/b/"\n' + ' result = 1\n' + ' return result + 1' + ) diff --git a/tools/patch_parser.py b/tools/patch_parser.py index 716036f3..bef196e5 100644 --- a/tools/patch_parser.py +++ b/tools/patch_parser.py @@ -359,7 +359,7 @@ def _apply_update(op: PatchOperation, file_ops: Any) -> Tuple[bool, str]: # Parse content (remove line numbers) current_lines = [] for line in read_result.content.split('\n'): - if '|' in line: + if re.match(r'^\s*\d+\|', line): # Line format: " 123|content" parts = line.split('|', 1) if len(parts) == 2: