File size: 3,825 Bytes
1d9bd9b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import os
import re
import sys
import unittest

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(HERE, "..", "scripts"))

from agent import resolve_case_reference


class FakeCorpus:
    def __init__(self):
        self.meta = {
            "babu-specific": {
                "case_name": "Babu Lal vs Hazari Lal Klshori Lal & Ors",
                "neutral_citation": "1982 INSC 11",
                "year": 1982,
            },
            "babu-other": {
                "case_name": "Babu Lal vs State Of Uttar Pradesh",
                "neutral_citation": "1964 INSC 40",
                "year": 1964,
            },
            "bachan-death": {
                "case_name": "Bachan Singh vs State Of Punjab",
                "neutral_citation": "1980 INSC 120",
                "year": 1980,
            },
            "bachan-service": {
                "case_name": "Bachan Singh & Anr vs Union Of India & Ors",
                "neutral_citation": "1972 INSC 85",
                "year": 1972,
            },
        }

    def is_retrieval_eligible(self, doc_id):
        return str(doc_id) in self.meta

    def _card(self, doc_id):
        return {"doc_id": str(doc_id), **self.meta[str(doc_id)]}

    @staticmethod
    def _normal(value):
        return re.sub(r"[^a-z0-9]+", " ", str(value).lower()).strip()

    def identity_hits(self, query):
        normalized = self._normal(query)
        for doc_id, item in self.meta.items():
            if normalized == self._normal(item["case_name"]):
                return [doc_id], "case name"
            if normalized == self._normal(item["neutral_citation"]):
                return [doc_id], "citation"
        return [], None

    def name_lookup(self, name, k=4):
        query_tokens = set(self._normal(name).split()) - {"v", "vs", "versus", "and", "anr", "ors"}
        ranked = []
        for doc_id, item in self.meta.items():
            title_tokens = set(self._normal(item["case_name"]).split())
            overlap = len(query_tokens & title_tokens)
            if overlap:
                ranked.append((overlap, doc_id))
        ranked.sort(reverse=True)
        return [self._card(doc_id) for _, doc_id in ranked[:k]]


class CaseReferenceResolutionTest(unittest.TestCase):
    def setUp(self):
        self.corpus = FakeCorpus()

    def test_full_party_title_resolves_without_vector_search(self):
        result = resolve_case_reference(
            self.corpus, "Babu Lal vs Hazari Lal Klshori Lal & Ors"
        )

        self.assertEqual(result["status"], "resolved")
        self.assertEqual(result["case"]["doc_id"], "babu-specific")

    def test_short_name_binds_to_active_case(self):
        result = resolve_case_reference(
            self.corpus, "Babu Lal", active_case_id="babu-specific"
        )

        self.assertEqual(result["status"], "resolved")
        self.assertEqual(result["source"], "active_case")

    def test_short_name_binds_to_unique_recent_result(self):
        result = resolve_case_reference(
            self.corpus, "Babu Lal", recent_case_ids=["babu-specific"]
        )

        self.assertEqual(result["status"], "resolved")
        self.assertEqual(result["source"], "recent_result")

    def test_fresh_ambiguous_name_requires_user_selection(self):
        result = resolve_case_reference(self.corpus, "Bachan Singh")

        self.assertEqual(result["status"], "ambiguous")
        self.assertGreaterEqual(len(result["candidates"]), 2)

    def test_missing_case_is_reported_as_not_found(self):
        result = resolve_case_reference(
            self.corpus, "Anne Besant National Girls High School"
        )

        self.assertEqual(result["status"], "not_found")
        self.assertEqual(result["candidates"], [])


if __name__ == "__main__":
    unittest.main()