-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_models.py
More file actions
137 lines (112 loc) · 4.14 KB
/
test_models.py
File metadata and controls
137 lines (112 loc) · 4.14 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
"""Test cases for the Spiral model."""
import datetime
import pandas as pd
import pytest
from graphomotor.core import models
def test_valid_spiral_creation(
valid_spiral_data: pd.DataFrame,
valid_spiral_metadata: dict[str, str | datetime.datetime],
) -> None:
"""Test creating a valid Drawing instance."""
spiral = models.Drawing(
data=valid_spiral_data,
task_name="spiral_drawing",
metadata=valid_spiral_metadata,
)
assert spiral.data.equals(valid_spiral_data)
assert spiral.metadata == valid_spiral_metadata
assert spiral.task_name == "spiral_drawing"
def test_empty_dataframe(
valid_spiral_metadata: dict[str, str | datetime.datetime],
) -> None:
"""Test validation error when DataFrame is empty."""
empty_data = pd.DataFrame(
columns=["line_number", "x", "y", "UTC_Timestamp", "seconds"]
)
with pytest.raises(ValueError, match="DataFrame is empty"):
models.Drawing(
data=empty_data, task_name="spiral", metadata=valid_spiral_metadata
)
@pytest.mark.parametrize(
"key,invalid_value,expected_error",
[
("id", "1001", "'id' must start with digit 5"),
("id", "512345", "'id' must be 7 digits long"),
],
)
def test_invalid_metadata_values(
valid_spiral_data: pd.DataFrame,
valid_spiral_metadata: dict[str, str | datetime.datetime],
key: str,
invalid_value: str | datetime.datetime,
expected_error: str,
) -> None:
"""Test validation errors for various invalid metadata values."""
invalid_metadata = valid_spiral_metadata.copy()
invalid_metadata[key] = invalid_value
with pytest.raises(ValueError, match=expected_error):
models.Drawing(
data=valid_spiral_data, task_name="spiral", metadata=invalid_metadata
)
@pytest.fixture
def circle() -> models.CircleTarget:
"""Create a standard circle at origin with radius 10."""
return models.CircleTarget(
order=1, label="test_circle", center_x=0.0, center_y=0.0, radius=10.0
)
@pytest.mark.parametrize(
"x,y,description",
[
(0.0, 0.0, "center"),
(10.0, 0.0, "right edge"),
(0.0, 10.0, "top edge"),
(-10.0, 0.0, "left edge"),
(0.0, -10.0, "bottom edge"),
(5.0, 0.0, "inside horizontally"),
(0.0, 5.0, "inside vertically"),
],
)
def test_point_inside_circle(
circle: models.CircleTarget,
x: float,
y: float,
description: str,
) -> None:
"""Point at center, on edge, or just inside should be contained."""
assert circle.contains_point(x, y)
def test_point_outside_with_default_tolerance(circle: models.CircleTarget) -> None:
"""Point outside default tolerance boundary should not be contained."""
assert not circle.contains_point(16.0, 0.0)
assert not circle.contains_point(0.0, 16.0)
def test_path_optimality_positive() -> None:
"""Test case for path optimality with positive optimal distance."""
start = models.CircleTarget(order=1, label="1", center_x=0, center_y=0, radius=1)
end = models.CircleTarget(order=2, label="2", center_x=10, center_y=0, radius=1)
segment = models.LineSegment(
start_label="1",
end_label="2",
points=pd.DataFrame(),
is_error=False,
line_number=1,
distance=8,
)
expected_optimal_distance = (
end.center_x - start.center_x - start.radius - end.radius
)
expected_path_optimality = expected_optimal_distance / segment.distance
segment.calculate_path_optimality(start, end)
assert segment.path_optimality == expected_path_optimality
def test_path_optimality_non_positive_distance() -> None:
"""Test case where optimal distance is zero or negative, so no assignment occurs."""
start = models.CircleTarget(order=1, label="1", center_x=0, center_y=0, radius=5)
end = models.CircleTarget(order=2, label="2", center_x=8, center_y=0, radius=5)
segment = models.LineSegment(
start_label="1",
end_label="2",
points=pd.DataFrame(),
is_error=False,
line_number=1,
distance=5,
)
segment.calculate_path_optimality(start, end)
assert segment.path_optimality == 0.0