mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 17:34:43 +00:00
151 lines
3.5 KiB
Nim
151 lines
3.5 KiB
Nim
discard """
|
|
targets: "c js"
|
|
"""
|
|
|
|
import lists, sequtils, std/enumerate, std/sugar
|
|
|
|
const
|
|
data = [1, 2, 3, 4, 5, 6]
|
|
|
|
block SinglyLinkedListTest1:
|
|
var L: SinglyLinkedList[int]
|
|
for d in items(data): L.prepend(d)
|
|
for d in items(data): L.append(d)
|
|
doAssert($L == "[6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6]")
|
|
|
|
doAssert(4 in L)
|
|
|
|
block SinglyLinkedListTest2:
|
|
var L: SinglyLinkedList[string]
|
|
for d in items(data): L.prepend($d)
|
|
doAssert($L == """["6", "5", "4", "3", "2", "1"]""")
|
|
|
|
doAssert("4" in L)
|
|
|
|
|
|
block DoublyLinkedListTest1:
|
|
var L: DoublyLinkedList[int]
|
|
for d in items(data): L.prepend(d)
|
|
for d in items(data): L.append(d)
|
|
L.remove(L.find(1))
|
|
doAssert($L == "[6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6]")
|
|
|
|
doAssert(4 in L)
|
|
|
|
block SinglyLinkedRingTest1:
|
|
var L: SinglyLinkedRing[int]
|
|
L.prepend(4)
|
|
doAssert($L == "[4]")
|
|
L.prepend(4)
|
|
|
|
doAssert($L == "[4, 4]")
|
|
doAssert(4 in L)
|
|
|
|
|
|
block DoublyLinkedRingTest1:
|
|
var L: DoublyLinkedRing[int]
|
|
L.prepend(4)
|
|
doAssert($L == "[4]")
|
|
L.prepend(4)
|
|
|
|
doAssert($L == "[4, 4]")
|
|
doAssert(4 in L)
|
|
|
|
L.append(3)
|
|
L.append(5)
|
|
doAssert($L == "[4, 4, 3, 5]")
|
|
|
|
L.remove(L.find(3))
|
|
L.remove(L.find(5))
|
|
L.remove(L.find(4))
|
|
L.remove(L.find(4))
|
|
doAssert($L == "[]")
|
|
doAssert(4 notin L)
|
|
|
|
block tlistsToString:
|
|
block:
|
|
var l = initDoublyLinkedList[int]()
|
|
l.append(1)
|
|
l.append(2)
|
|
l.append(3)
|
|
doAssert $l == "[1, 2, 3]"
|
|
block:
|
|
var l = initDoublyLinkedList[string]()
|
|
l.append("1")
|
|
l.append("2")
|
|
l.append("3")
|
|
doAssert $l == """["1", "2", "3"]"""
|
|
block:
|
|
var l = initDoublyLinkedList[char]()
|
|
l.append('1')
|
|
l.append('2')
|
|
l.append('3')
|
|
doAssert $l == """['1', '2', '3']"""
|
|
|
|
template testCommon(initList, toList) =
|
|
|
|
block: # toSinglyLinkedList, toDoublyLinkedList
|
|
let l = seq[int].default
|
|
doAssert l.toList.toSeq == []
|
|
doAssert [1].toList.toSeq == [1]
|
|
doAssert [1, 2, 3].toList.toSeq == [1, 2, 3]
|
|
|
|
block copy:
|
|
doAssert array[0, int].default.toList.copy.toSeq == []
|
|
doAssert [1].toList.copy.toSeq == [1]
|
|
doAssert [1, 2].toList.copy.toSeq == [1, 2]
|
|
doAssert [1, 2, 3].toList.copy.toSeq == [1, 2, 3]
|
|
type Foo = ref object
|
|
x: int
|
|
var f0 = Foo(x: 0)
|
|
let f1 = Foo(x: 1)
|
|
var a = [f0].toList
|
|
var b = a.copy
|
|
b.append f1
|
|
doAssert a.toSeq == [f0]
|
|
doAssert b.toSeq == [f0, f1]
|
|
f0.x = 42
|
|
doAssert a.head.value.x == 42
|
|
doAssert b.head.value.x == 42
|
|
|
|
block: # add, addMoved
|
|
block:
|
|
var
|
|
l0 = initList[int]()
|
|
l1 = [1].toList
|
|
l2 = [2, 3].toList
|
|
l3 = [4, 5, 6].toList
|
|
l0.add l3
|
|
l1.add l3
|
|
l2.addMoved l3
|
|
doAssert l0.toSeq == [4, 5, 6]
|
|
doAssert l1.toSeq == [1, 4, 5, 6]
|
|
doAssert l2.toSeq == [2, 3, 4, 5, 6]
|
|
doAssert l3.toSeq == []
|
|
l2.add l3 # re-adding l3 that was destroyed is now a no-op
|
|
doAssert l2.toSeq == [2, 3, 4, 5, 6]
|
|
doAssert l3.toSeq == []
|
|
block:
|
|
var
|
|
l0 = initList[int]()
|
|
l1 = [1].toList
|
|
l2 = [2, 3].toList
|
|
l3 = [4, 5, 6].toList
|
|
l3.addMoved l0
|
|
l2.addMoved l1
|
|
doAssert l3.toSeq == [4, 5, 6]
|
|
doAssert l2.toSeq == [2, 3, 1]
|
|
l3.add l0
|
|
doAssert l3.toSeq == [4, 5, 6]
|
|
block:
|
|
var c = [0, 1].toList
|
|
c.addMoved c
|
|
let s = collect:
|
|
for i, ci in enumerate(c):
|
|
if i == 6: break
|
|
ci
|
|
doAssert s == [0, 1, 0, 1, 0, 1]
|
|
|
|
testCommon initSinglyLinkedList, toSinglyLinkedList
|
|
testCommon initDoublyLinkedList, toDoublyLinkedList
|