UNPKG

element-plus

Version:

A Component Library for Vue3.0

259 lines (214 loc) 6.77 kB
import { nextTick } from 'vue' import makeMount from '@element-plus/test-utils/make-mount' import makeScroll from '@element-plus/test-utils/make-scroll' import setupMock from '../setup-mock' import { CENTERED_ALIGNMENT, START_ALIGNMENT, END_ALIGNMENT, SMART_ALIGNMENT, } from '../src/defaults' import { FixedSizeGrid } from '..' import type { GridExposes } from '../src/types' type GridRef = GridExposes const onItemRendered = jest.fn() const WINDOW_KLS = 'window' const ITEM_KLS = 'item' const ITEM_SELECTOR = `.${ITEM_KLS}` const mount = makeMount( { template: `<fixed-size-grid v-bind="$attrs" ref="gridRef"> <template #default="{columnIndex, style, rowIndex}"> <div class="${ITEM_KLS}" :style="style">item {{ rowIndex }} {{ columnIndex }}</div> </template> </fixed-size-grid>`, components: { FixedSizeGrid, }, }, { props: { className: WINDOW_KLS, columnWidth: 50, height: 100, rowHeight: 25, totalColumn: 100, totalRow: 100, width: 100, onItemRendered, }, }, ) let cleanup: () => void describe('<fixed-size-grid />', () => { beforeAll(() => { cleanup = setupMock() }) afterAll(() => { cleanup() }) beforeEach(() => { onItemRendered.mockClear() }) describe('render testing', () => { it('should render correctly', async () => { const wrapper = mount() await nextTick() // 8 visible grid. 2 x 4 // total rows total columns // | | // 16 cached grid (2 + 2) x (4 + 2) - (2 x 4) expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) const gridRef = wrapper.vm.$refs.gridRef as GridRef expect(gridRef.innerRef.style.height).toBe('2500px') expect(gridRef.innerRef.style.width).toBe('5000px') }) it('should render zero row zero column', async () => { const wrapper = mount({ props: { totalColumn: 0, totalRow: 0, }, }) await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(0) }) }) describe('scroll testing', () => { it('should scroll correctly', async () => { const wrapper = mount() await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) const gridRef = wrapper.vm.$refs.gridRef as GridRef makeScroll(gridRef.windowRef, 'scrollTop', 100) await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(21) makeScroll(gridRef.windowRef, 'scrollLeft', 100) await nextTick() // 5 (backward cache 1 + visible 2 + forward cache 2) // * 7 (backward cache 1 + visible 4 + forward cache 2) // 35 expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(35) }) it ('should not scroll at all', async () => { const wrapper = mount() await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) const gridRef = wrapper.vm.$refs.gridRef as GridRef makeScroll(gridRef.windowRef, 'scrollTop', 0) await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) makeScroll(gridRef.windowRef, 'scrollLeft', 0) await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) }) it('should run scrollTo correctly', async () => { const wrapper = mount() await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) const gridRef = wrapper.vm.$refs.gridRef as GridRef gridRef.scrollTo({ scrollLeft: 100, scrollTop: 0, }) await nextTick() // 4 (0 + 2 + 2) * 8 (2 + 4 + 2) grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(36) gridRef.scrollTo({ scrollLeft: 100, scrollTop: 100, }) await nextTick() // 6 (2 + 2 + 2) * 8 (2 + 4 + 2) grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(48) const prevFirstItem = wrapper.find(ITEM_SELECTOR) // should do nothing gridRef.scrollTo({ scrollLeft: 100, scrollTop: 100, }) await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(48) expect(wrapper.find(ITEM_SELECTOR)).toEqual(prevFirstItem) }) it('should scrollToItem with correct alignment', async () => { const wrapper = mount() await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) const gridRef = wrapper.vm.$refs.gridRef as GridRef // do nothing scroll gridRef.scrollToItem() await nextTick() expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(24) // auto alignment gridRef.scrollToItem(10) await nextTick() // 8 x 4 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(32) gridRef.scrollToItem(10, 10) await nextTick() // 8 x 6 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(48) gridRef.scrollToItem(5, 5, SMART_ALIGNMENT) await nextTick() // 8 x 7 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(56) gridRef.scrollToItem(6, 6, SMART_ALIGNMENT) await nextTick() // 8 x 6 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(48) gridRef.scrollToItem(6, 6, START_ALIGNMENT) await nextTick() // 8 x 6 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(48) gridRef.scrollToItem(5, 5, CENTERED_ALIGNMENT) await nextTick() // 9 x 7 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(63) gridRef.scrollToItem(6, 6, CENTERED_ALIGNMENT) await nextTick() // 9 x 7 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(63) gridRef.scrollToItem(4, 4, END_ALIGNMENT) await nextTick() // 7 x 6 grid expect(wrapper.findAll(ITEM_SELECTOR)).toHaveLength(42) }) }) describe('error handling', () => { it('should throw when column-width is not number', () => { const errorHandler = jest.fn() mount({ props: { columnWidth: '1', }, global: { config: { errorHandler, warnHandler() { // suppress warning }, }, }, }) expect(errorHandler).toHaveBeenCalled() }) it('should throw when row-height is not number', () => { const errorHandler = jest.fn() mount({ props: { rowHeight: '1', }, global: { config: { errorHandler, warnHandler() { // suppress warning }, }, }, }) expect(errorHandler).toHaveBeenCalled() }) }) })