use wasm_bindgen::JsCast;
use wasm_bindgen_test::wasm_bindgen_test_configure;
use wasm_bindgen_test::*;
use web_sys::{window, HtmlElement};
use weblog::console_log;
use std::cell::Cell;
use std::rc::Rc;
use webru::*;
wasm_bindgen_test_configure!(run_in_browser);
#[wasm_bindgen_test]
fn create_element_test() {
const INNER_HTML: &str = "Testing time";
const ID: &str = "heading";
let h1 = create_element("h1");
h1.set_inner_html(INNER_HTML);
h1.set_id(ID);
body().append_child(&h1).unwrap();
assert_eq!(h1.inner_html(), INNER_HTML);
assert_eq!(h1.id(), ID);
assert_ne!(h1.inner_html(), "Wrong heading");
assert_ne!(h1.id(), "wrong id");
}
#[wasm_bindgen_test]
fn get_element_by_id_test() {
const PARAGRAPH_ID: &str = "little_para";
const PARAGRAPH_CLASS: &str = "para graph";
let p = create_element("p");
p.set_id(PARAGRAPH_ID);
p.set_class_name(PARAGRAPH_CLASS);
{
let p = get_element_by_id(PARAGRAPH_ID);
assert_eq!(p, None);
}
body().append_child(&p).unwrap();
let p = get_element_by_id(PARAGRAPH_ID);
assert_eq!(p.clone().unwrap().class_name(), PARAGRAPH_CLASS);
assert_ne!(p, None);
}
#[wasm_bindgen_test]
fn get_elements_by_classname_test() {
const PARAGRAPH_CLASS: &str = "sad fsda fasdf";
const PARAGRAPH_1_ID: &str = "@%ASF";
const PARAGRAPH_2_ID: &str = "@%ASGAH";
let p1 = create_element("p");
p1.set_class_name(PARAGRAPH_CLASS);
p1.set_id(PARAGRAPH_1_ID);
let p2 = create_element("p");
p2.set_class_name(PARAGRAPH_CLASS);
p2.set_id(PARAGRAPH_2_ID);
{
let p = get_elements_by_classname(PARAGRAPH_CLASS);
assert_eq!(p.length(), 0);
}
body().append_child(&p1).unwrap();
body().append_child(&p2).unwrap();
let p = get_elements_by_classname(PARAGRAPH_CLASS);
assert_eq!(p.length(), 2);
assert_eq!(p.item(0).unwrap().id(), PARAGRAPH_1_ID);
assert_eq!(p.item(1).unwrap().id(), PARAGRAPH_2_ID);
}
#[wasm_bindgen_test]
fn get_elements_by_classname_inside_vec_test() {
const PARAGRAPH_CLASS: &str = "as dfsadfasd ffa";
const PARAGRAPH_1_ID: &str = "@%asdr4";
const PARAGRAPH_2_ID: &str = "@%@%^^GA";
let p1 = create_element("p");
p1.set_class_name(PARAGRAPH_CLASS);
p1.set_id(PARAGRAPH_1_ID);
let p2 = create_element("p");
p2.set_class_name(PARAGRAPH_CLASS);
p2.set_id(PARAGRAPH_2_ID);
{
let p = get_elements_by_classname_inside_vec(PARAGRAPH_CLASS);
assert_eq!(p.len(), 0);
}
body().append_child(&p1).unwrap();
body().append_child(&p2).unwrap();
let p = get_elements_by_classname_inside_vec(PARAGRAPH_CLASS);
assert_eq!(p.len(), 2);
assert_eq!(p[0].id(), PARAGRAPH_1_ID);
assert_eq!(p[1].id(), PARAGRAPH_2_ID);
}
#[wasm_bindgen_test]
fn query_selector_test() {
const PARAGRAPH_ID: &str = "peraid";
const PARAGRAPH_CLASS: &str = "perapera";
let p = create_element("p");
p.set_id(PARAGRAPH_ID);
p.set_class_name(PARAGRAPH_CLASS);
{
let p = query_selector(&format!("#{}", PARAGRAPH_ID));
assert_eq!(p, None);
}
body().append_child(&p).unwrap();
let p_right = query_selector(&format!("#{}", PARAGRAPH_ID));
let p_wrong = query_selector(&format!("#{}", "ewsdfs"));
assert_eq!(p_right.clone().unwrap().class_name(), PARAGRAPH_CLASS);
assert_ne!(p_right, p_wrong);
assert_ne!(p_right, None);
}
#[wasm_bindgen_test]
fn query_selector_all_test() {
const PARAGRAPH_CLASS: &str = "sadjfalsdf";
const PARAGRAPH_1_ID: &str = "@***>>>";
const PARAGRAPH_2_ID: &str = "!!__<<";
let p1 = create_element("p");
p1.set_class_name(PARAGRAPH_CLASS);
p1.set_id(PARAGRAPH_1_ID);
let p2 = create_element("p");
p2.set_class_name(PARAGRAPH_CLASS);
p2.set_id(PARAGRAPH_2_ID);
{
let p = query_selector_all(&format!(".{}", PARAGRAPH_CLASS));
assert_eq!(p.length(), 0);
}
body().append_child(&p1).unwrap();
body().append_child(&p2).unwrap();
let p = query_selector_all(&format!(".{}", PARAGRAPH_CLASS));
assert_eq!(p.length(), 2);
}
#[wasm_bindgen_test]
fn query_selector_all_inside_vec_test() {
const PARAGRAPH_CLASS: &str = "cleardldls";
const PARAGRAPH_1_ID: &str = "@***>>>";
const PARAGRAPH_2_ID: &str = "!!__<<";
let p1 = create_element("p");
p1.set_class_name(PARAGRAPH_CLASS);
p1.set_id(PARAGRAPH_1_ID);
let p2 = create_element("p");
p2.set_class_name(PARAGRAPH_CLASS);
p2.set_id(PARAGRAPH_2_ID);
{
let p = query_selector_all_inside_vec(&format!(".{}", PARAGRAPH_CLASS));
assert_eq!(p.len(), 0);
}
body().append_child(&p1).unwrap();
body().append_child(&p2).unwrap();
let p = query_selector_all_inside_vec(&format!(".{}", PARAGRAPH_CLASS));
assert_eq!(p.len(), 2);
}
#[wasm_bindgen_test]
fn document_test() {
assert_eq!(document(), window().unwrap().document().unwrap());
}
#[wasm_bindgen_test]
fn location_test() {
assert_eq!(
location(),
window().unwrap().document().unwrap().location().unwrap()
);
}
#[wasm_bindgen_test]
fn url_test() {
console_log!("The value of `url()` for your website is: ", url());
assert_eq!(
url(),
web_sys::window()
.unwrap()
.document()
.unwrap()
.url()
.unwrap()
);
}
#[wasm_bindgen_test]
fn body_test() {
let body = body();
assert_eq!(body, window().unwrap().document().unwrap().body().unwrap());
assert_eq!(body.tag_name(), "BODY");
}
#[wasm_bindgen_test]
fn domain_name_test() {
assert_eq!(domain_name(), "127.0.0.1");
console_log!(
"The value of `domain_name()` for your website is: ",
domain_name()
)
}
#[wasm_bindgen_test]
fn path_name_test() {
assert_eq!(path_name(), "/")
}
#[wasm_bindgen_test]
fn reload_test() {
let button = create_element("button")
.dyn_ref::<HtmlElement>()
.unwrap()
.clone();
button.set_inner_html("reload page");
let callback = callback(|| {
reload();
});
button.set_onclick(Some(callback.as_ref().dyn_ref().unwrap()));
callback.forget();
let p = create_element("p");
p.set_inner_html("Click this button, if the website reloads after clicking, the test `reload_test` has passed");
let hr1 = create_element("hr");
let hr2 = create_element("hr");
body().append_child(&hr1).unwrap();
body().append_child(&p).unwrap();
body().append_child(&button).unwrap();
body().append_child(&hr2).unwrap();
}
#[wasm_bindgen_test]
fn alert_test() {
alert("If you see this message, the test `alert_test` has passed");
}
#[wasm_bindgen_test]
fn prompt_test() {
prompt("If you see this prompt, the test `prompt_test` has passed");
}
#[wasm_bindgen_test]
fn set_timeout_clear_timeout_test() {
#[derive(Debug)]
struct SetTimeoutId {
id: Cell<Option<i32>>,
}
const HIDE_DURATION: u16 = 4000; let settimeout_id = Rc::new(SetTimeoutId {
id: Cell::new(None),
});
let hide_button = create_element("button")
.dyn_ref::<HtmlElement>()
.unwrap()
.clone();
hide_button.set_inner_html(&format!(
"Hide this button for {} seconds",
HIDE_DURATION / 1000
));
let cancel_hide_button = create_element("button")
.dyn_ref::<HtmlElement>()
.unwrap()
.clone();
cancel_hide_button.set_inner_html("Hide that button forever");
let cb = callback({
let hide_button = hide_button.clone();
let settimeout_id = Rc::clone(&settimeout_id.clone());
move || {
hide_button.style().set_property("display", "none").unwrap();
let settimeout_id = Rc::clone(&settimeout_id.clone());
let hide_button = hide_button.clone();
let timeout_id = set_timeout(
move || {
hide_button
.style()
.set_property("display", "block")
.unwrap();
},
HIDE_DURATION as i32,
)
.unwrap();
settimeout_id.id.set(Some(timeout_id));
}
});
hide_button.set_onclick(Some(cb.as_ref().dyn_ref().unwrap()));
cb.forget();
let cb = callback({
move || {
let settimeout_id = Rc::clone(&settimeout_id.clone());
console_log!(format!("set timeout: {:?}", settimeout_id));
if let Some(id) = settimeout_id.id.get() {
clear_timeout(id);
settimeout_id.id.set(None);
}
}
});
cancel_hide_button.set_onclick(Some(cb.as_ref().dyn_ref().unwrap()));
cb.forget();
let hr1 = create_element("hr");
let hr2 = create_element("hr");
body().append_child(&hr1).unwrap();
body().append_child(&hide_button).unwrap();
body().append_child(&cancel_hide_button).unwrap();
body().append_child(&hr2).unwrap();
}
#[wasm_bindgen_test]
fn set_interval_clear_interval_test() {
#[derive(Debug)]
struct SetIntervalId {
id: Cell<Option<i32>>,
}
#[derive(Debug)]
struct Counter {
count: Cell<usize>,
}
const INTERVAL_SPEED: u32 = 1000; let setinterval_id = Rc::new(SetIntervalId {
id: Cell::new(None),
});
let counter = Rc::new(Counter {
count: Cell::new(0),
});
let counter_element = create_element("p");
counter_element.set_inner_html("0");
let start_counter_button = create_element("button")
.dyn_ref::<HtmlElement>()
.unwrap()
.clone();
start_counter_button.set_inner_html("Start counter");
let stop_counter_button = create_element("button")
.dyn_ref::<HtmlElement>()
.unwrap()
.clone();
stop_counter_button.set_inner_html("Stop counter");
let cb = callback({
let counter_element = counter_element.clone();
let setinterval_id = Rc::clone(&setinterval_id);
move || {
let counter = Rc::clone(&counter);
let interval_id = set_interval(
{
let counter_element = counter_element.clone();
move || {
counter.count.set(counter.count.get() + 1);
counter_element.set_inner_html(&format!("{}", counter.count.get()));
}
},
INTERVAL_SPEED as i32,
);
setinterval_id.id.set(Some(interval_id.unwrap()));
}
});
start_counter_button.set_onclick(Some(cb.as_ref().dyn_ref().unwrap()));
cb.forget();
let cb = callback({
move || {
if let Some(id) = setinterval_id.id.get() {
clear_interval(id)
}
setinterval_id.id.set(None);
}
});
stop_counter_button.set_onclick(Some(cb.as_ref().dyn_ref().unwrap()));
cb.forget();
let hr1 = create_element("hr");
let hr2 = create_element("hr");
body().append_child(&hr1).unwrap();
body().append_child(&counter_element).unwrap();
body().append_child(&start_counter_button).unwrap();
body().append_child(&stop_counter_button).unwrap();
body().append_child(&hr2).unwrap();
}
#[wasm_bindgen_test]
fn timeout_test() {
#[derive(Clone, Copy, Debug, PartialEq)]
enum EarthShape {
Flat,
Round,
}
let earth_shape = Rc::new(Cell::new(EarthShape::Flat));
{
let earth_shape = Rc::clone(&earth_shape);
Timeout::start(
move || {
earth_shape.set(EarthShape::Round);
},
4000,
);
}
set_timeout(
move || {
assert_eq!(earth_shape.get(), EarthShape::Round);
},
5000,
)
.unwrap();
let earth_shape = Rc::new(Cell::new(EarthShape::Flat));
{
let earth_shape = Rc::clone(&earth_shape);
let timeout_id = Timeout::start(
move || {
earth_shape.set(EarthShape::Round);
},
4000,
);
timeout_id.stop();
}
set_timeout(
move || {
assert_eq!(earth_shape.get(), EarthShape::Flat);
},
5000,
)
.unwrap();
}
#[wasm_bindgen_test]
fn interval_test() {
#[derive(Clone, Copy, Debug, PartialEq)]
enum EarthShape {
Flat,
Round,
}
let earth_shape = Rc::new(Cell::new(EarthShape::Flat));
{
let earth_shape = Rc::clone(&earth_shape);
Interval::start(
move || {
earth_shape.set(EarthShape::Round);
},
4000,
);
}
set_interval(
move || {
assert_eq!(earth_shape.get(), EarthShape::Round);
},
5000,
)
.unwrap();
let earth_shape = Rc::new(Cell::new(EarthShape::Flat));
{
let earth_shape = Rc::clone(&earth_shape);
let interval_id = Interval::start(
move || {
earth_shape.set(EarthShape::Round);
},
4000,
);
interval_id.stop();
}
set_interval(
move || {
assert_eq!(earth_shape.get(), EarthShape::Flat);
},
5000,
)
.unwrap();
}
#[wasm_bindgen_test]
fn media_query_text() {
use webru::{body, create_element, media_query};
let p = create_element("p");
p.set_inner_html("You cannot see me if you are less then 1000px");
body().append_child(&p).unwrap();
media_query(
{
let p = p.clone();
move || {
p.set_inner_html("");
}
},
move || {
p.clone()
.set_inner_html("You cannot see me if you are less then 1000px");
},
1000,
);
}