/** * Space 间距组件:容器方向 / 间距 gap / 对齐 / 换行 / 分隔符 / 空子节点。 * 只断言渲染出的 class、内联 gap 与包裹结构,不涉及真实布局尺寸。 */ import { describe, it, expect } from 'vitest' import { mount } from '@vue/test-utils' import Space from '@/components/ui/space/space.vue' /** 便捷挂载:默认塞两个子元素 */ function mountSpace(props = {}, slots = {}) { return mount(Space, { props, slots: { default: 'AB', ...slots }, }) } describe('Space 组件', () => { it('默认水平:容器带方向类,每个子元素包一层 .space-item', () => { const wrapper = mountSpace() expect(wrapper.classes()).toContain('space') expect(wrapper.classes()).toContain('space-horizontal') expect(wrapper.findAll('.space-item')).toHaveLength(2) expect(wrapper.attributes('data-slot')).toBe('space') }) it('水平默认对齐 center;显式 align 覆盖', () => { expect(mountSpace().classes()).toContain('space-align-center') expect(mountSpace({ align: 'start' }).classes()).toContain('space-align-start') expect(mountSpace({ align: 'baseline' }).classes()).toContain('space-align-baseline') }) it('size 预设映射为对应 px 的 gap', () => { const style = mountSpace({ size: 'middle' }).attributes('style') expect(style).toContain('column-gap: 16px') expect(style).toContain('row-gap: 16px') }) it('size 数字按 px 处理', () => { const style = mountSpace({ size: 20 }).attributes('style') expect(style).toContain('column-gap: 20px') expect(style).toContain('row-gap: 20px') }) it('size 数组 [水平, 垂直] 分别设 column-gap / row-gap', () => { const style = mountSpace({ size: [12, 24] }).attributes('style') expect(style).toContain('column-gap: 12px') expect(style).toContain('row-gap: 24px') }) it('vertical 简写切换为纵向且不设默认对齐', () => { const wrapper = mountSpace({ vertical: true }) expect(wrapper.classes()).toContain('space-vertical') expect(wrapper.classes()).not.toContain('space-align-center') }) it('orientation 优先于 vertical', () => { const wrapper = mountSpace({ orientation: 'horizontal', vertical: true }) expect(wrapper.classes()).toContain('space-horizontal') expect(wrapper.classes()).not.toContain('space-vertical') }) it('wrap 仅水平方向生效', () => { expect(mountSpace({ wrap: true }).classes()).toContain('space-wrap') expect(mountSpace({ wrap: true, vertical: true }).classes()).not.toContain('space-wrap') }) it('separator 插槽:分隔符数量 = 子元素数 - 1,末尾不加', () => { const wrapper = mountSpace( {}, { default: 'ABC', separator: '|' }, ) expect(wrapper.findAll('.space-item')).toHaveLength(3) expect(wrapper.findAll('.space-separator')).toHaveLength(2) expect(wrapper.text()).toContain('|') }) it('无 separator 插槽时不渲染分隔符', () => { expect(mountSpace().findAll('.space-separator')).toHaveLength(0) }) it('无有效子元素时不渲染容器', () => { const wrapper = mount(Space, { slots: { default: '' } }) expect(wrapper.find('.space').exists()).toBe(false) }) it('过滤子元素之间的空白文本节点', () => { const wrapper = mount(Space, { slots: { default: 'A\n B\n' }, }) expect(wrapper.findAll('.space-item')).toHaveLength(2) }) })