Skip to content

Commit a705bb0

Browse files
TST: adds more unit tests to the codebase
1 parent 26834dc commit a705bb0

File tree

7 files changed

+244
-2
lines changed

7 files changed

+244
-2
lines changed

tests/fixtures/surfaces/surface_fixtures.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import pytest
22

3-
from rocketpy import NoseCone, RailButtons, Tail, TrapezoidalFins
4-
from rocketpy.rocket.aero_surface.fins.free_form_fins import FreeFormFins
3+
from rocketpy.rocket.aero_surface import (
4+
EllipticalFins,
5+
FreeFormFins,
6+
NoseCone,
7+
RailButtons,
8+
Tail,
9+
TrapezoidalFins,
10+
)
511

612

713
@pytest.fixture
@@ -94,3 +100,16 @@ def calisto_rail_buttons():
94100
angular_position=45,
95101
name="Rail Buttons",
96102
)
103+
104+
105+
@pytest.fixture
106+
def elliptical_fin_set():
107+
return EllipticalFins(
108+
n=4,
109+
span=0.100,
110+
root_chord=0.120,
111+
rocket_radius=0.0635,
112+
cant_angle=0,
113+
airfoil=None,
114+
name="Test Elliptical Fins",
115+
)

tests/unit/test_aero_surfaces.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest.mock import patch
2+
13
import pytest
24

35
from rocketpy import NoseCone
@@ -71,3 +73,65 @@ def test_powerseries_nosecones_setters(power, invalid_power, new_power):
7173
expected_k = (2 * new_power) / ((2 * new_power) + 1)
7274

7375
assert pytest.approx(test_nosecone.k) == expected_k
76+
77+
78+
@patch("matplotlib.pyplot.show")
79+
def test_elliptical_fins_draw(mock_show, elliptical_fin_set):
80+
assert elliptical_fin_set.plots.draw(filename=None) is None
81+
82+
83+
def test_nose_cone_info(calisto_nose_cone):
84+
assert calisto_nose_cone.info() is None
85+
86+
87+
@patch("matplotlib.pyplot.show")
88+
def test_nose_cone_draw(mock_show, calisto_nose_cone):
89+
assert calisto_nose_cone.draw(filename=None) is None
90+
91+
92+
def test_trapezoidal_fins_info(calisto_trapezoidal_fins):
93+
assert calisto_trapezoidal_fins.info() is None
94+
95+
96+
def test_trapezoidal_fins_tip_chord_setter(calisto_trapezoidal_fins):
97+
calisto_trapezoidal_fins.tip_chord = 0.1
98+
assert calisto_trapezoidal_fins.tip_chord == 0.1
99+
100+
101+
def test_trapezoidal_fins_root_chord_setter(calisto_trapezoidal_fins):
102+
calisto_trapezoidal_fins.root_chord = 0.1
103+
assert calisto_trapezoidal_fins.root_chord == 0.1
104+
105+
106+
def test_trapezoidal_fins_sweep_angle_setter(calisto_trapezoidal_fins):
107+
calisto_trapezoidal_fins.sweep_angle = 0.1
108+
assert calisto_trapezoidal_fins.sweep_angle == 0.1
109+
110+
111+
def test_trapezoidal_fins_sweep_length_setter(calisto_trapezoidal_fins):
112+
calisto_trapezoidal_fins.sweep_length = 0.1
113+
assert calisto_trapezoidal_fins.sweep_length == 0.1
114+
115+
116+
def test_tail_info(calisto_tail):
117+
assert calisto_tail.info() is None
118+
119+
120+
def test_tail_length_setter(calisto_tail):
121+
calisto_tail.length = 0.1
122+
assert calisto_tail.length == 0.1
123+
124+
125+
def test_tail_rocket_radius_setter(calisto_tail):
126+
calisto_tail.rocket_radius = 0.1
127+
assert calisto_tail.rocket_radius == 0.1
128+
129+
130+
def test_tail_bottom_radius_setter(calisto_tail):
131+
calisto_tail.bottom_radius = 0.1
132+
assert calisto_tail.bottom_radius == 0.1
133+
134+
135+
def test_tail_top_radius_setter(calisto_tail):
136+
calisto_tail.top_radius = 0.1
137+
assert calisto_tail.top_radius == 0.1

