diff --git a/crates/js-sys/tests/all/Generator.rs b/crates/js-sys/tests/all/Generator.rs deleted file mode 100644 index 8617de90..00000000 --- a/crates/js-sys/tests/all/Generator.rs +++ /dev/null @@ -1,146 +0,0 @@ -#![allow(non_snake_case)] - -use project; - -#[test] -fn return_() { - project() - .file( - "src/lib.rs", - r#" - #![feature(use_extern_macros)] - - extern crate wasm_bindgen; - extern crate js_sys; - use wasm_bindgen::prelude::*; - - #[wasm_bindgen] - pub fn gen_return(this: &js_sys::Generator, value: &JsValue) -> JsValue { - this.return_(value) - } - "#, - ) - .file( - "test.js", - 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() - .file( - "src/lib.rs", - r#" - #![feature(use_extern_macros)] - - extern crate wasm_bindgen; - extern crate js_sys; - use wasm_bindgen::prelude::*; - - #[wasm_bindgen] - pub fn next(this: &js_sys::Generator, value: &JsValue) -> JsValue { - this.next(value) - .ok() - .expect("generator throws an error") - } - - #[wasm_bindgen] - pub fn next_throws_error(this: &js_sys::Generator, value: &JsValue) -> bool { - this.next(value).is_err() - } - "#, - ) - .file( - "test.js", - r#" - import * as assert from "assert"; - import * as wasm from "./out"; - - export function test() { - function* generator() { - const reply = yield '2 * 2'; - - return reply === 4; - } - - const gen = generator(); - - const q = wasm.next(gen, undefined); - assert.deepEqual(q, { value: '2 * 2', done: false }); - - const a = wasm.next(gen, 4); - assert.deepEqual(a, { value: true, done: true }); - - function* brokenGenerator() { - throw new Error('Something went wrong'); - yield 1; - } - - assert.ok(wasm.next_throws_error(brokenGenerator(), undefined)); - } - "#, - ) - .test() -} - -#[test] -fn throw() { - project() - .file( - "src/lib.rs", - r#" - #![feature(use_extern_macros)] - - extern crate wasm_bindgen; - extern crate js_sys; - use wasm_bindgen::prelude::*; - - #[wasm_bindgen] - pub fn gen_throws_error(this: &js_sys::Generator, error: &js_sys::Error) -> bool { - this.throw(error).is_err() - } - "#, - ) - .file( - "test.js", - 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(); - - assert.ok(wasm.gen_throws_error(gen, new Error('Something went wrong'))); - assert.deepEqual(gen.next(), { value: undefined, done: true }); - } - "#, - ) - .test() -} diff --git a/crates/js-sys/tests/all/main.rs b/crates/js-sys/tests/all/main.rs index ddfe145f..51b06e58 100644 --- a/crates/js-sys/tests/all/main.rs +++ b/crates/js-sys/tests/all/main.rs @@ -11,7 +11,6 @@ fn project() -> project_builder::Project { // Keep these tests in alphabetical order, just like the imports in `src/js.rs`. mod ArrayIterator; -mod Generator; mod Intl; mod JsString; mod Map; diff --git a/crates/js-sys/tests/wasm/Function.rs b/crates/js-sys/tests/wasm/Function.rs index b2918caf..e2449a7e 100644 --- a/crates/js-sys/tests/wasm/Function.rs +++ b/crates/js-sys/tests/wasm/Function.rs @@ -25,7 +25,7 @@ fn apply() { let arr = JsValue::from(Array::new()); let args = Array::new(); args.push(1.into()); - ARRAY_PROTOTYPE.push().apply(&arr, &args); + ARRAY_PROTOTYPE.push().apply(&arr, &args).unwrap(); assert_eq!(Array::from(arr).length(), 1); } diff --git a/crates/js-sys/tests/wasm/Generator.js b/crates/js-sys/tests/wasm/Generator.js new file mode 100644 index 00000000..2cb59cca --- /dev/null +++ b/crates/js-sys/tests/wasm/Generator.js @@ -0,0 +1,23 @@ +exports.one_two_generator = function() { + function* generator() { + yield 1; + yield 2; + } + return generator(); +}; + +exports.dummy_generator = function() { + function* generator() { + const reply = yield '2 * 2'; + return reply === 4; + } + return generator(); +}; + +exports.broken_generator = function() { + function* brokenGenerator() { + throw new Error('Something went wrong'); + yield 1; + } + return brokenGenerator(); +}; diff --git a/crates/js-sys/tests/wasm/Generator.rs b/crates/js-sys/tests/wasm/Generator.rs new file mode 100644 index 00000000..06ea7c53 --- /dev/null +++ b/crates/js-sys/tests/wasm/Generator.rs @@ -0,0 +1,58 @@ +use wasm_bindgen::prelude::*; +use wasm_bindgen_test::*; +use js_sys::*; + +#[wasm_bindgen(module = "tests/wasm/Generator.js", version = "*")] +extern { + fn one_two_generator() -> Generator; + fn dummy_generator() -> Generator; + fn broken_generator() -> Generator; + + type GeneratorResult; + + #[wasm_bindgen(method, getter, structural)] + fn value(this: &GeneratorResult) -> JsValue; + #[wasm_bindgen(method, getter, structural)] + fn done(this: &GeneratorResult) -> bool; + +} + +#[wasm_bindgen_test] +fn return_() { + let gen = one_two_generator(); + gen.next(&JsValue::undefined()).unwrap(); + + let res = GeneratorResult::from(gen.return_(&42.into())); + assert_eq!(res.value(), 42); + assert!(res.done()); + + let next = GeneratorResult::from(gen.next(&JsValue::undefined()).unwrap()); + assert!(next.value().is_undefined()); + assert!(next.done()); +} + +#[wasm_bindgen_test] +fn next() { + let gen = dummy_generator(); + + let result = GeneratorResult::from(gen.next(&JsValue::undefined()).unwrap()); + assert!(!result.done()); + assert_eq!(result.value(), "2 * 2"); + + let result = GeneratorResult::from(gen.next(&4.into()).unwrap()); + assert!(result.done()); + assert_eq!(result.value(), true); + + assert!(broken_generator().next(&3.into()).is_err()); +} + +#[wasm_bindgen_test] +fn throw() { + let gen = one_two_generator(); + gen.next(&JsValue::undefined()).unwrap(); + + assert!(gen.throw(&Error::new(&"something went wrong".into())).is_err()); + let next = GeneratorResult::from(gen.next(&JsValue::undefined()).unwrap()); + assert!(next.value().is_undefined()); + assert!(next.done()); +} diff --git a/crates/js-sys/tests/wasm/main.rs b/crates/js-sys/tests/wasm/main.rs index a09f523a..e0e41ec4 100644 --- a/crates/js-sys/tests/wasm/main.rs +++ b/crates/js-sys/tests/wasm/main.rs @@ -14,3 +14,4 @@ pub mod DataView; pub mod Date; pub mod Error; pub mod Function; +pub mod Generator;