Skip to content

Commit 6a87c73

Browse files
committed
Added tests for new calculate module functions.
1 parent c41a2b4 commit 6a87c73

4 files changed

Lines changed: 211 additions & 3 deletions

File tree

immanuel/classes/wrap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ def __init__(self, object: dict) -> None:
263263
self.direct = self._movement == calc.DIRECT
264264
self.stationary = self._movement == calc.STATIONARY
265265
self.retrograde = self._movement == calc.RETROGRADE
266-
self.typical = calculate.object_movement_typical(object)
266+
self.typical = calculate.is_object_movement_typical(object)
267267
self.formatted = _(names.OBJECT_MOVEMENTS[self._movement], gender(object['index']))
268268

269269
def __str__(self) -> str:

immanuel/tools/calculate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def object_movement(object: dict | float) -> int:
7979
return calc.DIRECT if speed > calc.STATION_SPEED else calc.RETROGRADE
8080

8181

82-
def object_movement_typical(object: dict) -> bool:
82+
def is_object_movement_typical(object: dict) -> bool:
8383
""" Returns whether an object's movement is typical, ie. direct for planets,
8484
retrograde for nodes, stationary for Parts and eclipses. """
8585
if object['index'] in (

tests/test_calculate.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,52 @@ def test_object_movement(day_jd, coords):
120120
assert calculate.object_movement(part_of_fortune) == calc.STATIONARY
121121

122122

123+
def test_is_object_movement_typical(day_jd, coords):
124+
sun, north_node, part_of_fortune = ephemeris.objects((chart.SUN, chart.NORTH_NODE, chart.PART_OF_FORTUNE), day_jd, *coords, chart.PLACIDUS, calc.DAY_NIGHT_FORMULA).values()
125+
# Direct
126+
assert calculate.is_object_movement_typical(sun) == True
127+
sun['speed'] *= -1
128+
assert calculate.is_object_movement_typical(sun) == False
129+
# Retrograde
130+
assert calculate.is_object_movement_typical(north_node) == True
131+
north_node['speed'] *= -1
132+
assert calculate.is_object_movement_typical(north_node) == False
133+
# Stationed
134+
assert calculate.is_object_movement_typical(part_of_fortune) == True
135+
part_of_fortune['speed'] *= -1
136+
assert calculate.is_object_movement_typical(part_of_fortune) == True
137+
138+
139+
def test_relative_position(day_jd, coords):
140+
sun, mercury, neptune = ephemeris.objects((chart.SUN, chart.MERCURY, chart.NEPTUNE), day_jd, *coords).values()
141+
assert calculate.relative_position(sun, mercury) == calc.ORIENTAL
142+
assert calculate.relative_position(sun, neptune) == calc.OCCIDENTAL
143+
assert calculate.relative_position(mercury, neptune) == calc.OCCIDENTAL
144+
assert calculate.relative_position(neptune, mercury) == calc.ORIENTAL
145+
146+
147+
def test_is_in_sect_day(day_jd, coords):
148+
sun, moon, mercury, venus, mars, jupiter, saturn = ephemeris.objects((chart.SUN, chart.MOON, chart.MERCURY, chart.VENUS, chart.MARS, chart.JUPITER, chart.SATURN), day_jd, *coords).values()
149+
assert calculate.is_in_sect(sun, True) == True
150+
assert calculate.is_in_sect(jupiter, True) == True
151+
assert calculate.is_in_sect(saturn, True) == True
152+
assert calculate.is_in_sect(moon, True) == False
153+
assert calculate.is_in_sect(venus, True) == False
154+
assert calculate.is_in_sect(mars, True) == False
155+
assert calculate.is_in_sect(mercury, True, sun) == (calculate.relative_position(sun, mercury) == calc.ORIENTAL)
156+
157+
158+
def test_is_in_sect_night(night_jd, coords):
159+
sun, moon, mercury, venus, mars, jupiter, saturn = ephemeris.objects((chart.SUN, chart.MOON, chart.MERCURY, chart.VENUS, chart.MARS, chart.JUPITER, chart.SATURN), night_jd, *coords).values()
160+
assert calculate.is_in_sect(sun, False) == False
161+
assert calculate.is_in_sect(jupiter, False) == False
162+
assert calculate.is_in_sect(saturn, False) == False
163+
assert calculate.is_in_sect(moon, False) == True
164+
assert calculate.is_in_sect(venus, False) == True
165+
assert calculate.is_in_sect(mars, False) == True
166+
assert calculate.is_in_sect(mercury, False, sun) == (calculate.relative_position(sun, mercury) == calc.OCCIDENTAL)
167+
168+
123169
def test_is_out_of_bounds(day_jd, coords):
124170
sun, mercury = ephemeris.objects((chart.SUN, chart.MERCURY), day_jd, *coords, chart.PLACIDUS).values()
125171
assert calculate.is_out_of_bounds(sun, day_jd) is False

tests/test_charts.py

Lines changed: 163 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
from pytest import fixture
2121

2222
from immanuel import charts
23-
from immanuel.const import calc, chart, names
23+
from immanuel.classes import wrap
24+
from immanuel.const import calc, chart, dignities, names
2425
from immanuel.setup import settings
2526
from immanuel.tools import convert
2627

@@ -95,6 +96,167 @@ def test_subject(dob, lat, lon, native, julian_date):
9596
assert ambiguous_native.date_time_ambiguous == True
9697

9798

99+
def test_wrapped_data(native):
100+
settings.objects.append(chart.PRE_NATAL_LUNAR_ECLIPSE)
101+
natal_chart = charts.Natal(native)
102+
103+
# Angle
104+
longitude = natal_chart.objects[chart.SUN].longitude
105+
assert longitude.raw == 280.6237802656368
106+
assert longitude.formatted == '280°37\'26"'
107+
assert longitude.direction == '+'
108+
assert longitude.degrees == 280
109+
assert longitude.minutes == 37
110+
assert longitude.seconds == 26
111+
112+
# Aspect
113+
aspect = natal_chart.aspects[chart.SUN][chart.MOON]
114+
assert aspect.active == chart.MOON
115+
assert aspect.passive == chart.SUN
116+
assert aspect.type == names.ASPECTS[calc.SEXTILE]
117+
assert aspect.aspect == calc.SEXTILE
118+
assert aspect.orb == settings.planet_orbs[calc.SEXTILE]
119+
assert type(aspect.distance) is wrap.Angle # Tested separately, just ensure type
120+
assert type(aspect.difference) is wrap.Angle # Tested separately, just ensure type
121+
122+
# AspectCondition
123+
assert aspect.condition.associate == True
124+
assert aspect.condition.dissociate == False
125+
assert aspect.condition.formatted == names.ASPECT_CONDITIONS[calc.ASSOCIATE]
126+
127+
# AspectMovement
128+
assert aspect.movement.applicative == False
129+
assert aspect.movement.exact == False
130+
assert aspect.movement.separative == True
131+
assert aspect.movement.formatted == names.ASPECT_MOVEMENTS[calc.SEPARATIVE]
132+
133+
# Coordinates
134+
assert type(natal_chart.native.coordinates.latitude) is wrap.Angle # Tested separately, just ensure type
135+
assert type(natal_chart.native.coordinates.longitude) is wrap.Angle # Tested separately, just ensure type
136+
137+
# DateTime
138+
date_time = natal_chart.native.date_time
139+
assert type(date_time.datetime) is datetime
140+
assert date_time.timezone == 'PST'
141+
assert date_time.ambiguous == False
142+
assert date_time.julian == 2451545.25
143+
assert date_time.deltat == 0.0007387629899254968
144+
assert date_time.sidereal_time == '16:54:13'
145+
146+
# MoonPhase
147+
moon_phase = natal_chart.moon_phase
148+
assert moon_phase.new_moon == False
149+
assert moon_phase.waxing_crescent == False
150+
assert moon_phase.first_quarter == False
151+
assert moon_phase.waxing_gibbous == False
152+
assert moon_phase.full_moon == False
153+
assert moon_phase.disseminating == False
154+
assert moon_phase.third_quarter == True
155+
assert moon_phase.balsamic == False
156+
assert moon_phase.formatted == names.MOON_PHASES[calc.THIRD_QUARTER]
157+
158+
# Object
159+
sun = natal_chart.objects[chart.SUN]
160+
assert sun.index == chart.SUN
161+
assert sun.name == names.PLANETS[chart.SUN]
162+
assert sun.distance == 0.9833259257690341
163+
assert sun.speed == 1.0194579691359147
164+
assert sun.out_of_bounds == False
165+
assert sun.in_sect == True
166+
assert sun.score == 3
167+
168+
assert type(sun.latitude) is wrap.Angle # Tested separately, just ensure type
169+
assert type(sun.longitude) is wrap.Angle # Tested separately, just ensure type
170+
assert type(sun.sign_longitude) is wrap.Angle # Tested separately, just ensure type
171+
assert type(sun.declination) is wrap.Angle # Tested separately, just ensure type
172+
173+
# ObjectType
174+
assert sun.type.index == chart.PLANET
175+
assert sun.type.name == names.OBJECTS[chart.PLANET]
176+
177+
# Sign
178+
assert sun.sign.number == chart.CAPRICORN
179+
assert sun.sign.name == names.SIGNS[chart.CAPRICORN]
180+
assert sun.sign.element == names.ELEMENTS[chart.EARTH]
181+
assert sun.sign.modality == names.MODALITIES[chart.CARDINAL]
182+
183+
# Decan
184+
assert sun.decan.number == chart.DECAN2
185+
assert sun.decan.name == names.DECANS[chart.DECAN2]
186+
187+
# House
188+
assert sun.house.index == chart.HOUSE11
189+
assert sun.house.number == 11
190+
assert sun.house.name == names.HOUSES[chart.HOUSE11]
191+
192+
# ObjectMovement
193+
assert sun.movement.direct == True
194+
assert sun.movement.stationary == False
195+
assert sun.movement.retrograde == False
196+
assert sun.movement.typical == True
197+
assert sun.movement.formatted == names.OBJECT_MOVEMENTS[calc.DIRECT]
198+
199+
# DignityState
200+
assert sun.dignities.ruler == False
201+
assert sun.dignities.exalted == False
202+
assert sun.dignities.triplicity_ruler == False
203+
assert sun.dignities.term_ruler == False
204+
assert sun.dignities.face_ruler == False
205+
assert sun.dignities.mutual_reception_ruler == False
206+
assert sun.dignities.mutual_reception_exalted == False
207+
assert sun.dignities.mutual_reception_triplicity_ruler == True
208+
assert sun.dignities.mutual_reception_term_ruler == False
209+
assert sun.dignities.mutual_reception_face_ruler == False
210+
assert sun.dignities.detriment == False
211+
assert sun.dignities.fall == False
212+
assert sun.dignities.peregrine == False
213+
assert sun.dignities.formatted == [
214+
names.DIGNITIES[dignities.MUTUAL_RECEPTION_TRIPLICITY_RULER],
215+
]
216+
217+
# EclipseType
218+
eclipse = natal_chart.objects[chart.PRE_NATAL_LUNAR_ECLIPSE]
219+
assert eclipse.eclipse_type.total == False
220+
assert eclipse.eclipse_type.annular == False
221+
assert eclipse.eclipse_type.partial == True
222+
assert eclipse.eclipse_type.annular_total == False
223+
assert eclipse.eclipse_type.penumbral == False
224+
assert eclipse.eclipse_type.formatted == names.ECLIPSE_TYPES[chart.PARTIAL]
225+
226+
assert type(eclipse.date_time) is wrap.DateTime # Tested separately, just ensure type
227+
228+
# Subject
229+
subject = natal_chart.native
230+
assert type(subject.date_time) is wrap.DateTime # Tested separately, just ensure type
231+
assert type(subject.coordinates) is wrap.Coordinates # Tested separately, just ensure type
232+
233+
# Weightings
234+
weightings = natal_chart.weightings
235+
assert type(weightings.elements) is wrap.Elements # Tested separately, just ensure type
236+
assert type(weightings.modalities) is wrap.Modalities # Tested separately, just ensure type
237+
assert type(weightings.quadrants) is wrap.Quadrants # Tested separately, just ensure type
238+
239+
# Elements
240+
elements = natal_chart.weightings.elements
241+
assert type(elements.fire) is list
242+
assert type(elements.earth) is list
243+
assert type(elements.air) is list
244+
assert type(elements.water) is list
245+
246+
# Modalities
247+
modalities = natal_chart.weightings.modalities
248+
assert type(modalities.cardinal) is list
249+
assert type(modalities.fixed) is list
250+
assert type(modalities.mutable) is list
251+
252+
# Quadrants
253+
quadrants = natal_chart.weightings.quadrants
254+
assert type(quadrants.first) is list
255+
assert type(quadrants.second) is list
256+
assert type(quadrants.third) is list
257+
assert type(quadrants.fourth) is list
258+
259+
98260
def test_natal(native, lat, lon):
99261
natal_chart = charts.Natal(native)
100262

0 commit comments

Comments
 (0)