def test_precision(self):
   self.assertEqual(Timestamp(10000000) % 0.1, 0)
   self.assertEqual(Timestamp(10000000) % 0.05, 0)
   self.assertEqual(Timestamp(10000000) % 0.000005, 0)
   self.assertEqual(Timestamp(10000000) % Duration(0.1), 0)
   self.assertEqual(Timestamp(10000000) % Duration(0.05), 0)
   self.assertEqual(Timestamp(10000000) % Duration(0.000005), 0)
 def test_str(self):
   self.assertEqual('Duration(1.234567)',
                    str(Duration(1.234567)))
   self.assertEqual('Duration(-1.234567)',
                    str(Duration(-1.234567)))
   self.assertEqual('Duration(-999999999.900000)',
                    str(Duration(-999999999.9)))
   self.assertEqual('Duration(999999999)',
                    str(Duration(999999999)))
   self.assertEqual('Duration(-999999999)',
                    str(Duration(-999999999)))
 def test_sort_order(self):
   self.assertEqual(
       [-63, Duration(-3), 2, 9, Duration(292.3), 500],
       sorted([9, 2, Duration(-3), Duration(292.3), -63, 500]))
   self.assertEqual(
       [4, 5, Duration(6), Duration(7), 8, 9],
       sorted([9, 8, Duration(7), Duration(6), 5, 4]))
 def test_arithmetic(self):
   self.assertEqual(Duration(123) + 456, 579)
   self.assertEqual(456 + Duration(123), 579)
   self.assertEqual(Duration(123) * 456, 56088)
   self.assertEqual(456 * Duration(123), 56088)
   self.assertEqual(Duration(123) - 456, -333)
   self.assertEqual(456 - Duration(123), 333)
   self.assertEqual(-Duration(123), -123)
 def __init__(self, gap_size):
   if gap_size <= 0:
     raise ValueError('The size parameter must be strictly positive.')
   self.gap_size = Duration.of(gap_size)
 def __init__(self, size, period, offset=0):
   if size <= 0:
     raise ValueError('The size parameter must be strictly positive.')
   self.size = Duration.of(size)
   self.period = Duration.of(period)
   self.offset = Timestamp.of(offset) % size
  def test_arithmetic(self):
    # Supported operations.
    self.assertEqual(Timestamp(123) + 456, 579)
    self.assertEqual(Timestamp(123) + Duration(456), 579)
    self.assertEqual(456 + Timestamp(123), 579)
    self.assertEqual(Duration(456) + Timestamp(123), 579)
    self.assertEqual(Timestamp(123) - 456, -333)
    self.assertEqual(Timestamp(123) - Duration(456), -333)
    self.assertEqual(Timestamp(1230) % 456, 318)
    self.assertEqual(Timestamp(1230) % Duration(456), 318)

    # Check that direct comparison of Timestamp and Duration is allowed.
    self.assertTrue(Duration(123) == Timestamp(123))
    self.assertTrue(Timestamp(123) == Duration(123))
    self.assertFalse(Duration(123) == Timestamp(1230))
    self.assertFalse(Timestamp(123) == Duration(1230))

    # Check return types.
    self.assertEqual((Timestamp(123) + 456).__class__, Timestamp)
    self.assertEqual((Timestamp(123) + Duration(456)).__class__, Timestamp)
    self.assertEqual((456 + Timestamp(123)).__class__, Timestamp)
    self.assertEqual((Duration(456) + Timestamp(123)).__class__, Timestamp)
    self.assertEqual((Timestamp(123) - 456).__class__, Timestamp)
    self.assertEqual((Timestamp(123) - Duration(456)).__class__, Timestamp)
    self.assertEqual((Timestamp(1230) % 456).__class__, Duration)
    self.assertEqual((Timestamp(1230) % Duration(456)).__class__, Duration)

    # Unsupported operations.
    with self.assertRaises(TypeError):
      self.assertEqual(Timestamp(123) * 456, 56088)
    with self.assertRaises(TypeError):
      self.assertEqual(Timestamp(123) * Duration(456), 56088)
    with self.assertRaises(TypeError):
      self.assertEqual(456 * Timestamp(123), 56088)
    with self.assertRaises(TypeError):
      self.assertEqual(Duration(456) * Timestamp(123), 56088)
    with self.assertRaises(TypeError):
      self.assertEqual(456 - Timestamp(123), 333)
    with self.assertRaises(TypeError):
      self.assertEqual(Duration(456) - Timestamp(123), 333)
    with self.assertRaises(TypeError):
      self.assertEqual(-Timestamp(123), -123)
    with self.assertRaises(TypeError):
      self.assertEqual(-Timestamp(123), -Duration(123))
    with self.assertRaises(TypeError):
      self.assertEqual(1230 % Timestamp(456), 318)
    with self.assertRaises(TypeError):
      self.assertEqual(Duration(1230) % Timestamp(456), 318)
 def test_of(self):
   interval = Timestamp(123)
   self.assertEqual(id(interval), id(Timestamp.of(interval)))
   self.assertEqual(interval, Timestamp.of(123.0))
   with self.assertRaises(TypeError):
     Timestamp.of(Duration(10))
 def test_precision(self):
   self.assertEqual(Duration(10000000) % 0.1, 0)
   self.assertEqual(Duration(10000000) % 0.05, 0)
   self.assertEqual(Duration(10000000) % 0.000005, 0)