tests/unit/test_flight_time_nodes.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,13 @@ def test_time_node_lt(flight_calisto):
9999
node2 = flight_calisto.TimeNodes.TimeNode(2.0, [], [], [])
100100
assert node1 < node2
101101
assert not node2 < node1
102+
103+
104+
def test_time_node_repr(flight_calisto):
105+
node = flight_calisto.TimeNodes.TimeNode(1.0, [], [], [])
106+
assert isinstance(repr(node), str)
107+
108+
109+
def test_time_nodes_repr(flight_calisto):
110+
time_nodes = flight_calisto.TimeNodes()
111+
assert isinstance(repr(time_nodes), str)

tests/unit/test_tank.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
from math import isclose
22
from pathlib import Path
3+
from unittest.mock import patch
34

45
import numpy as np
56
import pytest
67
import scipy.integrate as spi
78

9+
from rocketpy.motors import TankGeometry
10+
811
BASE_PATH = Path("./data/rockets/berkeley/")
912

1013

@@ -355,3 +358,8 @@ def expected_gas_inertia(t):
355358
atol=1e-3,
356359
rtol=1e-2,
357360
)
361+
362+
363+
@patch("matplotlib.pyplot.show")
364+
def test_tank_geometry_plots_info(mock_show):
365+
assert TankGeometry({(0, 5): 1}).plots.all() is None

tests/unit/test_tools.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
euler313_to_quaternions,
77
find_roots_cubic_function,
88
haversine,
9+
tuple_handler,
910
)
1011

1112

@@ -72,3 +73,30 @@ def test_cardanos_root_finding():
7273
def test_haversine(lat0, lon0, lat1, lon1, expected_distance):
7374
distance = haversine(lat0, lon0, lat1, lon1)
7475
assert np.isclose(distance, expected_distance, rtol=1e-2)
76+
77+
78+
@pytest.mark.parametrize(
79+
"input_value, expected_output",
80+
[
81+
(5, (0, 5)),
82+
(3.5, (0, 3.5)),
83+
([7], (0, 7)),
84+
((8,), (0, 8)),
85+
([2, 4], (2, 4)),
86+
((1, 3), (1, 3)),
87+
],
88+
)
89+
def test_tuple_handler(input_value, expected_output):
90+
assert tuple_handler(input_value) == expected_output
91+
92+
93+
@pytest.mark.parametrize(
94+
"input_value, expected_exception",
95+
[
96+
([1, 2, 3], ValueError),
97+
((4, 5, 6), ValueError),
98+
],
99+
)
100+
def test_tuple_handler_exceptions(input_value, expected_exception):
101+
with pytest.raises(expected_exception):
102+
tuple_handler(input_value)

