| #[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") |
| } |
| } |