File size: 3,399 Bytes
1a12965
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
"""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)