) =>
page().waitForFunction(
(sel, expectedText, expectedClasses) => {
- const el = document.querySelector(sel)!
+ const el = document.querySelector(sel)
const hasClasses =
expectedClasses.length === 0
- ? el.classList.length === 0
- : expectedClasses.every(c => el.classList.contains(c))
+ ? el?.classList.length === 0
+ : expectedClasses.every(c => el?.classList.contains(c))
const hasText = el?.textContent?.includes(expectedText)
return !!el && hasClasses && hasText
},
expect(await classList(containerSelector)).contains('v-enter-active')
expect(await text(containerSelector)).toContain('vIf')
await transitionFinish()
- await nextFrame()
// leave
+ await nextFrame()
expect(
(await transitionStart(btnSelector, containerSelector)).classNames,
).toStrictEqual(['v-leave-from', 'v-leave-active'])
])
await transitionFinish()
- await nextFrame()
expect(await count(containerSelector)).toBe(0)
// enter
await transitionFinish()
await nextFrame()
expect(await isVisible(containerSelector)).toBe(true)
+
+ const calls = await page().evaluate(() => {
+ return (window as any).calls
+ })
+
+ expect(calls).toStrictEqual([
+ 'beforeAppear',
+ 'onEnter',
+ 'afterAppear',
+ 'beforeLeave',
+ 'onLeave',
+ 'afterLeave',
+ 'beforeEnter',
+ 'onEnter',
+ 'afterEnter',
+ ])
},
E2E_TIMEOUT,
)
E2E_TIMEOUT,
)
- test.todo('transition hooks', async () => {}, E2E_TIMEOUT)
-
+ // tests for using vdom component in createVaporApp + vaporInteropPlugin
describe('interop', () => {
- test.todo('interop: render vdom component', async () => {}, E2E_TIMEOUT)
+ test(
+ 'render vdom component',
+ async () => {
+ const btnSelector = '.vdom > button'
+ const containerSelector = '.vdom > div'
+
+ expect(await html(containerSelector)).toBe(`<div>vdom comp</div>`)
+
+ // comp leave
+ expect(
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
+ ).toBe(`<div class="v-leave-from v-leave-active">vdom comp</div>`)
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="v-leave-active v-leave-to">vdom comp</div>`,
+ )
+
+ await transitionFinish()
+ expect(await html(containerSelector)).toBe(``)
+
+ // comp enter
+ expect(
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
+ ).toBe(`<div class="v-enter-from v-enter-active">vdom comp</div>`)
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="v-enter-active v-enter-to">vdom comp</div>`,
+ )
+
+ await transitionFinish()
+ expect(await html(containerSelector)).toBe(
+ `<div class="">vdom comp</div>`,
+ )
+ },
+ E2E_TIMEOUT,
+ )
- test.todo(
- 'interop: switch between vdom/vapor component',
- async () => {},
+ test(
+ 'switch between vdom/vapor component (out-in mode)',
+ async () => {
+ const btnSelector = '.vdom-vapor-out-in > button'
+ const containerSelector = '.vdom-vapor-out-in > div'
+ const childSelector = `${containerSelector} > div`
+
+ expect(await html(containerSelector)).toBe(`<div>vdom comp</div>`)
+
+ // switch to vapor comp
+ // vdom comp leave
+ expect(
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
+ ).toBe(`<div class="fade-leave-from fade-leave-active">vdom comp</div>`)
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="fade-leave-active fade-leave-to">vdom comp</div>`,
+ )
+
+ // vapor comp enter
+ await waitForElement(childSelector, 'vapor compA', [
+ 'fade-enter-from',
+ 'fade-enter-active',
+ ])
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="fade-enter-active fade-enter-to">vapor compA</div>`,
+ )
+
+ await transitionFinish()
+ expect(await html(containerSelector)).toBe(
+ `<div class="">vapor compA</div>`,
+ )
+
+ // switch to vdom comp
+ // vapor comp leave
+ expect(
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
+ ).toBe(
+ `<div class="fade-leave-from fade-leave-active">vapor compA</div>`,
+ )
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="fade-leave-active fade-leave-to">vapor compA</div>`,
+ )
+
+ // vdom comp enter
+ await waitForElement(childSelector, 'vdom comp', [
+ 'fade-enter-from',
+ 'fade-enter-active',
+ ])
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="fade-enter-active fade-enter-to">vdom comp</div>`,
+ )
+
+ await transitionFinish()
+ expect(await html(containerSelector)).toBe(
+ `<div class="">vdom comp</div>`,
+ )
+ },
+ E2E_TIMEOUT,
+ )
+
+ test(
+ 'switch between vdom/vapor component (in-out mode)',
+ async () => {
+ const btnSelector = '.vdom-vapor-in-out > button'
+ const containerSelector = '.vdom-vapor-in-out > div'
+ const childSelector = `${containerSelector} > div`
+
+ expect(await html(containerSelector)).toBe(`<div>vapor compA</div>`)
+
+ // switch to vdom comp
+ // vdom comp enter
+ expect(
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
+ ).toBe(
+ `<div>vapor compA</div><div class="fade-enter-from fade-enter-active">vdom comp</div>`,
+ )
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div>vapor compA</div><div class="fade-enter-active fade-enter-to">vdom comp</div>`,
+ )
+
+ // vapor comp leave
+ await waitForElement(childSelector, 'vapor compA', [
+ 'fade-leave-from',
+ 'fade-leave-active',
+ ])
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="fade-leave-active fade-leave-to">vapor compA</div><div class="">vdom comp</div>`,
+ )
+
+ await transitionFinish()
+ expect(await html(containerSelector)).toBe(
+ `<div class="">vdom comp</div>`,
+ )
+
+ // switch to vapor comp
+ // vapor comp enter
+ expect(
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
+ ).toBe(
+ `<div class="">vdom comp</div><div class="fade-enter-from fade-enter-active">vapor compA</div>`,
+ )
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="">vdom comp</div><div class="fade-enter-active fade-enter-to">vapor compA</div>`,
+ )
+
+ // vdom comp leave
+ await waitForElement(childSelector, 'vdom comp', [
+ 'fade-leave-from',
+ 'fade-leave-active',
+ ])
+
+ await nextFrame()
+ expect(await html(containerSelector)).toBe(
+ `<div class="fade-leave-active fade-leave-to">vdom comp</div><div class="">vapor compA</div>`,
+ )
+
+ await transitionFinish()
+ expect(await html(containerSelector)).toBe(
+ `<div class="">vapor compA</div>`,
+ )
+ },
E2E_TIMEOUT,
)
})
const toggle = ref(true)
const count = ref(0)
+const calls = []
+window.calls = calls
+
import VaporCompA from './components/VaporCompA.vue'
import VaporCompB from './components/VaporCompB.vue'
const activeComponent = shallowRef(VaporCompB)
activeComponent.value =
activeComponent.value === VaporCompA ? VaporCompB : VaporCompA
}
+
+const toggleVdom = ref(true)
+import VDomComp from './components/VdomComp.vue'
+
+const interopComponent = shallowRef(VDomComp)
+function toggleInteropComponent() {
+ interopComponent.value =
+ interopComponent.value === VaporCompA ? VDomComp : VaporCompA
+}
</script>
<template>
</div>
<div class="vif">
<button @click="toggle = !toggle">Toggle</button>
- <Transition appear>
+ <Transition appear @beforeEnter="() => calls.push('beforeEnter')" @enter="() => calls.push('onEnter')"
+ @afterEnter="() => calls.push('afterEnter')" @beforeLeave="() => calls.push('beforeLeave')"
+ @leave="() => calls.push('onLeave')" @afterLeave="() => calls.push('afterLeave')"
+ @beforeAppear="() => calls.push('beforeAppear')" @appear="() => calls.push('onAppear')"
+ @afterAppear="() => calls.push('afterAppear')">
<h1 v-if="toggle">vIf</h1>
</Transition>
</div>
</Transition>
</div>
</div>
+ <div class="vdom">
+ <button @click="toggleVdom = !toggleVdom">toggle vdom component</button>
+ <div>
+ <Transition>
+ <VDomComp v-if="toggleVdom" />
+ </Transition>
+ </div>
+ </div>
+ <div class="vdom-vapor-out-in">
+ <button @click="toggleInteropComponent">switch between vdom/vapor component out-in mode</button>
+ <div>
+ <Transition name="fade" mode="out-in">
+ <component :is="interopComponent"></component>
+ </Transition>
+ </div>
+ </div>
+ <div class="vdom-vapor-in-out">
+ <button @click="toggleVdom = !toggleVdom">switch between vdom/vapor component in-out mode</button>
+ <div>
+ <Transition name="fade" mode="in-out">
+ <VaporCompA v-if="toggleVdom" />
+ <VDomComp v-else></VDomComp>
+ </Transition>
+ </div>
+ </div>
</template>
<style>
.keyed {