create_element.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //! Tests that ensure that we create the right DOM element from a VirtualNode
  2. //!
  3. //! To run all tests in this file:
  4. //!
  5. //! wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test create_element
  6. // #![feature(proc_macro_hygiene)]
  7. extern crate wasm_bindgen_test;
  8. extern crate web_sys;
  9. use std::cell::Cell;
  10. use std::rc::Rc;
  11. use wasm_bindgen::JsCast;
  12. use wasm_bindgen_test::*;
  13. use web_sys::{Element, Event, EventTarget, MouseEvent};
  14. use virtual_dom_rs::prelude::*;
  15. wasm_bindgen_test_configure!(run_in_browser);
  16. /// wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test create_element nested_divs
  17. #[wasm_bindgen_test]
  18. fn nested_divs() {
  19. let vdiv = html! { <div> <div> <div></div> </div> </div> };
  20. let div: Element = vdiv.create_dom_node().node.unchecked_into();
  21. assert_eq!(&div.inner_html(), "<div><div></div></div>");
  22. }
  23. /// wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test create_element svg_element
  24. /// TODO: Temporarily disabled until we figure out why it's failing in CI but not failing locally
  25. // #[wasm_bindgen_test]
  26. // fn svg_element() {
  27. // let vdiv = html! { <div><svg xmlns="http://www.w3.org/2000/svg">
  28. // <circle cx="50" cy="50" r="50"/>
  29. // </svg></div> };
  30. // let div: Element = vdiv.create_dom_node().node.unchecked_into();
  31. // assert_eq!(
  32. // &div.inner_html(),
  33. // r#"<svg xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"></circle></svg>"#
  34. // );
  35. // }
  36. /// wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test create_element div_with_attributes
  37. #[wasm_bindgen_test]
  38. fn div_with_attributes() {
  39. let vdiv = html! { <div id="id-here" class="two classes"></div> };
  40. let div: Element = vdiv.create_dom_node().node.unchecked_into();
  41. assert_eq!(&div.id(), "id-here");
  42. assert!(div.class_list().contains("two"));
  43. assert!(div.class_list().contains("classes"));
  44. assert_eq!(div.class_list().length(), 2);
  45. }
  46. /// wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test create_element click_event
  47. #[wasm_bindgen_test]
  48. fn click_event() {
  49. let clicked = Rc::new(Cell::new(false));
  50. let clicked_clone = Rc::clone(&clicked);
  51. let div = html! {
  52. <div
  53. onclick=move |_ev: MouseEvent| {
  54. clicked_clone.set(true);
  55. }
  56. >
  57. </div>
  58. };
  59. let click_event = Event::new("click").unwrap();
  60. let div = div.create_dom_node().node;
  61. (EventTarget::from(div))
  62. .dispatch_event(&click_event)
  63. .unwrap();
  64. assert_eq!(*clicked, Cell::new(true));
  65. }
  66. /// wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test create_element inner_html
  67. /// @book start inner-html
  68. #[wasm_bindgen_test]
  69. fn inner_html() {
  70. let div = html! {
  71. <div
  72. unsafe_inner_html="<span>hi</span>"
  73. >
  74. </div>
  75. };
  76. let div: Element = div.create_dom_node().node.unchecked_into();
  77. assert_eq!(div.inner_html(), "<span>hi</span>");
  78. }
  79. // @book end inner-html
  80. /// wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test create_element on_create_elem
  81. /// @book start on-create-elem
  82. #[wasm_bindgen_test]
  83. fn on_create_elem() {
  84. let div = html! {
  85. <div
  86. on_create_elem=|elem: web_sys::Element| {
  87. elem.set_inner_html("Hello world");
  88. }
  89. >
  90. <span>This span should get replaced</span>
  91. </div>
  92. };
  93. let div: Element = div.create_dom_node().node.unchecked_into();
  94. assert_eq!(div.inner_html(), "Hello world");
  95. }
  96. // @book end on-create-elem