test_frozen.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import re
  2. import pytest
  3. from pandas.core.indexes.frozen import FrozenList
  4. @pytest.fixture
  5. def lst():
  6. return [1, 2, 3, 4, 5]
  7. @pytest.fixture
  8. def container(lst):
  9. return FrozenList(lst)
  10. @pytest.fixture
  11. def unicode_container():
  12. return FrozenList(["\u05d0", "\u05d1", "c"])
  13. class TestFrozenList:
  14. def check_mutable_error(self, *args, **kwargs):
  15. # Pass whatever function you normally would to pytest.raises
  16. # (after the Exception kind).
  17. mutable_regex = re.compile("does not support mutable operations")
  18. msg = "'(_s)?re.(SRE_)?Pattern' object is not callable"
  19. with pytest.raises(TypeError, match=msg):
  20. mutable_regex(*args, **kwargs)
  21. def test_no_mutable_funcs(self, container):
  22. def setitem():
  23. container[0] = 5
  24. self.check_mutable_error(setitem)
  25. def setslice():
  26. container[1:2] = 3
  27. self.check_mutable_error(setslice)
  28. def delitem():
  29. del container[0]
  30. self.check_mutable_error(delitem)
  31. def delslice():
  32. del container[0:3]
  33. self.check_mutable_error(delslice)
  34. mutable_methods = ("extend", "pop", "remove", "insert")
  35. for meth in mutable_methods:
  36. self.check_mutable_error(getattr(container, meth))
  37. def test_slicing_maintains_type(self, container, lst):
  38. result = container[1:2]
  39. expected = lst[1:2]
  40. self.check_result(result, expected)
  41. def check_result(self, result, expected):
  42. assert isinstance(result, FrozenList)
  43. assert result == expected
  44. def test_string_methods_dont_fail(self, container):
  45. repr(container)
  46. str(container)
  47. bytes(container)
  48. def test_tricky_container(self, unicode_container):
  49. repr(unicode_container)
  50. str(unicode_container)
  51. def test_add(self, container, lst):
  52. result = container + (1, 2, 3)
  53. expected = FrozenList(lst + [1, 2, 3])
  54. self.check_result(result, expected)
  55. result = (1, 2, 3) + container
  56. expected = FrozenList([1, 2, 3] + lst)
  57. self.check_result(result, expected)
  58. def test_iadd(self, container, lst):
  59. q = r = container
  60. q += [5]
  61. self.check_result(q, lst + [5])
  62. # Other shouldn't be mutated.
  63. self.check_result(r, lst)
  64. def test_union(self, container, lst):
  65. result = container.union((1, 2, 3))
  66. expected = FrozenList(lst + [1, 2, 3])
  67. self.check_result(result, expected)
  68. def test_difference(self, container):
  69. result = container.difference([2])
  70. expected = FrozenList([1, 3, 4, 5])
  71. self.check_result(result, expected)
  72. def test_difference_dupe(self):
  73. result = FrozenList([1, 2, 3, 2]).difference([2])
  74. expected = FrozenList([1, 3])
  75. self.check_result(result, expected)
  76. def test_tricky_container_to_bytes_raises(self, unicode_container):
  77. # GH 26447
  78. msg = "^'str' object cannot be interpreted as an integer$"
  79. with pytest.raises(TypeError, match=msg):
  80. bytes(unicode_container)