45 lines
2.8 KiB
TypeScript
45 lines
2.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import type { LineSeriesOption } from 'echarts'
|
|
import type { DailyPoint } from './types'
|
|
import { skuTrendOption } from './skuTrendChart'
|
|
import { adminWorkbenchChartTheme } from '@/styles/adminWorkbenchChartTheme'
|
|
const point = (day: number, status: string, value: string | null = '2'): DailyPoint => ({ businessDate: `2026-10-${day}`, dataStatus: status, outboundQuantity: value, observedQuantity: value, quantityUnit: 'PCS', reasonCodes: [] })
|
|
describe.each([
|
|
['default', undefined],
|
|
['workbench', adminWorkbenchChartTheme],
|
|
] as const)('SKU ECharts data configuration with %s theme', (_, theme) => {
|
|
it('connects complete to partial days with dashed edges and resumes solid edges', () => {
|
|
const series = skuTrendOption([point(10, 'COMPLETE'), point(11, 'PARTIAL'), point(12, 'COMPLETE'), point(13, 'COMPLETE')], theme).series as LineSeriesOption[]
|
|
expect(series[1]?.lineStyle?.type).toBe('dashed')
|
|
expect(series[1]?.data).toEqual([2, 2, 2, null])
|
|
expect(series[2]?.lineStyle?.type).toBe('solid')
|
|
expect(series[2]?.data).toEqual([null, null, 2, 2])
|
|
})
|
|
it('does not join across unknown or omitted dates and preserves zero', () => {
|
|
const series = skuTrendOption([point(10, 'COMPLETE', '0'), point(11, 'UNKNOWN', null), point(12, 'COMPLETE'), point(14, 'COMPLETE')], theme).series as LineSeriesOption[]
|
|
expect(series).toHaveLength(1)
|
|
expect(series[0]?.data?.[0]).toMatchObject({ value: 0 })
|
|
expect(series[0]?.data?.[1]).toMatchObject({ value: null })
|
|
expect(series[0]?.connectNulls).toBe(false)
|
|
})
|
|
})
|
|
|
|
it('only shades contiguous complete segments and retains date indices while zooming', () => {
|
|
const points = [point(10, 'COMPLETE'), point(11, 'COMPLETE'), point(12, 'UNKNOWN', null), point(13, 'PARTIAL'), point(14, 'COMPLETE'), point(16, 'COMPLETE'), point(17, 'COMPLETE')]
|
|
const option = skuTrendOption(points, adminWorkbenchChartTheme)
|
|
const series = option.series as LineSeriesOption[]
|
|
expect(series[0]?.areaStyle).toBeUndefined()
|
|
expect(series[1]?.areaStyle).toBeDefined()
|
|
expect(series[1]?.data).toEqual([2, 2, null, null, null, null, null])
|
|
expect(series[2]?.lineStyle?.type).toBe('dashed')
|
|
expect(series[2]?.areaStyle).toBeUndefined()
|
|
expect(series[3]?.data).toEqual([null, null, null, null, null, 2, 2])
|
|
expect(series.slice(1).every(item => item.silent && item.connectNulls === false)).toBe(true)
|
|
expect(option.dataZoom).toMatchObject([{ start: 0, end: 100, filterMode: 'none' }])
|
|
expect(option.xAxis).toMatchObject({ data: points.map(item => item.businessDate) })
|
|
expect(option.yAxis).toMatchObject({ min: 0 })
|
|
const original = skuTrendOption(points).series as LineSeriesOption[]
|
|
expect(original[0]?.itemStyle?.color).toBe('#6078ea')
|
|
expect(original.every(item => !item.areaStyle)).toBe(true)
|
|
})
|