Skip to content

Commit 2f2b0b6

Browse files
committed
test: add tests
1 parent 84b99c5 commit 2f2b0b6

File tree

3 files changed

+96
-5
lines changed

3 files changed

+96
-5
lines changed

src/Range.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ const emits = defineEmits<{
4242
}>()
4343
4444
defineSlots<{
45-
top: (props: { data: U }) => any
46-
bottom: (props: { data: U }) => any
45+
top?: (props: { data: U }) => any
46+
bottom?: (props: { data: U }) => any
4747
}>()
4848
4949
const modelType = computed<'number' | 'data' | 'numberList' | 'dataList'>(() => {
@@ -131,7 +131,7 @@ watch(model, (val) => {
131131
else if (val.length < length) {
132132
for (let i = length - 1; i >= val.length; i--) {
133133
const index = indexMapReversed.value[i]
134-
index > -1 && delete indexMap.value[index]
134+
delete indexMap.value[index]
135135
}
136136
sort(val)
137137
}

src/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ export function value2percentage(value: number, min: number, max: number, step:
2828
const percentageStep = step / (max - min)
2929
return Math.round(percentage / percentageStep) * percentageStep
3030
}
31+
32+
export const PromiseTimeout = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))

test/range.test.ts

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { describe, expect, it } from 'vitest'
1+
import { describe, expect, it, vi } from 'vitest'
22
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'
46
import { Range } from '../src/index'
57

68
describe('range', () => {
@@ -94,4 +96,91 @@ describe('range', () => {
9496
})
9597
expect(wrapper.find('.m-range-mark-item').exists()).toBe(true)
9698
})
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+
})
97186
})

0 commit comments

Comments
 (0)