import unittest
from typing import Iterator
import xml.etree.ElementTree as ET
from sia import util
class UtilTest(unittest.TestCase):
def test_stop_before_value(self):
# Helper function to create iterator from list
def create_iterator(items: list) -> Iterator[str]:
for item in items:
yield item
# Test case 1: Stop value in middle of sequence
input_sequence = ['hello', 'world', 'STOP', 'ignored']
result = list(util.stop_before_value(create_iterator(input_sequence), 'STOP'))
self.assertEqual(result, ['hello', 'world'])
# Test case 2: Stop value not in sequence
input_sequence = ['hello', 'world']
result = list(util.stop_before_value(create_iterator(input_sequence), 'STOP'))
self.assertEqual(result, ['hello', 'world'])
# Test case 3: Stop value at start of sequence
input_sequence = ['STOP', 'ignored']
result = list(util.stop_before_value(create_iterator(input_sequence), 'STOP'))
self.assertEqual(result, [])
# Test case 4: Stop value as part of an item
input_sequence = ['hello', 'woSTOPrld', 'ignored']
result = list(util.stop_before_value(create_iterator(input_sequence), 'STOP'))
self.assertEqual(result, ['hello', 'wo'])
# Test case 5: Empty sequence
input_sequence = []
result = list(util.stop_before_value(create_iterator(input_sequence), 'STOP'))
self.assertEqual(result, [])
def test_pretty_print_element_basic(self):
"""Test basic element printing"""
elem = ET.Element('root')
child = ET.SubElement(elem, 'child', {'attr': 'value'})
child.text = 'text'
expected = '''
'''
self.assertEqual(util.pretty_print_element(elem).strip(), expected.strip())
def test_pretty_print_element_long_attributes(self):
"""Test printing elements with long attributes that need wrapping"""
elem = ET.Element('root', {
'very_long_attribute_1': 'value1',
'very_long_attribute_2': 'value2',
'very_long_attribute_3': 'value3'
})
result = util.pretty_print_element(elem, max_line=40)
# Verify attributes are wrapped to new lines
self.assertIn('\n very_long_attribute_1="value1"', result)
self.assertIn('\n very_long_attribute_2="value2"', result)
self.assertIn('\n very_long_attribute_3="value3"', result)
def test_pretty_print_element_cdata(self):
"""Test printing elements with CDATA sections"""
elem = ET.Element('root')
elem.text = 'preserved\n spacing'
expected = '''
'''
self.assertEqual(util.pretty_print_element(elem).strip(), expected.strip())
def test_pretty_print_element_empty(self):
"""Test printing empty elements"""
elem = ET.Element('empty')
self.assertEqual(util.pretty_print_element(elem), '')
def test_real_world_context(self):
"""Test formatting a realistic context example"""
# Create a context element with system metrics and a repeat entry
context = ET.Element('context', {
'time': '2024-10-18T12:00:00Z',
'cpu': '12',
'gpu': '26',
'memory_used': '9556302234',
'memory_total': '17179869184',
'disk_used': '244434939904',
'disk_total': '273145991168',
'context': '3',
'stdin': '0'
})
repeat = ET.SubElement(context, 'repeat', {
'id': 'a3d89ee5-28ec-4c5a-b9e9-a30af53d43a0',
'exit_code': '0'
})
repeat.text = 'ls -lah /'
stdout = ET.SubElement(repeat, 'stdout')
stdout.text = '''total 16K
drwxr-xr-x 1 sia 1049089 0 Oct 28 13:40 ./
drwxr-xr-x 1 sia 1049089 0 Oct 28 13:40 ../
drwxr-xr-x 1 sia 1049089 0 Oct 28 13:40 tasks/
drwxr-xr-x 1 sia 1049089 0 Oct 28 13:40 user/'''
stderr = ET.SubElement(repeat, 'stderr')
formatted = util.pretty_print_element(context)
# Verify key formatting expectations
self.assertIn(' ', formatted)
self.assertIn(' ', formatted)
self.assertIn(' ', formatted)
self.assertIn(' & " \''
result = util.pretty_print_element(elem)
# Should be escaped or wrapped in CDATA
self.assertTrue(
('< > & " '' in result) or
(' & " \']]>' in result)
)
def test_mixed_content(self):
"""Test formatting elements with mixed text and child nodes"""
elem = ET.Element('root')
elem.text = 'before'
child = ET.SubElement(elem, 'child')
child.tail = 'after'
result = util.pretty_print_element(elem)
# Verify text positioning
self.assertIn('before', result)
self.assertIn('after', result)