Files
clide/test/kernel/src/focus_test.dart
T
jpmschweitzerandClaude Opus 4.7 478cff6050 add ClidePane primitive + focus-driven status-bar slot
Replace the MessageBus-based pane-context slot with a focus-driven one.
Panes keep their status widget locally; the FocusTracker holds the
focused pane's widget (activeStatusWidget) and ClidePane conveys it to
the shared slot only while its contribution is focused, re-conveying on
change and clearing on blur. The status-bar item just renders
focus.activeStatusWidget, height-clamped and marquee-scrolled when it
overflows. Removes the publish/subscribe race the bus version had.

T-150.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 11:23:30 +02:00

55 lines
1.8 KiB
Dart

/// Tests for FocusTracker's status-widget slot (T-150).
library;
import 'package:clide/kernel/src/focus.dart';
import 'package:clide/kernel/src/panels/slot_id.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('FocusTracker status widget', () {
test('setStatusWidget applies only for the focused contribution', () {
final f = FocusTracker();
f.setActive(slot: Slots.workspace, contributionId: 'a');
const wa = SizedBox(key: ValueKey('a'));
f.setStatusWidget('a', wa);
expect(f.activeStatusWidget, wa);
// A background contribution's update is ignored.
f.setStatusWidget('b', const SizedBox(key: ValueKey('b')));
expect(f.activeStatusWidget, wa);
});
test('a focus change clears the previous status widget', () {
final f = FocusTracker();
f.setActive(slot: Slots.workspace, contributionId: 'a');
f.setStatusWidget('a', const SizedBox());
expect(f.activeStatusWidget, isNotNull);
f.setActive(slot: Slots.workspace, contributionId: 'b');
expect(f.activeStatusWidget, isNull);
});
test('clear() resets focus and status', () {
final f = FocusTracker();
f.setActive(slot: Slots.workspace, contributionId: 'a');
f.setStatusWidget('a', const SizedBox());
f.clear();
expect(f.activeContributionId, isNull);
expect(f.activeStatusWidget, isNull);
});
test('setStatusWidget notifies on change, not on a repeat', () {
final f = FocusTracker();
f.setActive(slot: Slots.workspace, contributionId: 'a');
var n = 0;
f.addListener(() => n++);
const w = SizedBox();
f.setStatusWidget('a', w);
expect(n, 1);
f.setStatusWidget('a', w); // identical → no notify
expect(n, 1);
});
});
}