bindings for Generator.return()

This commit is contained in:
Alexander Kryvomaz 2018-07-03 23:47:10 +03:00
parent 6e95ba20f1
commit 39d79eb037
2 changed files with 52 additions and 6 deletions

View File

@ -374,6 +374,12 @@ extern "C" {
extern {
pub type Generator;
/// The return() method returns the given value and finishes the generator.
///
/// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/return
#[wasm_bindgen(method, structural, js_name = return)]
pub fn gen_return(this: &Generator, value: &JsValue) -> JsValue;
/// The next() method returns an object with two properties done and value.
/// You can also provide a parameter to the next method to send a value to the generator.
///

View File

@ -2,6 +2,50 @@
use project;
#[test]
fn gen_return() {
project()
.file(
"src/lib.rs",
r#"
#![feature(proc_macro, wasm_custom_section)]
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
use wasm_bindgen::js;
#[wasm_bindgen]
pub fn gen_return(this: &js::Generator, value: &JsValue) -> JsValue {
this.gen_return(value)
}
"#,
)
.file(
"test.ts",
r#"
import * as assert from "assert";
import * as wasm from "./out";
export function test() {
function* generator() {
yield 1;
yield 2;
}
const gen = generator();
gen.next();
const res = wasm.gen_return(gen, 42);
assert.deepEqual(res, { value: 42, done: true });
const next = gen.next();
assert.deepEqual(next, { value: undefined, done: true });
}
"#,
)
.test()
}
#[test]
fn next() {
project()
@ -36,14 +80,10 @@ fn next() {
const gen = generator();
const q = wasm.next(gen, undefined);
assert.equal(q.value, '2 * 2');
assert.equal(q.done, false);
assert.deepEqual(q, { value: '2 * 2', done: false });
const a = wasm.next(gen, 4);
assert.equal(a.value, true);
assert.equal(a.done, true);
assert.deepEqual(a, { value: true, done: true });
}
"#,
)