test_hashable.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. from django.test import SimpleTestCase
  2. from django.utils.hashable import make_hashable
  3. class TestHashable(SimpleTestCase):
  4. def test_equal(self):
  5. tests = (
  6. ([], ()),
  7. (["a", 1], ("a", 1)),
  8. ({}, ()),
  9. ({"a"}, ("a",)),
  10. (frozenset({"a"}), {"a"}),
  11. ({"a": 1, "b": 2}, (("a", 1), ("b", 2))),
  12. ({"b": 2, "a": 1}, (("a", 1), ("b", 2))),
  13. (("a", ["b", 1]), ("a", ("b", 1))),
  14. (("a", {"b": 1}), ("a", (("b", 1),))),
  15. )
  16. for value, expected in tests:
  17. with self.subTest(value=value):
  18. self.assertEqual(make_hashable(value), expected)
  19. def test_count_equal(self):
  20. tests = (
  21. ({"a": 1, "b": ["a", 1]}, (("a", 1), ("b", ("a", 1)))),
  22. ({"a": 1, "b": ("a", [1, 2])}, (("a", 1), ("b", ("a", (1, 2))))),
  23. )
  24. for value, expected in tests:
  25. with self.subTest(value=value):
  26. self.assertCountEqual(make_hashable(value), expected)
  27. def test_unhashable(self):
  28. class Unhashable:
  29. __hash__ = None
  30. with self.assertRaisesMessage(TypeError, "unhashable type: 'Unhashable'"):
  31. make_hashable(Unhashable())