From 39d79eb0371db096506fbd7fe99b012de2762987 Mon Sep 17 00:00:00 2001 From: Alexander Kryvomaz Date: Tue, 3 Jul 2018 23:47:10 +0300 Subject: [PATCH] bindings for Generator.return() --- src/js.rs | 6 ++++ tests/all/js_globals/Generator.rs | 52 +++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/js.rs b/src/js.rs index a9cdd098..9618d57f 100644 --- a/src/js.rs +++ b/src/js.rs @@ -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. /// diff --git a/tests/all/js_globals/Generator.rs b/tests/all/js_globals/Generator.rs index f0543f63..ee061c27 100644 --- a/tests/all/js_globals/Generator.rs +++ b/tests/all/js_globals/Generator.rs @@ -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 }); } "#, )