dom.spec.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { append, insert, normalizeBlock, prepend, remove } from '../src/dom'
  2. import { type Fragment, type ParentBlock, fragmentKey } from '../src/render'
  3. const node1 = document.createTextNode('node1')
  4. const node2 = document.createTextNode('node2')
  5. const node3 = document.createTextNode('node3')
  6. const anchor = document.createTextNode('anchor')
  7. describe('dom', () => {
  8. test('normalizeBlock', () => {
  9. expect(normalizeBlock([node1, node2, node3])).toEqual([node1, node2, node3])
  10. expect(normalizeBlock([node1, [node2, [node3]]])).toEqual([
  11. node1,
  12. node2,
  13. node3,
  14. ])
  15. expect(
  16. normalizeBlock([
  17. node1,
  18. { nodes: node2, anchor, [fragmentKey]: true },
  19. [node3],
  20. ]),
  21. ).toEqual([node1, node2, anchor, node3])
  22. })
  23. describe('insert', () => {
  24. test('parent is node', () => {
  25. const container = document.createElement('div')
  26. insert([anchor], container)
  27. insert([node1], container)
  28. insert([node2], container, anchor)
  29. insert([], container, node3)
  30. expect(Array.from(container.childNodes)).toEqual([node2, anchor, node1])
  31. expect(() => insert(node3, container, node3)).toThrowError(
  32. 'The child can not be found in the parent.',
  33. )
  34. })
  35. test('parent is array', () => {
  36. const container: Node[] = []
  37. insert(anchor, container)
  38. insert({ nodes: node1, [fragmentKey]: true }, container)
  39. insert([node2], container, anchor)
  40. expect(container).toEqual([
  41. [node2],
  42. anchor,
  43. { nodes: node1, [fragmentKey]: true },
  44. ])
  45. expect(() => insert([], container, node3)).toThrowError(
  46. 'The child can not be found in the parent.',
  47. )
  48. expect(() => insert(node3, container, node3)).toThrowError(
  49. 'The child can not be found in the parent.',
  50. )
  51. })
  52. })
  53. describe('prepend', () => {
  54. test('parent is node', () => {
  55. const container = document.createElement('div')
  56. prepend(container, [node1], node2)
  57. prepend(container, { nodes: node3, [fragmentKey]: true })
  58. expect(Array.from(container.childNodes)).toEqual([node3, node1, node2])
  59. })
  60. test('parent is array', () => {
  61. const container: Node[] = []
  62. prepend(container, [node1], node2)
  63. prepend(container, { nodes: node3, [fragmentKey]: true })
  64. expect(container).toEqual([
  65. { nodes: node3, [fragmentKey]: true },
  66. [node1],
  67. node2,
  68. ])
  69. })
  70. })
  71. describe('append', () => {
  72. test('parent is node', () => {
  73. const container = document.createElement('div')
  74. append(container, [node1], node2)
  75. append(container, { nodes: node3, [fragmentKey]: true })
  76. expect(Array.from(container.childNodes)).toEqual([node1, node2, node3])
  77. })
  78. test('parent is array', () => {
  79. const container: Node[] = []
  80. append(container, [node1], node2)
  81. append(container, { nodes: node3, [fragmentKey]: true })
  82. expect(container).toEqual([
  83. [node1],
  84. node2,
  85. { nodes: node3, [fragmentKey]: true },
  86. ])
  87. })
  88. })
  89. describe('remove', () => {
  90. test('parent is node', () => {
  91. const container = document.createElement('div')
  92. container.append(node1, node2, node3)
  93. remove([node1], container)
  94. remove({ nodes: node3, [fragmentKey]: true }, container)
  95. expect(Array.from(container.childNodes)).toEqual([node2])
  96. expect(() => remove(anchor, container)).toThrowError(
  97. 'The node to be removed is not a child of this node.',
  98. )
  99. })
  100. test('parent is array', () => {
  101. const n1 = [node1]
  102. const n3: Fragment = { nodes: node3, [fragmentKey]: true }
  103. const container: ParentBlock = [n1, node2, n3]
  104. remove(n1, container)
  105. remove(n3, container)
  106. expect(container).toEqual([node2])
  107. expect(() => remove(anchor, container)).toThrowError(
  108. 'The node to be removed is not a child of this node.',
  109. )
  110. })
  111. })
  112. })