import { describe, expect, it } from "vitest" ;
import { formatDurationCompact } from "../infra/format-time/format-duration.js" ;
import {
countMismatches,
countRunning,
formatImageMatch,
formatSimpleStatus,
formatStatus,
} from "./sandbox-formatters.js" ;
/** Helper matching old formatAge behavior: spaced compound duration */
const formatAge = (ms: number) => formatDurationCompact(ms, { spaced: true }) ?? "0s" ;
describe("sandbox-formatters" , () => {
describe("formatStatus" , () => {
it.each([
{ running: true , expected: " running" },
{ running: false , expected: "⚫ stopped" },
])("formats running=$running" , ({ running, expected }) => {
expect(formatStatus(running)).toBe(expected);
});
});
describe("formatSimpleStatus" , () => {
it.each([
{ running: true , expected: "running" },
{ running: false , expected: "stopped" },
])("formats running=$running without emoji" , ({ running, expected }) => {
expect(formatSimpleStatus(running)).toBe(expected);
});
});
describe("formatImageMatch" , () => {
it.each([
{ imageMatch: true , expected: "✓" },
{ imageMatch: false , expected: "⚠️ mismatch" },
])("formats imageMatch=$imageMatch" , ({ imageMatch, expected }) => {
expect(formatImageMatch(imageMatch)).toBe(expected);
});
});
describe("formatAge" , () => {
it.each([
{ ms: 0 , expected: "0s" },
{ ms: 5000 , expected: "5s" },
{ ms: 45000 , expected: "45s" },
{ ms: 60000 , expected: "1m" },
{ ms: 90000 , expected: "1m 30s" }, // 90 seconds = 1m 30s
{ ms: 300000 , expected: "5m" },
{ ms: 3600000 , expected: "1h" },
{ ms: 3660000 , expected: "1h 1m" },
{ ms: 5400000 , expected: "1h 30m" },
{ ms: 7200000 , expected: "2h" },
{ ms: 86400000 , expected: "1d" },
{ ms: 90000000 , expected: "1d 1h" },
{ ms: 172800000 , expected: "2d" },
{ ms: 183600000 , expected: "2d 3h" },
{ ms: 59999 , expected: "1m" }, // Rounds to 1 minute exactly
{ ms: 3599999 , expected: "1h" }, // Rounds to 1 hour exactly
{ ms: 86399999 , expected: "1d" }, // Rounds to 1 day exactly
])("formats $ms ms" , ({ ms, expected }) => {
expect(formatAge(ms)).toBe(expected);
});
});
describe("countRunning" , () => {
it.each([
{
items: [
{ running: true , name: "a" },
{ running: false , name: "b" },
{ running: true , name: "c" },
{ running: false , name: "d" },
],
expected: 2 ,
},
{
items: [
{ running: false , name: "a" },
{ running: false , name: "b" },
],
expected: 0 ,
},
{
items: [
{ running: true , name: "a" },
{ running: true , name: "b" },
{ running: true , name: "c" },
],
expected: 3 ,
},
])("counts running items" , ({ items, expected }) => {
expect(countRunning(items)).toBe(expected);
});
});
describe("countMismatches" , () => {
it.each([
{
items: [
{ imageMatch: true , name: "a" },
{ imageMatch: false , name: "b" },
{ imageMatch: true , name: "c" },
{ imageMatch: false , name: "d" },
{ imageMatch: false , name: "e" },
],
expected: 3 ,
},
{
items: [
{ imageMatch: true , name: "a" },
{ imageMatch: true , name: "b" },
],
expected: 0 ,
},
{
items: [
{ imageMatch: false , name: "a" },
{ imageMatch: false , name: "b" },
{ imageMatch: false , name: "c" },
],
expected: 3 ,
},
])("counts image mismatches" , ({ items, expected }) => {
expect(countMismatches(items)).toBe(expected);
});
});
describe("counter empty inputs" , () => {
it.each([
{ fn: countRunning as (items: unknown[]) => number },
{ fn: countMismatches as (items: unknown[]) => number },
])("should return 0 for empty array" , ({ fn }) => {
expect(fn([])).toBe(0 );
});
});
});
Messung V0.5 in Prozent C=97 H=100 G=98
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland