test_dom.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //! A DOM for testing - both internal and external code.
  2. use bumpalo::Bump;
  3. use crate::innerlude::*;
  4. use crate::nodes::IntoVNode;
  5. pub struct TestDom {
  6. bump: Bump,
  7. scheduler: Scheduler,
  8. }
  9. impl TestDom {
  10. pub fn new() -> TestDom {
  11. let bump = Bump::new();
  12. let (sender, receiver) = futures_channel::mpsc::unbounded::<SchedulerMsg>();
  13. let scheduler = Scheduler::new(sender, receiver);
  14. TestDom { bump, scheduler }
  15. }
  16. pub fn new_factory(&self) -> NodeFactory {
  17. NodeFactory::new(&self.bump)
  18. }
  19. pub fn render_direct<'a, F>(&'a self, lazy_nodes: LazyNodes<'a, F>) -> VNode<'a>
  20. where
  21. F: FnOnce(NodeFactory<'a>) -> VNode<'a>,
  22. {
  23. lazy_nodes.into_vnode(NodeFactory::new(&self.bump))
  24. }
  25. pub fn render<'a, F>(&'a self, lazy_nodes: LazyNodes<'a, F>) -> &'a VNode<'a>
  26. where
  27. F: FnOnce(NodeFactory<'a>) -> VNode<'a>,
  28. {
  29. self.bump
  30. .alloc(lazy_nodes.into_vnode(NodeFactory::new(&self.bump)))
  31. }
  32. pub fn diff<'a>(&'a self, old: &'a VNode<'a>, new: &'a VNode<'a>) -> Mutations<'a> {
  33. let mutations = Mutations::new();
  34. let mut machine = DiffMachine::new(mutations, &self.scheduler.pool);
  35. machine.stack.push(DiffInstruction::Diff { new, old });
  36. machine.mutations
  37. }
  38. pub fn create<'a, F1>(&'a self, left: LazyNodes<'a, F1>) -> Mutations<'a>
  39. where
  40. F1: FnOnce(NodeFactory<'a>) -> VNode<'a>,
  41. {
  42. let old = self.bump.alloc(self.render_direct(left));
  43. let mut machine = DiffMachine::new(Mutations::new(), &self.scheduler.pool);
  44. machine.stack.create_node(old, MountType::Append);
  45. machine.work(&mut || false);
  46. machine.mutations
  47. }
  48. pub fn lazy_diff<'a, F1, F2>(
  49. &'a self,
  50. left: LazyNodes<'a, F1>,
  51. right: LazyNodes<'a, F2>,
  52. ) -> (Mutations<'a>, Mutations<'a>)
  53. where
  54. F1: FnOnce(NodeFactory<'a>) -> VNode<'a>,
  55. F2: FnOnce(NodeFactory<'a>) -> VNode<'a>,
  56. {
  57. let (old, new) = (self.render(left), self.render(right));
  58. let mut machine = DiffMachine::new(Mutations::new(), &self.scheduler.pool);
  59. machine.stack.create_node(old, MountType::Append);
  60. machine.work(|| false);
  61. let create_edits = machine.mutations;
  62. let mut machine = DiffMachine::new(Mutations::new(), &self.scheduler.pool);
  63. machine.stack.push(DiffInstruction::Diff { old, new });
  64. machine.work(&mut || false);
  65. let edits = machine.mutations;
  66. (create_edits, edits)
  67. }
  68. }
  69. impl Default for TestDom {
  70. fn default() -> Self {
  71. Self::new()
  72. }
  73. }
  74. impl VirtualDom {
  75. pub fn simulate(&mut self) {
  76. //
  77. }
  78. }