feat: webapp topbar and tab switching

This commit is contained in:
2026-08-16 16:34:39 +08:00
parent f8639917f3
commit 867ba3b098
5 changed files with 220 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
// tabs.js 纯函数测试:不可变风格,验证 add/remove/switchTo
// tabs.js pure-function tests: immutable style, verify add/remove/switchTo
const { test } = require('node:test');
const assert = require('node:assert');
const { add, remove, switchTo } = require('../app/src/main/assets/h5/js/webapp/tabs.js');
test('add 不存在时新增并激活,已存在时不重复', () => {
let tabs = [];
tabs = add(tabs, 'a', '云音乐');
tabs = add(tabs, 'b', '天气');
tabs = add(tabs, 'a', '云音乐');
assert.strictEqual(tabs.length, 2, '重复 id 不应重复添加');
assert.strictEqual(tabs.filter(t => t.active).length, 1, '仅一个激活标签');
assert.strictEqual(tabs.find(t => t.active).id, 'a', '重复添加应重新激活该 id');
});
test('add 不修改传入数组(不可变)', () => {
const before = [];
const after = add(before, 'a', 'x');
assert.strictEqual(before.length, 0, '原数组不应被改动');
assert.strictEqual(after.length, 1);
});
test('remove 删除指定标签', () => {
let tabs = [{ id: 'a', name: 'x', active: false }, { id: 'b', name: 'y', active: true }];
tabs = remove(tabs, 'a');
assert.strictEqual(tabs.length, 1);
assert.strictEqual(tabs[0].id, 'b');
});
test('switchTo 激活指定 id 且不修改原数组', () => {
const before = [{ id: 'a', name: 'x', active: true }, { id: 'b', name: 'y', active: false }];
const after = switchTo(before, 'b');
assert.strictEqual(after.find(t => t.id === 'b').active, true);
assert.strictEqual(after.filter(t => t.active).length, 1);
assert.strictEqual(before.find(t => t.id === 'b').active, false, '原数组不应被改动');
});