import unittest from PIL import Image, ImageDraw from grounding_demo.protocol import Primitive from grounding_demo.render import draw_primitives, layout_box_labels, _font, PURPLE class RenderRegression(unittest.TestCase): def test_chinese_and_mixed_text_have_real_glyphs(self): font = _font(24, "中文 OCR:姓名,日期(2026年)") missing = bytes(font.getmask("\u0378")) masks = [] for char in "姓名出生日期地址簡體繁體,:()": with self.subTest(char=char): mask = bytes(font.getmask(char)) self.assertNotEqual(mask, missing) self.assertTrue(any(mask)) masks.append(mask) self.assertEqual(len(set(masks[:6])), 6) def test_chinese_badges_measure_and_draw_with_the_same_font(self): text = "中文 OCR:测试标签 2026年(示例)" primitives = [Primitive(text, (100, 300, 800, 500))] badge = layout_box_labels(primitives, 1000, 700, _font(20))[0] self.assertEqual(badge["text"], text) expected = ImageDraw.Draw(Image.new("RGB", (1, 1))).textbbox( (0, 0), text, font=_font(20, text) ) self.assertEqual(badge["text_bounds"], expected) x1, y1, x2, y2 = badge["box"] self.assertEqual(x2-x1, expected[2]-expected[0]+8) self.assertEqual(y2-y1, expected[3]-expected[1]+8) rendered = draw_primitives(Image.new("RGB", (1000, 700), "white"), primitives) self.assertEqual(rendered.size, (1000, 700)) def test_long_chinese_badges_stay_inside_canvas_without_changing_text_data(self): text = "这是一段很长的中文识别结果,包含标点和 English 2026。"*4 primitive = Primitive(text, (900, 0, 999, 999)) badges = layout_box_labels([primitive], 140, 120, _font(18)) self.assertEqual(len(badges), 1) badge = badges[0] self.assertEqual(badge["label"], text) self.assertTrue(badge["text"].endswith("…")) x1,y1,x2,y2 = badge["box"] self.assertTrue(0<=x1