diff_patch.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //! Tests that ensure that diffing and patching work properly in a real browser.
  2. //!
  3. //! To run all tests in this file:
  4. //!
  5. //! wasm-pack test crates/virtual-dom-rs --chrome --headless -- --test diff_patch
  6. // #![feature(proc_macro_hygiene)]
  7. extern crate wasm_bindgen_test;
  8. extern crate web_sys;
  9. use wasm_bindgen_test::*;
  10. use virtual_dom_rs::prelude::*;
  11. wasm_bindgen_test_configure!(run_in_browser);
  12. mod diff_patch_test_case;
  13. use self::diff_patch_test_case::DiffPatchTest;
  14. #[wasm_bindgen_test]
  15. fn replace_child() {
  16. DiffPatchTest {
  17. desc: "Replace a root node attribute attribute and a child text node",
  18. old: html! {
  19. <div>
  20. Original element
  21. </div>
  22. },
  23. new: html! { <div> Patched element</div> },
  24. override_expected: None,
  25. }
  26. .test();
  27. }
  28. #[wasm_bindgen_test]
  29. fn truncate_children() {
  30. DiffPatchTest {
  31. desc: "Truncates extra children",
  32. old: html! {
  33. <div>
  34. <div> <div> <b></b> <em></em> </div> </div>
  35. </div>
  36. },
  37. new: html! {
  38. <div>
  39. <div> <div> <b></b> </div> </div>
  40. </div>
  41. },
  42. override_expected: None,
  43. }
  44. .test();
  45. DiffPatchTest {
  46. desc: "https://github.com/chinedufn/percy/issues/48",
  47. old: html! {
  48. <div>
  49. ab <p></p> c
  50. </div>
  51. },
  52. new: html! {
  53. <div>
  54. ab <p></p>
  55. </div>
  56. },
  57. override_expected: None,
  58. }
  59. .test();
  60. }
  61. #[wasm_bindgen_test]
  62. fn remove_attributes() {
  63. DiffPatchTest {
  64. desc: "Removes attributes",
  65. old: html! { <div style=""> </div>
  66. },
  67. new: html! { <div></div> },
  68. override_expected: None,
  69. }
  70. .test();
  71. }
  72. #[wasm_bindgen_test]
  73. fn append_children() {
  74. DiffPatchTest {
  75. desc: "Append a child node",
  76. old: html! { <div> </div>
  77. },
  78. new: html! { <div> <span></span> </div> },
  79. override_expected: None,
  80. }
  81. .test();
  82. }
  83. #[wasm_bindgen_test]
  84. fn text_node_siblings() {
  85. // NOTE: Since there are two text nodes next to eachother we expect a `<!--ptns-->` separator in
  86. // between them.
  87. // @see virtual_node/mod.rs -> create_dom_node() for more information
  88. // TODO: A little more spacing than there should be in between the text nodes ... but doesn't
  89. // impact the user experience so we can look into that later..
  90. let override_expected = Some(
  91. r#"<div id="after"><span> The button has been clicked: <!--ptns--> world </span></div>"#,
  92. );
  93. let old1 = VirtualNode::text("The button has been clicked: ");
  94. let old2 = VirtualNode::text("hello");
  95. let new1 = VirtualNode::text("The button has been clicked: ");
  96. let new2 = VirtualNode::text("world");
  97. DiffPatchTest {
  98. desc: "Diff patch on text node siblings",
  99. old: html! {
  100. <div id="before">
  101. <span> { {old1} {old2} } </span>
  102. </div>
  103. },
  104. new: html! {
  105. <div id="after">
  106. <span> { {new1} {new2} } </span>
  107. </div>
  108. },
  109. override_expected,
  110. }
  111. .test();
  112. }
  113. #[wasm_bindgen_test]
  114. fn append_text_node() {
  115. DiffPatchTest {
  116. desc: "Append text node",
  117. old: html! { <div> </div> },
  118. new: html! { <div> Hello </div> },
  119. override_expected: None,
  120. }
  121. .test();
  122. }
  123. #[wasm_bindgen_test]
  124. fn append_sibling_text_nodes() {
  125. let text1 = VirtualNode::text("Hello");
  126. let text2 = VirtualNode::text("World");
  127. DiffPatchTest {
  128. desc: "Append sibling text nodes",
  129. old: html! { <div> </div> },
  130. new: html! { <div> {text1} {text2} </div> },
  131. override_expected: None,
  132. }
  133. .test();
  134. }
  135. #[wasm_bindgen_test]
  136. fn replace_with_children() {
  137. DiffPatchTest {
  138. desc: "Replace node that has children",
  139. old: html! { <table><tr><th>0</th></tr><tr><td>1</td></tr></table> },
  140. new: html! { <table><tr><td>2</td></tr><tr><th>3</th></tr></table> },
  141. override_expected: None,
  142. }
  143. .test();
  144. }
  145. // https://github.com/chinedufn/percy/issues/62
  146. #[wasm_bindgen_test]
  147. fn replace_element_with_text_node() {
  148. DiffPatchTest {
  149. desc: "#62: Replace element with text node",
  150. old: html! { <span> <br> </span> },
  151. new: html! { <span> a </span> },
  152. override_expected: None,
  153. }
  154. .test();
  155. }
  156. // https://github.com/chinedufn/percy/issues/68
  157. #[wasm_bindgen_test]
  158. fn text_root_node() {
  159. DiffPatchTest {
  160. desc: "Patching of text root node works",
  161. old: html! { Old text },
  162. new: html! { New text },
  163. override_expected: None,
  164. }
  165. .test();
  166. }
  167. #[wasm_bindgen_test]
  168. fn replace_text_with_element() {
  169. DiffPatchTest {
  170. desc: "Replacing a text node with an element works",
  171. old: html! { <div>a</div> },
  172. new: html! { <div><br></div> },
  173. override_expected: None,
  174. }
  175. .test();
  176. }