Skip to content

Commit a434ab5

Browse files
Merge pull request #145 from marcostfermin/pr/modified-tests
Expand test coverage for electricpy, circle, and triangle modules
2 parents 68a6972 + e3136b7 commit a434ab5

3 files changed

Lines changed: 275 additions & 3 deletions

File tree

test/test_circle.py

Lines changed: 130 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import cmath
2-
from electricpy.geometry.circle import Circle
2+
import math
3+
import pytest
4+
5+
import electricpy.geometry.circle as circle_mod
6+
from electricpy.geometry.circle import Circle, construct
37
from electricpy.geometry import Line, Point
48

59

@@ -80,3 +84,128 @@ def test_1(self):
8084

8185
assert compare_lines(c.normal(p0), Line(1, -1, 0))
8286
assert compare_lines(c.normal(p1), Line(1, 1, 0))
87+
88+
89+
def test_contains_point_and_tangent_validation():
90+
c = Circle((0, 0), 2)
91+
assert c.contains_point(Point(2, 0))
92+
with pytest.raises(ValueError):
93+
c.tangent(Point(1, 1))
94+
assert c.tangent(Point(1, 1), require_on_circle=False) == Line(1, 1, -4)
95+
96+
assert c.power(Point(0, 0)) == -4
97+
assert c.power(Point(2, 0)) == 0
98+
assert c.is_tangent(Line(1, 0, -2))
99+
assert not c.is_tangent(Line(1, 0, -3))
100+
assert c.is_normal(Line(1, 0, 0))
101+
assert not c.is_normal(Line(1, 0, -1))
102+
103+
104+
def test_equation_and_parametric_errors():
105+
c = Circle((1, 2), 3)
106+
eq = c.equation()
107+
assert "x^2 + y^2" in eq
108+
assert " - 2*x" in eq
109+
assert " - 4*y" in eq
110+
assert " - 4" in eq
111+
assert c.radius == 3
112+
113+
with pytest.raises(ValueError):
114+
list(c.parametric_equation(theta_resolution=0))
115+
with pytest.raises(ValueError):
116+
list(c.parametric_equation(theta_resolution=-0.1))
117+
118+
points = list(c.parametric_equation(theta_resolution=math.pi))
119+
assert points[0] == (4.0, 2.0)
120+
assert points[-1][0] == pytest.approx(4.0)
121+
semi = list(c.parametric_equation(theta_resolution=math.pi / 2, semi=True))
122+
assert semi[0] == (4.0, 2.0)
123+
assert semi[-1][0] == pytest.approx(-2.0)
124+
125+
eq_no_linear = Circle((0, 0), math.pi).equation()
126+
assert "x^2 + y^2" in eq_no_linear
127+
assert "*x" not in eq_no_linear
128+
assert "*y" not in eq_no_linear
129+
assert " - " in eq_no_linear
130+
131+
eq_float = Circle((0.3, 0), 1).equation()
132+
assert " - 0.6*x" in eq_float
133+
134+
135+
def test_sector_and_intersection_cases():
136+
c1 = Circle((0, 0), 1)
137+
c2 = Circle((2, 0), 1)
138+
assert c1.sector_length(cmath.pi) == cmath.pi
139+
assert c1.sector_area(cmath.pi) == cmath.pi / 2
140+
inter = c1.intersection(c2)
141+
assert isinstance(inter, Point)
142+
assert c1.intersetion(c2) == inter
143+
144+
assert c1.intersection(Circle((0, 0), 1)) == "infinite"
145+
assert c1.intersection(Circle((0, 0), 2)) is None
146+
assert c1.intersection(Circle((5, 0), 1)) is None
147+
assert c1.intersection(Circle((0.5, 0), 5)) is None
148+
149+
two = c1.intersection(Circle((1, 0), 1))
150+
assert isinstance(two, tuple)
151+
assert len(two) == 2
152+
assert c1.contains_point(two[0])
153+
assert c1.contains_point(two[1])
154+
155+
with pytest.raises(TypeError):
156+
c1.intersection("not-a-circle")
157+
158+
near_tangent = c1.intersection(Circle((2 + 1e-6, 0), 1), tol=1e-5)
159+
assert isinstance(near_tangent, Point)
160+
161+
assert c1.intersection(Circle((2.5, 0), 1), tol=0.5) is None
162+
163+
164+
def test_construct_circle():
165+
p0 = Point(1, 0)
166+
p1 = Point(0, 1)
167+
p2 = Point(-1, 0)
168+
circ = construct(p0, p1, p2)
169+
assert circ.contains_point(p1)
170+
171+
with pytest.raises(AssertionError):
172+
construct(Point(0, 0), Point(1, 1), Point(2, 2))
173+
174+
175+
def test_point_coercion_and_repr():
176+
pt = circle_mod._as_point((1, 2))
177+
assert isinstance(pt, Point)
178+
assert pt == Point(1, 2)
179+
pt = circle_mod._as_point([3, 4])
180+
assert pt == Point(3, 4)
181+
pt = circle_mod._as_point(Point(5, 6))
182+
assert pt == Point(5, 6)
183+
184+
with pytest.raises(ValueError):
185+
circle_mod._as_point((1, 2, 3))
186+
with pytest.raises(TypeError):
187+
circle_mod._as_point("bad")
188+
189+
assert circle_mod._is_close(1.0, 1.0 + 1e-10)
190+
assert not circle_mod._is_close(1.0, 1.1, rel_tol=1e-6, abs_tol=1e-6)
191+
192+
circle = Circle((0, 0), 1)
193+
assert repr(circle) == "Circle(center=(0.0, 0.0), radius=1.0)"
194+
assert str(circle) == "Circle(center=(0.0, 0.0), radius=1.0)"
195+
assert circle == Circle((0, 0), 1)
196+
assert circle != Circle((0, 0), 2)
197+
assert circle != "not-a-circle"
198+
assert hash(circle) == hash((0.0, 0.0, 1.0))
199+
200+
201+
def test_circle_init_validation_and_normal_error():
202+
with pytest.raises(TypeError):
203+
Circle((0, 0), "bad")
204+
with pytest.raises(ValueError):
205+
Circle((0, 0), -1)
206+
with pytest.raises(TypeError):
207+
Circle("bad", 1)
208+
209+
circle = Circle((1, 1), 1)
210+
with pytest.raises(ValueError):
211+
circle.normal(Point(1, 1))

