99 lines
2.7 KiB
TypeScript
99 lines
2.7 KiB
TypeScript
|
|
import { describe, expect, it } from 'vitest'
|
||
|
|
|
||
|
|
import type { DisplaySeries, DisplayTrack } from './types'
|
||
|
|
import { buildYAxisSeriesGroups, MAX_MULTI_Y_AXIS_COUNT } from './layout'
|
||
|
|
|
||
|
|
function series(id: string, minimum: number, maximum: number): DisplaySeries {
|
||
|
|
return {
|
||
|
|
id,
|
||
|
|
name: id,
|
||
|
|
color: '#1677ff',
|
||
|
|
points: [
|
||
|
|
{ x: 0, y: minimum },
|
||
|
|
{ x: 1, y: maximum },
|
||
|
|
],
|
||
|
|
xDomain: [0, 1],
|
||
|
|
yDomain: [minimum, maximum],
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function track(seriesList: DisplaySeries[]): DisplayTrack {
|
||
|
|
return {
|
||
|
|
id: 'track',
|
||
|
|
series: seriesList,
|
||
|
|
xDomain: [0, 1],
|
||
|
|
yDomain: [0, 50],
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
describe('multi-value Y-axis grouping', () => {
|
||
|
|
it('keeps every overlaid series on one axis in single-axis mode', () => {
|
||
|
|
const groups = buildYAxisSeriesGroups(
|
||
|
|
track([series('a', 0, 1), series('b', 10, 20)]),
|
||
|
|
'single-axis',
|
||
|
|
)
|
||
|
|
|
||
|
|
expect(groups).toHaveLength(1)
|
||
|
|
expect(groups[0]?.seriesList.map((item) => item.id)).toEqual(['a', 'b'])
|
||
|
|
expect(groups[0]?.domain).toEqual([0, 50])
|
||
|
|
})
|
||
|
|
|
||
|
|
it('uses the reference left-right axis order and merges overflow into axis four', () => {
|
||
|
|
const groups = buildYAxisSeriesGroups(
|
||
|
|
track([
|
||
|
|
series('a', 0, 1),
|
||
|
|
series('b', 10, 11),
|
||
|
|
series('c', 20, 21),
|
||
|
|
series('d', 30, 31),
|
||
|
|
series('e', 40, 50),
|
||
|
|
]),
|
||
|
|
'multi-axis',
|
||
|
|
)
|
||
|
|
|
||
|
|
expect(groups).toHaveLength(MAX_MULTI_Y_AXIS_COUNT)
|
||
|
|
expect(groups.map((group) => group.side)).toEqual(['left', 'left', 'right', 'right'])
|
||
|
|
expect(groups.map((group) => group.seriesList.map((item) => item.id))).toEqual([
|
||
|
|
['a'],
|
||
|
|
['b'],
|
||
|
|
['c'],
|
||
|
|
['d', 'e'],
|
||
|
|
])
|
||
|
|
expect(groups[3]?.domain[0]).toBeLessThanOrEqual(30)
|
||
|
|
expect(groups[3]?.domain[1]).toBeGreaterThanOrEqual(50)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('derives merged multi-axis domains from precomputed series domains', () => {
|
||
|
|
const first = series('a', -20, -10)
|
||
|
|
const second = series('b', 40, 60)
|
||
|
|
first.points = [{ x: 0, y: -15 }]
|
||
|
|
second.points = [{ x: 0, y: 50 }]
|
||
|
|
|
||
|
|
const groups = buildYAxisSeriesGroups(
|
||
|
|
track([
|
||
|
|
series('left', 0, 1),
|
||
|
|
series('middle', 10, 11),
|
||
|
|
series('right', 20, 21),
|
||
|
|
first,
|
||
|
|
second,
|
||
|
|
]),
|
||
|
|
'multi-axis',
|
||
|
|
)
|
||
|
|
|
||
|
|
expect(groups[3]?.domain[0]).toBeLessThanOrEqual(-20)
|
||
|
|
expect(groups[3]?.domain[1]).toBeGreaterThanOrEqual(60)
|
||
|
|
})
|
||
|
|
|
||
|
|
it('places two and three axes on the expected sides', () => {
|
||
|
|
const source = [series('a', 0, 1), series('b', 10, 11), series('c', 20, 21)]
|
||
|
|
|
||
|
|
expect(
|
||
|
|
buildYAxisSeriesGroups(track(source.slice(0, 2)), 'multi-axis').map((g) => g.side),
|
||
|
|
).toEqual(['left', 'right'])
|
||
|
|
expect(buildYAxisSeriesGroups(track(source), 'multi-axis').map((g) => g.side)).toEqual([
|
||
|
|
'left',
|
||
|
|
'right',
|
||
|
|
'right',
|
||
|
|
])
|
||
|
|
})
|
||
|
|
})
|