|
1 | | -import { describe, expect, it } from 'vitest' |
| 1 | +import { describe, expect, it, vi } from 'vitest' |
2 | 2 | import { mount } from '@vue/test-utils' |
3 | | -import { h } from 'vue' |
| 3 | +import { h, nextTick, ref } from 'vue' |
| 4 | +import type { RangeData } from '../src/type' |
| 5 | +import { PromiseTimeout } from '../src/utils' |
4 | 6 | import { Range } from '../src/index' |
5 | 7 |
|
6 | 8 | describe('range', () => { |
@@ -94,4 +96,91 @@ describe('range', () => { |
94 | 96 | }) |
95 | 97 | expect(wrapper.find('.m-range-mark-item').exists()).toBe(true) |
96 | 98 | }) |
| 99 | + |
| 100 | + it('should work with drag', async () => { |
| 101 | + const model = ref(0) |
| 102 | + const wrapper = mount(Range, { |
| 103 | + props: { modelValue: model, style: 'width:200px' }, |
| 104 | + attachTo: document.getElementById('app') || document.body, |
| 105 | + }) |
| 106 | + const track = wrapper.find('.m-range-track') |
| 107 | + // @ts-expect-error no mock of getBoundingClientRect |
| 108 | + vi.spyOn(track.element, 'getBoundingClientRect', 'get').mockImplementation(() => () => ({ left: 0, top: 0, width: 200, height: 200 })) |
| 109 | + const thumb = wrapper.findComponent({ name: 'RangeThumb' }) |
| 110 | + thumb.trigger('pointerdown', { clientX: 0 }) |
| 111 | + |
| 112 | + const mousemove = new MouseEvent('pointermove', { |
| 113 | + screenX: 100, |
| 114 | + screenY: 0, |
| 115 | + clientX: 100, |
| 116 | + clientY: 0, |
| 117 | + }) |
| 118 | + window.dispatchEvent(mousemove) |
| 119 | + await nextTick() |
| 120 | + expect(model.value).toBe(50) |
| 121 | + |
| 122 | + const mouseup = new MouseEvent('pointerup', { |
| 123 | + screenX: 100, |
| 124 | + screenY: 0, |
| 125 | + clientX: 100, |
| 126 | + clientY: 0, |
| 127 | + }) |
| 128 | + window.dispatchEvent(mouseup) |
| 129 | + await nextTick() |
| 130 | + expect(model.value).toBe(50) |
| 131 | + }) |
| 132 | + |
| 133 | + it('should work with outside model value change', async () => { |
| 134 | + const model = ref<RangeData<number>[]>(Array.from({ length: 10 }, (_, i) => ({ |
| 135 | + value: i * 10, |
| 136 | + data: i, |
| 137 | + }))) |
| 138 | + mount(Range, { |
| 139 | + props: { |
| 140 | + modelValue: model, |
| 141 | + }, |
| 142 | + }) |
| 143 | + model.value.splice(5, 1) |
| 144 | + await PromiseTimeout(10) |
| 145 | + expect(model.value).toMatchInlineSnapshot(` |
| 146 | + [ |
| 147 | + { |
| 148 | + "data": 0, |
| 149 | + "value": 0, |
| 150 | + }, |
| 151 | + { |
| 152 | + "data": 1, |
| 153 | + "value": 10, |
| 154 | + }, |
| 155 | + { |
| 156 | + "data": 2, |
| 157 | + "value": 20, |
| 158 | + }, |
| 159 | + { |
| 160 | + "data": 3, |
| 161 | + "value": 30, |
| 162 | + }, |
| 163 | + { |
| 164 | + "data": 4, |
| 165 | + "value": 40, |
| 166 | + }, |
| 167 | + { |
| 168 | + "data": 6, |
| 169 | + "value": 60, |
| 170 | + }, |
| 171 | + { |
| 172 | + "data": 7, |
| 173 | + "value": 70, |
| 174 | + }, |
| 175 | + { |
| 176 | + "data": 8, |
| 177 | + "value": 80, |
| 178 | + }, |
| 179 | + { |
| 180 | + "data": 9, |
| 181 | + "value": 90, |
| 182 | + }, |
| 183 | + ] |
| 184 | + `) |
| 185 | + }) |
97 | 186 | }) |
0 commit comments