Port Generator tests to wasm

This commit is contained in:
Alex Crichton 2018-07-20 12:56:32 -07:00
parent f3d4a20ec7
commit 067de51e57
6 changed files with 83 additions and 148 deletions

View File

@ -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()
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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();
};

View File

@ -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());
}

View File

@ -14,3 +14,4 @@ pub mod DataView;
pub mod Date;
pub mod Error;
pub mod Function;
pub mod Generator;