Files
ai-agent-scaffold-go/configs/agent/skills/pdf/scripts/check_bounding_boxes_test.py
2026-05-30 23:16:49 +08:00

225 lines
8.3 KiB
Python

# flake8: noqa
# yapf: disable
import io
import unittest
import json
from check_bounding_boxes import get_bounding_box_messages
# Currently this is not run automatically in CI; it's just for documentation and manual checking.
class TestGetBoundingBoxMessages(unittest.TestCase):
def create_json_stream(self, data):
"""Helper to create a JSON stream from data"""
return io.StringIO(json.dumps(data))
def test_no_intersections(self):
"""Test case with no bounding box intersections"""
data = {
'form_fields': [{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [60, 10, 150, 30]
}, {
'description': 'Email',
'page_number': 1,
'label_bounding_box': [10, 40, 50, 60],
'entry_bounding_box': [60, 40, 150, 60]
}]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(any('SUCCESS' in msg for msg in messages))
self.assertFalse(any('FAILURE' in msg for msg in messages))
def test_label_entry_intersection_same_field(self):
"""Test intersection between label and entry of the same field"""
data = {
'form_fields': [{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 60, 30],
'entry_bounding_box': [50, 10, 150, 30] # Overlaps with label
}]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(
any('FAILURE' in msg and 'intersection' in msg
for msg in messages))
self.assertFalse(any('SUCCESS' in msg for msg in messages))
def test_intersection_between_different_fields(self):
"""Test intersection between bounding boxes of different fields"""
data = {
'form_fields': [
{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [60, 10, 150, 30]
},
{
'description': 'Email',
'page_number': 1,
'label_bounding_box': [40, 20, 80,
40], # Overlaps with Name's boxes
'entry_bounding_box': [160, 10, 250, 30]
}
]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(
any('FAILURE' in msg and 'intersection' in msg
for msg in messages))
self.assertFalse(any('SUCCESS' in msg for msg in messages))
def test_different_pages_no_intersection(self):
"""Test that boxes on different pages don't count as intersecting"""
data = {
'form_fields': [
{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [60, 10, 150, 30]
},
{
'description': 'Email',
'page_number': 2,
'label_bounding_box':
[10, 10, 50, 30], # Same coordinates but different page
'entry_bounding_box': [60, 10, 150, 30]
}
]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(any('SUCCESS' in msg for msg in messages))
self.assertFalse(any('FAILURE' in msg for msg in messages))
def test_entry_height_too_small(self):
"""Test that entry box height is checked against font size"""
data = {
'form_fields': [{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [60, 10, 150, 20], # Height is 10
'entry_text': {
'font_size': 14 # Font size larger than height
}
}]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(
any('FAILURE' in msg and 'height' in msg for msg in messages))
self.assertFalse(any('SUCCESS' in msg for msg in messages))
def test_entry_height_adequate(self):
"""Test that adequate entry box height passes"""
data = {
'form_fields': [{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [60, 10, 150, 30], # Height is 20
'entry_text': {
'font_size': 14 # Font size smaller than height
}
}]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(any('SUCCESS' in msg for msg in messages))
self.assertFalse(any('FAILURE' in msg for msg in messages))
def test_default_font_size(self):
"""Test that default font size is used when not specified"""
data = {
'form_fields': [{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [60, 10, 150, 20], # Height is 10
'entry_text':
{} # No font_size specified, should use default 14
}]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(
any('FAILURE' in msg and 'height' in msg for msg in messages))
self.assertFalse(any('SUCCESS' in msg for msg in messages))
def test_no_entry_text(self):
"""Test that missing entry_text doesn't cause height check"""
data = {
'form_fields': [{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [60, 10, 150,
20] # Small height but no entry_text
}]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(any('SUCCESS' in msg for msg in messages))
self.assertFalse(any('FAILURE' in msg for msg in messages))
def test_multiple_errors_limit(self):
"""Test that error messages are limited to prevent excessive output"""
fields = []
# Create many overlapping fields
for i in range(25):
fields.append({
'description': f'Field{i}',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30], # All overlap
'entry_bounding_box': [20, 15, 60, 35] # All overlap
})
data = {'form_fields': fields}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
# Should abort after ~20 messages
self.assertTrue(any('Aborting' in msg for msg in messages))
# Should have some FAILURE messages but not hundreds
failure_count = sum(1 for msg in messages if 'FAILURE' in msg)
self.assertGreater(failure_count, 0)
self.assertLess(len(messages), 30) # Should be limited
def test_edge_touching_boxes(self):
"""Test that boxes touching at edges don't count as intersecting"""
data = {
'form_fields': [{
'description': 'Name',
'page_number': 1,
'label_bounding_box': [10, 10, 50, 30],
'entry_bounding_box': [50, 10, 150, 30] # Touches at x=50
}]
}
stream = self.create_json_stream(data)
messages = get_bounding_box_messages(stream)
self.assertTrue(any('SUCCESS' in msg for msg in messages))
self.assertFalse(any('FAILURE' in msg for msg in messages))
if __name__ == '__main__':
unittest.main()