import { nextTick } from '@vue/runtime-core'
import { mount } from '@vue/test-utils'
import Scrollbar from '../src/components/scrollbar'
import { ScrollbarDirKey } from '../src/defaults'
describe('virtual scrollbar', () => {
async function testInlineStyle(layout = 'vertical') {
const wrapper = mount({
template: ``,
components: {
Scrollbar,
},
})
await nextTick()
const scrollbar = wrapper.findComponent(Scrollbar)
const styles = getComputedStyle(scrollbar.vm.$el)
Object.entries({
display: 'block',
position: 'absolute',
width: 'vertical' !== layout ? '100%' : '6px',
height: 'vertical' !== layout ? '6px' : 'auto',
[ScrollbarDirKey[layout]]: '2px',
right: '2px',
bottom: '2px',
'border-radius': '4px',
}).forEach(([key, value]) =>
expect(`${key}: ${styles.getPropertyValue(key)}`).toBe(`${key}: ${value}`)
)
}
it('vertical inline style', async () => {
testInlineStyle('vertical')
})
it('horizontal inline style', () => {
testInlineStyle('horizontal')
})
it('click track', async () => {
const wrapper = mount({
template: `
`,
components: {
Scrollbar,
},
})
await nextTick()
const scrollbar = wrapper.findComponent(Scrollbar)
const el = scrollbar.vm.$el
// layout: vertical; width: auto; height: 100px; scrollHeight: 400px;
// thumb ratio: (100 / 400) * 100 -> 25 // (clientHeight / scrollHeight) * 100
// thumbSize: 33 // scrollbar.ts computed thumbSize
// thumb translateY: (0 / (400 - 100)) * (100 - 25) -> 0 // (scrollTop / (scrollHeight - clientHeight)) * (clientHeight - thumbSize)
const initializeStyle =
'height: 33px; transform: translateY(0px); webkit-transform: translateY(0px); width: 100%;'
expect(wrapper.find('.el-scrollbar__thumb').attributes('style')).toContain(
initializeStyle
)
const e = document.createEvent('MouseEvents')
const clientY = 20
e.initMouseEvent(
'mousedown',
false,
false,
null,
0,
0,
0,
0,
clientY,
false,
false,
false,
false,
0,
null
)
el.dispatchEvent(e)
await nextTick()
expect(
wrapper.find('.el-scrollbar__thumb').attributes('style')
).not.toContain(initializeStyle)
})
})