set_test.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. from pyrsistent import pset, s
  2. import pytest
  3. import pickle
  4. def test_key_is_tuple():
  5. with pytest.raises(KeyError):
  6. pset().remove((1,1))
  7. def test_literalish_works():
  8. assert s() is pset()
  9. assert s(1, 2) == pset([1, 2])
  10. def test_supports_hash():
  11. assert hash(s(1, 2)) == hash(s(1, 2))
  12. def test_empty_truthiness():
  13. assert s(1)
  14. assert not s()
  15. def test_contains_elements_that_it_was_initialized_with():
  16. initial = [1, 2, 3]
  17. s = pset(initial)
  18. assert set(s) == set(initial)
  19. assert len(s) == len(set(initial))
  20. def test_is_immutable():
  21. s1 = pset([1])
  22. s2 = s1.add(2)
  23. assert s1 == pset([1])
  24. assert s2 == pset([1, 2])
  25. s3 = s2.remove(1)
  26. assert s2 == pset([1, 2])
  27. assert s3 == pset([2])
  28. def test_remove_when_not_present():
  29. s1 = s(1, 2, 3)
  30. with pytest.raises(KeyError):
  31. s1.remove(4)
  32. def test_discard():
  33. s1 = s(1, 2, 3)
  34. assert s1.discard(3) == s(1, 2)
  35. assert s1.discard(4) is s1
  36. def test_is_iterable():
  37. assert sum(pset([1, 2, 3])) == 6
  38. def test_contains():
  39. s = pset([1, 2, 3])
  40. assert 2 in s
  41. assert 4 not in s
  42. def test_supports_set_operations():
  43. s1 = pset([1, 2, 3])
  44. s2 = pset([3, 4, 5])
  45. assert s1 | s2 == s(1, 2, 3, 4, 5)
  46. assert s1.union(s2) == s1 | s2
  47. assert s1 & s2 == s(3)
  48. assert s1.intersection(s2) == s1 & s2
  49. assert s1 - s2 == s(1, 2)
  50. assert s1.difference(s2) == s1 - s2
  51. assert s1 ^ s2 == s(1, 2, 4, 5)
  52. assert s1.symmetric_difference(s2) == s1 ^ s2
  53. def test_supports_set_comparisons():
  54. s1 = s(1, 2, 3)
  55. s3 = s(1, 2)
  56. s4 = s(1, 2, 3)
  57. assert s(1, 2, 3, 3, 5) == s(1, 2, 3, 5)
  58. assert s1 != s3
  59. assert s3 < s1
  60. assert s3 <= s1
  61. assert s3 <= s4
  62. assert s1 > s3
  63. assert s1 >= s3
  64. assert s4 >= s3
  65. def test_str():
  66. rep = str(pset([1, 2, 3]))
  67. assert rep == "pset([1, 2, 3])"
  68. def test_is_disjoint():
  69. s1 = pset([1, 2, 3])
  70. s2 = pset([3, 4, 5])
  71. s3 = pset([4, 5])
  72. assert not s1.isdisjoint(s2)
  73. assert s1.isdisjoint(s3)
  74. def test_evolver_simple_add():
  75. x = s(1, 2, 3)
  76. e = x.evolver()
  77. assert not e.is_dirty()
  78. e.add(4)
  79. assert e.is_dirty()
  80. x2 = e.persistent()
  81. assert not e.is_dirty()
  82. assert x2 == s(1, 2, 3, 4)
  83. assert x == s(1, 2, 3)
  84. def test_evolver_simple_remove():
  85. x = s(1, 2, 3)
  86. e = x.evolver()
  87. e.remove(2)
  88. x2 = e.persistent()
  89. assert x2 == s(1, 3)
  90. assert x == s(1, 2, 3)
  91. def test_evolver_no_update_produces_same_pset():
  92. x = s(1, 2, 3)
  93. e = x.evolver()
  94. assert e.persistent() is x
  95. def test_evolver_len():
  96. x = s(1, 2, 3)
  97. e = x.evolver()
  98. assert len(e) == 3
  99. def test_copy_returns_reference_to_self():
  100. s1 = s(10)
  101. assert s1.copy() is s1
  102. def test_pickling_empty_set():
  103. assert pickle.loads(pickle.dumps(s(), -1)) == s()
  104. def test_pickling_non_empty_map():
  105. assert pickle.loads(pickle.dumps(s(1, 2), -1)) == s(1, 2)
  106. def test_supports_weakref():
  107. import weakref
  108. weakref.ref(s(1))
  109. def test_update():
  110. assert s(1, 2, 3).update([3, 4, 4, 5]) == s(1, 2, 3, 4, 5)
  111. def test_update_no_elements():
  112. s1 = s(1, 2)
  113. assert s1.update([]) is s1
  114. def test_iterable():
  115. """
  116. PSets can be created from iterables even though they can't be len() hinted.
  117. """
  118. assert pset(iter("a")) == pset(iter("a"))