139 lines
3.5 KiB
JavaScript
139 lines
3.5 KiB
JavaScript
// 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 {
|
|
setLineChartData,
|
|
setBarChartData,
|
|
timeRange,
|
|
yTimeRange,
|
|
getXIndex,
|
|
formatTime,
|
|
formatMaxTwo,
|
|
} from "@/module/setChartData.js";
|
|
|
|
describe("timeRange", () => {
|
|
it("splits time into equal parts", () => {
|
|
const result = timeRange(0, 100, 3);
|
|
expect(result).toEqual([0, 50, 100]);
|
|
});
|
|
|
|
it("rounds values to integers", () => {
|
|
const result = timeRange(0, 10, 4);
|
|
// 0, 3.33, 6.67, 10 -> rounded
|
|
expect(result).toEqual([0, 3, 7, 10]);
|
|
});
|
|
});
|
|
|
|
describe("getXIndex", () => {
|
|
it("finds exact match index", () => {
|
|
expect(getXIndex([10, 20, 30], 20)).toBe(1);
|
|
});
|
|
|
|
it("finds closest value index", () => {
|
|
expect(getXIndex([10, 20, 30], 22)).toBe(1);
|
|
});
|
|
|
|
it("returns last matching index for equal distances", () => {
|
|
// 15 is equidistant from 10 and 20, <= means last wins
|
|
expect(getXIndex([10, 20, 30], 15)).toBe(1);
|
|
});
|
|
});
|
|
|
|
describe("formatTime", () => {
|
|
it("formats seconds only", () => {
|
|
expect(formatTime(45)).toBe("45s");
|
|
});
|
|
|
|
it("formats minutes and seconds", () => {
|
|
expect(formatTime(125)).toBe("2m5s");
|
|
});
|
|
|
|
it("formats hours, minutes, seconds", () => {
|
|
expect(formatTime(3661)).toBe("1h1m1s");
|
|
});
|
|
|
|
it("formats days", () => {
|
|
expect(formatTime(90061)).toBe("1d1h1m1s");
|
|
});
|
|
|
|
it("returns null for NaN", () => {
|
|
expect(formatTime("abc")).toBeNull();
|
|
});
|
|
|
|
it("handles zero seconds", () => {
|
|
expect(formatTime(0)).toBe("0s");
|
|
});
|
|
});
|
|
|
|
describe("formatMaxTwo", () => {
|
|
it("keeps only top two units", () => {
|
|
expect(formatMaxTwo(["1d2h3m4s"])).toEqual(["1d 2h"]);
|
|
});
|
|
|
|
it("keeps single unit as-is", () => {
|
|
expect(formatMaxTwo(["45s"])).toEqual(["45s"]);
|
|
});
|
|
|
|
it("handles two units", () => {
|
|
expect(formatMaxTwo(["3m20s"])).toEqual(["3m 20s"]);
|
|
});
|
|
|
|
it("processes multiple items", () => {
|
|
expect(formatMaxTwo(["1h30m10s", "45s"])).toEqual(["1h 30m", "45s"]);
|
|
});
|
|
});
|
|
|
|
describe("setLineChartData", () => {
|
|
it("prepends min and appends max to data", () => {
|
|
const baseData = [
|
|
{ x: 1, y: 10 },
|
|
{ x: 2, y: 20 },
|
|
{ x: 3, y: 30 },
|
|
{ x: 4, y: 40 },
|
|
{ x: 5, y: 50 },
|
|
{ x: 6, y: 60 },
|
|
{ x: 7, y: 70 },
|
|
{ x: 8, y: 80 },
|
|
{ x: 9, y: 90 },
|
|
{ x: 10, y: 100 },
|
|
];
|
|
const result = setLineChartData(baseData, "xMax", "xMin", false, 200, 0);
|
|
// Should have 12 elements (10 original + 2 boundary)
|
|
expect(result).toHaveLength(12);
|
|
expect(result[0].x).toBe("xMin");
|
|
expect(result[11].x).toBe("xMax");
|
|
});
|
|
|
|
it("clamps percent values between 0 and 1", () => {
|
|
const baseData = [
|
|
{ x: 1, y: 0.1 },
|
|
{ x: 2, y: 0.2 },
|
|
{ x: 3, y: 0.3 },
|
|
{ x: 4, y: 0.4 },
|
|
{ x: 5, y: 0.5 },
|
|
{ x: 6, y: 0.6 },
|
|
{ x: 7, y: 0.7 },
|
|
{ x: 8, y: 0.8 },
|
|
{ x: 9, y: 0.9 },
|
|
{ x: 10, y: 0.95 },
|
|
];
|
|
const result = setLineChartData(baseData, "xMax", "xMin", true, 1, 0);
|
|
expect(result[0].y).toBeGreaterThanOrEqual(0);
|
|
expect(result[0].y).toBeLessThanOrEqual(1);
|
|
expect(result[11].y).toBeGreaterThanOrEqual(0);
|
|
expect(result[11].y).toBeLessThanOrEqual(1);
|
|
});
|
|
});
|
|
|
|
describe("setBarChartData", () => {
|
|
it("converts x values to formatted date strings", () => {
|
|
const baseData = [{ x: "2023-01-15T12:00:00", y: 100 }];
|
|
const result = setBarChartData(baseData);
|
|
expect(result[0].y).toBe(100);
|
|
expect(result[0].x).toMatch(/2023\/1\/15/);
|
|
});
|
|
});
|