test/test_electricpy.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
# Electricpy Imports
66
from electricpy import powerflow
77
from electricpy import phasor
8+
from electricpy import reactance
9+
from electricpy import tcycle
810
from electricpy.passive import air_core_inductance
911

1012
def test_bridge_impedance():
@@ -453,4 +455,14 @@ def test_1(self):
453455
self.turn = 251
454456

455457
expected_result = 0.42755
456-
self.check_result(expected_result)
458+
self.check_result(expected_result)
459+
460+
461+
def test_tcycle_validation():
462+
with pytest.raises(ValueError):
463+
tcycle(1, freq=-60)
464+
465+
466+
def test_reactance_inductive():
467+
result = reactance(5, freq=60)
468+
assert result > 0

test/test_triangle.py

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import cmath
2+
import math
3+
import pytest
4+
25
from electricpy.geometry import triangle
36
from electricpy.geometry import Point
47
from test import compare_points
@@ -66,4 +69,132 @@ def test_1(self):
6669
p2 = Point(1, 0)
6770
p3 = Point(1*cmath.cos(cmath.pi/3), 1*cmath.sin(cmath.pi/3))
6871
t = triangle.Triangle(p1, p2, p3)
69-
assert compare_points(t.circum_center(), Point(0.5, cmath.sqrt(3)/6))
72+
assert compare_points(t.circum_center(), Point(0.5, cmath.sqrt(3)/6))
73+
74+
75+
def test_triangle_perimeter_and_area():
76+
p1 = Point(0, 0)
77+
p2 = Point(3, 0)
78+
p3 = Point(0, 4)
79+
t = triangle.Triangle(p1, p2, p3)
80+
assert t.perimeter() == 12
81+
assert t.perimeters() == 12
82+
assert t.area() == 6
83+
84+
85+
def test_triangle_radii():
86+
p1 = Point(0, 0)
87+
p2 = Point(3, 0)
88+
p3 = Point(0, 4)
89+
t = triangle.Triangle(p1, p2, p3)
90+
assert t.in_radius() == 1
91+
assert t.circum_radius() == 2.5
92+
93+
94+
def test_triangle_invalid_points():
95+
p1 = Point(0, 0)
96+
p2 = Point(1, 1)
97+
p3 = Point(2, 2)
98+
with pytest.raises(ValueError):
99+
triangle.Triangle(p1, p2, p3)
100+
101+
102+
def test_triangle_init_validation_and_helpers():
103+
with pytest.raises(ValueError):
104+
triangle.Triangle(Point(0, 0), Point(1, 0))
105+
106+
with pytest.raises(TypeError):
107+
triangle.Triangle(Point(0, 0), (1, 0), Point(0, 1))
108+
109+
with pytest.raises(ValueError):
110+
triangle.Triangle(Point(0, 0), Point(0, 0), Point(1, 1))
111+
112+
assert triangle._as_float(1) == 1.0
113+
assert triangle._as_float(1 + 1e-13j) == 1.0
114+
with pytest.raises(ValueError):
115+
triangle._as_float(1 + 1e-3j)
116+
117+
assert triangle._is_close(1.0, 1.0 + 1e-10)
118+
assert not triangle._is_close(1.0, 1.01, rel_tol=1e-6, abs_tol=1e-6)
119+
120+
p0 = Point(0, 0)
121+
p1 = Point(2, 0)
122+
p2 = Point(0, 2)
123+
assert triangle._triangle_twice_area(p0, p1, p2) == 4.0
124+
125+
126+
def test_triangle_area_and_centers_errors():
127+
tri = object.__new__(triangle.Triangle)
128+
tri.points = (Point(0, 0), Point(1, 0), Point(0, 1))
129+
tri._tol = 1e-12
130+
tri.a = 0.0
131+
tri.b = 0.0
132+
tri.c = 0.0
133+
134+
with pytest.raises(ValueError):
135+
tri.in_center()
136+
137+
with pytest.raises(ValueError):
138+
tri.in_radius()
139+
140+
tri2 = object.__new__(triangle.Triangle)
141+
tri2.points = (Point(0, 0), Point(1, 0), Point(0, 1))
142+
tri2._tol = 1e-12
143+
tri2.a = 1.0
144+
tri2.b = 1.0
145+
tri2.c = 3.0
146+
147+
with pytest.raises(ValueError):
148+
tri2.area()
149+
150+
tri3 = object.__new__(triangle.Triangle)
151+
tri3.points = (Point(0, 0), Point(1, 0), Point(0, 1))
152+
tri3._tol = 1e-12
153+
tri3.a = 1.0
154+
tri3.b = 1.0
155+
tri3.c = 2.0
156+
157+
with pytest.raises(ValueError):
158+
tri3.circum_radius()
159+
160+
tri4 = object.__new__(triangle.Triangle)
161+
tri4.points = (Point(0, 0), Point(1, 0), Point(0, 1))
162+
tri4._tol = 1e-12
163+
tri4.a = 1.0
164+
tri4.b = 1.0
165+
tri4.c = 2.0 + 1e-13
166+
assert tri4.area() == 0.0
167+
168+
169+
def test_triangle_validation_helper():
170+
tri = object.__new__(triangle.Triangle)
171+
tri.points = (Point(0, 0), Point(1, 0), Point(2, 0))
172+
tri._tol = 1e-12
173+
tri.a = 1.0
174+
tri.b = 1.0
175+
tri.c = 2.1
176+
assert not tri._Triangle__is_valid()
177+
178+
tri.c = 2.0
179+
assert not tri._Triangle__is_valid()
180+
181+
tri.a = 1.0
182+
tri.b = 3.0
183+
tri.c = 1.0
184+
assert not tri._Triangle__is_valid()
185+
186+
tri.a = 3.0
187+
tri.b = 1.0
188+
tri.c = 1.0
189+
assert not tri._Triangle__is_valid()
190+
191+
tri.a = 1.0
192+
tri.b = 1.0
193+
tri.c = 1.0
194+
assert not tri._Triangle__is_valid()
195+
196+
tri.points = (Point(0, 0), Point(1, 0), Point(0, 1))
197+
tri.a = math.sqrt(2)
198+
tri.b = 1.0
199+
tri.c = 1.0
200+
assert tri._Triangle__is_valid()

0 commit comments

Comments
 (0)