blob: 46dbf271a0ebbd8b58d82ca0804f1e63a4a17783 [file]
import 'package:devtools_app/src/flutter/table.dart';
import 'package:devtools_app/src/table_data.dart';
import 'package:devtools_app/src/trees.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'wrappers.dart';
void main() {
group('FlatTable view', () {
List<TestData> flatData;
setUp(() {
flatData = [
TestData('Foo', 0),
TestData('Bar', 1),
TestData('Baz', 2),
TestData('Qux', 3),
TestData('Snap', 4),
TestData('Crackle', 5),
TestData('Pop', 5),
TestData('Baz', 6),
TestData('Qux', 7),
];
});
testWidgets('displays with simple content', (WidgetTester tester) async {
final table = FlatTable<TestData>(
columns: [_FlatNameColumn()],
data: [TestData('empty', 0)],
keyFactory: (d) => Key(d.name),
onItemSelected: noop,
);
await tester.pumpWidget(wrap(table));
expect(find.byWidget(table), findsOneWidget);
expect(find.byKey(const Key('empty')), findsOneWidget);
});
testWidgets('displays with tree column first', (WidgetTester tester) async {
await setWindowSize(const Size(800.0, 1200.0));
final table = FlatTable<TestData>(
columns: [
_FlatNameColumn(),
_NumberColumn(),
],
data: flatData,
onItemSelected: noop,
keyFactory: (d) => Key(d.name),
);
await tester.pumpWidget(wrap(table));
expect(find.byWidget(table), findsOneWidget);
expect(find.byKey(const Key('Foo')), findsOneWidget);
expect(find.byKey(const Key('Bar')), findsOneWidget);
// Note that two keys with the same name are allowed but not necessarily a
// good idea. We should be using unique identifiers for keys.
expect(find.byKey(const Key('Baz')), findsNWidgets(2));
expect(find.byKey(const Key('Qux')), findsNWidgets(2));
expect(find.byKey(const Key('Snap')), findsOneWidget);
expect(find.byKey(const Key('Crackle')), findsOneWidget);
expect(find.byKey(const Key('Pop')), findsOneWidget);
await resetWindowSize();
});
testWidgets('displays with many columns', (WidgetTester tester) async {
final table = FlatTable<TestData>(
columns: [
_NumberColumn(),
_CombinedColumn(),
_FlatNameColumn(),
_CombinedColumn(),
],
data: flatData,
onItemSelected: noop,
keyFactory: (data) => Key(data.name),
);
await tester.pumpWidget(wrap(
SizedBox(
width: 200.0,
height: 200.0,
child: table,
),
));
expect(find.byWidget(table), findsOneWidget);
});
testWidgets('can select an item', (WidgetTester tester) async {
TestData selected;
final testData = TestData('empty', 0);
const key = Key('empty');
final table = FlatTable<TestData>(
columns: [_FlatNameColumn()],
data: [testData],
keyFactory: (d) => Key(d.name),
onItemSelected: (item) => selected = item,
);
await tester.pumpWidget(wrap(table));
expect(find.byWidget(table), findsOneWidget);
expect(find.byKey(key), findsOneWidget);
expect(selected, isNull);
await tester.tap(find.byKey(key));
expect(selected, testData);
});
test('fails with no data', () {
expect(
() {
FlatTable<TestData>(
columns: [_FlatNameColumn()],
data: null,
keyFactory: (d) => Key(d.name),
onItemSelected: noop,
);
},
throwsAssertionError,
);
});
test('fails when a TreeNode cannot provide a key', () {
expect(() {
FlatTable<TestData>(
columns: [_FlatNameColumn()],
data: flatData,
keyFactory: null,
onItemSelected: noop,
);
}, throwsAssertionError);
});
});
group('TreeTable view', () {
TestData tree;
TreeColumnData<TestData> treeColumn;
setUp(() {
treeColumn = _NameColumn();
tree = TestData('Foo', 0)
..children.addAll([
TestData('Bar', 1)
..children.addAll([
TestData('Baz', 2),
TestData('Qux', 3),
TestData('Snap', 4),
TestData('Crackle', 5),
TestData('Pop', 5),
]),
TestData('Baz', 6),
TestData('Qux', 7),
]);
tree.expandCascading();
});
testWidgets('displays with simple content', (WidgetTester tester) async {
final table = TreeTable<TestData>(
columns: [treeColumn],
data: TestData('empty', 0),
treeColumn: treeColumn,
keyFactory: (d) => Key(d.name),
);
await tester.pumpWidget(wrap(table));
expect(find.byWidget(table), findsOneWidget);
expect(find.byKey(const Key('empty')), findsOneWidget);
});
testWidgets('displays with tree column first', (WidgetTester tester) async {
await setWindowSize(const Size(800.0, 1200.0));
final table = TreeTable<TestData>(
columns: [
treeColumn,
_NumberColumn(),
],
data: tree,
treeColumn: treeColumn,
keyFactory: (d) => Key(d.name),
);
await tester.pumpWidget(wrap(table));
expect(find.byWidget(table), findsOneWidget);
expect(find.byKey(const Key('Foo')), findsOneWidget);
expect(find.byKey(const Key('Bar')), findsOneWidget);
// Note that two keys with the same name are allowed but not necessarily a
// good idea. We should be using unique identifiers for keys.
expect(find.byKey(const Key('Baz')), findsNWidgets(2));
expect(find.byKey(const Key('Qux')), findsNWidgets(2));
expect(find.byKey(const Key('Snap')), findsOneWidget);
expect(find.byKey(const Key('Crackle')), findsOneWidget);
expect(find.byKey(const Key('Pop')), findsOneWidget);
await resetWindowSize();
});
testWidgets('displays with many columns', (WidgetTester tester) async {
final table = TreeTable<TestData>(
columns: [
_NumberColumn(),
_CombinedColumn(),
treeColumn,
_CombinedColumn(),
],
data: tree,
treeColumn: treeColumn,
keyFactory: (d) => Key(d.name),
);
await tester.pumpWidget(wrap(
SizedBox(
width: 200.0,
height: 200.0,
child: table,
),
));
expect(find.byWidget(table), findsOneWidget);
});
testWidgets('properly collapses and expands the tree',
(WidgetTester tester) async {
final table = TreeTable<TestData>(
columns: [
_NumberColumn(),
treeColumn,
],
data: tree,
treeColumn: treeColumn,
keyFactory: (d) => Key(d.name),
);
await tester.pumpWidget(wrap(table));
await tester.pumpAndSettle();
expect(tree.isExpanded, true);
await tester.tap(find.byKey(const Key('Foo')));
await tester.pumpAndSettle();
expect(tree.isExpanded, false);
await tester.tap(find.byKey(const Key('Foo')));
await tester.pumpAndSettle();
expect(tree.isExpanded, true);
await tester.tap(find.byKey(const Key('Bar')));
await tester.pumpAndSettle();
expect(tree.children[0].isExpanded, false);
});
test('fails with no data', () {
expect(
() {
TreeTable<TestData>(
columns: [treeColumn],
data: null,
treeColumn: treeColumn,
keyFactory: (d) => Key(d.name),
);
},
throwsAssertionError,
);
});
test('fails when a TreeNode cannot provide a key', () {
expect(() {
TreeTable<TestData>(
columns: [treeColumn],
data: tree,
treeColumn: treeColumn,
keyFactory: null,
);
}, throwsAssertionError);
});
test('fails when there is no TreeColumn', () {
expect(() {
TreeTable<TestData>(
columns: [treeColumn],
data: tree,
treeColumn: null,
keyFactory: (d) => Key(d.name),
);
}, throwsAssertionError);
expect(() {
TreeTable<TestData>(
columns: const [],
data: tree,
treeColumn: treeColumn,
keyFactory: (d) => Key(d.name),
);
}, throwsAssertionError);
});
});
}
class TestData extends TreeNode<TestData> {
TestData(this.name, this.number);
final String name;
final int number;
}
class _NameColumn extends TreeColumnData<TestData> {
_NameColumn() : super('Name');
@override
String getValue(TestData dataObject) => dataObject.name;
}
class _NumberColumn extends ColumnData<TestData> {
_NumberColumn() : super('Name');
@override
String getValue(TestData dataObject) => 'dataObject.number';
@override
double get fixedWidthPx => 400.0;
}
class _FlatNameColumn extends ColumnData<TestData> {
_FlatNameColumn() : super('Name');
@override
String getValue(TestData dataObject) => dataObject.name;
@override
double get fixedWidthPx => 300.0;
}
class _CombinedColumn extends ColumnData<TestData> {
_CombinedColumn() : super('Name & Number');
@override
String getValue(TestData dataObject) =>
'${dataObject.name} ${dataObject.number}';
@override
double get fixedWidthPx => 400.0;
}
void noop(TestData data) {}