File size: 1,974 Bytes
1b141db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 math
import unittest

from src.geometry import (
    calculate_site_metrics,
    normalize_map_state,
    polygon_area_local,
    polygon_perimeter_local,
)


class GeometryTests(unittest.TestCase):
    def test_local_polygon_area_and_perimeter(self):
        points = [(0, 0), (10, 0), (10, 5), (0, 5), (0, 0)]

        self.assertEqual(polygon_area_local(points), 50)
        self.assertEqual(polygon_perimeter_local(points), 30)

    def test_drawn_polygon_normalizes_to_site_selection(self):
        map_state = {
            "mode": "polygon",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [70.0, 21.0],
                        [70.002, 21.0],
                        [70.002, 21.002],
                        [70.0, 21.002],
                        [70.0, 21.0],
                    ]
                ],
            },
        }

        selection = normalize_map_state(map_state)

        self.assertEqual(selection.selection_type, "drawn_polygon")
        self.assertEqual(selection.coordinate_mode, "wgs84")
        self.assertIn("approximate", selection.accuracy_label)
        self.assertGreater(selection.area_sqm, 0)
        self.assertGreater(selection.perimeter_m, 0)

    def test_pin_radius_normalizes_to_site_selection(self):
        selection = normalize_map_state(
            {"mode": "pin_radius", "lat": 21.0, "lon": 70.0, "radius_m": 250}
        )

        self.assertEqual(selection.selection_type, "pin_radius")
        self.assertEqual(selection.radius_m, 250)
        self.assertAlmostEqual(selection.area_sqm, math.pi * 250 * 250, delta=1)
        self.assertIn("not exact", " ".join(selection.limitations))

    def test_calculate_site_metrics_rejects_empty_geometry(self):
        with self.assertRaises(ValueError):
            calculate_site_metrics({"type": "Polygon", "coordinates": []})


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