From e9ea2dabc10cbf2991768cb60895440ddad99543 Mon Sep 17 00:00:00 2001 From: Robert Masen Date: Mon, 18 Jun 2018 15:34:48 -0500 Subject: [PATCH] add Validate ptr test --- tests/all/main.rs | 1 + tests/all/validate_prt.rs | 69 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 tests/all/validate_prt.rs diff --git a/tests/all/main.rs b/tests/all/main.rs index b909788a..2e7eaad0 100644 --- a/tests/all/main.rs +++ b/tests/all/main.rs @@ -538,3 +538,4 @@ mod structural; mod u64; mod webidl; mod comments; +mod validate_prt; \ No newline at end of file diff --git a/tests/all/validate_prt.rs b/tests/all/validate_prt.rs new file mode 100644 index 00000000..53c59a65 --- /dev/null +++ b/tests/all/validate_prt.rs @@ -0,0 +1,69 @@ +use super::project; + +#[test] +fn works() { + project() + .file("src/lib.rs", r#" + #![feature(proc_macro, wasm_custom_section, wasm_import_module)] + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + #[wasm_bindgen] + pub struct Fruit { + name: String, + } + #[wasm_bindgen] + impl Fruit { + #[wasm_bindgen(method)] + pub fn name(&self) -> String { + self.name.clone() + } + #[wasm_bindgen(constructor)] + pub fn new(name: String) -> Self { + Fruit { + name, + } + } + } + #[wasm_bindgen] + pub fn eat(_fruit: Fruit) { } + "#) + .file("test.js", r#" + import * as wasm from './out'; + const targetMessage = 'Attempt to use a moved value'; + function assertEq(a, b) { + console.log(a, '?=', b); + if (a === b) + return; + throw new Error('not equal'); + } + export function test() { + useMoved(); + moveMoved(); + } + export function useMoved() { + // create a new struct + let apple = new wasm.Fruit('apple'); + // sanity check that this method works + let name = apple.name(); + // consume the struct + wasm.eat(apple); + // try and use the moved apple again + try { + let movedName = apple.name(); + } catch (e) { + assertEq(e.message, targetMessage); + } + } + export function moveMoved() { + let pear = new wasm.Fruit('pear'); + let name = pear.name(); + wasm.eat(pear); + try { + wasm.eat(pear); + } catch (e) { + assertEq(e.message, targetMessage); + } + } + "#) + .test(); +}