test_figure_yaml.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. # -*- coding: utf-8 -*-
  2. import pytest
  3. from ioex.calcex import Figure
  4. yaml = pytest.importorskip('yaml')
  5. @pytest.mark.parametrize(('yaml_loader'), [yaml.Loader, yaml.SafeLoader])
  6. @pytest.mark.parametrize(('figure_yaml', 'expected_figure'), [
  7. ['!fig {value: null, unit: null}', Figure()],
  8. ['!fig {value: 123.4, unit: null}', Figure(123.4)],
  9. ['!fig {value: [1, 2], unit: null}', Figure([1, 2])],
  10. ['!fig {value: null, unit: kg}', Figure(unit='kg')],
  11. ['!fig {value: 123.4, unit: km/h}', Figure(123.4, 'km/h')],
  12. ['!fig {value: [1, 2], unit: km/h}', Figure([1, 2], 'km/h')],
  13. ['!fig "?"', Figure()],
  14. ['!fig 123.4', Figure(123.4)],
  15. ['!fig 123.0', Figure(123.0)],
  16. ['!fig "? kg"', Figure(unit='kg')],
  17. ['!fig 123.4 km/h', Figure(123.4, 'km/h')],
  18. ['!fig 1234', Figure(1234)],
  19. ['!fig -123', Figure(-123)],
  20. [u'!fig 1234 米/s²', Figure(1234, u'米/s²')],
  21. ])
  22. def test_register_yaml_constructor(figure_yaml, expected_figure, yaml_loader):
  23. class TestLoader(yaml_loader):
  24. pass
  25. Figure.register_yaml_constructor(TestLoader, tag='!fig')
  26. generated_figure = yaml.load(figure_yaml, Loader=TestLoader)
  27. assert expected_figure == generated_figure
  28. assert isinstance(generated_figure.value, type(expected_figure.value))
  29. @pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
  30. @pytest.mark.parametrize(('figure', 'expected_text'), [
  31. [Figure(), '?'],
  32. [Figure(1234), '1234'],
  33. [Figure(-123), '-123'],
  34. [Figure(123.4), '123.4'],
  35. [Figure(-12.3), '-12.3'],
  36. [Figure(None, u'm/s²'), u'? m/s²'],
  37. [Figure(None, u'm/(s·s)'), u'? m/(s·s)'],
  38. [Figure(1234, u'米/s²'), u'1234 米/s²'],
  39. [Figure(123.4, u'm/s²'), u'123.4 m/s²'],
  40. ])
  41. def test_to_yaml_scalar(figure, expected_text, yaml_dumper):
  42. class TestDumper(yaml_dumper):
  43. pass
  44. TestDumper.add_representer(
  45. type(figure),
  46. lambda d, f: figure.to_yaml(d, f, '!fig')
  47. )
  48. generated_yaml = yaml.dump(figure, Dumper=TestDumper)
  49. class TestLoader(yaml.SafeLoader):
  50. pass
  51. TestLoader.add_constructor(
  52. '!fig',
  53. lambda loader, node: loader.construct_scalar(node),
  54. )
  55. assert expected_text == yaml.load(generated_yaml, Loader=TestLoader)
  56. @pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
  57. @pytest.mark.parametrize(('figure'), [
  58. Figure([1, 2]),
  59. Figure([1, 2], u'm/s²'),
  60. Figure({'x': 1, 'y': -2}, u'米/s²'),
  61. ])
  62. def test_to_yaml_mapping(figure, yaml_dumper):
  63. class TestDumper(yaml_dumper):
  64. pass
  65. TestDumper.add_representer(
  66. type(figure),
  67. lambda d, f: figure.to_yaml(d, f, '!fig')
  68. )
  69. generated_yaml = yaml.dump(figure, Dumper=TestDumper)
  70. class TestLoader(yaml.SafeLoader):
  71. pass
  72. TestLoader.add_constructor(
  73. '!fig',
  74. lambda loader, node: loader.construct_mapping(node),
  75. )
  76. figure_attr = yaml.load(generated_yaml, Loader=TestLoader)
  77. assert set(['value', 'unit']) == set(figure_attr.keys())
  78. assert figure.value == figure_attr['value']
  79. assert figure.unit == figure_attr['unit']
  80. @pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
  81. @pytest.mark.parametrize(('figure'), [
  82. Figure(123.4, u'm/s²'),
  83. ])
  84. def test_register_yaml_representer(figure, yaml_dumper):
  85. class TestDumper(yaml_dumper):
  86. pass
  87. figure.register_yaml_representer(TestDumper, tag='!test-fig')
  88. generated_yaml = yaml.dump(figure, Dumper=TestDumper)
  89. class TestLoader(yaml.SafeLoader):
  90. pass
  91. figure.register_yaml_constructor(TestLoader, tag='!test-fig')
  92. loaded_figure = yaml.load(generated_yaml, Loader=TestLoader)
  93. assert figure == loaded_figure
  94. @pytest.mark.parametrize(('yaml_loader'), [yaml.Loader, yaml.SafeLoader])
  95. def test_from_yaml_subclass_explicit_tag(yaml_loader):
  96. class SubFigure(Figure):
  97. pass
  98. class TestLoader(yaml_loader):
  99. pass
  100. Figure.register_yaml_constructor(TestLoader, tag='!fig')
  101. SubFigure.register_yaml_constructor(TestLoader, tag='!sfig')
  102. subfig = yaml.load("!sfig 12.34 EUR", Loader=TestLoader)
  103. assert SubFigure == type(subfig)
  104. assert Figure != type(subfig)
  105. assert SubFigure(12.34, 'EUR') == subfig
  106. @pytest.mark.parametrize(('yaml_loader'), [yaml.Loader, yaml.SafeLoader])
  107. def test_from_yaml_subclass_implicit_tag(yaml_loader):
  108. class SubFigure(Figure):
  109. yaml_tag = "!sfig"
  110. class TestLoader(yaml_loader):
  111. pass
  112. SubFigure.register_yaml_constructor(TestLoader)
  113. subfig = yaml.load("!sfig 12.34 EUR", Loader=TestLoader)
  114. assert SubFigure == type(subfig)
  115. assert Figure != type(subfig)
  116. assert SubFigure(12.34, 'EUR') == subfig
  117. @pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
  118. def test_to_yaml_subclass_explicit_tag(yaml_dumper):
  119. class SubFigure(Figure):
  120. pass
  121. class TestDumper(yaml_dumper):
  122. pass
  123. Figure.register_yaml_representer(TestDumper, tag='!fig')
  124. SubFigure.register_yaml_representer(TestDumper, tag='!sfig')
  125. subfig_yaml = yaml.dump(
  126. SubFigure(12.34, 'EUR'),
  127. Dumper=TestDumper,
  128. )
  129. assert "!sfig '12.34 EUR'\n" == subfig_yaml
  130. @pytest.mark.parametrize(('yaml_dumper'), [yaml.Dumper, yaml.SafeDumper])
  131. def test_to_yaml_subclass_implicit_tag(yaml_dumper):
  132. class SubFigure(Figure):
  133. yaml_tag = "!subfig"
  134. class TestDumper(yaml_dumper):
  135. pass
  136. SubFigure.register_yaml_representer(TestDumper)
  137. subfig_yaml = yaml.dump(
  138. SubFigure(12.34, 'EUR'),
  139. Dumper=TestDumper,
  140. )
  141. assert "!subfig '12.34 EUR'\n" == subfig_yaml