Files
Nim/tests/stdlib/tdeques.nim
flywind 834d5641e8 use sink and lent in deques (#17661)
* use sink and lent in deques

* Update lib/pure/collections/deques.nim

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
2021-04-07 14:17:48 +02:00

189 lines
4.0 KiB
Nim

discard """
matrix: "--gc:refc; --gc:orc"
targets: "c cpp js"
"""
import std/deques
from std/sequtils import toSeq
block:
proc index(self: Deque[int], idx: Natural): int =
self[idx]
proc main =
var testDeque = initDeque[int]()
testDeque.addFirst(1)
doAssert testDeque.index(0) == 1
main()
block:
var d = initDeque[int]()
d.addLast(1)
doAssert $d == "[1]"
block:
var d = initDeque[string]()
d.addLast("1")
doAssert $d == """["1"]"""
block:
var d = initDeque[char]()
d.addLast('1')
doAssert $d == "['1']"
block:
var deq = initDeque[int](1)
deq.addLast(4)
deq.addFirst(9)
deq.addFirst(123)
var first = deq.popFirst()
deq.addLast(56)
doAssert(deq.peekLast() == 56)
deq.addLast(6)
doAssert(deq.peekLast() == 6)
var second = deq.popFirst()
deq.addLast(789)
doAssert(deq.peekLast() == 789)
doAssert first == 123
doAssert second == 9
doAssert($deq == "[4, 56, 6, 789]")
doAssert deq == [4, 56, 6, 789].toDeque
doAssert deq[0] == deq.peekFirst and deq.peekFirst == 4
#doAssert deq[^1] == deq.peekLast and deq.peekLast == 789
deq[0] = 42
deq[deq.len - 1] = 7
doAssert 6 in deq and 789 notin deq
doAssert deq.find(6) >= 0
doAssert 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:
doAssert deq.contains(i) and deq.find(i) >= 0
else:
doAssert(not deq.contains(i) and deq.find(i) < 0)
when compileOption("boundChecks"):
try:
echo deq[99]
doAssert false
except IndexDefect:
discard
try:
doAssert deq.len == 4
for i in 0 ..< 5: deq.popFirst()
doAssert 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
doAssert $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]()
doAssert deq.len == 0
for i in 1 .. a: deq.addLast i
if b < deq.len: # checking before indexed access.
doAssert 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.
doAssert deq.peekFirst == 1
doAssert deq.peekLast == a
while deq.len > 0: # checking if the deque is empty
doAssert 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 std/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)
doAssert $q == "[{3}, {2}, {1}]"
static:
main()
proc main() =
block:
let a = [10, 20, 30].toDeque
doAssert toSeq(a.pairs) == @[(0, 10), (1, 20), (2, 30)]
block:
let q = [7, 9].toDeque
doAssert 7 in q
doAssert q.contains(7)
doAssert 8 notin q
block:
let a = [10, 20, 30, 40, 50].toDeque
doAssert $a == "[10, 20, 30, 40, 50]"
doAssert a.peekFirst == 10
doAssert len(a) == 5
block:
let a = [10, 20, 30, 40, 50].toDeque
doAssert $a == "[10, 20, 30, 40, 50]"
doAssert a.peekLast == 50
doAssert len(a) == 5
block:
var a = [10, 20, 30, 40, 50].toDeque
doAssert $a == "[10, 20, 30, 40, 50]"
doAssert a.popFirst == 10
doAssert $a == "[20, 30, 40, 50]"
block:
var a = [10, 20, 30, 40, 50].toDeque
doAssert $a == "[10, 20, 30, 40, 50]"
doAssert a.popLast == 50
doAssert $a == "[10, 20, 30, 40]"
block:
var a = [10, 20, 30, 40, 50].toDeque
doAssert $a == "[10, 20, 30, 40, 50]"
clear(a)
doAssert len(a) == 0
static: main()
main()