tests/unit/test_units.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import pytest
2+
3+
from rocketpy.units import (
4+
conversion_factor,
5+
convert_temperature,
6+
convert_units,
7+
)
8+
9+
10+
class TestConvertTemperature:
11+
def test_convert_temperature_same_unit(self):
12+
assert convert_temperature(300, "K", "K") == 300
13+
assert convert_temperature(27, "degC", "degC") == 27
14+
assert convert_temperature(80, "degF", "degF") == 80
15+
16+
def test_convert_temperature_K_to_degC(self):
17+
assert convert_temperature(300, "K", "degC") == pytest.approx(26.85, rel=1e-2)
18+
19+
def test_convert_temperature_K_to_degF(self):
20+
assert convert_temperature(300, "K", "degF") == pytest.approx(80.33, rel=1e-2)
21+
22+
def test_convert_temperature_degC_to_K(self):
23+
assert convert_temperature(27, "degC", "K") == pytest.approx(300.15, rel=1e-2)
24+
25+
def test_convert_temperature_degC_to_degF(self):
26+
assert convert_temperature(27, "degC", "degF") == pytest.approx(80.6, rel=1e-2)
27+
28+
def test_convert_temperature_degF_to_K(self):
29+
assert convert_temperature(80, "degF", "K") == pytest.approx(299.817, rel=1e-2)
30+
31+
def test_convert_temperature_degF_to_degC(self):
32+
assert convert_temperature(80, "degF", "degC") == pytest.approx(26.67, rel=1e-2)
33+
34+
def test_convert_temperature_invalid_conversion(self):
35+
with pytest.raises(ValueError):
36+
convert_temperature(300, "K", "invalid_unit")
37+
with pytest.raises(ValueError):
38+
convert_temperature(300, "invalid_unit", "K")
39+
40+
41+
class TestConversionFactor:
42+
def test_conversion_factor_same_unit(self):
43+
assert conversion_factor("m", "m") == 1
44+
assert conversion_factor("ft", "ft") == 1
45+
assert conversion_factor("s", "s") == 1
46+
47+
def test_conversion_factor_m_to_ft(self):
48+
assert conversion_factor("m", "ft") == pytest.approx(3.28084, rel=1e-2)
49+
50+
def test_conversion_factor_ft_to_m(self):
51+
assert conversion_factor("ft", "m") == pytest.approx(0.3048, rel=1e-2)
52+
53+
def test_conversion_factor_s_to_min(self):
54+
assert conversion_factor("s", "min") == pytest.approx(1 / 60, rel=1e-2)
55+
56+
def test_conversion_factor_min_to_s(self):
57+
assert conversion_factor("min", "s") == pytest.approx(60, rel=1e-2)
58+
59+
def test_conversion_factor_invalid_conversion(self):
60+
with pytest.raises(ValueError):
61+
conversion_factor("m", "invalid_unit")
62+
with pytest.raises(ValueError):
63+
conversion_factor("invalid_unit", "m")
64+
65+
66+
class TestConvertUnits:
67+
def test_convert_units_same_unit(self):
68+
assert convert_units(300, "K", "K") == 300
69+
assert convert_units(27, "degC", "degC") == 27
70+
assert convert_units(80, "degF", "degF") == 80
71+
72+
def test_convert_units_K_to_degC(self):
73+
assert convert_units(300, "K", "degC") == pytest.approx(26.85, rel=1e-2)
74+
75+
def test_convert_units_K_to_degF(self):
76+
assert convert_units(300, "K", "degF") == pytest.approx(80.33, rel=1e-2)
77+
78+
def test_convert_units_kilogram_to_pound(self):
79+
assert convert_units(1, "kg", "lb") == pytest.approx(2.20462, rel=1e-2)
80+
81+
def test_convert_units_kilometer_to_mile(self):
82+
assert convert_units(1, "km", "mi") == pytest.approx(0.621371, rel=1e-2)

tests/unit/test_utilities.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,34 @@ def test_get_instance_attributes(flight_calisto_robust):
178178
assert np.allclose(attr, value)
179179
else:
180180
assert attr == value
181+
182+
183+
@pytest.mark.parametrize(
184+
"f, eps, expected",
185+
[
186+
([1.0, 1.0, 1.0, 2.0, 3.0], 1e-6, 0),
187+
([1.0, 1.0, 1.0, 2.0, 3.0], 1e-1, 0),
188+
([1.0, 1.1, 1.2, 2.0, 3.0], 1e-1, None),
189+
([1.0, 1.0, 1.0, 1.0, 1.0], 1e-6, 0),
190+
([1.0, 1.0, 1.0, 1.0, 1.0], 1e-1, 0),
191+
([1.0, 1.0, 1.0], 1e-6, 0),
192+
([1.0, 1.0], 1e-6, None),
193+
([1.0], 1e-6, None),
194+
([], 1e-6, None),
195+
],
196+
)
197+
def test_check_constant(f, eps, expected):
198+
"""Test if the function `check_constant` returns the correct index or None
199+
for different scenarios.
200+
201+
Parameters
202+
----------
203+
f : list or array
204+
A list or array of numerical values.
205+
eps : float
206+
The tolerance level for comparing the elements.
207+
expected : int or None
208+
The expected result of the function.
209+
"""
210+
result = utilities.check_constant(f, eps)
211+
assert result == expected

0 commit comments

Comments
 (0)