Skip to content

Commit

Permalink
Issue metomi#80: invert order of checks when time ticks
Browse files Browse the repository at this point in the history
  • Loading branch information
kinow committed Oct 8, 2018
1 parent 2cda500 commit 7c5749b
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 45 deletions.
90 changes: 45 additions & 45 deletions isodatetime/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -1162,62 +1162,62 @@ def add_truncated(self, year_of_century=None, year_of_decade=None,
minute_of_hour=None, second_of_minute=None):
"""Combine this TimePoint with truncated time properties."""
new = self.copy()
if hour_of_day is not None and minute_of_hour is None:
minute_of_hour = 0
if ((hour_of_day is not None or minute_of_hour is not None) and
second_of_minute is None):
second_of_minute = 0
if second_of_minute is not None or minute_of_hour is not None:
new.to_hour_minute_second()
if second_of_minute is not None:
while new.second_of_minute != second_of_minute:
new.second_of_minute += 1.0
new.tick_over()
if minute_of_hour is not None:
while new.minute_of_hour != minute_of_hour:
new.minute_of_hour += 1.0
new.tick_over()
if hour_of_day is not None:
while new.hour_of_day != hour_of_day:
new.hour_of_day += 1.0
if year_of_century is not None:
new.to_calendar_date()
new_year_of_century = new.year % 100
while new_year_of_century != year_of_century:
new.year += 1
new_year_of_century = new.year % 100
if year_of_decade is not None:
new.to_calendar_date()
new_year_of_decade = new.year % 10
while new_year_of_decade != year_of_decade:
new.year += 1
new_year_of_decade = new.year % 10
if month_of_year is not None:
new.to_calendar_date()
while new.month_of_year != month_of_year:
new.month_of_year += 1
new.tick_over()
if day_of_week is not None:
if week_of_year is not None:
new.to_week_date()
while new.day_of_week != day_of_week:
new.day_of_week += 1
new.tick_over()
if day_of_month is not None:
new.to_calendar_date()
while new.day_of_month != day_of_month:
new.day_of_month += 1
while new.week_of_year != week_of_year:
new.week_of_year += 1
new.tick_over()
if day_of_year is not None:
new.to_ordinal_date()
while new.day_of_year != day_of_year:
new.day_of_year += 1
new.tick_over()
if week_of_year is not None:
if day_of_month is not None:
new.to_calendar_date()
while new.day_of_month != day_of_month:
new.day_of_month += 1
new.tick_over()
if day_of_week is not None:
new.to_week_date()
while new.week_of_year != week_of_year:
new.week_of_year += 1
while new.day_of_week != day_of_week:
new.day_of_week += 1
new.tick_over()
if month_of_year is not None:
new.to_calendar_date()
while new.month_of_year != month_of_year:
new.month_of_year += 1
if hour_of_day is not None:
while new.hour_of_day != hour_of_day:
new.hour_of_day += 1.0
new.tick_over()
if year_of_decade is not None:
new.to_calendar_date()
new_year_of_decade = new.year % 10
while new_year_of_decade != year_of_decade:
new.year += 1
new_year_of_decade = new.year % 10
if year_of_century is not None:
new.to_calendar_date()
new_year_of_century = new.year % 100
while new_year_of_century != year_of_century:
new.year += 1
new_year_of_century = new.year % 100
if minute_of_hour is not None:
while new.minute_of_hour != minute_of_hour:
new.minute_of_hour += 1.0
new.tick_over()
if second_of_minute is not None:
while new.second_of_minute != second_of_minute:
new.second_of_minute += 1.0
new.tick_over()
if second_of_minute is not None or minute_of_hour is not None:
new.to_hour_minute_second()
if ((hour_of_day is not None or minute_of_hour is not None) and
second_of_minute is None):
second_of_minute = 0
if hour_of_day is not None and minute_of_hour is None:
minute_of_hour = 0
return new

def __add__(self, other, no_copy=False):
Expand Down
24 changes: 24 additions & 0 deletions isodatetime/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1206,6 +1206,30 @@ def test_timepoint_time_zone(self):
duration, data.Duration(days=0),
i_test_date_str + " - " + j_test_date_str)

def test_timepoint_adding_truncated_timepoint(self):
"""See issue #80. When adding a truncated time, the result timepoint
must not be inconsistent, e.g.
2000-01-01T00:00:00Z + 03-30T00:00:00Z = 2000-03-30T00:00:00Z
"""
t1 = data.TimePoint(year=2000, month_of_year=1, day_of_month=1,
hour_of_day=0, minute_of_hour=0,
second_of_minute=0, time_zone_hour=0,
time_zone_minute=0)
t2 = data.TimePoint(month_of_year=3, day_of_month=30,
hour_of_day=0, minute_of_hour=0,
second_of_minute=0, time_zone_hour=0,
time_zone_minute=0, truncated=True)
t3 = t1 + t2
self.assertEqual(2000, t3.year)
self.assertEqual(3, t3.month_of_year)
self.assertEqual(30, t3.day_of_month)
self.assertEqual(0, t3.hour_of_day)
self.assertEqual(0, t3.minute_of_hour)
self.assertEqual(0, t3.second_of_minute)
self.assertEqual(data.Duration(hours=0, minutes=0), t3.get_time_zone())
self.assertEqual("2000-03-30T00:00:00Z", str(t3))

def test_timepoint_dumper(self):
"""Test the dumping of TimePoint instances."""
parser = parsers.TimePointParser(allow_truncated=True,
Expand Down

0 comments on commit 7c5749b

Please sign in to comment.