tsets_various.nim 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. discard """
  2. output: '''
  3. set is empty
  4. '''
  5. """
  6. import sets, hashes
  7. from sequtils import toSeq
  8. from algorithm import sorted
  9. proc sortedPairs[T](t: T): auto = toSeq(t.pairs).sorted
  10. template sortedItems(t: untyped): untyped = sorted(toSeq(t))
  11. block tsetpop:
  12. var a = initHashSet[int]()
  13. for i in 1..1000:
  14. a.incl(i)
  15. doAssert len(a) == 1000
  16. for i in 1..1000:
  17. discard a.pop()
  18. doAssert len(a) == 0
  19. try:
  20. echo a.pop()
  21. except KeyError as e:
  22. echo e.msg
  23. block tsets_lt:
  24. var s, s1: set[char]
  25. s = {'a'..'d'}
  26. s1 = {'a'..'c'}
  27. doAssert s1 < s
  28. doAssert s1 * s == {'a'..'c'}
  29. doAssert s1 <= s
  30. block tsets2:
  31. const
  32. data = [
  33. "34", "12",
  34. "90", "0",
  35. "1", "2",
  36. "3", "4",
  37. "5", "6",
  38. "7", "8",
  39. "9", "---00",
  40. "10", "11", "19",
  41. "20", "30", "40",
  42. "50", "60", "70",
  43. "80"]
  44. block tableTest1:
  45. var t = initHashSet[tuple[x, y: int]]()
  46. t.incl((0,0))
  47. t.incl((1,0))
  48. assert(not t.containsOrIncl((0,1)))
  49. t.incl((1,1))
  50. for x in 0..1:
  51. for y in 0..1:
  52. assert((x,y) in t)
  53. #assert($t ==
  54. # "{(x: 0, y: 0), (x: 0, y: 1), (x: 1, y: 0), (x: 1, y: 1)}")
  55. block setTest2:
  56. var t = initHashSet[string]()
  57. t.incl("test")
  58. t.incl("111")
  59. t.incl("123")
  60. t.excl("111")
  61. t.incl("012")
  62. t.incl("123") # test duplicates
  63. assert "123" in t
  64. assert "111" notin t # deleted
  65. assert t.missingOrExcl("000")
  66. assert "000" notin t
  67. assert t.missingOrExcl("012") == false
  68. assert "012" notin t
  69. assert t.containsOrIncl("012") == false
  70. assert t.containsOrIncl("012")
  71. assert "012" in t # added back
  72. for key in items(data): t.incl(key)
  73. for key in items(data): assert key in t
  74. for key in items(data): t.excl(key)
  75. for key in items(data): assert key notin t
  76. block orderedSetTest1:
  77. var t = data.toOrderedSet
  78. for key in items(data): assert key in t
  79. var i = 0
  80. # `items` needs to yield in insertion order:
  81. for key in items(t):
  82. assert key == data[i]
  83. inc(i)
  84. block tsets3:
  85. let
  86. s1: HashSet[int] = toHashSet([1, 2, 4, 8, 16])
  87. s2: HashSet[int] = toHashSet([1, 2, 3, 5, 8])
  88. s3: HashSet[int] = toHashSet([3, 5, 7])
  89. block union:
  90. let
  91. s1_s2 = union(s1, s2)
  92. s1_s3 = s1 + s3
  93. s2_s3 = s2 + s3
  94. assert s1_s2.len == 7
  95. assert s1_s3.len == 8
  96. assert s2_s3.len == 6
  97. for i in s1:
  98. assert i in s1_s2
  99. assert i in s1_s3
  100. for i in s2:
  101. assert i in s1_s2
  102. assert i in s2_s3
  103. for i in s3:
  104. assert i in s1_s3
  105. assert i in s2_s3
  106. assert((s1 + s1) == s1)
  107. assert((s2 + s1) == s1_s2)
  108. block intersection:
  109. let
  110. s1_s2 = intersection(s1, s2)
  111. s1_s3 = intersection(s1, s3)
  112. s2_s3 = s2 * s3
  113. assert s1_s2.len == 3
  114. assert s1_s3.len == 0
  115. assert s2_s3.len == 2
  116. for i in s1_s2:
  117. assert i in s1
  118. assert i in s2
  119. for i in s1_s3:
  120. assert i in s1
  121. assert i in s3
  122. for i in s2_s3:
  123. assert i in s2
  124. assert i in s3
  125. assert((s2 * s2) == s2)
  126. assert((s3 * s2) == s2_s3)
  127. block symmetricDifference:
  128. let
  129. s1_s2 = symmetricDifference(s1, s2)
  130. s1_s3 = s1 -+- s3
  131. s2_s3 = s2 -+- s3
  132. assert s1_s2.len == 4
  133. assert s1_s3.len == 8
  134. assert s2_s3.len == 4
  135. for i in s1:
  136. assert i in s1_s2 xor i in s2
  137. assert i in s1_s3 xor i in s3
  138. for i in s2:
  139. assert i in s1_s2 xor i in s1
  140. assert i in s2_s3 xor i in s3
  141. for i in s3:
  142. assert i in s1_s3 xor i in s1
  143. assert i in s2_s3 xor i in s2
  144. assert((s3 -+- s3) == initHashSet[int]())
  145. assert((s3 -+- s1) == s1_s3)
  146. block difference:
  147. let
  148. s1_s2 = difference(s1, s2)
  149. s1_s3 = difference(s1, s3)
  150. s2_s3 = s2 - s3
  151. assert s1_s2.len == 2
  152. assert s1_s3.len == 5
  153. assert s2_s3.len == 3
  154. for i in s1:
  155. assert i in s1_s2 xor i in s2
  156. assert i in s1_s3 xor i in s3
  157. for i in s2:
  158. assert i in s2_s3 xor i in s3
  159. assert((s2 - s2) == initHashSet[int]())
  160. block disjoint:
  161. assert(not disjoint(s1, s2))
  162. assert disjoint(s1, s3)
  163. assert(not disjoint(s2, s3))
  164. assert(not disjoint(s2, s2))
  165. block: # https://github.com/nim-lang/Nim/issues/13496
  166. template testDel(body) =
  167. block:
  168. body
  169. t.incl(15)
  170. t.incl(19)
  171. t.incl(17)
  172. t.incl(150)
  173. t.excl(150)
  174. doAssert t.len == 3
  175. doAssert sortedItems(t) == @[15, 17, 19]
  176. var s = newSeq[int]()
  177. for v in t: s.add(v)
  178. assert s.len == 3
  179. doAssert sortedItems(s) == @[15, 17, 19]
  180. when t is OrderedSet:
  181. doAssert sortedPairs(t) == @[(a: 0, b: 15), (a: 1, b: 19), (a: 2, b: 17)]
  182. doAssert toSeq(t) == @[15, 19, 17]
  183. testDel(): (var t: HashSet[int])
  184. testDel(): (var t: OrderedSet[int])
  185. block: # test correctness after a number of inserts/deletes
  186. template testDel(body) =
  187. block:
  188. body
  189. var expected: seq[int]
  190. let n = 100
  191. let n2 = n*2
  192. for i in 0..<n:
  193. t.incl(i)
  194. for i in 0..<n:
  195. if i mod 3 == 0:
  196. t.excl(i)
  197. for i in n..<n2:
  198. t.incl(i)
  199. for i in 0..<n2:
  200. if i mod 7 == 0:
  201. t.excl(i)
  202. for i in 0..<n2:
  203. if (i>=n or i mod 3 != 0) and i mod 7 != 0:
  204. expected.add i
  205. for i in expected: doAssert i in t
  206. doAssert t.len == expected.len
  207. doAssert sortedItems(t) == expected
  208. testDel(): (var t: HashSet[int])
  209. testDel(): (var t: OrderedSet[int])