cases.spec.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import {
  2. readFile,
  3. readObject,
  4. compileVue,
  5. compileWithDeps,
  6. createInstance,
  7. addTaskHook,
  8. resetTaskHook,
  9. getRoot,
  10. getEvents,
  11. fireEvent
  12. } from '../helpers'
  13. // Create one-off render test case
  14. function createRenderTestCase (name) {
  15. const source = readFile(`${name}.vue`)
  16. const target = readObject(`${name}.vdom.js`)
  17. return done => {
  18. compileVue(source).then(code => {
  19. const id = String(Date.now() * Math.random())
  20. const instance = createInstance(id, code)
  21. setTimeout(() => {
  22. expect(getRoot(instance)).toEqual(target)
  23. instance.$destroy()
  24. done()
  25. }, 50)
  26. }).catch(done.fail)
  27. }
  28. }
  29. // Create event test case, will trigger the first bind event
  30. function createEventTestCase (name) {
  31. const source = readFile(`${name}.vue`)
  32. const before = readObject(`${name}.before.vdom.js`)
  33. const after = readObject(`${name}.after.vdom.js`)
  34. return done => {
  35. compileVue(source).then(code => {
  36. const id = String(Date.now() * Math.random())
  37. const instance = createInstance(id, code)
  38. setTimeout(() => {
  39. expect(getRoot(instance)).toEqual(before)
  40. const event = getEvents(instance)[0]
  41. fireEvent(instance, event.ref, event.type, {})
  42. setTimeout(() => {
  43. expect(getRoot(instance)).toEqual(after)
  44. instance.$destroy()
  45. done()
  46. }, 50)
  47. }, 50)
  48. }).catch(done.fail)
  49. }
  50. }
  51. describe('Usage', () => {
  52. describe('render', () => {
  53. it('sample', createRenderTestCase('render/sample'))
  54. })
  55. describe('event', () => {
  56. it('click', createEventTestCase('event/click'))
  57. })
  58. describe('recycle-list', () => {
  59. it('text node', createRenderTestCase('recycle-list/text-node'))
  60. it('attributes', createRenderTestCase('recycle-list/attrs'))
  61. // it('class name', createRenderTestCase('recycle-list/classname'))
  62. it('inline style', createRenderTestCase('recycle-list/inline-style'))
  63. it('v-if', createRenderTestCase('recycle-list/v-if'))
  64. it('v-else', createRenderTestCase('recycle-list/v-else'))
  65. it('v-else-if', createRenderTestCase('recycle-list/v-else-if'))
  66. it('v-for', createRenderTestCase('recycle-list/v-for'))
  67. it('v-for-iterator', createRenderTestCase('recycle-list/v-for-iterator'))
  68. it('v-on', createRenderTestCase('recycle-list/v-on'))
  69. it('v-on-inline', createRenderTestCase('recycle-list/v-on-inline'))
  70. it('stateless component', done => {
  71. compileWithDeps('recycle-list/components/stateless.vue', [{
  72. name: 'banner',
  73. path: 'recycle-list/components/banner.vue'
  74. }]).then(code => {
  75. const id = String(Date.now() * Math.random())
  76. const instance = createInstance(id, code)
  77. setTimeout(() => {
  78. const target = readObject('recycle-list/components/stateless.vdom.js')
  79. expect(getRoot(instance)).toEqual(target)
  80. instance.$destroy()
  81. done()
  82. }, 50)
  83. }).catch(done.fail)
  84. })
  85. it('stateless component with props', done => {
  86. compileWithDeps('recycle-list/components/stateless-with-props.vue', [{
  87. name: 'poster',
  88. path: 'recycle-list/components/poster.vue'
  89. }]).then(code => {
  90. const id = String(Date.now() * Math.random())
  91. const instance = createInstance(id, code)
  92. setTimeout(() => {
  93. const target = readObject('recycle-list/components/stateless-with-props.vdom.js')
  94. expect(getRoot(instance)).toEqual(target)
  95. instance.$destroy()
  96. done()
  97. }, 50)
  98. }).catch(done.fail)
  99. })
  100. it('multi stateless components', done => {
  101. compileWithDeps('recycle-list/components/stateless-multi-components.vue', [{
  102. name: 'banner',
  103. path: 'recycle-list/components/banner.vue'
  104. }, {
  105. name: 'poster',
  106. path: 'recycle-list/components/poster.vue'
  107. }, {
  108. name: 'footer',
  109. path: 'recycle-list/components/footer.vue'
  110. }]).then(code => {
  111. const id = String(Date.now() * Math.random())
  112. const instance = createInstance(id, code)
  113. setTimeout(() => {
  114. const target = readObject('recycle-list/components/stateless-multi-components.vdom.js')
  115. expect(getRoot(instance)).toEqual(target)
  116. instance.$destroy()
  117. done()
  118. }, 50)
  119. }).catch(done.fail)
  120. })
  121. it('stateful component', done => {
  122. const tasks = []
  123. addTaskHook((_, task) => tasks.push(task))
  124. compileWithDeps('recycle-list/components/stateful.vue', [{
  125. name: 'counter',
  126. path: 'recycle-list/components/counter.vue'
  127. }]).then(code => {
  128. const id = String(Date.now() * Math.random())
  129. const instance = createInstance(id, code)
  130. expect(tasks.length).toEqual(3)
  131. setTimeout(() => {
  132. // check the render results
  133. const target = readObject('recycle-list/components/stateful.vdom.js')
  134. expect(getRoot(instance)).toEqual(target)
  135. tasks.length = 0
  136. // trigger component hooks
  137. instance.$triggerHook(
  138. 2, // cid of the virtual component template
  139. 'create', // lifecycle hook name
  140. // arguments for the callback
  141. [
  142. 'x-1', // componentId of the virtual component
  143. { start: 3 } // propsData of the virtual component
  144. ]
  145. )
  146. instance.$triggerHook(2, 'create', ['x-2', { start: 11 }])
  147. // the state (_data) of the virtual component should be sent to native
  148. expect(tasks.length).toEqual(2)
  149. expect(tasks[0].method).toEqual('updateComponentData')
  150. expect(tasks[0].args).toEqual(['x-1', { count: 6 }, ''])
  151. expect(tasks[1].method).toEqual('updateComponentData')
  152. expect(tasks[1].args).toEqual(['x-2', { count: 22 }, ''])
  153. instance.$triggerHook('x-1', 'attach')
  154. instance.$triggerHook('x-2', 'attach')
  155. tasks.length = 0
  156. // simulate a click event
  157. // the event will be caught by the virtual component template and
  158. // should be dispatched to virtual component according to the componentId
  159. const event = getEvents(instance)[0]
  160. fireEvent(instance, event.ref, 'click', { componentId: 'x-1' })
  161. setTimeout(() => {
  162. // expect(tasks.length).toEqual(1)
  163. // expect(tasks[0].method).toEqual('updateComponentData')
  164. // expect(tasks[0].args).toEqual([{ count: 7 }])
  165. instance.$destroy()
  166. resetTaskHook()
  167. done()
  168. })
  169. }, 50)
  170. }).catch(done.fail)
  171. })
  172. // it('component lifecycle', done => {
  173. // global.__lifecycles = []
  174. // compileWithDeps('recycle-list/components/stateful-lifecycle.vue', [{
  175. // name: 'lifecycle',
  176. // path: 'recycle-list/components/lifecycle.vue'
  177. // }]).then(code => {
  178. // const id = String(Date.now() * Math.random())
  179. // const instance = createInstance(id, code)
  180. // setTimeout(() => {
  181. // const target = readObject('recycle-list/components/stateful-lifecycle.vdom.js')
  182. // expect(getRoot(instance)).toEqual(target)
  183. // instance.$triggerHook(2, 'create', ['y-1'])
  184. // instance.$triggerHook('y-1', 'attach')
  185. // instance.$triggerHook('y-1', 'detach')
  186. // expect(global.__lifecycles).toEqual([
  187. // 'beforeCreate undefined',
  188. // 'created 0',
  189. // 'beforeMount 1',
  190. // 'mounted 1',
  191. // 'beforeUpdate 2',
  192. // 'updated 2',
  193. // 'beforeDestroy 2',
  194. // 'destroyed 2'
  195. // ])
  196. // delete global.__lifecycles
  197. // instance.$destroy()
  198. // done()
  199. // }, 50)
  200. // }).catch(done.fail)
  201. // })
  202. it('stateful component with v-model', done => {
  203. compileWithDeps('recycle-list/components/stateful-v-model.vue', [{
  204. name: 'editor',
  205. path: 'recycle-list/components/editor.vue'
  206. }]).then(code => {
  207. const id = String(Date.now() * Math.random())
  208. const instance = createInstance(id, code)
  209. setTimeout(() => {
  210. const target = readObject('recycle-list/components/stateful-v-model.vdom.js')
  211. expect(getRoot(instance)).toEqual(target)
  212. instance.$destroy()
  213. done()
  214. }, 50)
  215. }).catch(done.fail)
  216. })
  217. })
  218. })