// 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_web/material.dart'; import 'package:flutter_web_test/flutter_web_test.dart'; import 'data_table_test_utils.dart'; void main() { testWidgets('DataTable control test', (WidgetTester tester) async { final List log = []; Widget buildTable({int sortColumnIndex, bool sortAscending = true}) { return DataTable( sortColumnIndex: sortColumnIndex, sortAscending: sortAscending, onSelectAll: (bool value) { log.add('select-all: $value'); }, columns: [ const DataColumn( label: Text('Name'), tooltip: 'Name', ), DataColumn( label: const Text('Calories'), tooltip: 'Calories', numeric: true, onSort: (int columnIndex, bool ascending) { log.add('column-sort: $columnIndex $ascending'); }), ], rows: kDesserts.map((Dessert dessert) { return DataRow( key: Key(dessert.name), onSelectChanged: (bool selected) { log.add('row-selected: ${dessert.name}'); }, cells: [ DataCell( Text(dessert.name), ), DataCell( Text('${dessert.calories}'), showEditIcon: true, onTap: () { log.add('cell-tap: ${dessert.calories}'); }, ), ], ); }).toList(), ); } await tester.pumpWidget(MaterialApp(home: Material(child: buildTable()))); await tester.tap(find.byType(Checkbox).first); expect(log, ['select-all: true']); log.clear(); await tester.tap(find.text('Cupcake')); expect(log, ['row-selected: Cupcake']); log.clear(); await tester.tap(find.text('Calories')); expect(log, ['column-sort: 1 true']); log.clear(); await tester.pumpWidget( MaterialApp(home: Material(child: buildTable(sortColumnIndex: 1)))); await tester.pumpAndSettle(const Duration(milliseconds: 200)); await tester.tap(find.text('Calories')); expect(log, ['column-sort: 1 false']); log.clear(); await tester.pumpWidget(MaterialApp( home: Material( child: buildTable(sortColumnIndex: 1, sortAscending: false)))); await tester.pumpAndSettle(const Duration(milliseconds: 200)); await tester.tap(find.text('375')); expect(log, ['cell-tap: 375']); log.clear(); await tester.tap(find.byType(Checkbox).last); expect(log, ['row-selected: KitKat']); log.clear(); }); testWidgets('DataTable overflow test - header', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: Material( child: DataTable( columns: [ DataColumn( label: Text('X' * 2000), ), ], rows: const [ DataRow( cells: [ DataCell( Text('X'), ), ], ), ], ), ), ), ); expect(tester.renderObject(find.byType(Text).first).size.width, greaterThan(800.0)); expect(tester.renderObject(find.byType(Row).first).size.width, greaterThan(800.0)); expect(tester.takeException(), isNull); // column overflows table, but text doesn't overflow cell }); testWidgets('DataTable overflow test - header with spaces', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: Material( child: DataTable( columns: [ DataColumn( label: Text('X ' * 2000), // has soft wrap points, but they should be ignored ), ], rows: const [ DataRow( cells: [ DataCell( Text('X'), ), ], ), ], ), ), ), ); expect(tester.renderObject(find.byType(Text).first).size.width, greaterThan(800.0)); expect(tester.renderObject(find.byType(Row).first).size.width, greaterThan(800.0)); expect(tester.takeException(), isNull); // column overflows table, but text doesn't overflow cell }, skip: true); // https://github.com/flutter/flutter/issues/13512 testWidgets('DataTable overflow test', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: Material( child: DataTable( columns: const [ DataColumn( label: Text('X'), ), ], rows: [ DataRow( cells: [ DataCell( Text('X' * 2000), ), ], ), ], ), ), ), ); expect(tester.renderObject(find.byType(Text).first).size.width, lessThan(800.0)); expect(tester.renderObject(find.byType(Row).first).size.width, greaterThan(800.0)); expect(tester.takeException(), isNull); // cell overflows table, but text doesn't overflow cell }); testWidgets('DataTable overflow test', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: Material( child: DataTable( columns: const [ DataColumn( label: Text('X'), ), ], rows: [ DataRow( cells: [ DataCell( Text('X ' * 2000), // wraps ), ], ), ], ), ), ), ); expect(tester.renderObject(find.byType(Text).first).size.width, lessThan(800.0)); expect(tester.renderObject(find.byType(Row).first).size.width, lessThan(800.0)); expect(tester.takeException(), isNull); }); }