const { describe, test } = require('node:test'); const assert = require('node:assert'); const { BB } = require('./setup'); describe('BB.state', () => { test('subscribe registers callback and fires on set', () => { let called = false; BB.state.subscribe('_t1', () => { called = true; }); BB.state.set('_t1', 'hello'); assert.ok(called, 'Subscriber should fire'); }); test('set passes old and new values to subscriber', () => { BB.state.set('_t2', 'first'); let capturedOld; BB.state.subscribe('_t2', (n, o) => { capturedOld = o; }); BB.state.set('_t2', 'second'); assert.strictEqual(capturedOld, 'first'); }); test('set does not trigger unrelated subscribers', () => { let called = false; BB.state.subscribe('_t3_a', () => { called = true; }); BB.state.set('_t3_b', 'val'); assert.ok(!called, 'Unrelated subscriber should not fire'); }); test('unsubscribe removes callback', () => { let count = 0; const unsub = BB.state.subscribe('_t4', () => { count++; }); BB.state.set('_t4', 'a'); assert.strictEqual(count, 1); unsub(); BB.state.set('_t4', 'b'); assert.strictEqual(count, 1); }); test('set with same value still triggers', () => { BB.state.set('_t5', 'same'); let count = 0; BB.state.subscribe('_t5', () => { count++; }); BB.state.set('_t5', 'same'); assert.strictEqual(count, 1); }); test('multiple subscribers on same key all fire', () => { let a = false, b = false; BB.state.subscribe('_t6', () => { a = true; }); BB.state.subscribe('_t6', () => { b = true; }); BB.state.set('_t6', 'v'); assert.ok(a && b, 'Both should fire'); }); test('direct property assignment triggers via Proxy', () => { let called = false; BB.state.subscribe('_t7', () => { called = true; }); BB.state._t7 = 'proxy'; assert.ok(called, 'Proxy set should trigger'); assert.strictEqual(BB.state._t7, 'proxy'); }); test('get returns current value', () => { BB.state.set('_t8', 42); assert.strictEqual(BB.state.get('_t8'), 42); }); test('initial state has expected default keys', () => { assert.ok(Array.isArray(BB.state.sources)); assert.strictEqual(BB.state.currentOrder, 'chronological'); assert.strictEqual(BB.state.hasMore, false); assert.strictEqual(BB.state.selectedItemId, null); }); });