nominaldelta

nominal difference of date/datetime
git clone https://git.ce9e.org/nominaldelta.git

commit
a63e86b0ac78c5e216017682fa69eeabb07b352a
parent
469d63154e6633162b88889cb2f70eeae5ed15e7
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-08-31 08:26
extend tests

many are reused from python-dateutil

Diffstat

M test.py 263 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------

1 files changed, 239 insertions, 24 deletions


diff --git a/test.py b/test.py

@@ -6,11 +6,90 @@ from zoneinfo import ZoneInfo
    6     6 from nominaldelta import NominalDelta
    7     7 
    8     8 
    9    -1 class TestNominalDelta(unittest.TestCase):
   10    -1     def test_weeks(self):
   -1     9 class NotAValueClass:
   -1    10     def _op(self, other):
   -1    11         return self
   -1    12 
   -1    13     __add__ = __radd__ = _op
   -1    14     __sub__ = __rsub__ = _op
   -1    15     __mul__ = __rmul__ = _op
   -1    16 
   -1    17     __lt__ = __rlt__ = _op
   -1    18     __gt__ = __rgt__ = _op
   -1    19     __eq__ = __req__ = _op
   -1    20     __le__ = __rle__ = _op
   -1    21     __ge__ = __rge__ = _op
   -1    22 
   -1    23 
   -1    24 NotAValue = NotAValueClass()
   -1    25 
   -1    26 
   -1    27 class GeneralTests(unittest.TestCase):
   -1    28     def test_construct(self):
   -1    29         self.assertEqual(NominalDelta(years=22, months=9).months, 273)
   11    30         self.assertEqual(NominalDelta(weeks=2, days=2).days, 16)
   12    31         self.assertEqual(NominalDelta(weeks=2, days=-1).days, 13)
   -1    32         self.assertEqual(NominalDelta(hours=1, minutes=2, seconds=3).seconds, 3723)
   -1    33         self.assertNotEqual(NominalDelta(days=365), NominalDelta(years=1))
   -1    34         self.assertNotEqual(NominalDelta(hours=24), NominalDelta(days=1))
   -1    35 
   -1    36     def test_fractional_year(self):
   -1    37         with self.assertRaises(ValueError):
   -1    38             NominalDelta(years=1.5)
   -1    39 
   -1    40     def test_fractional_month(self):
   -1    41         with self.assertRaises(ValueError):
   -1    42             NominalDelta(months=1.5)
   -1    43 
   -1    44     def test_hashable(self):
   -1    45         try:
   -1    46             {NominalDelta(minutes=1): 'test'}
   -1    47         except Exception:
   -1    48             self.fail('NominalDelta() failed to hash!')
   -1    49 
   -1    50     def test_boolean(self):
   -1    51         self.assertFalse(NominalDelta(days=0))
   -1    52         self.assertTrue(NominalDelta(days=1))
   -1    53 
   -1    54     def test_repr(self):
   -1    55         self.assertEqual(
   -1    56             repr(NominalDelta(years=1, months=-1, days=15)),
   -1    57             'NominalDelta(months=11, days=15, seconds=0)',
   -1    58         )
   -1    59         self.assertEqual(
   -1    60             repr(NominalDelta(months=14, seconds=-25)),
   -1    61             'NominalDelta(months=14, days=0, seconds=-25)',
   -1    62         )
   -1    63 
   -1    64     def test_unsupported_eq(self):
   -1    65         self.assertIs(NominalDelta(hours=3) == NotAValue, NotAValue)
   -1    66         self.assertFalse(NominalDelta(years=1) == 19)
   -1    67 
   -1    68     def test_unsupported_add(self):
   -1    69         self.assertIs(NominalDelta(days=1) + NotAValue, NotAValue)
   -1    70         with self.assertRaises(TypeError):
   -1    71             NominalDelta(days=3) + 9
   -1    72         with self.assertRaises(TypeError):
   -1    73             'asd' + NominalDelta(month=1)
   -1    74         with self.assertRaises(TypeError):
   -1    75             NominalDelta(month=1) + 'asd'
   -1    76         with self.assertRaises(TypeError):
   -1    77             NominalDelta(days=1) + datetime(2000, 1, 1)
   -1    78 
   -1    79     def test_unsupported_sub(self):
   -1    80         self.assertIs(NominalDelta(days=1) + NotAValue, NotAValue)
   -1    81         with self.assertRaises(TypeError):
   -1    82             NominalDelta(hours=12) - 14
   -1    83         with self.assertRaises(TypeError):
   -1    84             NominalDelta(days=1) - datetime(2000, 1, 1)
   -1    85 
   -1    86     def test_multiplication_unsupported_type(self):
   -1    87         self.assertIs(NominalDelta(days=1) * NotAValue, NotAValue)
   -1    88         with self.assertRaises(TypeError):
   -1    89             NominalDelta(hours=12) * 1.9
   -1    90 
   13    91 
   -1    92 class DeltaArithmeticTests(unittest.TestCase):
   14    93     def test_add(self):
   15    94         self.assertEqual(
   16    95             NominalDelta(months=1) + NominalDelta(days=2),
@@ -20,6 +99,11 @@ class TestNominalDelta(unittest.TestCase):
   20    99             NominalDelta(months=1) + NominalDelta(months=2),
   21   100             NominalDelta(months=3),
   22   101         )
   -1   102         self.assertEqual(
   -1   103             NominalDelta(days=10)
   -1   104             + NominalDelta(years=1, months=2, days=3, hours=4, minutes=5),
   -1   105             NominalDelta(years=1, months=2, days=13, hours=4, minutes=5),
   -1   106         )
   23   107 
   24   108     def test_sub(self):
   25   109         self.assertEqual(
@@ -30,6 +114,11 @@ class TestNominalDelta(unittest.TestCase):
   30   114             NominalDelta(months=1) - NominalDelta(months=2),
   31   115             NominalDelta(months=-1),
   32   116         )
   -1   117         self.assertEqual(
   -1   118             NominalDelta(days=10)
   -1   119             - NominalDelta(years=1, months=2, days=3, hours=4, minutes=5),
   -1   120             NominalDelta(years=-1, months=-2, days=7, hours=-4, minutes=-5),
   -1   121         )
   33   122 
   34   123     def test_neg(self):
   35   124         self.assertEqual(
@@ -49,38 +138,112 @@ class TestNominalDelta(unittest.TestCase):
   49   138             NominalDelta(months=2, days=-4),
   50   139         )
   51   140 
   52    -1     def test_radd_str_type_error(self):
   53    -1         with self.assertRaises(TypeError):
   54    -1             'asd' + NominalDelta(month=1)
   -1   141     def test_inheritance(self):
   -1   142         class ChildClass(NominalDelta):
   -1   143             pass
   55   144 
   56    -1         with self.assertRaises(TypeError):
   57    -1             NominalDelta(month=1) + 'asd'
   -1   145         delta = NominalDelta(months=1)
   -1   146         child = ChildClass(months=1)
   -1   147 
   -1   148         self.assertEqual(type(child + delta), type(child))
   -1   149         self.assertEqual(type(child - delta), type(child))
   -1   150         self.assertEqual(type(-child), type(child))
   -1   151         self.assertEqual(type(child * 5), type(child))
   58   152 
   59    -1     def test_radd_date(self):
   -1   153 
   -1   154 class AdditionTests(unittest.TestCase):
   -1   155     def test_add_date(self):
   60   156         self.assertEqual(
   61    -1             date(1970, 1, 30) + NominalDelta(months=1),
   62    -1             date(1970, 2, 28),
   -1   157             date(2003, 9, 17) + NominalDelta(months=1, weeks=1),
   -1   158             date(2003, 10, 24),
   63   159         )
   -1   160         self.assertEqual(date(2003, 12, 1) + NominalDelta(months=13), date(2005, 1, 1))
   -1   161         self.assertEqual(date(2021, 1, 28) + NominalDelta(months=1), date(2021, 2, 28))
   -1   162         self.assertEqual(date(2021, 2, 27) + NominalDelta(months=1), date(2021, 3, 27))
   -1   163         self.assertEqual(date(2021, 4, 29) + NominalDelta(months=1), date(2021, 5, 29))
   -1   164         self.assertEqual(date(2021, 5, 30) + NominalDelta(months=1), date(2021, 6, 30))
   -1   165 
   -1   166     def test_add_date_negative_months(self):
   -1   167         self.assertEqual(date(2003, 1, 1) + NominalDelta(months=-2), date(2002, 11, 1))
   -1   168 
   -1   169     def test_add_date_month_clip(self):
   -1   170         self.assertEqual(date(2003, 1, 27) + NominalDelta(months=1), date(2003, 2, 27))
   -1   171         self.assertEqual(date(2003, 1, 31) + NominalDelta(months=1), date(2003, 2, 28))
   -1   172         self.assertEqual(date(2003, 1, 31) + NominalDelta(months=2), date(2003, 3, 31))
   -1   173         self.assertEqual(date(2021, 1, 31) + NominalDelta(months=1), date(2021, 2, 28))
   -1   174         self.assertEqual(date(2021, 1, 30) + NominalDelta(months=1), date(2021, 2, 28))
   -1   175         self.assertEqual(date(2021, 1, 29) + NominalDelta(months=1), date(2021, 2, 28))
   -1   176         self.assertEqual(date(2021, 1, 28) + NominalDelta(months=1), date(2021, 2, 28))
   -1   177         self.assertEqual(date(2021, 2, 28) + NominalDelta(months=1), date(2021, 3, 28))
   -1   178         self.assertEqual(date(2021, 4, 30) + NominalDelta(months=1), date(2021, 5, 30))
   -1   179         self.assertEqual(date(2021, 5, 31) + NominalDelta(months=1), date(2021, 6, 30))
   -1   180 
   -1   181     def test_date_add_leap_year_clip(self):
   -1   182         self.assertEqual(date(1999, 2, 28) + NominalDelta(years=1), date(2000, 2, 28))
   -1   183         self.assertEqual(date(1999, 3, 1) + NominalDelta(years=1), date(2000, 3, 1))
   -1   184 
   -1   185         self.assertEqual(date(2000, 2, 28) + NominalDelta(years=1), date(2001, 2, 28))
   -1   186         self.assertEqual(date(2000, 2, 29) + NominalDelta(years=1), date(2001, 2, 28))
   -1   187 
   -1   188     def test_sub_date(self):
   -1   189         self.assertEqual(date(1970, 1, 30) - NominalDelta(days=5), date(1970, 1, 25))
   -1   190         self.assertEqual(date(2021, 2, 27) - NominalDelta(months=1), date(2021, 1, 27))
   -1   191         self.assertEqual(date(2021, 2, 28) - NominalDelta(months=1), date(2021, 1, 28))
   -1   192         self.assertEqual(date(2021, 3, 28) - NominalDelta(months=1), date(2021, 2, 28))
   -1   193         self.assertEqual(date(2021, 5, 30) - NominalDelta(months=1), date(2021, 4, 30))
   -1   194         self.assertEqual(date(2021, 6, 29) - NominalDelta(months=1), date(2021, 5, 29))
   64   195 
   65    -1     def test_radd_datetime(self):
   -1   196     def test_sub_date_clip(self):
   -1   197         self.assertEqual(date(2021, 3, 29) - NominalDelta(months=1), date(2021, 2, 28))
   -1   198         self.assertEqual(date(2021, 3, 30) - NominalDelta(months=1), date(2021, 2, 28))
   -1   199         self.assertEqual(date(2021, 3, 31) - NominalDelta(months=1), date(2021, 2, 28))
   -1   200         self.assertEqual(date(2021, 5, 31) - NominalDelta(months=1), date(2021, 4, 30))
   -1   201         self.assertEqual(date(2021, 6, 30) - NominalDelta(months=1), date(2021, 5, 30))
   -1   202 
   -1   203     def test_add_datetime(self):
   66   204         self.assertEqual(
   67    -1             datetime(1970, 1, 30, 13) + NominalDelta(months=1),
   68    -1             datetime(1970, 2, 28, 13),
   -1   205             datetime(2000, 1, 1) + NominalDelta(days=1), datetime(2000, 1, 2)
   -1   206         )
   -1   207         self.assertEqual(
   -1   208             datetime(2003, 9, 17, 20, 54, 47) + NominalDelta(months=1),
   -1   209             datetime(2003, 10, 17, 20, 54, 47),
   -1   210         )
   -1   211         self.assertEqual(
   -1   212             datetime(2003, 9, 17, 20, 54, 47) + NominalDelta(months=1, weeks=1),
   -1   213             datetime(2003, 10, 24, 20, 54, 47),
   -1   214         )
   -1   215         self.assertEqual(
   -1   216             datetime(2003, 9, 17, 20, 54, 47) + NominalDelta(years=1, months=-1),
   -1   217             datetime(2004, 8, 17, 20, 54, 47),
   69   218         )
   70   219         self.assertEqual(
   71   220             datetime(1970, 1, 30, 13) + NominalDelta(hours=2),
   72   221             datetime(1970, 1, 30, 15),
   73   222         )
   74   223         self.assertEqual(
   -1   224             datetime(1970, 1, 30, 13) + NominalDelta(seconds=80),
   -1   225             datetime(1970, 1, 30, 13, 1, 20),
   -1   226         )
   -1   227 
   -1   228     def test_add_datetime_24h(self):
   -1   229         self.assertEqual(
   75   230             datetime(1970, 1, 30, 13) + NominalDelta(hours=24),
   76   231             datetime(1970, 1, 31, 13),
   77   232         )
   -1   233 
   -1   234     def test_add_datetime_clip(self):
   78   235         self.assertEqual(
   79    -1             datetime(1970, 1, 30, 13) + NominalDelta(seconds=80),
   80    -1             datetime(1970, 1, 30, 13, 1, 20),
   -1   236             datetime(1970, 1, 30, 13) + NominalDelta(months=1),
   -1   237             datetime(1970, 2, 28, 13),
   81   238         )
   82   239 
   83    -1     def test_radd_datetime_dst(self):
   -1   240     def test_add_datetime_fractional_seconds(self):
   -1   241         self.assertEqual(
   -1   242             datetime(2009, 9, 3, 0, 0) + NominalDelta(minutes=30, seconds=30.5),
   -1   243             datetime(2009, 9, 3, 0, 30, 30, 500000),
   -1   244         )
   -1   245 
   -1   246     def test_add_datetime_dst(self):
   84   247         tz = ZoneInfo('Europe/Berlin')
   85   248         self.assertEqual(
   86   249             datetime(2019, 3, 31, 1, 59, tzinfo=tz) + NominalDelta(minutes=2),
@@ -95,13 +258,7 @@ class TestNominalDelta(unittest.TestCase):
   95   258             datetime(2019, 3, 31, 3, 30, tzinfo=tz),
   96   259         )
   97   260 
   98    -1     def test_rsub_date(self):
   99    -1         self.assertEqual(
  100    -1             date(1970, 1, 30) - NominalDelta(days=5),
  101    -1             date(1970, 1, 25),
  102    -1         )
  103    -1 
  104    -1     def test_rsub_datetime(self):
   -1   261     def test_sub_datetime(self):
  105   262         self.assertEqual(
  106   263             datetime(1970, 1, 30, 13) - NominalDelta(days=1),
  107   264             datetime(1970, 1, 29, 13),
@@ -118,8 +275,11 @@ class TestNominalDelta(unittest.TestCase):
  118   275             datetime(1970, 1, 30, 13) - NominalDelta(seconds=80),
  119   276             datetime(1970, 1, 30, 12, 58, 40),
  120   277         )
   -1   278         self.assertEqual(
   -1   279             datetime(2000, 1, 2) - NominalDelta(days=1), datetime(2000, 1, 1)
   -1   280         )
  121   281 
  122    -1     def test_rsub_datetime_dst(self):
   -1   282     def test_sub_datetime_dst(self):
  123   283         tz = ZoneInfo('Europe/Berlin')
  124   284         self.assertEqual(
  125   285             datetime(2019, 3, 31, 3, 1, tzinfo=tz) - NominalDelta(minutes=2),
@@ -131,6 +291,18 @@ class TestNominalDelta(unittest.TestCase):
  131   291             datetime(2019, 10, 27, 2, 59, tzinfo=tz),
  132   292         )
  133   293 
   -1   294 
   -1   295 class DiffTests(unittest.TestCase):
   -1   296     def test_diff_invalid(self):
   -1   297         with self.assertRaises(TypeError):
   -1   298             NominalDelta.diff('2018-01-02', '2018-01-01')
   -1   299 
   -1   300         with self.assertRaises(TypeError):
   -1   301             NominalDelta.diff('2018-01-02', datetime(2018, 1, 1))
   -1   302 
   -1   303         with self.assertRaises(TypeError):
   -1   304             NominalDelta.diff(datetime(2018, 1, 2), '2018-01-01')
   -1   305 
  134   306     def test_diff_date(self):
  135   307         self.assertEqual(
  136   308             NominalDelta.diff(date(1970, 1, 15), date(1970, 2, 15)),
@@ -169,3 +341,46 @@ class TestNominalDelta(unittest.TestCase):
  169   341             ),
  170   342             NominalDelta(seconds=80),
  171   343         )
   -1   344         self.assertEqual(
   -1   345             NominalDelta.diff(datetime(2001, 1, 1), datetime(2003, 9, 17, 20, 54, 47)),
   -1   346             NominalDelta(
   -1   347                 years=2,
   -1   348                 months=8,
   -1   349                 days=16,
   -1   350                 hours=20,
   -1   351                 minutes=54,
   -1   352                 seconds=47,
   -1   353             ),
   -1   354         )
   -1   355 
   -1   356     def test_diff_datetime_full_month(self):
   -1   357         self.assertEqual(
   -1   358             NominalDelta.diff(
   -1   359                 datetime(2003, 1, 31, 23, 59, 59),
   -1   360                 datetime(2003, 3, 1, 0, 0, 0),
   -1   361             ),
   -1   362             NominalDelta(months=1, seconds=1),
   -1   363         )
   -1   364         self.assertEqual(
   -1   365             NominalDelta.diff(
   -1   366                 datetime(2003, 3, 1, 0, 0, 0),
   -1   367                 datetime(2003, 1, 31, 23, 59, 59),
   -1   368             ),
   -1   369             NominalDelta(months=-1, seconds=-1),
   -1   370         )
   -1   371 
   -1   372     def test_diff_datetime_full_month_leap_year(self):
   -1   373         self.assertEqual(
   -1   374             NominalDelta.diff(
   -1   375                 datetime(2004, 1, 31, 23, 59, 59),
   -1   376                 datetime(2004, 3, 1, 0, 0, 0),
   -1   377             ),
   -1   378             NominalDelta(months=1, seconds=1),
   -1   379         )
   -1   380         self.assertEqual(
   -1   381             NominalDelta.diff(
   -1   382                 datetime(2004, 3, 1, 0, 0, 0),
   -1   383                 datetime(2004, 1, 31, 23, 59, 59),
   -1   384             ),
   -1   385             NominalDelta(months=-1, seconds=-1),
   -1   386         )