summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authorflywind <43030857+xflywind@users.noreply.github.com>2020-11-22 04:30:04 +0800
committerGitHub <noreply@github.com>2020-11-21 12:30:04 -0800
commitc9371ef59dc1c0b1037e0798dae8f0a90661db5d (patch)
tree912d6a5d6ce59d67e682c638e7a0a14cef356da6 /tests
parent3040f0550534848f61aa87d42e195e3fb5a70262 (diff)
downloadNim-c9371ef59dc1c0b1037e0798dae8f0a90661db5d.tar.gz
deques minor improvement (#16084)
Diffstat (limited to 'tests')
-rw-r--r--tests/stdlib/tdeque.nim111
1 files changed, 111 insertions, 0 deletions
diff --git a/tests/stdlib/tdeque.nim b/tests/stdlib/tdeque.nim
new file mode 100644
index 000000000..50e5d0ab1
--- /dev/null
+++ b/tests/stdlib/tdeque.nim
@@ -0,0 +1,111 @@
+import deques
+
+
+var deq = initDeque[int](1)
+deq.addLast(4)
+deq.addFirst(9)
+deq.addFirst(123)
+var first = deq.popFirst()
+deq.addLast(56)
+assert(deq.peekLast() == 56)
+deq.addLast(6)
+assert(deq.peekLast() == 6)
+var second = deq.popFirst()
+deq.addLast(789)
+assert(deq.peekLast() == 789)
+
+assert first == 123
+assert second == 9
+assert($deq == "[4, 56, 6, 789]")
+assert deq == [4, 56, 6, 789].toDeque
+
+assert deq[0] == deq.peekFirst and deq.peekFirst == 4
+#assert deq[^1] == deq.peekLast and deq.peekLast == 789
+deq[0] = 42
+deq[deq.len - 1] = 7
+
+assert 6 in deq and 789 notin deq
+assert deq.find(6) >= 0
+assert deq.find(789) < 0
+
+block:
+  var d = initDeque[int](1)
+  d.addLast 7
+  d.addLast 8
+  d.addLast 10
+  d.addFirst 5
+  d.addFirst 2
+  d.addFirst 1
+  d.addLast 20
+  d.shrink(fromLast = 2)
+  doAssert($d == "[1, 2, 5, 7, 8]")
+  d.shrink(2, 1)
+  doAssert($d == "[5, 7]")
+  d.shrink(2, 2)
+  doAssert d.len == 0
+
+for i in -2 .. 10:
+  if i in deq:
+    assert deq.contains(i) and deq.find(i) >= 0
+  else:
+    assert(not deq.contains(i) and deq.find(i) < 0)
+
+when compileOption("boundChecks"):
+  try:
+    echo deq[99]
+    assert false
+  except IndexDefect:
+    discard
+
+  try:
+    assert deq.len == 4
+    for i in 0 ..< 5: deq.popFirst()
+    assert false
+  except IndexDefect:
+    discard
+
+# grabs some types of resize error.
+deq = initDeque[int]()
+for i in 1 .. 4: deq.addLast i
+deq.popFirst()
+deq.popLast()
+for i in 5 .. 8: deq.addFirst i
+assert $deq == "[8, 7, 6, 5, 2, 3]"
+
+# Similar to proc from the documentation example
+proc foo(a, b: Positive) = # assume random positive values for `a` and `b`.
+  var deq = initDeque[int]()
+  assert deq.len == 0
+  for i in 1 .. a: deq.addLast i
+
+  if b < deq.len: # checking before indexed access.
+    assert deq[b] == b + 1
+
+  # The following two lines don't need any checking on access due to the logic
+  # of the program, but that would not be the case if `a` could be 0.
+  assert deq.peekFirst == 1
+  assert deq.peekLast == a
+
+  while deq.len > 0: # checking if the deque is empty
+    assert deq.popFirst() > 0
+
+#foo(0,0)
+foo(8, 5)
+foo(10, 9)
+foo(1, 1)
+foo(2, 1)
+foo(1, 5)
+foo(3, 2)
+
+import sets
+
+block t13310:
+  proc main() =
+    var q = initDeque[HashSet[int16]](2)
+    q.addFirst([1'i16].toHashSet)
+    q.addFirst([2'i16].toHashSet)
+    q.addFirst([3'i16].toHashSet)
+    assert $q == "[{3}, {2}, {1}]"
+
+  static:
+    main()