Merge tests into a larger file (part 2 of ∞) (#9335)

* merge controlflow tests

* merge distinct tests

* merge enum tests

* merge fields tests

* merge implicit tests

* merge iter issues tests
This commit is contained in:
Miran 2018-10-13 14:58:31 +02:00 • committed by Andreas Rumpf
commit 3c9fcc4c30
40 changed files with 809 additions and 802 deletions

View file

@ -1,14 +0,0 @@
discard """
output: '''1'''
"""
# bug #3837
iterator t1(): int {.closure.} =
yield 1
iterator t2(): int {.closure.} =
for i in t1():
yield i
for i in t2():
echo $i

View file

@ -1,20 +0,0 @@
discard """
output: '''0
1
2
3
4
'''
"""
proc moo(): iterator (): int =
iterator fooGen: int {.closure.} =
while true:
yield result
result.inc
return fooGen
var foo = moo()
for i in 0 .. 4:
echo foo()

View file

@ -1,7 +0,0 @@
iterator xy[T](a: T, b: set[T]): T =
if a in b:
yield a
for a in xy(1'i8, {}):
for b in xy(a, {}):
echo a

View file

@ -1,81 +0,0 @@
discard """
output: '''start
false
0
1
2
end
@[2, 4, 6, 8, 10]
@[4, 8, 12, 16, 20]'''
"""
# bug #3837
proc iter1(): (iterator: int) =
let coll = [0,1,2]
result = iterator: int {.closure.} =
for i in coll:
yield i
proc iter2(it: (iterator: int)): (iterator: int) =
result = iterator: int {.closure.} =
echo finished(it)
for i in it():
yield i
echo "start"
let myiter1 = iter1()
let myiter2 = iter2(myiter1)
for i in myiter2():
echo i
echo "end"
# start
# false
# end
from sequtils import toSeq
type Iterable*[T] = (iterator: T) | Slice[T]
## Everything that can be iterated over, iterators and slices so far.
proc toIter*[T](s: Slice[T]): iterator: T =
## Iterate over a slice.
iterator it: T {.closure.} =
for x in s.a..s.b:
yield x
return it
proc toIter*[T](i: iterator: T): iterator: T =
## Nop
i
iterator map*[T,S](i: Iterable[T], f: proc(x: T): S): S =
let i = toIter(i)
for x in i():
yield f(x)
proc filter*[T](i: Iterable[T], f: proc(x: T): bool): iterator: T =
## Iterates through an iterator and yields every item that fulfills the
## predicate `f`.
##
## .. code-block:: nim
## for x in filter(1..11, proc(x): bool = x mod 2 == 0):
## echo x
let i = toIter(i)
iterator it: T {.closure.} =
for x in i():
if f(x):
yield x
result = it
iterator filter*[T](i: Iterable[T], f: proc(x: T): bool): T =
let i = toIter(i)
for x in i():
if f(x):
yield x
var it = toSeq(filter(2..10, proc(x: int): bool = x mod 2 == 0))
echo it # @[2, 4, 6, 8, 10]
it = toSeq(map(filter(2..10, proc(x: int): bool = x mod 2 == 0), proc(x: int): int = x * 2))
echo it # Expected output: @[4, 8, 12, 16, 20], Actual output: @[]

View file

@ -1,33 +0,0 @@
# bug #3221
import algorithm, math, sequtils
iterator permutations[T](ys: openarray[T]): seq[T] =
var
d = 1
c = newSeq[int](ys.len)
xs = newSeq[T](ys.len)
for i, y in ys: xs[i] = y
yield xs
block outer:
while true:
while d > 1:
dec d
c[d] = 0
while c[d] >= d:
inc d
if d >= ys.len: break outer
let i = if (d and 1) == 1: c[d] else: 0
swap xs[i], xs[d]
yield xs
inc c[d]
proc dig_vectors(): void =
var v_nums: seq[int]
v_nums = newSeq[int](1)
for perm in permutations(toSeq(0 .. 1)):
v_nums[0] = 1
dig_vectors()

215
tests/iter/tissues.nim Normal file
View file

@ -0,0 +1,215 @@
discard """
output: '''
0
1
2
3
4
1
start
false
0
1
2
end
@[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 21, 24, 27, 30, 36, 40, 42]
1002
0
1
2
7
'''
"""
import algorithm, math, sequtils, strutils
block t338:
proc moo(): iterator (): int =
iterator fooGen: int {.closure.} =
while true:
yield result
result.inc
return fooGen
var foo = moo()
for i in 0 .. 4:
echo foo()
block t8041:
iterator xy[T](a: T, b: set[T]): T =
if a in b:
yield a
for a in xy(1'i8, {}):
for b in xy(a, {}):
echo a
block t3837_chained:
iterator t1(): int {.closure.} =
yield 1
iterator t2(): int {.closure.} =
for i in t1():
yield i
for i in t2():
echo $i
proc iter1(): (iterator: int) =
let coll = [0,1,2]
result = iterator: int {.closure.} =
for i in coll:
yield i
proc iter2(it: (iterator: int)): (iterator: int) =
result = iterator: int {.closure.} =
echo finished(it)
for i in it():
yield i
echo "start"
let myiter1 = iter1()
let myiter2 = iter2(myiter1)
for i in myiter2():
echo i
echo "end"
type Iterable[T] = (iterator: T) | Slice[T]
## Everything that can be iterated over, iterators and slices so far.
proc toIter[T](s: Slice[T]): iterator: T =
## Iterate over a slice.
iterator it: T {.closure.} =
for x in s.a..s.b:
yield x
return it
proc toIter[T](i: iterator: T): iterator: T =
## Nop
i
iterator map[T,S](i: Iterable[T], f: proc(x: T): S): S =
let i = toIter(i)
for x in i():
yield f(x)
proc filter[T](i: Iterable[T], f: proc(x: T): bool): iterator: T =
let i = toIter(i)
iterator it: T {.closure.} =
for x in i():
if f(x):
yield x
result = it
iterator filter[T](i: Iterable[T], f: proc(x: T): bool): T =
let i = toIter(i)
for x in i():
if f(x):
yield x
var it = toSeq(filter(2..10, proc(x: int): bool = x mod 2 == 0))
doAssert it == @[2, 4, 6, 8, 10]
it = toSeq(map(filter(2..10, proc(x: int): bool = x mod 2 == 0), proc(x: int): int = x * 2))
doAssert it == @[4, 8, 12, 16, 20]
block t3221_complex:
iterator permutations[T](ys: openarray[T]): seq[T] =
var
d = 1
c = newSeq[int](ys.len)
xs = newSeq[T](ys.len)
for i, y in ys: xs[i] = y
yield xs
block outer:
while true:
while d > 1:
dec d
c[d] = 0
while c[d] >= d:
inc d
if d >= ys.len: break outer
let i = if (d and 1) == 1: c[d] else: 0
swap xs[i], xs[d]
yield xs
inc c[d]
proc dig_vectors(): void =
var v_nums: seq[int]
v_nums = newSeq[int](1)
for perm in permutations(toSeq(0 .. 1)):
v_nums[0] = 1
dig_vectors()
block t3499_keepstate:
proc slice[T](iter: iterator(): T {.closure.}, sl: auto): seq[T] =
var res: seq[int64] = @[]
var i = 0
for n in iter():
if i > sl.b:
break
if i >= sl.a:
res.add(n)
inc i
res
iterator harshad(): int64 {.closure.} =
for n in 1 ..< int64.high:
var sum = 0
for ch in string($n):
sum += parseInt("" & ch)
if n mod sum == 0:
yield n
echo harshad.slice 0 ..< 20
for n in harshad():
if n > 1000:
echo n
break
# bug #3499 last snippet fixed
# bug 705 last snippet fixed
block t1725_nested:
iterator factory(): int {.closure.} =
iterator bar(): int {.closure.} =
yield 0
yield 1
yield 2
for x in bar(): yield x
for x in factory():
echo x
block t2023_objiter:
type
Obj = object
iter: iterator (): int8 {.closure.}
iterator test(): int8 {.closure.} =
yield 7
proc init():Obj=
result.iter = test
var o = init()
echo(o.iter())

View file

@ -1,36 +0,0 @@
discard """
output: '''@[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 21, 24, 27, 30, 36, 40, 42]
1002'''
"""
import strutils
proc slice[T](iter: iterator(): T {.closure.}, sl: auto): seq[T] =
var res: seq[int64] = @[]
var i = 0
for n in iter():
if i > sl.b:
break
if i >= sl.a:
res.add(n)
inc i
res
iterator harshad(): int64 {.closure.} =
for n in 1 .. < int64.high:
var sum = 0
for ch in string($n):
sum += parseInt("" & ch)
if n mod sum == 0:
yield n
echo harshad.slice 0 .. <20
for n in harshad():
if n > 1000:
echo n
break
# bug #3499 last snippet fixed
# bug 705 last snippet fixed

View file

@ -1,16 +0,0 @@
discard """
output: '''0
1
2'''
"""
# bug #1725
iterator factory(): int {.closure.} =
iterator bar(): int {.closure.} =
yield 0
yield 1
yield 2
for x in bar(): yield x
for x in factory():
echo x

View file

@ -1,18 +0,0 @@
discard """
output: "7"
"""
# bug #2023
type
Obj = object
iter: iterator (): int8 {.closure.}
iterator test(): int8 {.closure.} =
yield 7
proc init():Obj=
result.iter = test
var o = init()
echo(o.iter())