Files
Nim/tests/stdlib/tyield.nim
ringabout 4fa86422c0 stdlib tests now check refc too (#21664)
* stdlib tests now check refc too

* typo

* fixes line numbers

* disable cpp

* do not touch
2023-04-21 15:37:58 +02:00

259 lines
4.3 KiB
Nim

discard """
matrix: "--mm:refc; --mm:orc"
targets: "c cpp js"
"""
import std/[sugar, algorithm]
import std/assertions
block:
var x = @[(6.0, 6, '6'),
(5.0, 5, '5'),
(4.0, 4, '4'),
(3.0, 3, '3'),
(2.0, 2, '2'),
(1.0, 1, '1')]
let y = x.reversed
block:
let res = collect:
for (f, i, c) in x:
(f, i, c)
doAssert res == x
iterator popAscending[T](q: var seq[T]): T =
while q.len > 0: yield q.pop
block:
var res = collect:
for f, i, c in popAscending(x):
(f, i, c)
doAssert res == y
let z = reversed(res)
let res2 = collect:
for (f, i, c) in popAscending(res):
(f, i, c)
doAssert res2 == z
block:
var visits = 0
block:
proc bar(): (int, int) =
inc visits
(visits, visits)
iterator foo(): (int, int) =
yield bar()
for a, b in foo():
doAssert a == b
doAssert visits == 1
block:
proc iterAux(a: seq[int], i: var int): (int, string) =
result = (a[i], $a[i])
inc i
iterator pairs(a: seq[int]): (int, string) =
var i = 0
while i < a.len:
yield iterAux(a, i)
var x = newSeq[int](10)
for i in 0 ..< x.len:
x[i] = i
let res = collect:
for k, v in x:
(k, v)
let expected = collect:
for i in 0 ..< x.len:
(i, $i)
doAssert res == expected
block:
proc bar(): (int, int, int) =
inc visits
(visits, visits, visits)
iterator foo(): (int, int, int) =
yield bar()
for a, b, c in foo():
doAssert a == b
doAssert visits == 2
block:
proc bar(): int =
inc visits
visits
proc car(): int =
inc visits
visits
iterator foo(): (int, int) =
yield (bar(), car())
yield (bar(), car())
for a, b in foo():
doAssert b == a + 1
doAssert visits == 6
block:
proc bar(): (int, int) =
inc visits
(visits, visits)
proc t2(): int = 99
iterator foo(): (int, int) =
yield (12, t2())
yield bar()
let res = collect:
for (a, b) in foo():
(a, b)
doAssert res == @[(12, 99), (7, 7)]
doAssert visits == 7
block:
proc bar(): (int, int) =
inc visits
(visits, visits)
proc t2(): int = 99
iterator foo(): (int, int) =
yield ((12, t2()))
yield (bar())
let res = collect:
for (a, b) in foo():
(a, b)
doAssert res == @[(12, 99), (8, 8)]
doAssert visits == 8
block:
proc bar(): (int, int) =
inc visits
(visits, visits)
proc t1(): int = 99
proc t2(): int = 99
iterator foo(): (int, int) =
yield (t1(), t2())
yield bar()
let res = collect:
for a, b in foo():
(a, b)
doAssert res == @[(99, 99), (9, 9)]
doAssert visits == 9
block:
proc bar(): ((int, int), string) =
inc visits
((visits, visits), $visits)
proc t2(): int = 99
iterator foo(): ((int, int), string) =
yield ((1, 2), $t2())
yield bar()
let res = collect:
for a, b in foo():
(a, b)
doAssert res == @[((1, 2), "99"), ((10, 10), "10")]
doAssert visits == 10
block:
proc bar(): (int, int) =
inc visits
(visits, visits)
iterator foo(): (int, int) =
yield (for i in 0 ..< 10: discard bar(); bar())
yield (bar())
let res = collect:
for (a, b) in foo():
(a, b)
doAssert res == @[(21, 21), (22, 22)]
block:
proc bar(): (int, int) =
inc visits
(visits, visits)
proc t2(): int = 99
iterator foo(): (int, int) =
yield if true: bar() else: (t2(), t2())
yield (bar())
let res = collect:
for a, b in foo():
(a, b)
doAssert res == @[(23, 23), (24, 24)]
block:
iterator foo(): (int, int, int) =
var time = 777
yield (1, time, 3)
let res = collect:
for a, b, c in foo():
(a, b, c)
doAssert res == @[(1, 777, 3)]
block:
iterator foo(): (int, int, int) =
var time = 777
yield (1, time, 3)
let res = collect:
for t in foo():
(t[0], t[1], t[2])
doAssert res == @[(1, 777, 3)]
block:
proc bar(): (int, int, int) =
(1, 2, 3)
iterator foo(): (int, int, int) =
yield bar()
let res = collect:
for a, b, c in foo():
(a, b, c)
doAssert res == @[(1, 2, 3)]