1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
4import { beforeEach, describe, expect, test } from 'bun:test';
12} from './fersLogStore';
14describe('fers log store', () => {
16 useFersLogStore.setState({
19 maxLines: DEFAULT_LOG_MAX_LINES,
20 logLevel: DEFAULT_LOG_LEVEL,
25 test('appends log entries in order', () => {
28 .appendLog({ sequence: 1, level: 'INFO', line: 'first' });
31 .appendLog({ sequence: 2, level: 'ERROR', line: 'second' });
33 expect(useFersLogStore.getState().entries).toEqual([
34 { sequence: 1, level: 'INFO', line: 'first' },
35 { sequence: 2, level: 'ERROR', line: 'second' },
39 test('trims to bounded buffer and records dropped lines', () => {
40 useFersLogStore.setState({ maxLines: 2 });
42 for (let sequence = 1; sequence <= 4; sequence += 1) {
43 useFersLogStore.getState().appendLog({
46 line: `line ${sequence}`,
50 const state = useFersLogStore.getState();
51 expect(state.entries.map((entry) => entry.sequence)).toEqual([3, 4]);
52 expect(state.droppedCount).toBe(2);
55 test('clear resets entries and dropped count', () => {
56 useFersLogStore.setState({
57 entries: [{ sequence: 1, level: 'INFO', line: 'line' }],
61 useFersLogStore.getState().clearLogs();
63 expect(useFersLogStore.getState().entries).toEqual([]);
64 expect(useFersLogStore.getState().droppedCount).toBe(0);
67 test('max lines setting clamps and trims immediately', () => {
68 useFersLogStore.setState({
70 { sequence: 1, level: 'INFO', line: 'one' },
71 { sequence: 2, level: 'INFO', line: 'two' },
76 useFersLogStore.getState().setMaxLines(1);
78 const state = useFersLogStore.getState();
79 expect(state.maxLines).toBe(MIN_LOG_MAX_LINES);
80 expect(state.entries.map((entry) => entry.sequence)).toEqual([1, 2]);
83 test('clampLogMaxLines handles invalid and out-of-range values', () => {
84 expect(clampLogMaxLines(Number.NaN)).toBe(DEFAULT_LOG_MAX_LINES);
85 expect(clampLogMaxLines(1)).toBe(MIN_LOG_MAX_LINES);
86 expect(clampLogMaxLines(MAX_LOG_MAX_LINES + 1)).toBe(MAX_LOG_MAX_LINES);
87 expect(clampLogMaxLines(1234.9)).toBe(1234);
90 test('log level defaults and updates', () => {
91 expect(useFersLogStore.getState().logLevel).toBe(DEFAULT_LOG_LEVEL);
93 useFersLogStore.getState().setLogLevel('TRACE');
94 expect(useFersLogStore.getState().logLevel).toBe('TRACE');
96 useFersLogStore.getState().setLogLevel('OFF');
97 expect(useFersLogStore.getState().logLevel).toBe('OFF');