"""Integration tests for template and signature dataset discovery against the real bundled assets.""" from __future__ import annotations from src.signatures.signature_dataset import SignatureDataset from src.templates.template_loader import TemplateLoader import numpy as np def test_template_loader_discovers_all_nine_templates(image_dir, annotations_dir): loader = TemplateLoader(image_dir, annotations_dir) templates = loader.discover() assert len(templates) == 9 assert set(templates.keys()) == {f"bank_doc_{i:02d}" for i in range(1, 10)} def test_every_template_has_at_least_one_valid_signature_box(image_dir, annotations_dir): loader = TemplateLoader(image_dir, annotations_dir) for template_id in loader.list_ids(): template = loader.get(template_id) page = template.annotation.pages[0] assert len(page.signature_boxes) >= 1 for box in page.signature_boxes: assert box.x2 > box.x1 assert box.y2 > box.y1 # Box must lie within the annotated page bounds. assert 0 <= box.x1 and box.x2 <= page.page_size[0] assert 0 <= box.y1 and box.y2 <= page.page_size[1] def test_template_loader_random_template_is_deterministic(image_dir, annotations_dir): loader = TemplateLoader(image_dir, annotations_dir) t1 = loader.random_template(np.random.default_rng(123)) t2 = loader.random_template(np.random.default_rng(123)) assert t1.template_id == t2.template_id def test_signature_dataset_discovers_bundled_dataset(dataset_dir): ds = SignatureDataset(dataset_dir) records = ds.discover() assert len(records) > 0 assert any(r.source_type == "genuine" for r in records) assert any(r.source_type == "forged" for r in records) def test_signature_dataset_source_filter(dataset_dir): ds = SignatureDataset(dataset_dir) rng = np.random.default_rng(0) for _ in range(20): record = ds.sample(rng, source_filter="genuine") assert record.source_type == "genuine" def test_signature_dataset_sample_is_deterministic(dataset_dir): ds = SignatureDataset(dataset_dir) r1 = ds.sample(np.random.default_rng(55), source_filter="any") r2 = ds.sample(np.random.default_rng(55), source_filter="any") assert r1.signature_id == r2.signature_id def test_signature_dataset_discovers_multi_script_named_signers(dataset_dir): """dataset/metadata.csv associates dataset/hindi_bengali/*.png with real named, scripted identities (see dataset/hindi_bengali/) alongside the anonymous CEDAR pool.""" ds = SignatureDataset(dataset_dir) by_group = {} for r in ds.discover(): if "hindi_bengali" in r.path.as_posix(): by_group.setdefault(r.signer_group, set()).add(r.script) expected = { "Priya Sharma": {"hindi"}, "Raj Malhotra": {"hindi"}, "Vikram Singh": {"hindi"}, "Suman Das": {"bengali"}, "Anika Roy": {"bengali"}, "Carol Wong": {"latin"}, "Henry Ooi": {"latin"}, } assert by_group == expected for name in expected: assert ds.script_for_group(name) == next(iter(expected[name])) def test_default_script_for_unlabeled_records_is_latin(dataset_dir): ds = SignatureDataset(dataset_dir) cedar_records = [r for r in ds.discover() if "hindi_bengali" not in r.path.as_posix()] assert all(r.script == "latin" for r in cedar_records)