Files
clide/test/a11y/keyboard_traversal_test.dart
jpmschweitzerandClaude Opus 4.8 6d0ebab721 chore: adopt Dart 3.9 toolchain — honest floor + tall-style reformat (T-353)
Raise the declared minimums in pubspec.yaml to what our deps already
require: Flutter >=3.35.0 / Dart >=3.9.0 (was 3.19.0 / 3.5.0). alchemist
0.12 needs Flutter 3.32; Dart 3.9 first ships in Flutter 3.35, so 3.35 is
the binding floor. Pin the exact build toolchain in .fvmrc (Flutter
3.44.1).

Moving to the Dart 3.9 language level switches `dart format` to the new
"tall" style and enables two new lints. This commit is the resulting
mechanical churn, isolated from any behaviour change:
  - whole-tree `dart format` reformat (tall style)
  - `dart fix` for unnecessary_underscores + use_null_aware_elements

No runtime behaviour change; `make test` green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 12:11:53 +02:00

45 lines
1.5 KiB
Dart

import 'package:clide/widgets/widgets.dart';
import 'package:flutter/semantics.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import '../helpers/kernel_fixture.dart';
import '../helpers/widget_harness.dart';
/// Tier-0 smoke — each interactive primitive can *hold* focus when a
/// [Focus] wraps it, and Semantics reports the right tap action. Full
/// Tab-traversal order lives in `integration_test/app_starts_test.dart`
/// where the real WidgetsApp + DefaultFocusTraversal are present.
void main() {
group('keyboard focusability', () {
late KernelFixture f;
setUp(() async => f = await KernelFixture.create());
tearDown(() async => f.dispose());
testWidgets('ClideButton can be programmatically focused', (tester) async {
final node = FocusNode();
addTearDown(node.dispose);
await tester.pumpWidget(
harness(
f,
Focus(
focusNode: node,
child: ClideButton(label: 'Save', onPressed: () {}),
),
),
);
node.requestFocus();
await tester.pump();
expect(node.hasFocus, isTrue);
});
testWidgets('interactive widgets expose tap actions to a11y', (tester) async {
await tester.pumpWidget(harness(f, ClideButton(label: 'Save', onPressed: () {})));
final handle = tester.ensureSemantics();
final data = tester.getSemantics(find.byType(ClideButton)).getSemanticsData();
expect(data.hasAction(SemanticsAction.tap), isTrue);
handle.dispose();
});
});
}