test_duration.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. {'years': 1, 'days': 3},
  12. ])
  13. def test_init(init_kwargs):
  14. d = Duration(**init_kwargs)
  15. for attr in ['years', 'days']:
  16. if attr in init_kwargs:
  17. assert init_kwargs[attr] == getattr(d, attr)
  18. else:
  19. assert 0 == getattr(d, attr)
  20. def test_init_default():
  21. d = Duration()
  22. assert 0 == d.years
  23. assert 0 == d.days
  24. @pytest.mark.parametrize(('init_kwargs', 'exception_type'), [
  25. [{'years': -2}, ValueError],
  26. [{'years': '1'}, TypeError],
  27. [{'days': -2}, ValueError],
  28. [{'days': '1'}, TypeError],
  29. ])
  30. def test_init_fail(init_kwargs, exception_type):
  31. with pytest.raises(exception_type):
  32. Duration(**init_kwargs)
  33. @pytest.mark.parametrize(('years'), [
  34. 0,
  35. 13,
  36. ])
  37. def test_set_years(years):
  38. d = Duration()
  39. d.years = years
  40. assert d.years == years
  41. @pytest.mark.parametrize(('years', 'exception_type'), [
  42. [-2, ValueError],
  43. ['1', TypeError],
  44. ])
  45. def test_set_years_fail(years, exception_type):
  46. d = Duration()
  47. with pytest.raises(exception_type):
  48. d.years = years
  49. @pytest.mark.parametrize(('days'), [
  50. 0,
  51. 13,
  52. ])
  53. def test_set_days(days):
  54. d = Duration()
  55. d.days = days
  56. assert d.days == days
  57. @pytest.mark.parametrize(('days', 'exception_type'), [
  58. [-2, ValueError],
  59. ['1', TypeError],
  60. ])
  61. def test_set_days_fail(days, exception_type):
  62. d = Duration()
  63. with pytest.raises(exception_type):
  64. d.days = days
  65. @pytest.mark.parametrize(('init_params', 'iso'), [
  66. [{'years': 0}, 'P0Y'],
  67. [{'years': 30}, 'P30Y'],
  68. [{'years': 3}, 'P3Y'],
  69. [{'days': 30}, 'P30D'],
  70. [{'days': 3}, 'P3D'],
  71. [{'years': 10, 'days': 30}, 'P10Y30D'],
  72. ])
  73. def test_get_isoformat(init_params, iso):
  74. d = Duration(**init_params)
  75. assert d.isoformat == iso
  76. @pytest.mark.parametrize(('expected', 'source_iso'), [
  77. [Duration(years=0), 'P0Y'],
  78. [Duration(years=30), 'P30Y'],
  79. [Duration(years=3), 'P3Y'],
  80. [Duration(days=30), 'P30D'],
  81. [Duration(days=3), 'P3D'],
  82. [Duration(years=10, days=30), 'P10Y30D'],
  83. ])
  84. def test_from_iso(expected, source_iso):
  85. d = Duration.from_iso(source_iso)
  86. assert expected == d
  87. @pytest.mark.parametrize(('source_iso'), [
  88. 'Q0Y',
  89. '2017-05-19T20:02:22+02:00',
  90. ])
  91. def test_from_iso_fail(source_iso):
  92. with pytest.raises(ValueError):
  93. Duration.from_iso(source_iso)
  94. @pytest.mark.parametrize(('a', 'b'), [
  95. [Duration(), Duration(years=0, days=0)],
  96. [Duration(years=0), Duration(years=0)],
  97. [Duration(years=3), Duration(years=3)],
  98. [Duration(days=0), Duration(days=0)],
  99. [Duration(days=3), Duration(days=3)],
  100. [Duration(years=1, days=3), Duration(years=1, days=3)],
  101. ])
  102. def test_eq(a, b):
  103. assert a == b
  104. assert b == a
  105. @pytest.mark.parametrize(('src_dt', 'duration', 'expected_sum'), [
  106. [
  107. datetime.datetime(2017, 5, 19, 21, 7, 1),
  108. Duration(years=3),
  109. datetime.datetime(2020, 5, 19, 21, 7, 1),
  110. ],
  111. [
  112. datetime.datetime(2016, 2, 29, 21, 7, 1),
  113. Duration(years=1),
  114. datetime.datetime(2017, 2, 28, 21, 7, 1),
  115. ],
  116. [
  117. datetime.datetime(2016, 2, 29, 21, 7, 1),
  118. Duration(years=1, days=6),
  119. datetime.datetime(2017, 3, 6, 21, 7, 1),
  120. ],
  121. [
  122. pytz.timezone('Europe/Vienna').localize(
  123. datetime.datetime(2016, 2, 29, 21, 7, 1),
  124. ),
  125. Duration(years=1, days=6),
  126. pytz.timezone('Europe/Vienna').localize(
  127. datetime.datetime(2017, 3, 6, 21, 7, 1),
  128. ),
  129. ],
  130. ])
  131. def test_radd_datetime(src_dt, duration, expected_sum):
  132. assert expected_sum == src_dt + duration