test_traitlets_enum.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. # -*- coding: UTF-8 -*-
  2. # pylint: disable=missing-docstring, too-few-public-methods
  3. """
  4. Test the trait-type ``UseEnum``.
  5. """
  6. import unittest
  7. import enum
  8. from ipython_genutils.py3compat import string_types
  9. from traitlets import HasTraits, TraitError, UseEnum
  10. # -----------------------------------------------------------------------------
  11. # TEST SUPPORT:
  12. # -----------------------------------------------------------------------------
  13. class Color(enum.Enum):
  14. red = 1
  15. green = 2
  16. blue = 3
  17. yellow = 4
  18. class OtherColor(enum.Enum):
  19. red = 0
  20. green = 1
  21. # -----------------------------------------------------------------------------
  22. # TESTSUITE:
  23. # -----------------------------------------------------------------------------
  24. class TestUseEnum(unittest.TestCase):
  25. # pylint: disable=invalid-name
  26. class Example(HasTraits):
  27. color = UseEnum(Color, help="Color enum")
  28. def test_assign_enum_value(self):
  29. example = self.Example()
  30. example.color = Color.green
  31. self.assertEqual(example.color, Color.green)
  32. def test_assign_all_enum_values(self):
  33. # pylint: disable=no-member
  34. enum_values = [value for value in Color.__members__.values()]
  35. for value in enum_values:
  36. self.assertIsInstance(value, Color)
  37. example = self.Example()
  38. example.color = value
  39. self.assertEqual(example.color, value)
  40. self.assertIsInstance(value, Color)
  41. def test_assign_enum_value__with_other_enum_raises_error(self):
  42. example = self.Example()
  43. with self.assertRaises(TraitError):
  44. example.color = OtherColor.green
  45. def test_assign_enum_name_1(self):
  46. # -- CONVERT: string => Enum value (item)
  47. example = self.Example()
  48. example.color = "red"
  49. self.assertEqual(example.color, Color.red)
  50. def test_assign_enum_value_name(self):
  51. # -- CONVERT: string => Enum value (item)
  52. # pylint: disable=no-member
  53. enum_names = [enum_val.name for enum_val in Color.__members__.values()]
  54. for value in enum_names:
  55. self.assertIsInstance(value, string_types)
  56. example = self.Example()
  57. enum_value = Color.__members__.get(value)
  58. example.color = value
  59. self.assertIs(example.color, enum_value)
  60. self.assertEqual(example.color.name, value)
  61. def test_assign_scoped_enum_value_name(self):
  62. # -- CONVERT: string => Enum value (item)
  63. scoped_names = ["Color.red", "Color.green", "Color.blue", "Color.yellow"]
  64. for value in scoped_names:
  65. example = self.Example()
  66. example.color = value
  67. self.assertIsInstance(example.color, Color)
  68. self.assertEqual(str(example.color), value)
  69. def test_assign_bad_enum_value_name__raises_error(self):
  70. # -- CONVERT: string => Enum value (item)
  71. bad_enum_names = ["UNKNOWN_COLOR", "RED", "Green", "blue2"]
  72. for value in bad_enum_names:
  73. example = self.Example()
  74. with self.assertRaises(TraitError):
  75. example.color = value
  76. def test_assign_enum_value_number_1(self):
  77. # -- CONVERT: number => Enum value (item)
  78. example = self.Example()
  79. example.color = 1 # == Color.red.value
  80. example.color = Color.red.value
  81. self.assertEqual(example.color, Color.red)
  82. def test_assign_enum_value_number(self):
  83. # -- CONVERT: number => Enum value (item)
  84. # pylint: disable=no-member
  85. enum_numbers = [enum_val.value
  86. for enum_val in Color.__members__.values()]
  87. for value in enum_numbers:
  88. self.assertIsInstance(value, int)
  89. example = self.Example()
  90. example.color = value
  91. self.assertIsInstance(example.color, Color)
  92. self.assertEqual(example.color.value, value)
  93. def test_assign_bad_enum_value_number__raises_error(self):
  94. # -- CONVERT: number => Enum value (item)
  95. bad_numbers = [-1, 0, 5]
  96. for value in bad_numbers:
  97. self.assertIsInstance(value, int)
  98. assert UseEnum(Color).select_by_number(value, None) is None
  99. example = self.Example()
  100. with self.assertRaises(TraitError):
  101. example.color = value
  102. def test_ctor_without_default_value(self):
  103. # -- IMPLICIT: default_value = Color.red (first enum-value)
  104. class Example2(HasTraits):
  105. color = UseEnum(Color)
  106. example = Example2()
  107. self.assertEqual(example.color, Color.red)
  108. def test_ctor_with_default_value_as_enum_value(self):
  109. # -- CONVERT: number => Enum value (item)
  110. class Example2(HasTraits):
  111. color = UseEnum(Color, default_value=Color.green)
  112. example = Example2()
  113. self.assertEqual(example.color, Color.green)
  114. def test_ctor_with_default_value_none_and_not_allow_none(self):
  115. # -- IMPLICIT: default_value = Color.red (first enum-value)
  116. class Example2(HasTraits):
  117. color1 = UseEnum(Color, default_value=None, allow_none=False)
  118. color2 = UseEnum(Color, default_value=None)
  119. example = Example2()
  120. self.assertEqual(example.color1, Color.red)
  121. self.assertEqual(example.color2, Color.red)
  122. def test_ctor_with_default_value_none_and_allow_none(self):
  123. class Example2(HasTraits):
  124. color1 = UseEnum(Color, default_value=None, allow_none=True)
  125. color2 = UseEnum(Color, allow_none=True)
  126. example = Example2()
  127. self.assertIs(example.color1, None)
  128. self.assertIs(example.color2, None)
  129. def test_assign_none_without_allow_none_resets_to_default_value(self):
  130. class Example2(HasTraits):
  131. color1 = UseEnum(Color, allow_none=False)
  132. color2 = UseEnum(Color)
  133. example = Example2()
  134. example.color1 = None
  135. example.color2 = None
  136. self.assertIs(example.color1, Color.red)
  137. self.assertIs(example.color2, Color.red)
  138. def test_assign_none_to_enum_or_none(self):
  139. class Example2(HasTraits):
  140. color = UseEnum(Color, allow_none=True)
  141. example = Example2()
  142. example.color = None
  143. self.assertIs(example.color, None)
  144. def test_assign_bad_value_with_to_enum_or_none(self):
  145. class Example2(HasTraits):
  146. color = UseEnum(Color, allow_none=True)
  147. example = Example2()
  148. with self.assertRaises(TraitError):
  149. example.color = "BAD_VALUE"