From c9371ef59dc1c0b1037e0798dae8f0a90661db5d Mon Sep 17 00:00:00 2001 From: flywind <43030857+xflywind@users.noreply.github.com> Date: Sun, 22 Nov 2020 04:30:04 +0800 Subject: deques minor improvement (#16084) --- tests/stdlib/tdeque.nim | 111 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 tests/stdlib/tdeque.nim (limited to 'tests') 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() -- cgit 1.4.1-2-gfad0