// The Lucia project. // Copyright 2026-2026 DSP, inc. All rights reserved. // Authors: // imacat.yang@dsp.im (imacat), 2026/03/05 import { describe, it, expect } from 'vitest'; import { getTimeLabel, simpleTimeLabel, followTimeLabel, getStepSizeOfYTicks, getYTicksByIndex, setTimeStringFormatBaseOnTimeDifference, mapTimestampToAxisTicksByFormat, } from '@/module/timeLabel.js'; describe('getTimeLabel', () => { it('returns days for >= 86400 seconds', () => { expect(getTimeLabel(86400)).toBe('1 days'); expect(getTimeLabel(172800)).toBe('2 days'); }); it('returns hours for >= 3600 seconds', () => { expect(getTimeLabel(3600)).toBe('1 hrs'); expect(getTimeLabel(7200)).toBe('2 hrs'); }); it('returns minutes for >= 60 seconds', () => { expect(getTimeLabel(60)).toBe('1 mins'); expect(getTimeLabel(120)).toBe('2 mins'); }); it('returns seconds for < 60', () => { expect(getTimeLabel(30)).toBe('30 sec'); }); it('returns 0 sec for zero', () => { expect(getTimeLabel(0)).toBe('0 sec'); }); it('respects fixedNumber parameter', () => { expect(getTimeLabel(5400, 1)).toBe('1.5 hrs'); }); }); describe('simpleTimeLabel', () => { it('returns days with d suffix', () => { expect(simpleTimeLabel(86400)).toBe('1d'); }); it('returns hours with h suffix', () => { expect(simpleTimeLabel(3600)).toBe('1h'); expect(simpleTimeLabel(7200)).toBe('2h'); }); it('returns minutes with m suffix', () => { expect(simpleTimeLabel(60)).toBe('1m'); expect(simpleTimeLabel(120)).toBe('2m'); }); it('returns seconds with s suffix for small values', () => { expect(simpleTimeLabel(30)).toBe('30s'); }); it('returns 0s for zero', () => { expect(simpleTimeLabel(0)).toBe('0s'); }); it('correctly calculates hours for values between 1h and 1d', () => { // 5 hours = 18000 seconds -> should be "5h" expect(simpleTimeLabel(18000)).toBe('5h'); }); it('correctly calculates minutes for values between 1m and 1h', () => { // 30 minutes = 1800 seconds -> should be "30m" expect(simpleTimeLabel(1800)).toBe('30m'); }); }); describe('followTimeLabel', () => { it('uses day unit when max > 1 day', () => { // max = 100000 (> 86400), second = 86400 => 1d expect(followTimeLabel(86400, 100000)).toBe('1d'); }); it('uses hour unit when max > 1 hour', () => { // max = 7200 (> 3600), second = 3600 => 1h expect(followTimeLabel(3600, 7200)).toBe('1h'); }); it('uses minute unit when max > 1 minute', () => { // max = 120 (> 60), second = 60 => 1m expect(followTimeLabel(60, 120)).toBe('1m'); }); it('uses second unit when max <= 60', () => { expect(followTimeLabel(30, 50)).toBe('30s'); }); it('returns 0 without decimals when value is 0', () => { expect(followTimeLabel(0, 7200, 2)).toBe('0h'); }); }); describe('getStepSizeOfYTicks', () => { it('returns object with resultStepSize and unitToUse', () => { const result = getStepSizeOfYTicks(7200, 5); expect(result).toHaveProperty('resultStepSize'); expect(result).toHaveProperty('unitToUse'); expect(result.unitToUse).toBe('h'); }); it('uses day unit for large values', () => { const result = getStepSizeOfYTicks(200000, 5); expect(result.unitToUse).toBe('d'); }); it('uses second unit for small values', () => { const result = getStepSizeOfYTicks(30, 5); expect(result.unitToUse).toBe('s'); }); }); describe('getYTicksByIndex', () => { it('formats tick label with unit', () => { expect(getYTicksByIndex(2, 3, 'h')).toBe('6h'); }); it('truncates to 1 decimal place', () => { expect(getYTicksByIndex(1.5, 1, 'h')).toBe('1.5h'); }); }); describe('setTimeStringFormatBaseOnTimeDifference', () => { it('returns seconds format for < 60s difference', () => { expect(setTimeStringFormatBaseOnTimeDifference(0, 30)) .toBe('HH:mm:ss'); }); it('returns minute format for < 3600s difference', () => { expect(setTimeStringFormatBaseOnTimeDifference(0, 1800)) .toBe('MM/DD HH:mm'); }); it('returns hour format for < 86400s difference', () => { expect(setTimeStringFormatBaseOnTimeDifference(0, 43200)) .toBe('MM/DD HH:mm'); }); it('returns day format for < 30 days difference', () => { expect(setTimeStringFormatBaseOnTimeDifference(0, 864000)) .toBe('YYYY/MM/DD'); }); it('returns month format for >= 30 days difference', () => { expect(setTimeStringFormatBaseOnTimeDifference(0, 5000000)) .toBe('YYYY/MM/DD'); }); }); describe('mapTimestampToAxisTicksByFormat', () => { it('formats timestamps with given format', () => { const ts = [new Date('2023-01-15').getTime()]; const result = mapTimestampToAxisTicksByFormat(ts, 'YYYY/MM/DD'); expect(result[0]).toBe('2023/01/15'); }); it('returns undefined for falsy input', () => { expect(mapTimestampToAxisTicksByFormat(null, 'YYYY')) .toBeUndefined(); }); });