flutter/packages/flutter_test/test/semantics_finder_test.dart
Michael Goderbauer 50862bc04a
Fix SemanticsFinder for multi-view (#143485)
Fixes https://github.com/flutter/flutter/issues/143405.

It was counter-intuitive that a SemanticsFinder without specifying a FlutterView would only search the nodes in the default view. This change makes it so that when no view is specified the semantics trees of all known FlutterViews are searched.
2024-02-16 22:24:55 +00:00

71 lines
2.4 KiB
Dart

// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'multi_view_testing.dart';
void main() {
testWidgets('can find nodes in an view when no view is specified', (WidgetTester tester) async {
final List<FlutterView> views = <FlutterView>[
for (int i = 0; i < 3; i++)
FakeView(tester.view, viewId: i + 100)
];
await pumpViews(tester: tester, views: views);
expect(find.semantics.byLabel('View0Child0'), findsOne);
expect(find.semantics.byLabel('View1Child1'), findsOne);
expect(find.semantics.byLabel('View2Child2'), findsOne);
});
testWidgets('can find nodes only in specified view', (WidgetTester tester) async {
final List<FlutterView> views = <FlutterView>[
for (int i = 0; i < 3; i++)
FakeView(tester.view, viewId: i + 100)
];
await pumpViews(tester: tester, views: views);
expect(find.semantics.byLabel('View0Child0', view: views[0]), findsOne);
expect(find.semantics.byLabel('View0Child0', view: views[1]), findsNothing);
expect(find.semantics.byLabel('View0Child0', view: views[2]), findsNothing);
expect(find.semantics.byLabel('View1Child1', view: views[0]), findsNothing);
expect(find.semantics.byLabel('View1Child1', view: views[1]), findsOne);
expect(find.semantics.byLabel('View1Child1', view: views[2]), findsNothing);
expect(find.semantics.byLabel('View2Child2', view: views[0]), findsNothing);
expect(find.semantics.byLabel('View2Child2', view: views[1]), findsNothing);
expect(find.semantics.byLabel('View2Child2', view: views[2]), findsOne);
});
}
Future<void> pumpViews({required WidgetTester tester, required List<FlutterView> views}) {
final List<Widget> viewWidgets = <Widget>[
for (int i = 0; i < 3; i++)
View(
view: views[i],
child: Center(
child: Column(
children: <Widget>[
for (int c = 0; c < 5; c++)
Semantics(container: true, child: Text('View${i}Child$c')),
],
),
),
),
];
return tester.pumpWidget(
wrapWithView: false,
Directionality(
textDirection: TextDirection.ltr,
child: ViewCollection(
views: viewWidgets,
),
),
);
}