mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
193 lines
5.3 KiB
Dart
193 lines
5.3 KiB
Dart
// Copyright 2017 The Chromium 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/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
import 'data_table_test_utils.dart';
|
|
|
|
class TestDataSource extends DataTableSource {
|
|
int get generation => _generation;
|
|
int _generation = 0;
|
|
set generation(int value) {
|
|
if (_generation == value)
|
|
return;
|
|
_generation = value;
|
|
notifyListeners();
|
|
}
|
|
|
|
@override
|
|
DataRow getRow(int index) {
|
|
final Dessert dessert = kDesserts[index % kDesserts.length];
|
|
final int page = index ~/ kDesserts.length;
|
|
return new DataRow.byIndex(
|
|
index: index,
|
|
cells: <DataCell>[
|
|
new DataCell(new Text('${dessert.name} ($page)')),
|
|
new DataCell(new Text('${dessert.calories}')),
|
|
new DataCell(new Text('$generation')),
|
|
],
|
|
);
|
|
}
|
|
|
|
@override
|
|
int get rowCount => 50 * kDesserts.length;
|
|
|
|
@override
|
|
bool get isRowCountApproximate => false;
|
|
|
|
@override
|
|
int get selectedRowCount => 0;
|
|
}
|
|
|
|
void main() {
|
|
testWidgets('PaginatedDataTable paging', (WidgetTester tester) async {
|
|
final TestDataSource source = new TestDataSource();
|
|
|
|
final List<String> log = <String>[];
|
|
|
|
await tester.pumpWidget(new MaterialApp(
|
|
home: new PaginatedDataTable(
|
|
header: const Text('Test table'),
|
|
source: source,
|
|
rowsPerPage: 2,
|
|
availableRowsPerPage: <int>[
|
|
2, 4, 8, 16,
|
|
],
|
|
onRowsPerPageChanged: (int rowsPerPage) {
|
|
log.add('rows-per-page-changed: $rowsPerPage');
|
|
},
|
|
onPageChanged: (int rowIndex) {
|
|
log.add('page-changed: $rowIndex');
|
|
},
|
|
columns: <DataColumn>[
|
|
const DataColumn(label: const Text('Name')),
|
|
const DataColumn(label: const Text('Calories'), numeric: true),
|
|
const DataColumn(label: const Text('Generation')),
|
|
],
|
|
)
|
|
));
|
|
|
|
await tester.tap(find.byTooltip('Next page'));
|
|
|
|
expect(log, <String>['page-changed: 2']);
|
|
log.clear();
|
|
|
|
await tester.pump();
|
|
|
|
expect(find.text('Frozen yogurt (0)'), findsNothing);
|
|
expect(find.text('Eclair (0)'), findsOneWidget);
|
|
expect(find.text('Gingerbread (0)'), findsNothing);
|
|
|
|
await tester.tap(find.icon(Icons.chevron_left));
|
|
|
|
expect(log, <String>['page-changed: 0']);
|
|
log.clear();
|
|
|
|
await tester.pump();
|
|
|
|
expect(find.text('Frozen yogurt (0)'), findsOneWidget);
|
|
expect(find.text('Eclair (0)'), findsNothing);
|
|
expect(find.text('Gingerbread (0)'), findsNothing);
|
|
|
|
await tester.tap(find.icon(Icons.chevron_left));
|
|
|
|
expect(log, isEmpty);
|
|
|
|
await tester.tap(find.text('2'));
|
|
await tester.pumpAndSettle(const Duration(milliseconds: 200));
|
|
|
|
await tester.tap(find.text('8').last);
|
|
await tester.pumpAndSettle(const Duration(milliseconds: 200));
|
|
|
|
expect(log, <String>['rows-per-page-changed: 8']);
|
|
log.clear();
|
|
});
|
|
|
|
testWidgets('PaginatedDataTable control test', (WidgetTester tester) async {
|
|
TestDataSource source = new TestDataSource()
|
|
..generation = 42;
|
|
|
|
final List<String> log = <String>[];
|
|
|
|
Widget buildTable(TestDataSource source) {
|
|
return new PaginatedDataTable(
|
|
header: const Text('Test table'),
|
|
source: source,
|
|
onPageChanged: (int rowIndex) {
|
|
log.add('page-changed: $rowIndex');
|
|
},
|
|
columns: <DataColumn>[
|
|
const DataColumn(
|
|
label: const Text('Name'),
|
|
tooltip: 'Name',
|
|
),
|
|
new DataColumn(
|
|
label: const Text('Calories'),
|
|
tooltip: 'Calories',
|
|
numeric: true,
|
|
onSort: (int columnIndex, bool ascending) {
|
|
log.add('column-sort: $columnIndex $ascending');
|
|
}
|
|
),
|
|
const DataColumn(
|
|
label: const Text('Generation'),
|
|
tooltip: 'Generation',
|
|
),
|
|
],
|
|
actions: <Widget>[
|
|
new IconButton(
|
|
icon: const Icon(Icons.adjust),
|
|
onPressed: () {
|
|
log.add('action: adjust');
|
|
},
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
await tester.pumpWidget(new MaterialApp(
|
|
home: buildTable(source),
|
|
));
|
|
|
|
expect(find.text('Gingerbread (0)'), findsOneWidget);
|
|
expect(find.text('Gingerbread (1)'), findsNothing);
|
|
expect(find.text('42'), findsNWidgets(10));
|
|
|
|
source.generation = 43;
|
|
await tester.pump();
|
|
|
|
expect(find.text('42'), findsNothing);
|
|
expect(find.text('43'), findsNWidgets(10));
|
|
|
|
source = new TestDataSource()
|
|
..generation = 15;
|
|
|
|
await tester.pumpWidget(new MaterialApp(
|
|
home: buildTable(source),
|
|
));
|
|
|
|
expect(find.text('42'), findsNothing);
|
|
expect(find.text('43'), findsNothing);
|
|
expect(find.text('15'), findsNWidgets(10));
|
|
|
|
final PaginatedDataTableState state = tester.state(find.byType(PaginatedDataTable));
|
|
|
|
expect(log, isEmpty);
|
|
state.pageTo(23);
|
|
expect(log, <String>['page-changed: 20']);
|
|
log.clear();
|
|
|
|
await tester.pump();
|
|
|
|
expect(find.text('Gingerbread (0)'), findsNothing);
|
|
expect(find.text('Gingerbread (1)'), findsNothing);
|
|
expect(find.text('Gingerbread (2)'), findsOneWidget);
|
|
|
|
await tester.tap(find.icon(Icons.adjust));
|
|
expect(log, <String>['action: adjust']);
|
|
log.clear();
|
|
});
|
|
}
|