diff options
Diffstat (limited to 'coroutine/+test.ha')
-rw-r--r-- | coroutine/+test.ha | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/coroutine/+test.ha b/coroutine/+test.ha new file mode 100644 index 0000000..1ac5217 --- /dev/null +++ b/coroutine/+test.ha @@ -0,0 +1,57 @@ +// License: MPL-2.0 +// (c) 2022 citrons <citrons@mondecitronne.com> + +@test fn coroutine() void = { + let test: int = 0; + let co1 = new(&test_coroutine); + let co2 = new(&test_coroutine); + defer destroy(co1); + defer destroy(co2); + for (co1.status != status::dead || co2.status != status::dead) { + let val = test; + test = *(resume(co1, &val) as *int); + val = test; + test = *(resume(co2, &val) as *int); + }; + assert(test == 100); +}; + +fn test_coroutine(arg: nullable *void) nullable *void = { + let i = *(arg as *int); + let v: nullable *void = null; + for (let j = 0; j < 50; j += 1) { + v = suspend(&(i + 1)); + i = *(v as *int); + }; + return v; +}; + +let test: int = 0; +@test fn nested_coroutine() void = { + let co1 = new(&nested); + defer destroy(co1); + resume(co1, null); + for (co1.status != status::dead) { + let co2 = new(&nested); + defer destroy(co2); + resume(co1, co2); + assert(co2.status == status::dead); + }; + assert(test == 2500); +}; + +fn nested(arg: nullable *void) nullable *void = { + for (let i = 0; i < 50; i += 1) { + let co = suspend(null): + nullable *coroutine; + match (co) { + case null => + test += 1; + case let co: *coroutine => + for (co.status != status::dead) + resume(co, null); + }; + }; + return null; +}; + |