use wasm_bindgen::prelude::*; use wasm_bindgen_test::*; use web_sys::{HtmlButtonElement, HtmlFormElement, Node}; #[wasm_bindgen(module = "/tests/wasm/element.js")] extern "C" { fn new_button() -> HtmlButtonElement; fn new_form() -> HtmlFormElement; } #[wasm_bindgen_test] fn test_button_element() { let element = new_button(); let location = web_sys::window().unwrap().location().href().unwrap(); assert!(!element.autofocus(), "Shouldn't have autofocus"); element.set_autofocus(true); assert!(element.autofocus(), "Should have autofocus"); assert!(!element.disabled(), "Shouldn't be disabled"); element.set_disabled(true); assert!(element.disabled(), "Should be disabled"); match element.form() { None => assert!(true, "Shouldn't have a form"), _ => assert!(false, "Shouldn't have a form"), }; assert_eq!( element.form_action(), location, "Should have the pages location" ); element.set_form_action("http://boop.com/"); assert_eq!( element.form_action(), "http://boop.com/", "Should have a form_action" ); assert_eq!(element.form_enctype(), "", "Should have no enctype"); element.set_form_enctype("text/plain"); assert_eq!( element.form_enctype(), "text/plain", "Should have a plain text enctype" ); assert_eq!(element.form_method(), "", "Should have no method"); element.set_form_method("POST"); assert_eq!(element.form_method(), "post", "Should have a POST method"); assert!(!element.form_no_validate(), "Should validate"); element.set_form_no_validate(true); assert!(element.form_no_validate(), "Should not validate"); assert_eq!(element.form_target(), "", "Should have no target"); element.set_form_target("_blank"); assert_eq!( element.form_target(), "_blank", "Should have a _blank target" ); assert_eq!(element.name(), "", "Shouldn't have a name"); element.set_name("button-name"); assert_eq!(element.name(), "button-name", "Should have a name"); assert_eq!(element.type_(), "submit", "Shouldn't have a type"); element.set_type("reset"); assert_eq!(element.type_(), "reset", "Should have a reset type"); assert_eq!(element.value(), "", "Shouldn't have a value"); element.set_value("value1"); assert_eq!(element.value(), "value1", "Should have a value"); assert_eq!(element.will_validate(), false, "Shouldn't validate"); assert_eq!( element.validation_message().unwrap(), "", "Shouldn't have a value" ); assert_eq!(element.check_validity(), true, "Should be valid"); assert_eq!(element.report_validity(), true, "Should be valid"); element.set_custom_validity("Boop"); // Method exists but doesn't impact validity assert_eq!(element.check_validity(), true, "Should be valid"); assert_eq!(element.report_validity(), true, "Should be valid"); assert_eq!( element.labels().length(), 0, "Should return a node list with no elements" ); } #[wasm_bindgen_test] fn test_button_element_in_form() { let button = new_button(); button.set_type("reset"); let form = new_form(); form.set_name("test-form"); // TODO: implement `Clone` for types in `web_sys` to make this easier. let button = JsValue::from(button); let as_node = Node::from(button.clone()); Node::from(JsValue::from(form)) .append_child(&as_node) .unwrap(); let element = HtmlButtonElement::from(button); match element.form() { None => assert!(false, "Should have a form"), Some(form) => { assert!(true, "Should have a form"); assert_eq!( form.name(), "test-form", "Form should have a name of test-form" ); } }; assert_eq!(element.type_(), "reset", "Should have a type"); }