selector-engine.spec.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import SelectorEngine from '../../../src/dom/selector-engine'
  2. /** Test helpers */
  3. import { getFixture, clearFixture } from '../../helpers/fixture'
  4. describe('SelectorEngine', () => {
  5. let fixtureEl
  6. beforeAll(() => {
  7. fixtureEl = getFixture()
  8. })
  9. afterEach(() => {
  10. clearFixture()
  11. })
  12. describe('find', () => {
  13. it('should find elements', () => {
  14. fixtureEl.innerHTML = '<div></div>'
  15. const div = fixtureEl.querySelector('div')
  16. expect(SelectorEngine.find('div', fixtureEl)).toEqual([div])
  17. })
  18. it('should find elements globaly', () => {
  19. fixtureEl.innerHTML = '<div id="test"></div>'
  20. const div = fixtureEl.querySelector('#test')
  21. expect(SelectorEngine.find('#test')).toEqual([div])
  22. })
  23. it('should handle :scope selectors', () => {
  24. fixtureEl.innerHTML = `<ul>
  25. <li></li>
  26. <li>
  27. <a href="#" class="active">link</a>
  28. </li>
  29. <li></li>
  30. </ul>`
  31. const listEl = fixtureEl.querySelector('ul')
  32. const aActive = fixtureEl.querySelector('.active')
  33. expect(SelectorEngine.find(':scope > li > .active', listEl)).toEqual([aActive])
  34. })
  35. })
  36. describe('findOne', () => {
  37. it('should return one element', () => {
  38. fixtureEl.innerHTML = '<div id="test"></div>'
  39. const div = fixtureEl.querySelector('#test')
  40. expect(SelectorEngine.findOne('#test')).toEqual(div)
  41. })
  42. })
  43. describe('children', () => {
  44. it('should find children', () => {
  45. fixtureEl.innerHTML = `<ul>
  46. <li></li>
  47. <li></li>
  48. <li></li>
  49. </ul>`
  50. const list = fixtureEl.querySelector('ul')
  51. const liList = [].concat(...fixtureEl.querySelectorAll('li'))
  52. const result = SelectorEngine.children(list, 'li')
  53. expect(result).toEqual(liList)
  54. })
  55. })
  56. describe('parents', () => {
  57. it('should return parents', () => {
  58. expect(SelectorEngine.parents(fixtureEl, 'body').length).toEqual(1)
  59. })
  60. })
  61. describe('prev', () => {
  62. it('should return previous element', () => {
  63. fixtureEl.innerHTML = '<div class="test"></div><button class="btn"></button>'
  64. const btn = fixtureEl.querySelector('.btn')
  65. const divTest = fixtureEl.querySelector('.test')
  66. expect(SelectorEngine.prev(btn, '.test')).toEqual([divTest])
  67. })
  68. it('should return previous element with an extra element between', () => {
  69. fixtureEl.innerHTML = [
  70. '<div class="test"></div>',
  71. '<span></span>',
  72. '<button class="btn"></button>'
  73. ].join('')
  74. const btn = fixtureEl.querySelector('.btn')
  75. const divTest = fixtureEl.querySelector('.test')
  76. expect(SelectorEngine.prev(btn, '.test')).toEqual([divTest])
  77. })
  78. it('should return previous element with comments or text nodes between', () => {
  79. fixtureEl.innerHTML = [
  80. '<div class="test"></div>',
  81. '<div class="test"></div>',
  82. '<!-- Comment-->',
  83. 'Text',
  84. '<button class="btn"></button>'
  85. ].join('')
  86. const btn = fixtureEl.querySelector('.btn')
  87. const divTest = fixtureEl.querySelectorAll('.test')[1]
  88. expect(SelectorEngine.prev(btn, '.test')).toEqual([divTest])
  89. })
  90. })
  91. describe('next', () => {
  92. it('should return next element', () => {
  93. fixtureEl.innerHTML = '<div class="test"></div><button class="btn"></button>'
  94. const btn = fixtureEl.querySelector('.btn')
  95. const divTest = fixtureEl.querySelector('.test')
  96. expect(SelectorEngine.next(divTest, '.btn')).toEqual([btn])
  97. })
  98. it('should return next element with an extra element between', () => {
  99. fixtureEl.innerHTML = [
  100. '<div class="test"></div>',
  101. '<span></span>',
  102. '<button class="btn"></button>'
  103. ].join('')
  104. const btn = fixtureEl.querySelector('.btn')
  105. const divTest = fixtureEl.querySelector('.test')
  106. expect(SelectorEngine.next(divTest, '.btn')).toEqual([btn])
  107. })
  108. it('should return next element with comments or text nodes between', () => {
  109. fixtureEl.innerHTML = [
  110. '<div class="test"></div>',
  111. '<!-- Comment-->',
  112. 'Text',
  113. '<button class="btn"></button>',
  114. '<button class="btn"></button>'
  115. ].join('')
  116. const btn = fixtureEl.querySelector('.btn')
  117. const divTest = fixtureEl.querySelector('.test')
  118. expect(SelectorEngine.next(divTest, '.btn')).toEqual([btn])
  119. })
  120. })
  121. })