]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: trying to make tests work
authorEvan You <yyx990803@gmail.com>
Thu, 1 Nov 2018 22:43:28 +0000 (07:43 +0900)
committerEvan You <yyx990803@gmail.com>
Fri, 2 Nov 2018 21:31:31 +0000 (06:31 +0900)
packages/runtime-core/__tests__/fragment.spec.ts
packages/runtime-core/src/component.ts
packages/runtime-core/src/createRenderer.ts
packages/runtime-test/__tests__/testRuntime.spec.ts
packages/runtime-test/src/nodeOps.ts
packages/scheduler/src/experimental.ts
packages/scheduler/src/patchNodeOps.ts

index e558a74178eaf9de50030eca14c95739f5562041..0096cc771a479efa20f577f469bba404b18647cf 100644 (file)
@@ -16,14 +16,14 @@ import {
 } from '@vue/runtime-test'
 
 describe('Fragments', () => {
-  it('should allow returning multiple component root nodes', () => {
+  it('should allow returning multiple component root nodes', async () => {
     class App extends Component {
       render() {
         return [h('div', 'one'), 'two']
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
     expect(serialize(root)).toBe(`<div><div>one</div>two</div>`)
     expect(root.children.length).toBe(2)
     expect(root.children[0]).toMatchObject({
@@ -40,14 +40,14 @@ describe('Fragments', () => {
     })
   })
 
-  it('should be able to explicitly create fragments', () => {
+  it('should be able to explicitly create fragments', async () => {
     class App extends Component {
       render() {
         return h('div', [h(Fragment, [h('div', 'one'), 'two'])])
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
     const parent = root.children[0] as TestElement
     expect(serialize(parent)).toBe(`<div><div>one</div>two</div>`)
   })
@@ -65,7 +65,7 @@ describe('Fragments', () => {
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
 
     expect(serialize(root)).toBe(`<div><div>one</div>two</div>`)
 
@@ -84,7 +84,7 @@ describe('Fragments', () => {
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await await render(h(App), root)
 
     expect(serialize(root)).toBe(`<div><div>one</div>two</div>`)
 
@@ -103,7 +103,7 @@ describe('Fragments', () => {
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
 
     expect(serialize(root)).toBe(`<div><div>one</div><div>two</div></div>`)
 
@@ -138,7 +138,7 @@ describe('Fragments', () => {
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
     const parent = root.children[0] as TestElement
 
     expect(serialize(parent)).toBe(
@@ -179,7 +179,7 @@ describe('Fragments', () => {
     }
 
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
 
     expect(serialize(root)).toBe(
       `<div><div>outer</div><div>one</div><div>two</div></div>`
index e220056bf1febf5a61e602fac64805f8fc6d6e0c..6de11b647fe5ea736d4b3d8f37aa75249e4a7319 100644 (file)
@@ -109,7 +109,8 @@ export interface ComponentInstance<P = {}, D = {}>
 // actual implementation of the component
 class InternalComponent implements PublicInstanceMethods {
   get $el(): any {
-    return this.$vnode && this.$vnode.el
+    const el = this.$vnode && this.$vnode.el
+    return typeof el === 'function' ? (el as any)() : el
   }
 
   $vnode: VNode | null = null
index 3fe1b4d512f5504021d75561df865f7d9ffc1c9c..a85cffd67e9cf209497b82474385fe030a0900e8 100644 (file)
@@ -228,13 +228,9 @@ export function createRenderer(options: RendererOptions) {
       // kept-alive
       activateComponentInstance(vnode, container, endNode)
     } else {
-      if (__JSDOM__) {
+      queueJob(() => {
         mountComponentInstance(vnode, container, isSVG, endNode)
-      } else {
-        queueJob(() => {
-          mountComponentInstance(vnode, container, isSVG, endNode)
-        }, flushHooks)
-      }
+      }, flushHooks)
     }
   }
 
@@ -1441,7 +1437,6 @@ export function createRenderer(options: RendererOptions) {
       }
     }
     return nextTick(() => {
-      debugger
       return vnode && vnode.flags & VNodeFlags.COMPONENT_STATEFUL
         ? (vnode.children as ComponentInstance).$proxy
         : null
index 0948046578f1cd0857aee9c43b58178cb8443d04..ad7c421e570ceefbfbd87f551a82d108f354fc8e 100644 (file)
@@ -17,7 +17,7 @@ import {
 } from '../src'
 
 describe('test renderer', () => {
-  it('should work', () => {
+  it('should work', async () => {
     class App extends Component {
       render() {
         return h(
@@ -30,7 +30,7 @@ describe('test renderer', () => {
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
 
     expect(root.children.length).toBe(1)
 
@@ -64,7 +64,7 @@ describe('test renderer', () => {
     const root = nodeOps.createElement('div')
 
     resetOps()
-    render(h(App), root)
+    await render(h(App), root)
     const ops = dumpOps()
 
     expect(ops.length).toBe(5)
@@ -126,7 +126,7 @@ describe('test renderer', () => {
     })
   })
 
-  it('should be able to serialize nodes', () => {
+  it('should be able to serialize nodes', async () => {
     class App extends Component {
       render() {
         return h(
@@ -139,7 +139,7 @@ describe('test renderer', () => {
       }
     }
     const root = nodeOps.createElement('div')
-    render(h(App), root)
+    await render(h(App), root)
     expect(serialize(root)).toEqual(
       `<div><div id="test"><span>foo</span>hello</div></div>`
     )
index 9b4e48462f660be139bbd24725fccf36a347fc76..bcf4e1e4d573408fe05b54bf01a35a0a013dbe14 100644 (file)
@@ -63,6 +63,9 @@ export function dumpOps(): NodeOp[] {
 }
 
 function createElement(tag: string): TestElement {
+  if (nodeId === 5) {
+    throw new Error('foo')
+  }
   const node: TestElement = {
     id: nodeId++,
     type: NodeTypes.ELEMENT,
index 7c4a0ed5b75b57fe310e494c160319df480e141a..80a5ccf6b8b3a564cc37f1cc5059b61e8b1c271e 100644 (file)
@@ -61,7 +61,10 @@ export function nextTick<T>(fn?: () => T): Promise<T> {
         nextTickQueue.push(() => {
           resolve(fn ? fn() : undefined)
         })
-        pendingRejectors.push(reject)
+        pendingRejectors.push(err => {
+          if (fn) fn()
+          reject(err)
+        })
       } else {
         resolve(fn ? fn() : undefined)
       }
index 0ac25cc486be16e914dbb2c13d18de138341cb49..43f18c9d526ceb719a9ec96d39a1b81f219d51eb 100644 (file)
@@ -1,5 +1,6 @@
 import { NodeOps } from '@vue/runtime-core'
 import { nodeOps } from '../../runtime-dom/src/nodeOps'
+import { nodeOps as testNodeOps } from '../../runtime-test/src/nodeOps'
 
 export type Op = [Function, ...any[]]
 
@@ -14,27 +15,32 @@ const evaluate = (v: any) => {
 }
 
 // patch nodeOps to record operations without touching the DOM
-Object.keys(nodeOps).forEach((key: keyof NodeOps) => {
-  const original = nodeOps[key] as Function
-  if (key === 'querySelector') {
-    return
-  }
-  if (/create/.test(key)) {
-    nodeOps[key] = (...args: any[]) => {
-      let res: any
-      if (currentOps) {
-        return () => res || (res = original(...args))
-      } else {
-        return original(...args)
-      }
+function patchOps(nodeOps: NodeOps) {
+  Object.keys(nodeOps).forEach((key: keyof NodeOps) => {
+    const original = nodeOps[key] as Function
+    if (key === 'querySelector') {
+      return
     }
-  } else {
-    nodeOps[key] = (...args: any[]) => {
-      if (currentOps) {
-        currentOps.push([original, ...args.map(evaluate)])
-      } else {
-        original(...args)
+    if (/create/.test(key)) {
+      nodeOps[key] = (...args: any[]) => {
+        let res: any
+        if (currentOps) {
+          return () => res || (res = original(...args))
+        } else {
+          return original(...args)
+        }
+      }
+    } else {
+      nodeOps[key] = (...args: any[]) => {
+        if (currentOps) {
+          currentOps.push([original, ...args.map(evaluate)])
+        } else {
+          original(...args)
+        }
       }
     }
-  }
-})
+  })
+}
+
+patchOps(nodeOps)
+patchOps(testNodeOps)