blob: c801973a1c0726cdc9e92586c7b6ae4b93994008 [file] [log] [blame]
// 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 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'semantics_tester.dart';
void main() {
group('Available semantic scroll actions', () {
// Regression tests for https://github.com/flutter/flutter/issues/52032.
const int itemCount = 10;
const double itemHeight = 150.0;
testWidgets('forward vertical', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollUp]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollDown]));
semantics.dispose();
});
testWidgets('reverse vertical', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
reverse: true,
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollDown]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollUp]));
semantics.dispose();
});
testWidgets('forward horizontal', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
scrollDirection: Axis.horizontal,
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollLeft]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollRight]));
semantics.dispose();
});
testWidgets('reverse horizontal', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester);
final ScrollController controller = ScrollController();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: ListView.builder(
scrollDirection: Axis.horizontal,
reverse: true,
controller: controller,
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
return SizedBox(
height: itemHeight,
child: Text('Tile $index'),
);
},
),
),
);
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollRight]));
// Jump to the end.
controller.jumpTo(itemCount * itemHeight);
await tester.pumpAndSettle();
expect(semantics, includesNodeWith(actions: <SemanticsAction>[SemanticsAction.scrollLeft]));
semantics.dispose();
});
});
}