test_figure.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # -*- coding: utf-8 -*-
  2. import pytest
  3. import sys
  4. from ioex.calcex import Figure, UnitMismatchError
  5. @pytest.mark.parametrize(('init_params', 'init_kwargs', 'expected_value', 'expected_unit'), [
  6. [[], {}, None, None],
  7. [[123.4], {}, 123.4, None],
  8. [[None, 'm/s²'], {}, None, 'm/s²'],
  9. [[123.4, 'm/s²'], {}, 123.4, 'm/s²'],
  10. [[1234, '米/s²'], {}, 1234, '米/s²'],
  11. [[], {'value': 123.4}, 123.4, None],
  12. [[], {'unit': 'm/s²'}, None, 'm/s²'],
  13. [[], {'value': 123.4, 'unit': 'm/s²'}, 123.4, 'm/s²'],
  14. [[], {'value': 1234, 'unit': '米/s²'}, 1234, '米/s²'],
  15. [[1234], {'unit': '米/s²'}, 1234, '米/s²'],
  16. ])
  17. def test_init(init_params, init_kwargs, expected_value, expected_unit):
  18. f = Figure(*init_params, **init_kwargs)
  19. assert expected_value == f.value
  20. assert expected_unit == f.unit
  21. @pytest.mark.parametrize(('init_params', 'init_kwargs'), [
  22. [[12.34], {'value': 123.4}],
  23. [[12, 'm/h'], {'unit': 'm/s²'}],
  24. ])
  25. def test_init_multiple_values(init_params, init_kwargs):
  26. with pytest.raises(Exception):
  27. Figure(*init_params, **init_kwargs)
  28. @pytest.mark.parametrize(('value'), [
  29. 1234,
  30. 123.4,
  31. '一千',
  32. ])
  33. def test_set_value(value):
  34. f = Figure()
  35. assert None == f.value
  36. f.value = value
  37. assert value == f.value
  38. f.value = None
  39. assert None == f.value
  40. f.set_value(value)
  41. assert value == f.value
  42. def test_set_value_persistent():
  43. v = [1, 2]
  44. f = Figure(value=v)
  45. assert Figure([1, 2]) == f
  46. v[0] = 3
  47. v.append(4)
  48. assert Figure([1, 2]) == f
  49. def test_set_value_persistent_deep():
  50. v = [{'x': 1}, {'x': 2}]
  51. f = Figure(value=v)
  52. assert Figure([{'x': 1}, {'x': 2}]) == f
  53. v[0]['x'] = 3
  54. assert Figure([{'x': 1}, {'x': 2}]) == f
  55. @pytest.mark.parametrize(('unit'), [
  56. 'μg/l',
  57. '米/s²',
  58. ])
  59. def test_set_unit(unit):
  60. f = Figure()
  61. assert None == f.unit
  62. f.unit = unit
  63. assert unit == f.unit
  64. f.unit = None
  65. assert None == f.unit
  66. f.set_unit(unit)
  67. assert unit == f.unit
  68. def test_set_unit_persistent():
  69. u = [1, 2]
  70. f = Figure(0, u)
  71. assert Figure(0, [1, 2]) == f
  72. u.append(3)
  73. assert Figure(0, [1, 2]) == f
  74. def test_set_unit_persistent_deep():
  75. u = (['N', 'm'], ['l'])
  76. f = Figure(0, u)
  77. assert Figure(0, (['N', 'm'], ['l'])) == f
  78. u[0].append('g')
  79. assert Figure(0, (['N', 'm'], ['l'])) == f
  80. @pytest.mark.parametrize(('figure', 'expected_string'), [
  81. [Figure(), '?'],
  82. [Figure(value=123.4), '123.4'],
  83. [Figure(unit='m/s²'), '? m/s²'],
  84. [Figure(value=123.4, unit='m/s²'), '123.4 m/s²'],
  85. [Figure(value=1234, unit='米/s²'), '1234 米/s²'],
  86. ])
  87. def test_str(figure, expected_string):
  88. assert expected_string == str(figure)
  89. @pytest.mark.parametrize(('a', 'b'), [
  90. [Figure(1, 'm'), Figure(1, 'm')],
  91. ])
  92. def test_eq(a, b):
  93. assert a == b
  94. assert not (a != b)
  95. @pytest.mark.parametrize(('a', 'b'), [
  96. [Figure(1, 'm'), Figure(2, 'g')],
  97. [Figure(1, 'm'), Figure(2, 'm')],
  98. [Figure(2, 'm'), Figure(2, 'g')],
  99. ])
  100. def test_neq(a, b):
  101. assert a != b
  102. assert not (a == b)
  103. @pytest.mark.parametrize(('a', 'b', 'expected_sum'), [
  104. [Figure(1, 'm'), Figure(2, 'm'), Figure(3, 'm')],
  105. [Figure(-2, 'l'), Figure(-4, 'l'), Figure(-6, 'l')],
  106. [Figure(-1), Figure(3), Figure(2, None)],
  107. ])
  108. def test_add(a, b, expected_sum):
  109. assert expected_sum == a + b
  110. @pytest.mark.parametrize(('a', 'b'), [
  111. [Figure(1, 'm'), Figure(2, 'l')],
  112. [Figure(-2, 'l'), Figure(-4, None)],
  113. ])
  114. def test_add_unit_mismatch(a, b):
  115. with pytest.raises(UnitMismatchError):
  116. a + b
  117. def test_add_persistent():
  118. a = Figure([1], ['m'])
  119. b = Figure([2], ['m'])
  120. s = a + b
  121. assert Figure([1, 2], ['m']) == s
  122. a.value[0] = 3
  123. a.unit[0] = 'g'
  124. b.value[0] = 4
  125. b.unit[0] = 'l'
  126. assert Figure([1, 2], ['m']) == s
  127. def test_add_sum():
  128. s = sum([Figure(1, 'm'), Figure(2, 'm'), Figure(3, 'm')])
  129. assert Figure(6, 'm') == s
  130. @pytest.mark.parametrize(('a', 'b'), [
  131. [Figure(1, 'm'), 0],
  132. [Figure(1, 'm'), 'test'],
  133. [1, Figure(1, 'm')],
  134. ])
  135. def test_add_not_implemented(a, b):
  136. with pytest.raises(NotImplementedError):
  137. a + b
  138. @pytest.mark.parametrize(('a', 'b', 'expected_sum'), [
  139. [Figure(1, 'm'), Figure(2, 'm'), Figure(-1, 'm')],
  140. [Figure(-2, 'l'), Figure(-4, 'l'), Figure(2, 'l')],
  141. [Figure(-1), Figure(3), Figure(-4, None)],
  142. ])
  143. def test_sub(a, b, expected_sum):
  144. assert expected_sum == a - b
  145. @pytest.mark.parametrize(('a', 'b'), [
  146. [Figure(1, 'm'), Figure(2, 'l')],
  147. [Figure(-2, 'l'), Figure(-4, None)],
  148. ])
  149. def test_sub_unit_mismatch(a, b):
  150. with pytest.raises(UnitMismatchError):
  151. a - b
  152. def test_sub_persistent():
  153. a = Figure(1, ['m'])
  154. b = Figure(2, ['m'])
  155. d = a - b
  156. assert Figure(-1, ['m']) == d
  157. a.value = 3
  158. a.unit[0] = 'g'
  159. b.value = 4
  160. b.unit[0] = 'l'
  161. assert Figure(-1, ['m']) == d
  162. @pytest.mark.parametrize(('a', 'b', 'expected_product'), [
  163. [Figure(1, 'm'), Figure(2), Figure(2, 'm')],
  164. [Figure(1, 'm'), 2, Figure(2, 'm')],
  165. [Figure(2, 'm'), -1.5, Figure(-3, 'm')],
  166. ])
  167. def test_mult(a, b, expected_product):
  168. assert expected_product == a * b
  169. @pytest.mark.skipif(sys.version_info >= (3, 0), reason='__truediv__ is not defined')
  170. @pytest.mark.parametrize(('a', 'b', 'expected_quotient'), [
  171. [Figure(1.0, 'm'), Figure(2), Figure(0.5, 'm')],
  172. [Figure(1.0, 'm'), 2, Figure(0.5, 'm')],
  173. [Figure(2.0, 'm'), -1.5, Figure(-4. / 3, 'm')],
  174. ])
  175. def test_div(a, b, expected_quotient):
  176. generated_quotient = a / b
  177. assert expected_quotient == generated_quotient