281
284
self.assertEqual(repr(c), str(c))
284
class DateTimeTests(TestCase):
287
def unable_to_handle_timestamp(timestamp):
288
"""Return false if the platform can handle timestamps larger than 32bit
293
datetime.fromtimestamp(timestamp)
299
class DateTimeCreationTests(TestCase):
301
timestamp = 1405382400 # No significance, just a timestamp
286
303
def test_can_construct_datetime(self):
287
dt = DateTime(1377209927)
304
dt = DateTime(self.timestamp)
288
305
self.assertThat(dt, IsInstance(dbus.Array))
290
307
def test_datetime_has_slice_access(self):
291
dt = DateTime(1377209927)
293
self.assertThat(dt[0], Equals(1377209927))
308
dt = DateTime(self.timestamp)
309
self.assertThat(dt[0], Equals(self.timestamp))
295
311
def test_datetime_has_properties(self):
296
dt = DateTime(1377209927)
312
dt = DateTime(self.timestamp)
298
314
self.assertTrue(hasattr(dt, 'timestamp'))
299
315
self.assertTrue(hasattr(dt, 'year'))
303
319
self.assertTrue(hasattr(dt, 'minute'))
304
320
self.assertTrue(hasattr(dt, 'second'))
323
# Use a well known timezone for comparison
324
self.useFixture(Timezone('UTC'))
325
dt = DateTime(self.timestamp)
328
expected = "DateTime({:%Y-%m-%d %H:%M:%S})".format(
329
datetime.fromtimestamp(self.timestamp)
331
self.assertEqual(expected, observed)
333
def test_repr_equals_str(self):
334
dt = DateTime(self.timestamp)
335
self.assertEqual(repr(dt), str(dt))
337
def test_can_create_DateTime_using_large_timestamp(self):
338
"""Must be able to create a DateTime object using a timestamp larger
339
than the 32bit time_t limit.
342
# Use a well known timezone for comparison
343
self.useFixture(Timezone('UTC'))
344
large_timestamp = 2**32+1
345
dt = DateTime(large_timestamp)
347
self.assertEqual(dt.year, 2106)
348
self.assertEqual(dt.month, 2)
349
self.assertEqual(dt.day, 7)
350
self.assertEqual(dt.hour, 6)
351
self.assertEqual(dt.minute, 28)
352
self.assertEqual(dt.second, 17)
353
self.assertEqual(dt.timestamp, large_timestamp)
356
class DateTimeTests(TestWithScenarios, TestCase):
359
# This timestamp uncovered an issue during development.
360
('Explicit US/Pacific test', dict(
363
('September 2014', dict(
367
('NZ DST example', dict(
383
('32bit limit', dict(
395
timezone='Europe/London'
398
('New Zealand', dict(
403
timezone='US/Pacific'
411
timezone='Europe/Moscow'
415
timezone='Europe/Copenhagen',
419
scenarios = multiply_scenarios(timestamps, timezones)
421
def skip_if_timestamp_too_large(self, timestamp):
422
if unable_to_handle_timestamp(self.timestamp):
423
self.skip("Timestamp to large for platform time_t")
306
425
def test_datetime_properties_have_correct_values(self):
307
dt = DateTime(1377209927)
308
dt_with_tz = datetime.fromtimestamp(1377209927)
310
self.assertThat(dt.timestamp, Equals(dt_with_tz.timestamp()))
311
self.assertThat(dt.year, Equals(dt_with_tz.year))
312
self.assertThat(dt.month, Equals(dt_with_tz.month))
313
self.assertThat(dt.day, Equals(dt_with_tz.day))
314
self.assertThat(dt.hour, Equals(dt_with_tz.hour))
315
self.assertThat(dt.minute, Equals(dt_with_tz.minute))
316
self.assertThat(dt.second, Equals(dt_with_tz.second))
426
self.skip_if_timestamp_too_large(self.timestamp)
427
self.useFixture(Timezone(self.timezone))
429
dt1 = DateTime(self.timestamp)
430
dt2 = datetime.fromtimestamp(self.timestamp, tz.gettz())
432
self.assertThat(dt1.year, Equals(dt2.year))
433
self.assertThat(dt1.month, Equals(dt2.month))
434
self.assertThat(dt1.day, Equals(dt2.day))
435
self.assertThat(dt1.hour, Equals(dt2.hour))
436
self.assertThat(dt1.minute, Equals(dt2.minute))
437
self.assertThat(dt1.second, Equals(dt2.second))
438
self.assertThat(dt1.timestamp, Equals(dt2.timestamp()))
318
440
def test_equality_with_datetime(self):
319
dt1 = DateTime(1377209927)
320
dt2 = DateTime(1377209927)
441
self.skip_if_timestamp_too_large(self.timestamp)
442
self.useFixture(Timezone(self.timezone))
444
dt1 = DateTime(self.timestamp)
446
dt1.year, dt1.month, dt1.day, dt1.hour, dt1.minute, dt1.second
322
449
self.assertThat(dt1, Equals(dt2))
324
451
def test_equality_with_list(self):
325
dt1 = DateTime(1377209927)
452
self.skip_if_timestamp_too_large(self.timestamp)
453
self.useFixture(Timezone(self.timezone))
455
dt1 = DateTime(self.timestamp)
456
dt2 = [self.timestamp]
328
458
self.assertThat(dt1, Equals(dt2))
330
def test_equality_with_datetime_timestamp(self):
331
# DateTime no longer assumes UTC and uses local TZ.
332
dt1 = DateTime(1377209927)
333
dt2 = datetime.fromtimestamp(1377209927)
334
dt3 = datetime.fromtimestamp(1377209928)
460
def test_equality_with_datetime_object(self):
461
self.skip_if_timestamp_too_large(self.timestamp)
462
self.useFixture(Timezone(self.timezone))
464
dt1 = DateTime(self.timestamp)
465
dt2 = datetime.fromtimestamp(self.timestamp, tz.gettz())
466
dt3 = datetime.fromtimestamp(self.timestamp + 1, tz.gettz())
336
468
self.assertThat(dt1, Equals(dt2))
337
469
self.assertThat(dt1, NotEquals(dt3))
339
471
def test_can_convert_to_datetime(self):
340
dt1 = DateTime(1377209927)
472
self.skip_if_timestamp_too_large(self.timestamp)
474
dt1 = DateTime(self.timestamp)
342
475
self.assertThat(dt1.datetime, IsInstance(datetime))
345
expected = repr_type(
346
u"DateTime({:%Y-%m-%d %H:%M:%S})".format(
347
datetime.fromtimestamp(1377209927)
350
dt = DateTime(1377209927)
352
self.assertEqual(expected, observed)
354
def test_repr_equals_str(self):
355
dt = DateTime(1377209927)
356
self.assertEqual(repr(dt), str(dt))
359
478
class TimeTests(TestCase):