test_traitlets.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from __future__ import annotations
  2. from typing import Any
  3. from unittest import TestCase
  4. from traitlets import TraitError
  5. class TraitTestBase(TestCase):
  6. """A best testing class for basic trait types."""
  7. def assign(self, value: Any) -> None:
  8. self.obj.value = value # type:ignore[attr-defined]
  9. def coerce(self, value: Any) -> Any:
  10. return value
  11. def test_good_values(self) -> None:
  12. if hasattr(self, "_good_values"):
  13. for value in self._good_values:
  14. self.assign(value)
  15. self.assertEqual(self.obj.value, self.coerce(value)) # type:ignore[attr-defined]
  16. def test_bad_values(self) -> None:
  17. if hasattr(self, "_bad_values"):
  18. for value in self._bad_values:
  19. try:
  20. self.assertRaises(TraitError, self.assign, value)
  21. except AssertionError:
  22. raise AssertionError(value) from None
  23. def test_default_value(self) -> None:
  24. if hasattr(self, "_default_value"):
  25. self.assertEqual(self._default_value, self.obj.value) # type:ignore[attr-defined]
  26. def test_allow_none(self) -> None:
  27. if (
  28. hasattr(self, "_bad_values")
  29. and hasattr(self, "_good_values")
  30. and None in self._bad_values
  31. ):
  32. trait = self.obj.traits()["value"] # type:ignore[attr-defined]
  33. try:
  34. trait.allow_none = True
  35. self._bad_values.remove(None)
  36. # skip coerce. Allow None casts None to None.
  37. self.assign(None)
  38. self.assertEqual(self.obj.value, None) # type:ignore[attr-defined]
  39. self.test_good_values()
  40. self.test_bad_values()
  41. finally:
  42. # tear down
  43. trait.allow_none = False
  44. self._bad_values.append(None)
  45. def tearDown(self) -> None:
  46. # restore default value after tests, if set
  47. if hasattr(self, "_default_value"):
  48. self.obj.value = self._default_value # type:ignore[attr-defined]