def test_can_retain_offset_from_end_of_month(self): d = Date(1976, 1, -1) self.assertEqual(d, Date(1976, 1, 31)) d += Duration(months=1) self.assertEqual(d, Date(1976, 2, 29)) d += Duration(months=1) self.assertEqual(d, Date(1976, 3, 31)) d += Duration(months=1) self.assertEqual(d, Date(1976, 4, 30)) d += Duration(months=1) self.assertEqual(d, Date(1976, 5, 31)) d += Duration(months=1) self.assertEqual(d, Date(1976, 6, 30))
def test_str(self): self.assertEqual(str(Duration()), "PT0S") self.assertEqual(str(Duration(years=1, months=2)), "P1Y2M") self.assertEqual(str(Duration(years=-1, months=2)), "P-10M") self.assertEqual(str(Duration(months=-13)), "P-1Y-1M") self.assertEqual(str(Duration(months=2, days=3, seconds=5.7)), "P2M3DT5.7S") self.assertEqual(str(Duration(hours=12, minutes=34)), "PT12H34M") self.assertEqual(str(Duration(seconds=59)), "PT59S") self.assertEqual(str(Duration(seconds=0.123456789)), "PT0.123456789S") self.assertEqual(str(Duration(seconds=-0.123456789)), "PT-0.123456789S")
def hydrate_date(days): """ Hydrator for `Date` values. :param days: :return: Date """ return UNIX_EPOCH_DATE + Duration(days=days)
def test_milliseconds_only(self): d = Duration(milliseconds=1234.567) self.assertEqual(d.months, 0) self.assertEqual(d.days, 0) self.assertEqual(d.seconds, 1) self.assertEqual(d.subseconds, 0.234567) self.assertEqual(d.years_months_days, (0, 0, 0)) self.assertEqual(d.hours_minutes_seconds, (0, 0, 1.234567))
def test_weeks_only(self): d = Duration(weeks=4) self.assertEqual(d.months, 0) self.assertEqual(d.days, 28) self.assertEqual(d.seconds, 0) self.assertEqual(d.subseconds, 0.0) self.assertEqual(d.years_months_days, (0, 0, 28)) self.assertEqual(d.hours_minutes_seconds, (0, 0, 0.0))
def test_days_only(self): d = Duration(days=40) self.assertEqual(d.months, 0) self.assertEqual(d.days, 40) self.assertEqual(d.seconds, 0) self.assertEqual(d.subseconds, 0.0) self.assertEqual(d.years_months_days, (0, 0, 40)) self.assertEqual(d.hours_minutes_seconds, (0, 0, 0.0))
def test_hours_only(self): d = Duration(hours=10) self.assertEqual(d.months, 0) self.assertEqual(d.days, 0) self.assertEqual(d.seconds, 36000) self.assertEqual(d.subseconds, 0.0) self.assertEqual(d.years_months_days, (0, 0, 0)) self.assertEqual(d.hours_minutes_seconds, (10, 0, 0.0))
def test_minutes_only(self): d = Duration(minutes=90.5) self.assertEqual(d.months, 0) self.assertEqual(d.days, 0) self.assertEqual(d.seconds, 5430) self.assertEqual(d.subseconds, 0.0) self.assertEqual(d.years_months_days, (0, 0, 0)) self.assertEqual(d.hours_minutes_seconds, (1, 30, 30.0))
def test_seconds_only(self): d = Duration(seconds=123.456) self.assertEqual(d.months, 0) self.assertEqual(d.days, 0) self.assertEqual(d.seconds, 123) self.assertEqual(d.subseconds, 0.456) self.assertEqual(d.years_months_days, (0, 0, 0)) self.assertEqual(d.hours_minutes_seconds, (0, 2, 3.456))
def test_positive_negative_positive(self): d = Duration(years=1, months=2, days=-3, hours=4, minutes=5, seconds=6.789) self.assertEqual(d.months, 14) self.assertEqual(d.days, -3) self.assertEqual(d.seconds, 14706) self.assertEqual(d.subseconds, 0.789) self.assertEqual(d.years_months_days, (1, 2, -3)) self.assertEqual(d.hours_minutes_seconds, (4, 5, 6.789))
def test_negative_positive_negative(self): d = Duration(years=-1, months=-2, days=3, hours=-4, minutes=-5, seconds=-6.789) self.assertEqual(d.months, -14) self.assertEqual(d.days, 3) self.assertEqual(d.seconds, -14706) self.assertEqual(d.subseconds, -0.789) self.assertEqual(d.years_months_days, (-1, -2, 3)) self.assertEqual(d.hours_minutes_seconds, (-4, -5, -6.789))
def test_nanoseconds_only(self): d = Duration(nanoseconds=1234.567) self.assertEqual(d.months, 0) self.assertEqual(d.days, 0) self.assertEqual(d.seconds, 0) self.assertEqual(d.subseconds, 0.000001234) self.assertEqual(d.years_months_days, (0, 0, 0)) self.assertEqual(d.hours_minutes_seconds, (0, 0, 0.000001234))
def test_zero(self): d = Duration() self.assertEqual(d.months, 0) self.assertEqual(d.days, 0) self.assertEqual(d.seconds, 0) self.assertEqual(d.subseconds, 0.0) self.assertEqual(d.years_months_days, (0, 0, 0)) self.assertEqual(d.hours_minutes_seconds, (0, 0, 0.0)) self.assertFalse(bool(d))
def _hydrate_duration(self, months, days, seconds, nanoseconds): """ Hydrator for `Duration` values. :param months: :param days: :param seconds: :param nanoseconds: :return: `duration` namedtuple """ return Duration(months=months, days=days, seconds=seconds, nanoseconds=nanoseconds)
def hydrate_datetime(seconds, nanoseconds, tz=None): """ Hydrator for `DateTime` and `LocalDateTime` values. :param seconds: :param nanoseconds: :param tz: :return: datetime """ minutes, seconds = map(int, divmod(seconds, 60)) hours, minutes = map(int, divmod(minutes, 60)) days, hours = map(int, divmod(hours, 24)) seconds = (1000000000 * seconds + nanoseconds) / 1000000000 t = DateTime.combine(UNIX_EPOCH_DATE + Duration(days=days), Time(hours, minutes, seconds)) if tz is None: return t if isinstance(tz, int): tz_offset_minutes, tz_offset_seconds = divmod(tz, 60) zone = FixedOffset(tz_offset_minutes) else: zone = timezone(tz) return zone.localize(t)
def test_repr(self): d = Duration(months=2, days=3, seconds=5.7) self.assertEqual(repr(d), "Duration(months=2, days=3, seconds=5, subseconds=0.7)")
def test_duration(graph): skip_if_no_temporal_support(graph) i = Duration(months=1, days=2, seconds=3) o = graph.evaluate("RETURN $x", x=i) assert o == i
def test_duration_property(self): a = Node(dur=Duration(days=3)) r = cypher_repr(a) self.assertEqual("({dur: duration('P3D')})", r)
def test_floor_division_and_modulus_by_int(self): d1 = Duration(months=11, days=33, seconds=55.77) i = 2 self.assertEqual(divmod(d1, i), (Duration(months=5, days=16, seconds=27.0), Duration(months=1, days=1, seconds=1.77)))
def test_sub_duration(self): ct = ClockTime(123456.789) - Duration(seconds=1) self.assertEqual(ct.seconds, 123455) self.assertEqual(ct.nanoseconds, 789000000)
def test_sub_duration_with_months(self): with self.assertRaises(ValueError): _ = ClockTime(123456.789) - Duration(months=1)
def test_floor_division_and_modulus_by_object(self): with self.assertRaises(TypeError): _ = divmod(Duration(months=2, days=3, seconds=5.7), object())
def test_timedelta_and_duration(cls): from neotime import Duration b, unpacked = pack_and_unpack(cls(), version=(2, 0)) assert b == b"\xB4E\x00\x00\x00\x00" assert unpacked == Duration()
def test_true_division_by_float(self): d1 = Duration(months=11, days=33, seconds=55.77) f = 2.5 self.assertEqual(d1 / f, Duration(months=4, days=13, seconds=22.308))
def test_true_division_by_int(self): d1 = Duration(months=11, days=33, seconds=55.77) i = 2 self.assertEqual(d1 / i, Duration(months=6, days=16, seconds=27.885))
def test_days_out_of_range(self): with self.assertRaises(ValueError): _ = Duration(days=(2**64))
def test_true_division_by_object(self): with self.assertRaises(TypeError): _ = Duration(months=2, days=3, seconds=5.7) / object()
def test_unary_plus(self): d = Duration(months=11, days=33, seconds=55.77) self.assertEqual(+d, Duration(months=11, days=33, seconds=55.77))
def test_unary_minus(self): d = Duration(months=11, days=33, seconds=55.77) self.assertEqual(-d, Duration(months=-11, days=-33, seconds=-55.77))
def test_absolute(self): d = Duration(months=-11, days=-33, seconds=-55.77) self.assertEqual(abs(d), Duration(months=11, days=33, seconds=55.77))