import pytest
from src.models import FileItem

def test_file_item_custom_slices_serialization_with_annotations():
 # Test that FileItem correctly serializes custom_slices with tag and comment.
 slices = [
  {'start_line': 1, 'end_line': 10, 'tag': 'init', 'comment': 'Constructor logic'},
  {'start_line': 20, 'end_line': 30, 'tag': 'process', 'comment': 'Main processing loop'}
 ]
 item = FileItem(path='src/app.py', custom_slices=slices)
 
 serialized = item.to_dict()
 assert 'custom_slices' in serialized
 assert len(serialized['custom_slices']) == 2
 assert serialized['custom_slices'][0]['tag'] == 'init'
 assert serialized['custom_slices'][0]['comment'] == 'Constructor logic'
 assert serialized['custom_slices'][1]['tag'] == 'process'
 assert serialized['custom_slices'][1]['comment'] == 'Main processing loop'

def test_file_item_custom_slices_deserialization_with_annotations():
 # Test that FileItem correctly deserializes custom_slices with tag and comment.
 data = {
  'path': 'src/app.py',
  'custom_slices': [
   {'start_line': 5, 'end_line': 15, 'tag': 'helper', 'comment': 'Utility function'},
   {'start_line': 40, 'end_line': 50} # Missing optional fields
  ]
 }
 
 item = FileItem.from_dict(data)
 assert len(item.custom_slices) == 2
 
 # First slice has annotations
 assert item.custom_slices[0]['tag'] == 'helper'
 assert item.custom_slices[0]['comment'] == 'Utility function'
 
 # Second slice should have default None or empty string for optional fields
 # This is where it will likely FAIL if we haven't updated from_dict to inject defaults
 assert 'tag' in item.custom_slices[1]
 assert 'comment' in item.custom_slices[1]
 assert item.custom_slices[1]['tag'] is None
 assert item.custom_slices[1]['comment'] is None

def test_file_item_custom_slices_round_trip_annotations():
 # Test a full round trip of FileItem with slice annotations.
 item = FileItem(path='src/test.py', custom_slices=[
  {'start_line': 1, 'end_line': 5, 'tag': 'test', 'comment': 'Unit test case'}
 ])
 
 serialized = item.to_dict()
 deserialized = FileItem.from_dict(serialized)
 
 assert deserialized.custom_slices == item.custom_slices
 assert deserialized.custom_slices[0]['tag'] == 'test'
 assert deserialized.custom_slices[0]['comment'] == 'Unit test case'

