File size: 2,678 Bytes
b510add
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import unittest
from app import postprocess


class TestPostprocess(unittest.TestCase):
    def test_all_three_fields_consistent(self):
        recognized = [
            {"field": "prix", "text": "10000", "confidence": 0.98},
            {"field": "volume", "text": "14,28", "confidence": 0.95},
            {"field": "prix_litre", "text": "700", "confidence": 0.90},
        ]
        res = postprocess.process(recognized, fuel_price=700)
        self.assertEqual(res["detected_amount"], 10000.0)
        self.assertAlmostEqual(res["detected_liters"], 14.28, places=2)
        self.assertEqual(res["fuel_price"], 700.0)
        self.assertTrue(res["is_consistent"])

    def test_configured_fuel_price_overrides_screen_reading(self):
        # Le prix configuré côté YELY doit toujours l'emporter sur celui lu
        # à l'écran, même si le CRNN lit une valeur différente (mauvaise
        # lecture ou écran mal calibré) — règle métier n°1.
        recognized = [
            {"field": "prix", "text": "10000", "confidence": 0.98},
            {"field": "volume", "text": "14.28", "confidence": 0.95},
            {"field": "prix_litre", "text": "650", "confidence": 0.40},
        ]
        res = postprocess.process(recognized, fuel_price=700)
        self.assertEqual(res["fuel_price"], 700.0)

    def test_liters_only_computes_amount(self):
        recognized = [{"field": "volume", "text": "20.00", "confidence": 0.9}]
        res = postprocess.process(recognized, fuel_price=875)
        self.assertAlmostEqual(res["detected_liters"], 20.0, places=2)
        self.assertIsNone(res["detected_amount"])
        self.assertEqual(res["calculated_amount"], 17500.0)

    def test_amount_only_computes_liters(self):
        recognized = [{"field": "prix", "text": "10000", "confidence": 0.9}]
        res = postprocess.process(recognized, fuel_price=875)
        self.assertIsNone(res["detected_liters"])
        self.assertEqual(res["detected_amount"], 10000.0)
        self.assertAlmostEqual(res["calculated_liters"], 11.43, places=2)

    def test_inconsistent_values_detected(self):
        recognized = [
            {"field": "prix", "text": "10000", "confidence": 0.9},
            {"field": "volume", "text": "20.00", "confidence": 0.9},
        ]
        res = postprocess.process(recognized, fuel_price=875)
        self.assertFalse(res["is_consistent"])

    def test_no_recognized_fields(self):
        res = postprocess.process([], fuel_price=875)
        self.assertEqual(res["raw_numbers"], [])
        self.assertIsNone(res["detected_liters"])
        self.assertIsNone(res["detected_amount"])


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