blob: 42b222ea8eb64a314accc10f989a9d5ad3c91f35 [file] [log] [blame]
#[allow(unused_imports)] // test for #919
use std::borrow::BorrowMut;
use wasm_bindgen::prelude::*;
use wasm_bindgen_test::*;
#[wasm_bindgen(module = "tests/wasm/classes.js")]
extern "C" {
fn js_simple();
fn js_strings();
fn js_exceptions();
fn js_pass_one_to_another();
fn take_class(foo: ClassesIntoJs);
#[wasm_bindgen(js_name = take_class)]
fn take_class_as_jsvalue(foo: JsValue);
fn js_constructors();
fn js_empty_structs();
fn js_public_fields();
fn js_using_self();
fn js_readonly_fields();
fn js_double_consume();
fn js_js_rename();
fn js_access_fields();
fn js_renamed_export();
fn js_conditional_bindings();
fn js_assert_none(a: Option<OptionClass>);
fn js_assert_some(a: Option<OptionClass>);
fn js_return_none1() -> Option<OptionClass>;
fn js_return_none2() -> Option<OptionClass>;
fn js_return_some(a: OptionClass) -> Option<OptionClass>;
fn js_test_option_classes();
fn js_test_inspectable_classes();
fn js_test_inspectable_classes_can_override_generated_methods();
}
#[wasm_bindgen_test]
fn simple() {
js_simple();
}
#[wasm_bindgen]
pub struct ClassesSimple {
contents: u32,
}
#[wasm_bindgen]
impl ClassesSimple {
#[wasm_bindgen(constructor)]
pub fn new() -> ClassesSimple {
ClassesSimple::with_contents(0)
}
pub fn with_contents(a: u32) -> ClassesSimple {
ClassesSimple { contents: a }
}
pub fn add(&mut self, amt: u32) -> u32 {
self.contents += amt;
self.contents
}
pub fn consume(self) -> u32 {
self.contents
}
}
#[wasm_bindgen_test]
fn strings() {
js_strings()
}
#[wasm_bindgen]
pub struct ClassesStrings1 {
name: u32,
}
#[wasm_bindgen]
pub struct ClassesStrings2 {
contents: String,
}
#[wasm_bindgen]
impl ClassesStrings1 {
pub fn new() -> ClassesStrings1 {
ClassesStrings1 { name: 0 }
}
pub fn set(&mut self, amt: u32) {
self.name = amt;
}
pub fn bar(&self, mix: &str) -> ClassesStrings2 {
ClassesStrings2 {
contents: format!("foo-{}-{}", mix, self.name),
}
}
}
#[wasm_bindgen]
impl ClassesStrings2 {
pub fn name(&self) -> String {
self.contents.clone()
}
}
#[wasm_bindgen_test]
fn exceptions() {
js_exceptions();
}
#[wasm_bindgen]
pub struct ClassesExceptions1 {}
#[wasm_bindgen]
impl ClassesExceptions1 {
pub fn new() -> ClassesExceptions1 {
ClassesExceptions1 {}
}
pub fn foo(&self, _: &ClassesExceptions1) {}
pub fn bar(&mut self, _: &mut ClassesExceptions1) {}
}
#[wasm_bindgen]
pub struct ClassesExceptions2 {}
#[wasm_bindgen]
impl ClassesExceptions2 {
pub fn new() -> ClassesExceptions2 {
ClassesExceptions2 {}
}
}
#[wasm_bindgen_test]
fn pass_one_to_another() {
js_pass_one_to_another();
}
#[wasm_bindgen]
pub struct ClassesPassA {}
#[wasm_bindgen]
impl ClassesPassA {
pub fn new() -> ClassesPassA {
ClassesPassA {}
}
pub fn foo(&self, _other: &ClassesPassB) {}
pub fn bar(&self, _other: ClassesPassB) {}
}
#[wasm_bindgen]
pub struct ClassesPassB {}
#[wasm_bindgen]
impl ClassesPassB {
pub fn new() -> ClassesPassB {
ClassesPassB {}
}
}
#[wasm_bindgen_test]
fn pass_into_js() {
take_class(ClassesIntoJs(13));
}
#[wasm_bindgen]
pub struct ClassesIntoJs(i32);
#[wasm_bindgen]
impl ClassesIntoJs {
pub fn inner(&self) -> i32 {
self.0
}
}
#[wasm_bindgen]
pub struct Issue27Context {}
#[wasm_bindgen]
impl Issue27Context {
pub fn parse(&self, _expr: &str) -> Issue27Expr {
panic!()
}
pub fn eval(&self, _expr: &Issue27Expr) -> f64 {
panic!()
}
pub fn set(&mut self, _var: &str, _val: f64) {
panic!()
}
}
#[wasm_bindgen]
pub struct Issue27Expr {}
#[wasm_bindgen_test]
fn pass_into_js_as_js_class() {
take_class_as_jsvalue(ClassesIntoJs(13).into());
}
#[wasm_bindgen_test]
fn constructors() {
js_constructors();
}
#[wasm_bindgen]
pub fn cross_item_construction() -> ConstructorsBar {
ConstructorsBar::other_name(7, 8)
}
#[wasm_bindgen]
pub struct ConstructorsFoo {
number: u32,
}
#[wasm_bindgen]
impl ConstructorsFoo {
#[wasm_bindgen(constructor)]
pub fn new(number: u32) -> ConstructorsFoo {
ConstructorsFoo { number }
}
pub fn get_number(&self) -> u32 {
self.number
}
}
#[wasm_bindgen]
pub struct ConstructorsBar {
number: u32,
number2: u32,
}
#[wasm_bindgen]
impl ConstructorsBar {
#[wasm_bindgen(constructor)]
pub fn other_name(number: u32, number2: u32) -> ConstructorsBar {
ConstructorsBar { number, number2 }
}
pub fn get_sum(&self) -> u32 {
self.number + self.number2
}
}
#[wasm_bindgen_test]
fn empty_structs() {
js_empty_structs();
}
#[wasm_bindgen]
pub struct MissingClass {}
#[wasm_bindgen]
pub struct OtherEmpty {}
#[wasm_bindgen]
impl OtherEmpty {
pub fn return_a_value() -> MissingClass {
MissingClass {}
}
}
#[wasm_bindgen_test]
fn public_fields() {
js_public_fields();
}
#[wasm_bindgen]
#[derive(Default)]
pub struct PublicFields {
pub a: u32,
pub b: f32,
pub c: f64,
pub d: i32,
#[wasm_bindgen(skip)]
pub skipped: u32,
}
#[wasm_bindgen]
impl PublicFields {
pub fn new() -> PublicFields {
PublicFields::default()
}
}
#[wasm_bindgen_test]
fn using_self() {
js_using_self();
}
#[wasm_bindgen]
pub struct UseSelf {}
#[wasm_bindgen]
impl UseSelf {
pub fn new() -> Self {
UseSelf {}
}
}
#[wasm_bindgen_test]
fn readonly_fields() {
js_readonly_fields();
}
#[wasm_bindgen]
#[derive(Default)]
pub struct Readonly {
#[wasm_bindgen(readonly)]
pub a: u32,
}
#[wasm_bindgen]
impl Readonly {
pub fn new() -> Readonly {
Readonly::default()
}
}
#[wasm_bindgen_test]
fn double_consume() {
js_double_consume();
}
#[wasm_bindgen]
pub struct DoubleConsume {}
#[wasm_bindgen]
impl DoubleConsume {
#[wasm_bindgen(constructor)]
pub fn new() -> DoubleConsume {
DoubleConsume {}
}
pub fn consume(self, other: DoubleConsume) {
drop(other);
}
}
#[wasm_bindgen_test]
fn rename_function_for_js() {
js_js_rename();
foo();
}
#[wasm_bindgen]
pub struct JsRename {}
#[wasm_bindgen]
impl JsRename {
#[wasm_bindgen(constructor)]
pub fn new() -> JsRename {
let f = JsRename {};
f.foo();
f
}
#[wasm_bindgen(js_name = bar)]
pub fn foo(&self) {}
}
#[wasm_bindgen(js_name = classes_foo)]
pub fn foo() {}
#[wasm_bindgen]
pub struct AccessFieldFoo {
pub bar: AccessFieldBar,
}
#[wasm_bindgen]
pub struct AccessField0(pub AccessFieldBar);
#[wasm_bindgen]
#[derive(Copy, Clone)]
pub struct AccessFieldBar {
_value: u32,
}
#[wasm_bindgen]
impl AccessFieldFoo {
#[wasm_bindgen(constructor)]
pub fn new() -> AccessFieldFoo {
AccessFieldFoo {
bar: AccessFieldBar { _value: 2 },
}
}
}
#[wasm_bindgen]
impl AccessField0 {
#[wasm_bindgen(constructor)]
pub fn new() -> AccessField0 {
AccessField0(AccessFieldBar { _value: 2 })
}
}
#[wasm_bindgen_test]
fn access_fields() {
js_access_fields();
}
#[wasm_bindgen(js_name = JsRenamedExport)]
pub struct RenamedExport {
pub x: u32,
}
#[wasm_bindgen(js_class = JsRenamedExport)]
impl RenamedExport {
#[wasm_bindgen(constructor)]
pub fn new() -> RenamedExport {
RenamedExport { x: 3 }
}
pub fn foo(&self) {}
pub fn bar(&self, other: &RenamedExport) {
drop(other);
}
}
#[wasm_bindgen_test]
fn renamed_export() {
js_renamed_export();
}
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
pub struct ConditionalBindings {}
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
impl ConditionalBindings {
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(constructor))]
pub fn new() -> ConditionalBindings {
ConditionalBindings {}
}
}
#[wasm_bindgen_test]
fn conditional_bindings() {
js_conditional_bindings();
}
#[wasm_bindgen]
pub struct OptionClass(u32);
#[wasm_bindgen_test]
fn option_class() {
js_assert_none(None);
js_assert_some(Some(OptionClass(1)));
assert!(js_return_none1().is_none());
assert!(js_return_none2().is_none());
assert_eq!(js_return_some(OptionClass(2)).unwrap().0, 2);
js_test_option_classes();
}
#[wasm_bindgen]
pub fn option_class_none() -> Option<OptionClass> {
None
}
#[wasm_bindgen]
pub fn option_class_some() -> Option<OptionClass> {
Some(OptionClass(3))
}
#[wasm_bindgen]
pub fn option_class_assert_none(x: Option<OptionClass>) {
assert!(x.is_none());
}
#[wasm_bindgen]
pub fn option_class_assert_some(x: Option<OptionClass>) {
assert_eq!(x.unwrap().0, 3);
}
mod works_in_module {
use wasm_bindgen::prelude::wasm_bindgen;
#[wasm_bindgen]
pub struct WorksInModule(u32);
#[wasm_bindgen]
impl WorksInModule {
#[wasm_bindgen(constructor)]
pub fn new() -> WorksInModule {
WorksInModule(1)
}
pub fn foo(&self) {}
}
}
#[wasm_bindgen_test]
fn inspectable_classes() {
js_test_inspectable_classes();
}
#[wasm_bindgen(inspectable)]
#[derive(Default)]
pub struct Inspectable {
pub a: u32,
// This private field will not be exposed unless a getter is provided for it
#[allow(dead_code)]
private: u32,
}
#[wasm_bindgen]
impl Inspectable {
pub fn new() -> Self {
Self::default()
}
}
#[wasm_bindgen]
#[derive(Default)]
pub struct NotInspectable {
pub a: u32,
}
#[wasm_bindgen]
impl NotInspectable {
pub fn new() -> Self {
Self::default()
}
}
#[wasm_bindgen_test]
fn inspectable_classes_can_override_generated_methods() {
js_test_inspectable_classes_can_override_generated_methods();
}
#[wasm_bindgen(inspectable)]
#[derive(Default)]
pub struct OverriddenInspectable {
pub a: u32,
}
#[wasm_bindgen]
impl OverriddenInspectable {
pub fn new() -> Self {
Self::default()
}
#[wasm_bindgen(js_name = toJSON)]
pub fn to_json(&self) -> String {
String::from("JSON was overwritten")
}
#[wasm_bindgen(js_name = toString)]
pub fn to_string(&self) -> String {
String::from("string was overwritten")
}
}