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>
33 lines
1.3 KiB
Dart
33 lines
1.3 KiB
Dart
/// Tests for ClideMarquee (T-150): static when the child fits, scrolls
|
|
/// (looped copy) when it overflows; clips its box.
|
|
library;
|
|
|
|
import 'package:clide/widgets/widgets.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
Widget _boxed(double width, Widget child) => Directionality(
|
|
textDirection: TextDirection.ltr,
|
|
child: Center(
|
|
child: SizedBox(width: width, height: 16, child: child),
|
|
),
|
|
);
|
|
|
|
void main() {
|
|
testWidgets('shows the child statically when it fits', (tester) async {
|
|
await tester.pumpWidget(_boxed(300, const ClideMarquee(child: Text('short'))));
|
|
await tester.pump();
|
|
expect(find.text('short'), findsOneWidget);
|
|
await tester.pumpWidget(const SizedBox()); // tear down the ticker
|
|
});
|
|
|
|
testWidgets('renders a looped copy and runs without overflow when wider than the slot', (tester) async {
|
|
await tester.pumpWidget(_boxed(40, const ClideMarquee(child: Text('a long status line that overflows the slot'))));
|
|
await tester.pump(); // measure
|
|
await tester.pump(const Duration(milliseconds: 100)); // advance the ticker
|
|
expect(find.text('a long status line that overflows the slot'), findsWidgets);
|
|
expect(tester.takeException(), isNull);
|
|
await tester.pumpWidget(const SizedBox()); // dispose → stop ticker
|
|
});
|
|
}
|