feat(视口): 支持恢复受控缩放范围
All checks were successful
Package component / package (push) Successful in 4m38s

This commit is contained in:
李启源
2026-08-18 09:08:36 +08:00
parent 7a6a7e5c26
commit 5c71c28429
8 changed files with 226 additions and 20 deletions

View File

@@ -119,6 +119,108 @@ describe('WaveformChart viewport reset', () => {
expect(wrapper.findAll('.waveform-chart__axis-endpoint--end')[0].text()).toBe('1000')
})
it('keeps a controlled shared viewport when the data reference changes', async () => {
const wrapper = await mountSizedChart(
{
kind: 'points',
points: [
{ x: 0, y: 0 },
{ x: 1, y: 1 },
],
},
{ displayMode: 'separated' },
)
const chart = wrapper.vm as unknown as {
setViewportDomain: (domain: [number, number], trackIndex?: number) => void
}
chart.setViewportDomain([0.25, 0.75])
await flushPromises()
const startBefore = Number(wrapper.get('.waveform-chart__axis-endpoint--start').text())
const endBefore = Number(wrapper.get('.waveform-chart__axis-endpoint--end').text())
expect(startBefore).toBeGreaterThan(0)
expect(endBefore).toBeLessThan(1000)
await wrapper.setProps({
data: {
kind: 'points',
points: [
{ x: 0, y: 10 },
{ x: 1, y: 11 },
],
},
})
await flushPromises()
expect(Number(wrapper.get('.waveform-chart__axis-endpoint--start').text())).toBeCloseTo(
startBefore,
10,
)
expect(Number(wrapper.get('.waveform-chart__axis-endpoint--end').text())).toBeCloseTo(
endBefore,
10,
)
})
it('keeps independently controlled track viewports when the data reference changes', async () => {
const wrapper = await mountSizedChart(gridSeries(2), {
displayMode: 'independent',
grid: { rowCount: 1, columnCount: 2 },
})
const chart = wrapper.vm as unknown as {
setViewportDomain: (domain: [number, number], trackIndex?: number) => void
}
chart.setViewportDomain([0.2, 0.8], 0)
chart.setViewportDomain([0.1, 0.9], 1)
await flushPromises()
const endpoints = () =>
wrapper.findAll('.waveform-chart__track').map((track) => ({
start: track.get('.waveform-chart__axis-endpoint--start').text(),
end: track.get('.waveform-chart__axis-endpoint--end').text(),
}))
const endpointsBefore = endpoints()
expect(Number(endpointsBefore[0].start)).toBeGreaterThan(0)
expect(Number(endpointsBefore[0].end)).toBeLessThan(1000)
expect(Number(endpointsBefore[1].start)).toBeGreaterThan(0)
expect(Number(endpointsBefore[1].end)).toBeLessThan(1000)
await wrapper.setProps({ data: gridSeries(2) })
await flushPromises()
const endpointsAfter = endpoints()
endpointsAfter.forEach((endpoint, index) => {
expect(Number(endpoint.start)).toBeCloseTo(Number(endpointsBefore[index].start), 10)
expect(Number(endpoint.end)).toBeCloseTo(Number(endpointsBefore[index].end), 10)
})
})
it('ignores invalid domains and applies viewport constraints', async () => {
const wrapper = await mountSizedChart(
{
kind: 'points',
points: [
{ x: 0, y: 0 },
{ x: 1, y: 1 },
],
},
{ displayMode: 'separated', minZoomSpan: 0.2 },
)
const chart = wrapper.vm as unknown as {
setViewportDomain: (domain: [number, number], trackIndex?: number) => void
}
chart.setViewportDomain([Number.NaN, 0.5])
await flushPromises()
expect(wrapper.get('.waveform-chart__axis-endpoint--start').text()).toBe('0')
expect(wrapper.get('.waveform-chart__axis-endpoint--end').text()).toBe('1000')
chart.setViewportDomain([0.49, 0.51])
await flushPromises()
const start = Number(wrapper.get('.waveform-chart__axis-endpoint--start').text())
const end = Number(wrapper.get('.waveform-chart__axis-endpoint--end').text())
expect(end - start).toBeGreaterThanOrEqual(200)
})
it('resets shared and independent explicit domains to their included nice bounds', async () => {
const shared = await mountSizedChart(
{