Skip to content

Commit ddddb4c

Browse files
authored
Merge pull request #2 from GeoMop/nodianosh-pytest
napsl funce pro generovani distence a pridal unit testynapsane na pytest
2 parents 999f841 + ac33558 commit ddddb4c

8 files changed

Lines changed: 105 additions & 61 deletions

File tree

field_synthesis/assign_source_fields/assign_source_fields.py renamed to field_synthesis/functions/assign_source_fields.py

File renamed without changes.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import math
2+
3+
def calc_distance(count_points: int, area_size: float, free_space_ratio: float = 0.4) -> float:
4+
"""
5+
Odhadne optimální minimální vzdálenost bodů ve 2D prostoru
6+
s ohledem na procento požadovaného volného prostoru.
7+
"""
8+
if count_points <= 0 or area_size <= 0:
9+
return 0.0
10+
11+
total_area = area_size ** 2
12+
occupied_ratio = 1.0 - free_space_ratio
13+
occupied_area = total_area * occupied_ratio
14+
15+
area_per_point = occupied_area / count_points
16+
17+
min_distance = math.sqrt(area_per_point)
18+
19+
return min_distance

field_synthesis/generate_anchor_points/generate_anchor_points.py renamed to field_synthesis/functions/generate_points.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from scipy.stats.qmc import PoissonDisk
22
import numpy as np
33

4-
def generate_anchor_points(count_points, min_distance, area_size):
4+
def generate_points(count_points, min_distance, area_size):
55
"""
66
Funkce vygeneruje pole nahodnych bodu.
77

field_synthesis/generate_anchor_points/test_generate_anchor_points.py

Lines changed: 0 additions & 58 deletions
This file was deleted.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import pytest
2+
import numpy as np
3+
from field_synthesis.functions.assign_source_fields import assign_source_fields
4+
5+
def test_assign_source_fields_valid():
6+
"""Testuje správné hranice náhodných indexů a délku výstupu."""
7+
anchor_points = np.array([[1, 1], [2, 2], [3, 3], [4, 4]])
8+
num_fields = 3
9+
10+
result = assign_source_fields(anchor_points, num_fields)
11+
12+
assert len(result) == len(anchor_points)
13+
assert np.issubdtype(result.dtype, np.integer)
14+
# Indexy musí být 0, 1 nebo 2 (menší než num_fields)
15+
assert np.all(result >= 0)
16+
assert np.all(result < num_fields)
17+
18+
@pytest.mark.parametrize("anchors, fields", [
19+
(np.array([]), 5), # Prázdné pole bodů
20+
(np.array([[1, 1]]), 0), # Nula zdrojových polí
21+
(np.array([[1, 1]]), -1) # Záporný počet polí
22+
])
23+
def test_assign_source_fields_invalid(anchors, fields):
24+
"""Testuje okrajové případy a neplatné vstupy."""
25+
result = assign_source_fields(anchors, fields)
26+
27+
assert isinstance(result, np.ndarray)
28+
assert len(result) == 0
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import pytest
2+
import math
3+
from field_synthesis.functions.calc_distance import calc_distance
4+
5+
def test_estimate_distance_standard():
6+
"""Testuje standardní výpočet se 40% volným prostorem."""
7+
# 50 bodů, plocha 100x100 (10000), 60% obsazeno = 6000. 6000/50 = 120. Odmocnina z 120 je cca 10.954
8+
result = calc_distance(50, 100.0, 0.4)
9+
assert math.isclose(result, 10.95445, rel_tol=1e-4)
10+
11+
@pytest.mark.parametrize("points, area, free_space, expected", [
12+
(10, 50.0, 0.5, 11.1803),
13+
(100, 10.0, 0.1, 0.9486)
14+
])
15+
def test_estimate_distance_parametrized(points, area, free_space, expected):
16+
"""Testuje různé poměry a velikosti."""
17+
result = calc_distance(points, area, free_space)
18+
assert math.isclose(result, expected, rel_tol=1e-4)
19+
20+
def test_estimate_distance_invalid_inputs():
21+
"""Testuje chování při neplatných vstupech (nula nebo záporná čísla)."""
22+
assert calc_distance(0, 100.0, 0.4) == 0.0
23+
assert calc_distance(10, 0.0, 0.4) == 0.0
24+
assert calc_distance(-5, 100.0, 0.4) == 0.0
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import numpy as np
2+
from field_synthesis.functions.generate_points import generate_points
3+
4+
def test_generate_points_shape():
5+
"""Testuje, zda funkce vrací 2D pole se správným tvarem."""
6+
points = generate_points(count_points=20, min_distance=2.0, area_size=50.0)
7+
8+
assert isinstance(points, np.ndarray)
9+
assert points.shape[1] == 2 # Musí mít x a y souřadnice
10+
assert len(points) <= 20 # PoissonDisk nemusí vždy vygenerovat maximum bodů
11+
12+
def test_generate_points_invalid_inputs():
13+
"""Testuje pojistky proti nulovým a záporným hodnotám."""
14+
# Očekáváme prázdné 2D pole: tvar (0, 2)
15+
empty_result = np.zeros((0, 2))
16+
17+
result_zero_points = generate_points(0, 5.0, 50.0)
18+
result_zero_area = generate_points(10, 5.0, 0.0)
19+
20+
np.testing.assert_array_equal(result_zero_points, empty_result)
21+
np.testing.assert_array_equal(result_zero_area, empty_result)
22+
23+
def test_generate_points_bounds():
24+
"""Testuje, zda všechny vygenerované body leží uvnitř zadané oblasti."""
25+
area = 50.0
26+
points = generate_points(10, 2.0, area)
27+
28+
# Žádná souřadnice nesmí být menší než 0 nebo větší než area_size
29+
assert np.all(points >= 0.0)
30+
assert np.all(points <= area)

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
numpy
2-
scipy
1+
numpy>=2.0.0
2+
scipy>=1.14.0
3+
pytest

0 commit comments

Comments
 (0)