52 lines
2.7 KiB
Python
52 lines
2.7 KiB
Python
"""Synthetic OCR identity and malformed-result regressions; no desktop access."""
|
|
import unittest
|
|
from unittest import mock
|
|
import numpy as np
|
|
from session_name import NameReader, session_id_for
|
|
|
|
|
|
class VisualIdentityAuditTest(unittest.TestCase):
|
|
def test_different_customer_names_one_character_apart_stay_separate(self):
|
|
for first, second in (("客户甲@微信", "客户乙@微信"), ("小王@微信", "小李@微信"), ("会员0001", "会员0002"), ("王晓明", "王小明"), ("门店客服甲", "门店客服乙")):
|
|
with self.subTest(first=first, second=second):
|
|
reader = NameReader()
|
|
reader.remember(first)
|
|
normalized = reader.canonical(second)
|
|
self.assertEqual(normalized, second)
|
|
self.assertNotEqual(session_id_for(normalized), session_id_for(first))
|
|
|
|
def test_high_confidence_ocr_does_not_reuse_other_customers_history_key(self):
|
|
reader = NameReader()
|
|
with mock.patch.object(reader, "read_raw", side_effect=[("客户甲@微信", .99), ("客户乙@微信", .99)]):
|
|
first = reader.read(np.zeros((20, 80, 3), dtype=np.uint8), b"first-frame")
|
|
second = reader.read(np.zeros((20, 80, 3), dtype=np.uint8), b"second-frame")
|
|
self.assertNotEqual(session_id_for(first), session_id_for(second))
|
|
self.assertEqual(reader.known_names(), ["客户乙@微信", "客户甲@微信"])
|
|
|
|
def test_frequency_does_not_change_a_new_customers_identity(self):
|
|
reader = NameReader()
|
|
reader._known = {"客户甲@微信": 10000, "客户乙@微信": 2}
|
|
self.assertEqual(reader.canonical("客户丙@微信"), "客户丙@微信")
|
|
|
|
def test_non_finite_confidence_cannot_be_used_as_identity(self):
|
|
for score in (float("nan"), float("inf"), -float("inf"), 1.5):
|
|
with self.subTest(score=score):
|
|
reader = NameReader()
|
|
with mock.patch.object(reader, "read_raw", return_value=("客户甲", score)):
|
|
self.assertEqual(reader.read(np.zeros((20, 80, 3), dtype=np.uint8)), "")
|
|
|
|
def test_malformed_layout_item_does_not_drop_valid_following_item(self):
|
|
valid = [[[2, 2], [40, 2], [40, 18], [2, 18]], "消息", .99]
|
|
invalid = [
|
|
[[[float("inf"), 2], [40, 2], [40, 18], [2, 18]], "broken box", .99],
|
|
[[[2, 2], [40, 2], [40, 18], [2, 18]], "bad score", float("nan")],
|
|
[[[2, 2], [40, 2], [40, 18], [2, 18]], "impossible score", 1.5],
|
|
]
|
|
reader = NameReader()
|
|
reader._engine = mock.Mock(return_value=(invalid + [valid], None))
|
|
self.assertEqual([item["text"] for item in reader.read_layout(np.zeros((30, 60, 3), dtype=np.uint8))], ["消息"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|