} 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({
})
})
- 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>`)
})
}
}
const root = nodeOps.createElement('div')
- render(h(App), root)
+ await render(h(App), root)
expect(serialize(root)).toBe(`<div><div>one</div>two</div>`)
}
}
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>`)
}
}
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>`)
}
}
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(
}
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>`
// 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
// kept-alive
activateComponentInstance(vnode, container, endNode)
} else {
- if (__JSDOM__) {
+ queueJob(() => {
mountComponentInstance(vnode, container, isSVG, endNode)
- } else {
- queueJob(() => {
- mountComponentInstance(vnode, container, isSVG, endNode)
- }, flushHooks)
- }
+ }, flushHooks)
}
}
}
}
return nextTick(() => {
- debugger
return vnode && vnode.flags & VNodeFlags.COMPONENT_STATEFUL
? (vnode.children as ComponentInstance).$proxy
: null
} from '../src'
describe('test renderer', () => {
- it('should work', () => {
+ it('should work', async () => {
class App extends Component {
render() {
return h(
}
}
const root = nodeOps.createElement('div')
- render(h(App), root)
+ await render(h(App), root)
expect(root.children.length).toBe(1)
const root = nodeOps.createElement('div')
resetOps()
- render(h(App), root)
+ await render(h(App), root)
const ops = dumpOps()
expect(ops.length).toBe(5)
})
})
- it('should be able to serialize nodes', () => {
+ it('should be able to serialize nodes', async () => {
class App extends Component {
render() {
return h(
}
}
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>`
)
}
function createElement(tag: string): TestElement {
+ if (nodeId === 5) {
+ throw new Error('foo')
+ }
const node: TestElement = {
id: nodeId++,
type: NodeTypes.ELEMENT,
nextTickQueue.push(() => {
resolve(fn ? fn() : undefined)
})
- pendingRejectors.push(reject)
+ pendingRejectors.push(err => {
+ if (fn) fn()
+ reject(err)
+ })
} else {
resolve(fn ? fn() : undefined)
}
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[]]
}
// 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)