Added test for find

This commit is contained in:
Nocturn9x 2022-03-16 13:39:32 +01:00
parent a3bcbc36e3
commit f979af98d3
2 changed files with 32 additions and 24 deletions

View File

@ -48,7 +48,7 @@ proc newDequeNode[T](val: T): DequeNode[T] =
result.val = val result.val = val
proc newLinkedDeque*[T](maxSize: int = 0): LinkedDeque[T] = proc newLinkedDeque*[T](maxSize: int = 0): LinkedDeque[T] {.raises: [ValueError].} =
## Initializes a new, empty ## Initializes a new, empty
## LinkedDeque object with an ## LinkedDeque object with an
## optional size limit. A maxSize ## optional size limit. A maxSize
@ -80,7 +80,7 @@ proc maxSize*[T](self: LinkedDeque[T]): int =
result = self.maxSize result = self.maxSize
proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] {.raises: IndexDefect.} = proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] {.raises: [IndexDefect, ValueError].} =
## Low level method for indexing and getting ## Low level method for indexing and getting
## a node object back ## a node object back
if self.high() == -1: if self.high() == -1:
@ -108,30 +108,30 @@ proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] {.raises: IndexDefec
dec(pos) dec(pos)
proc `[]`*[T](self: LinkedDeque[T], i: int): T {.raises: IndexDefect.} = proc `[]`*[T](self: LinkedDeque[T], i: int): T {.raises: [IndexDefect, ValueError].} =
## Implements indexing into the queue ## Implements indexing into the queue
result = self.getNode(i).val result = self.getNode(i).val
proc `[]=`*[T](self: LinkedDeque[T], i: int, val: T) {.raises: IndexDefect.} = proc `[]=`*[T](self: LinkedDeque[T], i: int, val: T) {.raises: [IndexDefect, ValueError].} =
## Sets element at position i ## Sets element at position i
## to the given value ## to the given value
self[i].val = val self[i].val = val
proc `[]`*[T](self: LinkedDeque[T], i: BackwardsIndex): T {.raises: IndexDefect.} = proc `[]`*[T](self: LinkedDeque[T], i: BackwardsIndex): T {.raises: [IndexDefect, ValueError].} =
## Implements indexing into the queue ## Implements indexing into the queue
## with backwards indeces ## with backwards indeces
result = self[self.size - int(i)] result = self[self.size - int(i)]
proc `[]=`*[T](self: LinkedDeque[T], i: BackwardsIndex, val: T) {.raises: IndexDefect.} = proc `[]=`*[T](self: LinkedDeque[T], i: BackwardsIndex, val: T) {.raises: [IndexDefect, ValueError].} =
## Sets element at backwards ## Sets element at backwards
## position i to the given value ## position i to the given value
self[self.size - int(i)] = val self[self.size - int(i)] = val
proc pop*[T](self: LinkedDeque[T], pos: int = 0): T {.raises: IndexDefect.} = proc pop*[T](self: LinkedDeque[T], pos: int = 0): T {.raises: [IndexDefect, ValueError].} =
## Pops an element off the deque ## Pops an element off the deque
## at the given index (default 0). ## at the given index (default 0).
## The queue is optimized for popping ## The queue is optimized for popping
@ -155,7 +155,7 @@ proc pop*[T](self: LinkedDeque[T], pos: int = 0): T {.raises: IndexDefect.} =
dec(self.size) dec(self.size)
proc pop*[T](self: LinkedDeque[T], pos: BackwardsIndex): T {.raises: IndexDefect.} = proc pop*[T](self: LinkedDeque[T], pos: BackwardsIndex): T {.raises: [IndexDefect, ValueError].} =
## Same as self.pop but for backwards indeces ## Same as self.pop but for backwards indeces
result = self.pop(self.size - int(pos)) result = self.pop(self.size - int(pos))
@ -207,7 +207,7 @@ proc addLeft*[T](self: LinkedDeque[T], val: T) =
inc(self.size) inc(self.size)
proc insert*[T](self: LinkedDeque[T], pos: int, val: T) {.raises: IndexDefect.} = proc insert*[T](self: LinkedDeque[T], pos: int, val: T) {.raises: [IndexDefect, ValueError].} =
## Inserts the given value at the given ## Inserts the given value at the given
## position. When pos equals 0, this proc is equivalent ## position. When pos equals 0, this proc is equivalent
## to addLeft. In all other cases, all items are ## to addLeft. In all other cases, all items are

View File

@ -19,18 +19,18 @@ import ../src/nimdeque
when isMainModule: when isMainModule:
const size = 10 const size = 5000
const benchSize = 500000 const benchSize = 50000
echo &"Running tests with queue of size {size}" echo &"Running tests with queue of size {size}"
var deque = newLinkedDeque[int]() var deque = newLinkedDeque[int]()
var testStart = cpuTime() var testStart = cpuTime()
echo &"\t- Checking add()" echo &"\t- Testing add()"
for i in countup(0, size - 1, 1): for i in countup(0, size - 1, 1):
deque.add(i) deque.add(i)
doAssert deque.len() == size doAssert deque.len() == size
echo "\t- Checking iteration" echo "\t- Testing iteration"
for i in countup(0, size - 1, 1): for i in countup(0, size - 1, 1):
doAssert deque[i] == i doAssert deque[i] == i
for i, e in deque: for i, e in deque:
@ -42,17 +42,17 @@ when isMainModule:
for i, e in deque.reversedPairs(): for i, e in deque.reversedPairs():
doAssert size - i - 1 == e doAssert size - i - 1 == e
echo "\t- Checking contains()" echo "\t- Testing contains()"
for i in countup(0, size - 1, 1): for i in countup(0, size - 1, 1):
doAssert i in deque doAssert i in deque
doAssert 48574857 notin deque doAssert 48574857 notin deque
doAssert -0xfffffff notin deque doAssert -0xfffffff notin deque
echo "\t- Checking pop(0)" echo "\t- Testing pop(0)"
doAssert deque.pop() == 0 doAssert deque.pop() == 0
doAssert deque.len() == size - 1 doAssert deque.len() == size - 1
doAssert deque[0] == 1 doAssert deque[0] == 1
echo "\t- Checking pop(^1)" echo "\t- Testing pop(^1)"
doAssert deque.pop(deque.high()) == size - 1 doAssert deque.pop(deque.high()) == size - 1
doAssert deque.len() == size - 2 doAssert deque.len() == size - 2
doAssert deque[deque.high()] == size - 2 doAssert deque[deque.high()] == size - 2
@ -61,7 +61,7 @@ when isMainModule:
for i in countup(0, size - 3, 1): for i in countup(0, size - 3, 1):
doAssert deque[i] == i + 1 doAssert deque[i] == i + 1
echo "\t- Checking addLeft()" echo "\t- Testing addLeft()"
deque.addLeft(0) deque.addLeft(0)
doAssert deque.len() == size - 1 doAssert deque.len() == size - 1
doAssert deque[0] == 0 doAssert deque[0] == 0
@ -70,21 +70,21 @@ when isMainModule:
for i in countup(0, size - 2, 1): for i in countup(0, size - 2, 1):
doAssert deque[i] == i doAssert deque[i] == i
echo "\t- Checking insert(3)" echo "\t- Testing insert(3)"
var oldLen = deque.len() var oldLen = deque.len()
deque.insert(3, 69420) deque.insert(3, 69420)
doAssert oldLen + 1 == deque.len() doAssert oldLen + 1 == deque.len()
doAssert deque.pop(3) == 69420 doAssert deque.pop(3) == 69420
doAssert deque.len() == oldLen doAssert deque.len() == oldLen
echo &"\t- Checking insert({size - 2})" echo &"\t- Testing insert({size - 2})"
oldLen = deque.len() oldLen = deque.len()
deque.insert(size - 2, 0x42362) deque.insert(size - 2, 0x42362)
doAssert oldLen + 1 == deque.len() doAssert oldLen + 1 == deque.len()
doAssert deque.pop(size - 2) == 0x42362 doAssert deque.pop(size - 2) == 0x42362
doAssert deque.len() == oldLen doAssert deque.len() == oldLen
echo &"\t- Checking insert({size div 2})" echo &"\t- Testing insert({size div 2})"
oldLen = deque.len() oldLen = deque.len()
deque.insert(size div 2, 0xf7102) deque.insert(size div 2, 0xf7102)
doAssert oldLen + 1 == deque.len() doAssert oldLen + 1 == deque.len()
@ -93,20 +93,20 @@ when isMainModule:
randomize() randomize()
let idx = rand(size - 1) let idx = rand(size - 1)
echo &"\t- Checking insert({idx})" echo &"\t- Testing insert({idx})"
oldLen = deque.len() oldLen = deque.len()
deque.insert(idx, 0xff) deque.insert(idx, 0xff)
doAssert oldLen + 1 == deque.len() doAssert oldLen + 1 == deque.len()
doAssert deque.pop(idx) == 0xff doAssert deque.pop(idx) == 0xff
doAssert deque.len() == oldLen doAssert deque.len() == oldLen
echo "\t- Checking backwards indeces" echo "\t- Testing backwards indeces"
for i in countdown(deque.high(), 1): for i in countdown(deque.high(), 1):
doAssert deque[^i] == deque[deque.len() - i] doAssert deque[^i] == deque[deque.len() - i]
deque.add(deque.pop(^1)) deque.add(deque.pop(^1))
doAssert deque[deque.high()] == deque[^1] doAssert deque[deque.high()] == deque[^1]
echo &"\t- Checking queue with maxSize {size div 2}" echo &"\t- Testing queue with maxSize {size div 2}"
var queue = newLinkedDeque[int](size div 2) var queue = newLinkedDeque[int](size div 2)
for i in countup(0, (size div 2) - 1): for i in countup(0, (size div 2) - 1):
queue.add(i) queue.add(i)
@ -150,6 +150,14 @@ when isMainModule:
# but ¯\_(ツ)_/¯ who cares # but ¯\_(ツ)_/¯ who cares
b.extend(a) b.extend(a)
doAssert a == b doAssert a == b
echo "\t- Testing find()"
for i in countup(0, size - 1):
deque.add(i)
doAssert deque.find(size - 1) == size - 1
doAssert deque.find(0) == 0
doAssert deque.find(size) == -1
doAssert deque.find(size div 2) == size div 2
echo &"Tests completed in {cpuTime() - testStart} seconds" echo &"Tests completed in {cpuTime() - testStart} seconds"
## End of tests, start of benchmark ## End of tests, start of benchmark
@ -326,5 +334,5 @@ when isMainModule:
start = cpuTime() start = cpuTime()
q2 = @[] q2 = @[]
echo &"Total benchmark time: {cpuTime() - benchStart}" echo &"\nTotal benchmark time: {cpuTime() - benchStart}"
echo &"Total execution time: {cpuTime() - testStart}" echo &"Total execution time: {cpuTime() - testStart}"