napi-rs/examples/napi/__tests__/generator.spec.ts
Mikaël Francoeur 83389a186b
feat(napi): add ScopeGenerator trait (#2831)
* add lifetime to iterator

* Add ScopedIterator

* fix type gen

* Clippy fix

---------

Co-authored-by: LongYinan <lynweklm@gmail.com>
2025-08-07 21:44:01 +08:00

88 lines
2.0 KiB
TypeScript

import test from 'ava'
import { Fib, Fib2, Fib3, Fib4, shutdownRuntime } from '../index.cjs'
test.after(() => {
shutdownRuntime()
})
for (const [index, factory] of [
() => new Fib(),
() => Fib2.create(0),
() => new Fib3(0, 1),
].entries()) {
test(`should be able to stop a generator #${index}`, (t) => {
let iterator = factory()
if (typeof Iterator === 'undefined') {
iterator = iterator[Symbol.iterator]()
}
t.deepEqual(iterator.next(), {
done: false,
value: 1,
})
iterator.next()
iterator.next()
iterator.next()
iterator.next()
t.deepEqual(iterator.next(), {
done: false,
value: 8,
})
t.deepEqual(iterator.return?.(), {
done: true,
})
t.deepEqual(iterator.next(), {
done: true,
})
})
test(`should be able to throw to generator #${index}`, (t) => {
const iterator = factory()
t.deepEqual(iterator.next(), {
done: false,
value: 1,
})
iterator.next()
iterator.next()
iterator.next()
iterator.next()
t.deepEqual(iterator.next(), {
done: false,
value: 8,
})
t.throws(() => iterator.throw!(new Error()))
t.deepEqual(iterator.next(), {
done: true,
})
})
test(`should be an Iterator and have the Iterator Helper methods #${index}`, (t) => {
if (typeof Iterator === 'undefined') {
t.pass('Iterator is not existing, skipping test')
return
}
const iterator = factory()
t.true(Object.getPrototypeOf(iterator) === Iterator.prototype)
let arr = [
...iterator
.drop(3)
.filter((x: number) => x % 2 == 0)
.take(5),
]
t.deepEqual(arr, [8, 34, 144, 610, 2584])
})
}
test('generator should be able to return object', (t) => {
const fib = new Fib4(0, 1)
const gen = fib[Symbol.iterator]
t.is(typeof gen, 'function')
const iterator = gen.call(fib)
t.deepEqual(iterator.next(), {
done: false,
value: { number: 1 },
})
})