test_duration.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. # -*- coding: utf-8 -*-
  2. import pytest
  3. from ioex.datetimeex import Duration
  4. import datetime
  5. import pytz
  6. @pytest.mark.parametrize(('init_kwargs'), [
  7. {'years': 0},
  8. {'years': 13},
  9. {'days': 0},
  10. {'days': 13},
  11. {'minutes': 7},
  12. {'years': 1, 'days': 3},
  13. {'years': 1, 'days': 3, 'minutes': 5},
  14. ])
  15. def test_init(init_kwargs):
  16. d = Duration(**init_kwargs)
  17. for attr in ['years', 'days']:
  18. if attr in init_kwargs:
  19. assert init_kwargs[attr] == getattr(d, attr)
  20. else:
  21. assert 0 == getattr(d, attr)
  22. def test_init_default():
  23. d = Duration()
  24. assert 0 == d.years
  25. assert 0 == d.days
  26. assert 0 == d.minutes
  27. @pytest.mark.parametrize(('init_kwargs', 'exception_type'), [
  28. [{'years': -2}, ValueError],
  29. [{'years': '1'}, TypeError],
  30. [{'days': -2}, ValueError],
  31. [{'days': '1'}, TypeError],
  32. [{'minutes': -2}, ValueError],
  33. [{'minutes': '1'}, TypeError],
  34. ])
  35. def test_init_fail(init_kwargs, exception_type):
  36. with pytest.raises(exception_type):
  37. Duration(**init_kwargs)
  38. @pytest.mark.parametrize(('years'), [
  39. 0,
  40. 13,
  41. ])
  42. def test_set_years(years):
  43. d = Duration()
  44. d.years = years
  45. assert d.years == years
  46. @pytest.mark.parametrize(('years', 'exception_type'), [
  47. [-2, ValueError],
  48. ['1', TypeError],
  49. ])
  50. def test_set_years_fail(years, exception_type):
  51. d = Duration()
  52. with pytest.raises(exception_type):
  53. d.years = years
  54. @pytest.mark.parametrize(('days'), [
  55. 0,
  56. 13,
  57. ])
  58. def test_set_days(days):
  59. d = Duration()
  60. d.days = days
  61. assert d.days == days
  62. @pytest.mark.parametrize(('days', 'exception_type'), [
  63. [-2, ValueError],
  64. ['1', TypeError],
  65. ])
  66. def test_set_days_fail(days, exception_type):
  67. d = Duration()
  68. with pytest.raises(exception_type):
  69. d.days = days
  70. @pytest.mark.parametrize(('minutes'), [
  71. 0,
  72. 13,
  73. ])
  74. def test_set_minutes(minutes):
  75. d = Duration()
  76. d.minutes = minutes
  77. assert d.minutes == minutes
  78. @pytest.mark.parametrize(('minutes', 'exception_type'), [
  79. [-2, ValueError],
  80. ['1', TypeError],
  81. ])
  82. def test_set_minutes_fail(minutes, exception_type):
  83. d = Duration()
  84. with pytest.raises(exception_type):
  85. d.minutes = minutes
  86. @pytest.mark.parametrize(('init_params', 'iso'), [
  87. [{'years': 0}, 'P0Y'],
  88. [{'years': 30}, 'P30Y'],
  89. [{'years': 3}, 'P3Y'],
  90. [{'days': 30}, 'P30D'],
  91. [{'days': 3}, 'P3D'],
  92. [{'minutes': 3}, 'PT3M'],
  93. [{'years': 10, 'days': 30}, 'P10Y30D'],
  94. [{'days': 30, 'minutes': 50}, 'P30DT50M'],
  95. [{'years': 10, 'days': 30, 'minutes': 50}, 'P10Y30DT50M'],
  96. ])
  97. def test_get_isoformat(init_params, iso):
  98. d = Duration(**init_params)
  99. assert d.isoformat == iso
  100. @pytest.mark.parametrize(('expected', 'source_iso'), [
  101. [Duration(years=0), 'P0Y'],
  102. [Duration(years=30), 'P30Y'],
  103. [Duration(years=3), 'P3Y'],
  104. [Duration(days=30), 'P30D'],
  105. [Duration(days=3), 'P3D'],
  106. [Duration(minutes=3), 'PT3M'],
  107. [Duration(years=10, days=30), 'P10Y30D'],
  108. [Duration(days=30, minutes=50), 'P30DT50M'],
  109. [Duration(years=10, days=30, minutes=50), 'P10Y30DT50M'],
  110. ])
  111. def test_from_iso(expected, source_iso):
  112. d = Duration.from_iso(source_iso)
  113. assert expected == d
  114. @pytest.mark.parametrize(('source_iso'), [
  115. 'Q0Y',
  116. 'P10M20M',
  117. '2017-05-19T20:02:22+02:00',
  118. ])
  119. def test_from_iso_fail(source_iso):
  120. with pytest.raises(ValueError):
  121. Duration.from_iso(source_iso)
  122. @pytest.mark.parametrize(('a', 'b'), [
  123. [Duration(), Duration(years=0, days=0)],
  124. [Duration(years=0), Duration(years=0)],
  125. [Duration(years=3), Duration(years=3)],
  126. [Duration(days=0), Duration(days=0)],
  127. [Duration(days=3), Duration(days=3)],
  128. [Duration(minutes=3), Duration(minutes=3)],
  129. [Duration(years=1, days=3), Duration(years=1, days=3)],
  130. [Duration(years=1, days=3, minutes=5),
  131. Duration(years=1, days=3, minutes=5)],
  132. ])
  133. def test_eq(a, b):
  134. assert a == b
  135. assert b == a
  136. @pytest.mark.parametrize(('src_dt', 'duration', 'expected_sum'), [
  137. [
  138. datetime.datetime(2017, 5, 19, 21, 7, 1),
  139. Duration(years=3),
  140. datetime.datetime(2020, 5, 19, 21, 7, 1),
  141. ],
  142. [
  143. datetime.datetime(2016, 2, 29, 21, 7, 1),
  144. Duration(years=1),
  145. datetime.datetime(2017, 2, 28, 21, 7, 1),
  146. ],
  147. [
  148. datetime.datetime(2016, 2, 29, 21, 7, 1),
  149. Duration(years=1, days=6),
  150. datetime.datetime(2017, 3, 6, 21, 7, 1),
  151. ],
  152. [
  153. datetime.datetime(2016, 2, 29, 21, 7, 1),
  154. Duration(years=1, days=6, minutes=18),
  155. datetime.datetime(2017, 3, 6, 21, 25, 1),
  156. ],
  157. [
  158. pytz.timezone('Europe/Vienna').localize(
  159. datetime.datetime(2016, 2, 29, 21, 7, 1),
  160. ),
  161. Duration(years=1, days=6),
  162. pytz.timezone('Europe/Vienna').localize(
  163. datetime.datetime(2017, 3, 6, 21, 7, 1),
  164. ),
  165. ],
  166. ])
  167. def test_radd_datetime(src_dt, duration, expected_sum):
  168. assert expected_sum == src_dt + duration