passes.rs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. use dioxus_native_core::node::NodeType;
  2. use dioxus_native_core::prelude::*;
  3. use rustc_hash::{FxHashMap, FxHashSet};
  4. fn create_blank_element() -> NodeType {
  5. NodeType::Element(ElementNode {
  6. tag: "div".to_owned(),
  7. namespace: None,
  8. attributes: FxHashMap::default(),
  9. listeners: FxHashSet::default(),
  10. })
  11. }
  12. #[test]
  13. fn node_pass() {
  14. #[derive(Debug, Default, Clone, PartialEq)]
  15. struct Number(i32);
  16. impl State for Number {
  17. type ChildDependencies = ();
  18. type NodeDependencies = ();
  19. type ParentDependencies = ();
  20. const NODE_MASK: NodeMaskBuilder<'static> = NodeMaskBuilder::new();
  21. fn update<'a>(
  22. &mut self,
  23. _: NodeView,
  24. _: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  25. _: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  26. _: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  27. _: &SendAnyMap,
  28. ) -> bool {
  29. self.0 += 1;
  30. true
  31. }
  32. fn create<'a>(
  33. node_view: NodeView<()>,
  34. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  35. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  36. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  37. context: &SendAnyMap,
  38. ) -> Self {
  39. let mut myself = Self::default();
  40. myself.update(node_view, node, parent, children, context);
  41. myself
  42. }
  43. }
  44. let mut tree: RealDom = RealDom::new(Box::new([Number::to_type_erased()]));
  45. tree.update_state(SendAnyMap::new(), false);
  46. assert_eq!(tree.get(tree.root_id()).unwrap().get(), Some(&Number(1)));
  47. // mark the node as dirty
  48. tree.get_mut(tree.root_id()).unwrap().get_mut::<Number>();
  49. tree.update_state(SendAnyMap::new(), false);
  50. assert_eq!(tree.get(tree.root_id()).unwrap().get(), Some(&Number(2)));
  51. }
  52. #[test]
  53. fn dependant_node_pass() {
  54. #[derive(Debug, Default, Clone, PartialEq)]
  55. struct AddNumber(i32);
  56. impl State for AddNumber {
  57. type ChildDependencies = ();
  58. type NodeDependencies = (SubtractNumber,);
  59. type ParentDependencies = ();
  60. const NODE_MASK: NodeMaskBuilder<'static> = NodeMaskBuilder::new();
  61. fn update<'a>(
  62. &mut self,
  63. _: NodeView,
  64. _: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  65. _: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  66. _: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  67. _: &SendAnyMap,
  68. ) -> bool {
  69. self.0 += 1;
  70. true
  71. }
  72. fn create<'a>(
  73. node_view: NodeView<()>,
  74. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  75. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  76. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  77. context: &SendAnyMap,
  78. ) -> Self {
  79. let mut myself = Self::default();
  80. myself.update(node_view, node, parent, children, context);
  81. myself
  82. }
  83. }
  84. #[derive(Debug, Default, Clone, PartialEq)]
  85. struct SubtractNumber(i32);
  86. impl State for SubtractNumber {
  87. type ChildDependencies = ();
  88. type NodeDependencies = ();
  89. type ParentDependencies = ();
  90. const NODE_MASK: NodeMaskBuilder<'static> = NodeMaskBuilder::new();
  91. fn update<'a>(
  92. &mut self,
  93. _: NodeView,
  94. _: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  95. _: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  96. _: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  97. _: &SendAnyMap,
  98. ) -> bool {
  99. self.0 -= 1;
  100. true
  101. }
  102. fn create<'a>(
  103. node_view: NodeView<()>,
  104. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  105. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  106. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  107. context: &SendAnyMap,
  108. ) -> Self {
  109. let mut myself = Self::default();
  110. myself.update(node_view, node, parent, children, context);
  111. myself
  112. }
  113. }
  114. let mut tree: RealDom = RealDom::new(Box::new([
  115. AddNumber::to_type_erased(),
  116. SubtractNumber::to_type_erased(),
  117. ]));
  118. tree.update_state(SendAnyMap::new(), false);
  119. let root = tree.get(tree.root_id()).unwrap();
  120. assert_eq!(root.get(), Some(&AddNumber(1)));
  121. assert_eq!(root.get(), Some(&SubtractNumber(-1)));
  122. // mark the subtract state as dirty, it should update the add state
  123. tree.get_mut(tree.root_id())
  124. .unwrap()
  125. .get_mut::<SubtractNumber>();
  126. tree.update_state(SendAnyMap::new(), false);
  127. let root = tree.get(tree.root_id()).unwrap();
  128. assert_eq!(root.get(), Some(&AddNumber(2)));
  129. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  130. // mark the add state as dirty, it should ~not~ update the subtract state
  131. tree.get_mut(tree.root_id()).unwrap().get_mut::<AddNumber>();
  132. tree.update_state(SendAnyMap::new(), false);
  133. let root = tree.get(tree.root_id()).unwrap();
  134. assert_eq!(root.get(), Some(&AddNumber(3)));
  135. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  136. }
  137. #[test]
  138. fn independant_node_pass() {
  139. #[derive(Debug, Default, Clone, PartialEq)]
  140. struct AddNumber(i32);
  141. impl State for AddNumber {
  142. type ChildDependencies = ();
  143. type NodeDependencies = ();
  144. type ParentDependencies = ();
  145. const NODE_MASK: NodeMaskBuilder<'static> = NodeMaskBuilder::new();
  146. fn update<'a>(
  147. &mut self,
  148. _: NodeView,
  149. _: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  150. _: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  151. _: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  152. _: &SendAnyMap,
  153. ) -> bool {
  154. self.0 += 1;
  155. true
  156. }
  157. fn create<'a>(
  158. node_view: NodeView<()>,
  159. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  160. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  161. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  162. context: &SendAnyMap,
  163. ) -> Self {
  164. let mut myself = Self::default();
  165. myself.update(node_view, node, parent, children, context);
  166. myself
  167. }
  168. }
  169. #[derive(Debug, Default, Clone, PartialEq)]
  170. struct SubtractNumber(i32);
  171. impl State for SubtractNumber {
  172. type ChildDependencies = ();
  173. type NodeDependencies = ();
  174. type ParentDependencies = ();
  175. const NODE_MASK: NodeMaskBuilder<'static> = NodeMaskBuilder::new();
  176. fn update<'a>(
  177. &mut self,
  178. _: NodeView,
  179. _: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  180. _: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  181. _: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  182. _: &SendAnyMap,
  183. ) -> bool {
  184. self.0 -= 1;
  185. true
  186. }
  187. fn create<'a>(
  188. node_view: NodeView<()>,
  189. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  190. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  191. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  192. context: &SendAnyMap,
  193. ) -> Self {
  194. let mut myself = Self::default();
  195. myself.update(node_view, node, parent, children, context);
  196. myself
  197. }
  198. }
  199. let mut tree: RealDom = RealDom::new(Box::new([
  200. AddNumber::to_type_erased(),
  201. SubtractNumber::to_type_erased(),
  202. ]));
  203. tree.update_state(SendAnyMap::new(), false);
  204. let root = tree.get(tree.root_id()).unwrap();
  205. assert_eq!(root.get(), Some(&AddNumber(1)));
  206. assert_eq!(root.get(), Some(&SubtractNumber(-1)));
  207. // mark the subtract state as dirty, it should ~not~ update the add state
  208. tree.get_mut(tree.root_id())
  209. .unwrap()
  210. .get_mut::<SubtractNumber>();
  211. tree.update_state(SendAnyMap::new(), false);
  212. let root = tree.get(tree.root_id()).unwrap();
  213. assert_eq!(root.get(), Some(&AddNumber(1)));
  214. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  215. // mark the add state as dirty, it should ~not~ update the subtract state
  216. tree.get_mut(tree.root_id()).unwrap().get_mut::<AddNumber>();
  217. tree.update_state(SendAnyMap::new(), false);
  218. let root = tree.get(tree.root_id()).unwrap();
  219. assert_eq!(root.get(), Some(&AddNumber(2)));
  220. assert_eq!(root.get(), Some(&SubtractNumber(-2)));
  221. }
  222. #[test]
  223. fn down_pass() {
  224. #[derive(Debug, Clone, PartialEq)]
  225. struct AddNumber(i32);
  226. impl Default for AddNumber {
  227. fn default() -> Self {
  228. Self(1)
  229. }
  230. }
  231. impl State for AddNumber {
  232. type ChildDependencies = ();
  233. type NodeDependencies = ();
  234. type ParentDependencies = (AddNumber,);
  235. const NODE_MASK: NodeMaskBuilder<'static> = NodeMaskBuilder::new();
  236. fn update<'a>(
  237. &mut self,
  238. _: NodeView,
  239. _: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  240. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  241. _: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  242. _: &SendAnyMap,
  243. ) -> bool {
  244. if let Some((parent,)) = parent {
  245. self.0 += parent.0;
  246. }
  247. true
  248. }
  249. fn create<'a>(
  250. node_view: NodeView<()>,
  251. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  252. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  253. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  254. context: &SendAnyMap,
  255. ) -> Self {
  256. let mut myself = Self::default();
  257. myself.update(node_view, node, parent, children, context);
  258. myself
  259. }
  260. }
  261. let mut tree: RealDom = RealDom::new(Box::new([AddNumber::to_type_erased()]));
  262. let grandchild1 = tree.create_node(create_blank_element());
  263. let grandchild1 = grandchild1.id();
  264. let mut child1 = tree.create_node(create_blank_element());
  265. child1.add_child(grandchild1);
  266. let child1 = child1.id();
  267. let grandchild2 = tree.create_node(create_blank_element());
  268. let grandchild2 = grandchild2.id();
  269. let mut child2 = tree.create_node(create_blank_element());
  270. child2.add_child(grandchild2);
  271. let child2 = child2.id();
  272. let mut parent = tree.get_mut(tree.root_id()).unwrap();
  273. parent.add_child(child1);
  274. parent.add_child(child2);
  275. tree.update_state(SendAnyMap::new(), false);
  276. let root = tree.get(tree.root_id()).unwrap();
  277. dbg!(root.id());
  278. assert_eq!(root.get(), Some(&AddNumber(1)));
  279. let child1 = tree.get(child1).unwrap();
  280. dbg!(child1.id());
  281. dbg!(child1.parent().unwrap().get::<AddNumber>());
  282. assert_eq!(child1.get(), Some(&AddNumber(2)));
  283. let grandchild1 = tree.get(grandchild1).unwrap();
  284. assert_eq!(grandchild1.get(), Some(&AddNumber(3)));
  285. let child2 = tree.get(child2).unwrap();
  286. assert_eq!(child2.get(), Some(&AddNumber(2)));
  287. let grandchild2 = tree.get(grandchild2).unwrap();
  288. assert_eq!(grandchild2.get(), Some(&AddNumber(3)));
  289. }
  290. #[test]
  291. fn up_pass() {
  292. // Tree before:
  293. // 1=\
  294. // 1=\
  295. // 1
  296. // 1=\
  297. // 1
  298. // Tree after:
  299. // 4=\
  300. // 2=\
  301. // 1
  302. // 2=\
  303. // 1
  304. #[derive(Debug, Clone, PartialEq)]
  305. struct AddNumber(i32);
  306. impl State for AddNumber {
  307. type ChildDependencies = (AddNumber,);
  308. type NodeDependencies = ();
  309. type ParentDependencies = ();
  310. const NODE_MASK: NodeMaskBuilder<'static> = NodeMaskBuilder::new();
  311. fn update<'a>(
  312. &mut self,
  313. _: NodeView,
  314. _: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  315. _: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  316. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  317. _: &SendAnyMap,
  318. ) -> bool {
  319. if let Some(children) = children {
  320. self.0 += children.iter().map(|(i,)| i.0).sum::<i32>();
  321. }
  322. true
  323. }
  324. fn create<'a>(
  325. node_view: NodeView<()>,
  326. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  327. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  328. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  329. context: &SendAnyMap,
  330. ) -> Self {
  331. let mut myself = Self(1);
  332. myself.update(node_view, node, parent, children, context);
  333. myself
  334. }
  335. }
  336. let mut tree: RealDom = RealDom::new(Box::new([AddNumber::to_type_erased()]));
  337. let grandchild1 = tree.create_node(create_blank_element());
  338. let grandchild1 = grandchild1.id();
  339. let mut child1 = tree.create_node(create_blank_element());
  340. child1.add_child(grandchild1);
  341. let child1 = child1.id();
  342. let grandchild2 = tree.create_node(create_blank_element());
  343. let grandchild2 = grandchild2.id();
  344. let mut child2 = tree.create_node(create_blank_element());
  345. child2.add_child(grandchild2);
  346. let child2 = child2.id();
  347. let mut parent = tree.get_mut(tree.root_id()).unwrap();
  348. parent.add_child(child1);
  349. parent.add_child(child2);
  350. tree.update_state(SendAnyMap::new(), false);
  351. let root = tree.get(tree.root_id()).unwrap();
  352. assert_eq!(root.get(), Some(&AddNumber(5)));
  353. let child1 = tree.get(child1).unwrap();
  354. assert_eq!(child1.get(), Some(&AddNumber(2)));
  355. let grandchild1 = tree.get(grandchild1).unwrap();
  356. assert_eq!(grandchild1.get(), Some(&AddNumber(1)));
  357. let child2 = tree.get(child2).unwrap();
  358. assert_eq!(child2.get(), Some(&AddNumber(2)));
  359. let grandchild2 = tree.get(grandchild2).unwrap();
  360. assert_eq!(grandchild2.get(), Some(&AddNumber(1)));
  361. }