use super::websys_project;

#[test]
fn button_element() {
    websys_project()
        .file(
            "src/lib.rs",
            r#"
                #![feature(use_extern_macros, wasm_custom_section)]
                extern crate wasm_bindgen;
                use wasm_bindgen::prelude::*;
                extern crate web_sys;

                #[wasm_bindgen]
                pub fn test_button_element(element: &web_sys::HtmlButtonElement, location: String) {
                    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]
                pub fn test_button_element_in_form(element: &web_sys::HtmlButtonElement) {
                    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");
                }
            "#,
        )
        .file(
            "test.js",
            r#"
                import * as assert from "assert";
                import * as wasm from "./out";

                export function test() {
                    let button = document.createElement("button");
                    wasm.test_button_element(button, document.location.href);

                    let button2 = document.createElement("button");
                    button2.type = "reset";
                    let form = document.createElement("form");
                    form.name = "test-form";
                    form.appendChild(button2);
                    wasm.test_button_element_in_form(button2);
                }
            "#,
        )
        .test();
}