diff options
Diffstat (limited to 'tests/iter')
-rw-r--r-- | tests/iter/tchainediterators.nim | 5 | ||||
-rw-r--r-- | tests/iter/tconcat.nim | 24 | ||||
-rw-r--r-- | tests/iter/timplicit_auto.nim | 18 | ||||
-rw-r--r-- | tests/iter/tobj_iter.nim | 20 | ||||
-rw-r--r-- | tests/iter/tscheduler.nim | 76 | ||||
-rw-r--r-- | tests/iter/tshallowcopy_closures.nim | 31 |
6 files changed, 173 insertions, 1 deletions
diff --git a/tests/iter/tchainediterators.nim b/tests/iter/tchainediterators.nim index 8d9f44a54..796672783 100644 --- a/tests/iter/tchainediterators.nim +++ b/tests/iter/tchainediterators.nim @@ -6,13 +6,16 @@ discard """ 128 192 ''' + disabled: "true" """ +# This all relies on non-documented and questionable features. + iterator gaz(it: iterator{.inline.}): type(it) = for x in it: yield x*2 -iterator baz(it: iterator{.inline.}) = +iterator baz(it: iterator{.inline.}): auto = for x in gaz(it): yield x*2 diff --git a/tests/iter/tconcat.nim b/tests/iter/tconcat.nim new file mode 100644 index 000000000..477ac5e26 --- /dev/null +++ b/tests/iter/tconcat.nim @@ -0,0 +1,24 @@ +discard """ + output: '''1 +2 +3 +4 +20 +21 +22 +23''' +""" + +proc toIter*[T](s: Slice[T]): iterator: T = + iterator it: T {.closure.} = + for x in s.a..s.b: + yield x + return it + +iterator concat*[T](its: varargs[T, toIter]): auto = + for i in its: + for x in i(): + yield x + +for i in concat(1..4, 20..23): + echo i diff --git a/tests/iter/timplicit_auto.nim b/tests/iter/timplicit_auto.nim new file mode 100644 index 000000000..ccb279fe0 --- /dev/null +++ b/tests/iter/timplicit_auto.nim @@ -0,0 +1,18 @@ +# bug #1838 + +type State = enum Empty, Tree, Fire + +const + disp: array[State, string] = [" ", "\e[32m/\\\e[m", "\e[07;31m/\\\e[m"] + +proc univ(x, y: int): State = Tree + +var w, h = 30 + +iterator fields(a = (0,0), b = (h-1,w-1)) = + for y in max(a[0], 0) .. min(b[0], h-1): + for x in max(a[1], 0) .. min(b[1], w-1): + yield (y,x) + +for y,x in fields(): + stdout.write disp[univ(x, y)] diff --git a/tests/iter/tobj_iter.nim b/tests/iter/tobj_iter.nim new file mode 100644 index 000000000..eb0e37b23 --- /dev/null +++ b/tests/iter/tobj_iter.nim @@ -0,0 +1,20 @@ +discard """ + output: "7" +""" + +# bug #2023 + +{.deadCodeElim:on.} + +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()) diff --git a/tests/iter/tscheduler.nim b/tests/iter/tscheduler.nim new file mode 100644 index 000000000..a267f15c4 --- /dev/null +++ b/tests/iter/tscheduler.nim @@ -0,0 +1,76 @@ +discard """ + output: '''a1 5 +a2 10 +a1 3 +a1 1 +a2 8 +a2 6 +a2 4 +a2 2''' +""" + +import os, strutils, times, algorithm + + +type TaskFn = iterator (): float + +type Task = object + coro: TaskFn + next_run: float + + +type Scheduler = object + tasks: seq[Task] + + +proc newScheduler(): Scheduler = + var s = Scheduler() + s.tasks = @[] + return s + + +proc start(this: var Scheduler, task: TaskFn) = + var t = Task() + t.coro = task + t.next_run = 0.0 + this.tasks.add(t) + + +proc run(this: var Scheduler) = + while this.tasks.len > 0: + var dead: seq[int] = @[] + for i in this.tasks.low..this.tasks.high: + var task = this.tasks[i] + if finished(task.coro): + dead.add(i) + continue + if task.next_run <= epochTime(): + task.next_run = task.coro() + epochTime() + this.tasks[i] = task + for i in dead: + this.tasks.delete(i) + if this.tasks.len > 0: + sort(this.tasks, proc (t1: Task, t2: Task): int = cmp(t1.next_run, t2.next_run)) + sleep(int((this.tasks[0].next_run - epochTime()) * 1000)) + + +iterator a1(): float {.closure.} = + var k = 5 + while k > 0: + echo "a1 $1" % [$k] + dec k, 2 + yield 0.5 + + +iterator a2(): float {.closure.} = + var k = 10 + while k > 0: + echo "a2 $1" % [$k] + dec k, 2 + yield 1.5 + + +var sched = newScheduler() +sched.start(a1) +sched.start(a2) +sched.run() diff --git a/tests/iter/tshallowcopy_closures.nim b/tests/iter/tshallowcopy_closures.nim new file mode 100644 index 000000000..2f024ee7e --- /dev/null +++ b/tests/iter/tshallowcopy_closures.nim @@ -0,0 +1,31 @@ +discard """ + ccodecheck: "!@('{' \\s* 'NI HEX3Astate;' \\s* '}')" +""" + +# bug #1803 +type TaskFn = iterator (): float + +iterator a1(): float {.closure.} = + var k = 10 + while k > 0: + echo "a1 ", k + dec k + yield 1.0 + + +iterator a2(): float {.closure.} = + var k = 15 + while k > 0: + echo "a2 ", k + dec k + yield 2.0 + +var + x = a1 + y = a2 + z: TaskFn + +discard x() +z = x #shallowCopy(z, x) +z = y #shallowCopy(z, y) +discard x() |