| // 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(); |
| }); |
| } |