FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
fersLogStore.test.ts
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
3
4import { beforeEach, describe, expect, test } from 'bun:test';
5import {
6 clampLogMaxLines,
7 DEFAULT_LOG_LEVEL,
8 DEFAULT_LOG_MAX_LINES,
9 MAX_LOG_MAX_LINES,
10 MIN_LOG_MAX_LINES,
11 useFersLogStore,
12} from './fersLogStore';
13
14describe('fers log store', () => {
15 beforeEach(() => {
16 useFersLogStore.setState({
17 entries: [],
18 droppedCount: 0,
19 maxLines: DEFAULT_LOG_MAX_LINES,
20 logLevel: DEFAULT_LOG_LEVEL,
21 isOpen: false,
22 });
23 });
24
25 test('appends log entries in order', () => {
26 useFersLogStore
27 .getState()
28 .appendLog({ sequence: 1, level: 'INFO', line: 'first' });
29 useFersLogStore
30 .getState()
31 .appendLog({ sequence: 2, level: 'ERROR', line: 'second' });
32
33 expect(useFersLogStore.getState().entries).toEqual([
34 { sequence: 1, level: 'INFO', line: 'first' },
35 { sequence: 2, level: 'ERROR', line: 'second' },
36 ]);
37 });
38
39 test('trims to bounded buffer and records dropped lines', () => {
40 useFersLogStore.setState({ maxLines: 2 });
41
42 for (let sequence = 1; sequence <= 4; sequence += 1) {
43 useFersLogStore.getState().appendLog({
44 sequence,
45 level: 'INFO',
46 line: `line ${sequence}`,
47 });
48 }
49
50 const state = useFersLogStore.getState();
51 expect(state.entries.map((entry) => entry.sequence)).toEqual([3, 4]);
52 expect(state.droppedCount).toBe(2);
53 });
54
55 test('clear resets entries and dropped count', () => {
56 useFersLogStore.setState({
57 entries: [{ sequence: 1, level: 'INFO', line: 'line' }],
58 droppedCount: 4,
59 });
60
61 useFersLogStore.getState().clearLogs();
62
63 expect(useFersLogStore.getState().entries).toEqual([]);
64 expect(useFersLogStore.getState().droppedCount).toBe(0);
65 });
66
67 test('max lines setting clamps and trims immediately', () => {
68 useFersLogStore.setState({
69 entries: [
70 { sequence: 1, level: 'INFO', line: 'one' },
71 { sequence: 2, level: 'INFO', line: 'two' },
72 ],
73 maxLines: 2,
74 });
75
76 useFersLogStore.getState().setMaxLines(1);
77
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]);
81 });
82
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);
88 });
89
90 test('log level defaults and updates', () => {
91 expect(useFersLogStore.getState().logLevel).toBe(DEFAULT_LOG_LEVEL);
92
93 useFersLogStore.getState().setLogLevel('TRACE');
94 expect(useFersLogStore.getState().logLevel).toBe('TRACE');
95
96 useFersLogStore.getState().setLogLevel('OFF');
97 expect(useFersLogStore.getState().logLevel).toBe('OFF');
98 });
99});