123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- import { nextTick } from 'vue'
- import { mount } from '@vue/test-utils'
- import { describe, expect, test } from 'vitest'
- import makeScroll from '@element-plus/test-utils/make-scroll'
- import defineGetter from '@element-plus/test-utils/define-getter'
- import Scrollbar from '../src/scrollbar.vue'
- describe('ScrollBar', () => {
- test('vertical', async () => {
- const outerHeight = 204
- const innerHeight = 500
- const wrapper = mount(() => (
- <Scrollbar style={`height: ${outerHeight}px;`}>
- <div style={`height: ${innerHeight}px;`}></div>
- </Scrollbar>
- ))
- const scrollDom = wrapper.find('.el-scrollbar__wrap').element
- const offsetHeightRestore = defineGetter(
- scrollDom,
- 'offsetHeight',
- outerHeight
- )
- const scrollHeightRestore = defineGetter(
- scrollDom,
- 'scrollHeight',
- innerHeight
- )
- await makeScroll(scrollDom, 'scrollTop', 100)
- expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
- 'height: 80px; transform: translateY(50%);'
- )
- await makeScroll(scrollDom, 'scrollTop', 300)
- expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
- 'height: 80px; transform: translateY(150%);'
- )
- offsetHeightRestore()
- scrollHeightRestore()
- })
- test('horizontal', async () => {
- const outerWidth = 204
- const innerWidth = 500
- const wrapper = mount(() => (
- <Scrollbar style={`height: 100px; width: ${outerWidth}px;`}>
- <div style={`height: 100px; width: ${innerWidth}px;`}></div>
- </Scrollbar>
- ))
- const scrollDom = wrapper.find('.el-scrollbar__wrap').element
- const offsetWidthRestore = defineGetter(
- scrollDom,
- 'offsetWidth',
- outerWidth
- )
- const scrollWidthRestore = defineGetter(
- scrollDom,
- 'scrollWidth',
- innerWidth
- )
- await makeScroll(scrollDom, 'scrollLeft', 100)
- expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
- 'width: 80px; transform: translateX(50%);'
- )
- await makeScroll(scrollDom, 'scrollLeft', 300)
- expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
- 'width: 80px; transform: translateX(150%);'
- )
- offsetWidthRestore()
- scrollWidthRestore()
- })
- test('both vertical and horizontal', async () => {
- const outerHeight = 204
- const innerHeight = 500
- const outerWidth = 204
- const innerWidth = 500
- const wrapper = mount(() => (
- <Scrollbar style={`height: ${outerHeight}px; width: ${outerWidth}px;`}>
- <div style={`height: ${innerHeight}px; width: ${innerWidth}px;`}></div>
- </Scrollbar>
- ))
- const scrollDom = wrapper.find('.el-scrollbar__wrap').element
- const offsetHeightRestore = defineGetter(
- scrollDom,
- 'offsetHeight',
- outerHeight
- )
- const scrollHeightRestore = defineGetter(
- scrollDom,
- 'scrollHeight',
- innerHeight
- )
- const offsetWidthRestore = defineGetter(
- scrollDom,
- 'offsetWidth',
- outerWidth
- )
- const scrollWidthRestore = defineGetter(
- scrollDom,
- 'scrollWidth',
- innerWidth
- )
- await makeScroll(scrollDom, 'scrollTop', 100)
- await makeScroll(scrollDom, 'scrollLeft', 100)
- expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
- 'height: 80px; transform: translateY(50%);'
- )
- expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
- 'width: 80px; transform: translateX(50%);'
- )
- await makeScroll(scrollDom, 'scrollTop', 300)
- await makeScroll(scrollDom, 'scrollLeft', 300)
- expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
- 'height: 80px; transform: translateY(150%);'
- )
- expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
- 'width: 80px; transform: translateX(150%);'
- )
- offsetHeightRestore()
- scrollHeightRestore()
- offsetWidthRestore()
- scrollWidthRestore()
- })
- test('should render height props', async () => {
- const outerHeight = 204
- const innerHeight = 500
- const wrapper = mount(() => (
- <Scrollbar height={`${outerHeight}px`}>
- <div style={`height: ${innerHeight}px;`}></div>
- </Scrollbar>
- ))
- expect(wrapper.find('.el-scrollbar__wrap').attributes('style')).toContain(
- 'height: 204px;'
- )
- })
- test('should render max-height props', async () => {
- const outerHeight = 204
- const innerHeight = 100
- const wrapper = mount(() => (
- <Scrollbar max-height={`${outerHeight}px`}>
- <div style={`height: ${innerHeight}px;`}></div>
- </Scrollbar>
- ))
- expect(wrapper.find('.el-scrollbar__wrap').attributes('style')).toContain(
- 'max-height: 204px;'
- )
- })
- test('should render always props', async () => {
- const outerHeight = 204
- const innerHeight = 500
- const wrapper = mount(() => (
- <Scrollbar height={`${outerHeight}px`} always>
- <div style={`height: ${innerHeight}px;`}></div>
- </Scrollbar>
- ))
- expect(wrapper.find('.el-scrollbar__bar').attributes('style')).toBeFalsy()
- })
- test('set scrollTop & scrollLeft', async () => {
- const outerHeight = 204
- const innerHeight = 500
- const outerWidth = 204
- const innerWidth = 500
- const wrapper = mount({
- setup() {
- return () => (
- <Scrollbar
- ref="scrollbar"
- style={`height: ${outerHeight}px; width: ${outerWidth}px;`}
- always
- >
- <div
- style={`height: ${innerHeight}px; width: ${innerWidth}px;`}
- ></div>
- </Scrollbar>
- )
- },
- })
- const scrollbar = wrapper.findComponent({ ref: 'scrollbar' }).vm
- const scrollDom = wrapper.find('.el-scrollbar__wrap').element
- const offsetHeightRestore = defineGetter(
- scrollDom,
- 'offsetHeight',
- outerHeight
- )
- const scrollHeightRestore = defineGetter(
- scrollDom,
- 'scrollHeight',
- innerHeight
- )
- const offsetWidthRestore = defineGetter(
- scrollDom,
- 'offsetWidth',
- outerWidth
- )
- const scrollWidthRestore = defineGetter(
- scrollDom,
- 'scrollWidth',
- innerWidth
- )
- scrollbar.setScrollTop(100)
- await nextTick()
- scrollbar.setScrollLeft(100)
- await nextTick()
- expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
- 'height: 80px; transform: translateY(0%);'
- )
- expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
- 'width: 80px; transform: translateX(0%);'
- )
- offsetHeightRestore()
- scrollHeightRestore()
- offsetWidthRestore()
- scrollWidthRestore()
- })
- test('should render min-size props', async () => {
- const outerHeight = 204
- const innerHeight = 10000
- const wrapper = mount(() => (
- <Scrollbar style={`height: ${outerHeight}px;`}>
- <div style={`height: ${innerHeight}px;`}></div>
- </Scrollbar>
- ))
- const scrollDom = wrapper.find('.el-scrollbar__wrap').element
- const offsetHeightRestore = defineGetter(
- scrollDom,
- 'offsetHeight',
- outerHeight
- )
- const scrollHeightRestore = defineGetter(
- scrollDom,
- 'scrollHeight',
- innerHeight
- )
- await makeScroll(scrollDom, 'scrollTop', 0)
- expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
- 'height: 20px; transform: translateY(0%);'
- )
- offsetHeightRestore()
- scrollHeightRestore()
- })
- test('should render tag props', async () => {
- const wrapper = mount(() => (
- <Scrollbar tag="ul">
- {[1, 2, 3].map((item) => (
- <li>{item}</li>
- ))}
- </Scrollbar>
- ))
- expect(
- wrapper.find('.el-scrollbar__view').element instanceof HTMLUListElement
- ).toBeTruthy()
- })
- test('should render wrap-style props', async () => {
- const wrapStyle = 'background: red;'
- const wrapper = mount(() => <Scrollbar wrap-style={wrapStyle} />)
- expect(wrapper.find('.el-scrollbar__wrap').attributes('style')).toContain(
- wrapStyle
- )
- })
- test('should render wrap-class props', async () => {
- const wrapClass = 'test-wrap-class'
- const wrapper = mount(() => <Scrollbar wrap-class={wrapClass} />)
- expect(wrapper.find('.el-scrollbar__wrap').classes()).toContain(wrapClass)
- })
- test('should render view-style props', async () => {
- const viewStyle = 'display: inline-block;'
- const wrapper = mount(() => <Scrollbar view-style={viewStyle} />)
- expect(wrapper.find('.el-scrollbar__view').attributes('style')).toContain(
- viewStyle
- )
- })
- test('should render view-class props', async () => {
- const viewClass = 'test-view-class'
- const wrapper = mount(() => <Scrollbar view-class={viewClass} />)
- expect(wrapper.find('.el-scrollbar__view').classes()).toContain(viewClass)
- })
- })
|