blob: c90c0ab079d0c8e553a50de2d7abe71252d3f0b5 [file] [log] [blame]
// Copyright 2016 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 'feedback_tester.dart';
void main() {
/// Tests that a [Chip] that has its size constrained by its parent is
/// further constraining the size of its child, the label widget.
/// Optionally, adding an avatar or delete icon to the chip should not
/// cause the chip or label to exceed its constrained size.
Future<Null> _testConstrainedLabel(WidgetTester tester, {
CircleAvatar avatar, VoidCallback onDeleted,
}) async {
const double labelWidth = 100.0;
const double labelHeight = 50.0;
const double chipParentWidth = 75.0;
const double chipParentHeight = 25.0;
final Key labelKey = new UniqueKey();
await tester.pumpWidget(
new MaterialApp(
home: new Material(
child: new Center(
child: new Container(
width: chipParentWidth,
height: chipParentHeight,
child: new Chip(
avatar: avatar,
label: new Container(
key: labelKey,
width: labelWidth,
height: labelHeight,
),
onDeleted: onDeleted,
),
),
),
),
),
);
final Size labelSize = tester.getSize(find.byKey(labelKey));
expect(labelSize.width, lessThan(chipParentWidth));
expect(labelSize.height, lessThanOrEqualTo(chipParentHeight));
final Size chipSize = tester.getSize(find.byType(Chip));
expect(chipSize.width, chipParentWidth);
expect(chipSize.height, chipParentHeight);
}
testWidgets('Chip control test', (WidgetTester tester) async {
final FeedbackTester feedback = new FeedbackTester();
final List<String> deletedChipLabels = <String>[];
await tester.pumpWidget(
new MaterialApp(
home: new Material(
child: new Column(
children: <Widget>[
new Chip(
avatar: const CircleAvatar(
child: const Text('A')
),
label: const Text('Chip A'),
onDeleted: () {
deletedChipLabels.add('A');
},
deleteButtonTooltipMessage: 'Delete chip A',
),
new Chip(
avatar: const CircleAvatar(
child: const Text('B')
),
label: const Text('Chip B'),
onDeleted: () {
deletedChipLabels.add('B');
},
deleteButtonTooltipMessage: 'Delete chip B',
),
]
)
)
)
);
expect(tester.widget(find.byTooltip('Delete chip A')), isNotNull);
expect(tester.widget(find.byTooltip('Delete chip B')), isNotNull);
expect(feedback.clickSoundCount, 0);
expect(deletedChipLabels, isEmpty);
await tester.tap(find.byTooltip('Delete chip A'));
expect(deletedChipLabels, equals(<String>['A']));
await tester.pumpAndSettle(const Duration(seconds: 1));
expect(feedback.clickSoundCount, 1);
await tester.tap(find.byTooltip('Delete chip B'));
expect(deletedChipLabels, equals(<String>['A', 'B']));
await tester.pumpAndSettle(const Duration(seconds: 1));
expect(feedback.clickSoundCount, 2);
feedback.dispose();
});
testWidgets(
'Chip does not constrain size of label widget if it does not exceed '
'the available space', (WidgetTester tester) async {
const double labelWidth = 50.0;
const double labelHeight = 30.0;
final Key labelKey = new UniqueKey();
await tester.pumpWidget(
new Material(
child: new Center(
child: new Container(
width: 500.0,
height: 500.0,
child: new Column(
children: <Widget>[
new Chip(
label: new Container(
key: labelKey,
width: labelWidth,
height: labelHeight,
),
),
],
),
),
),
),
);
final Size labelSize = tester.getSize(find.byKey(labelKey));
expect(labelSize.width, labelWidth);
expect(labelSize.height, labelHeight);
});
testWidgets(
'Chip constrains the size of the label widget when it exceeds the '
'available space', (WidgetTester tester) async {
await _testConstrainedLabel(tester);
});
testWidgets(
'Chip constrains the size of the label widget when it exceeds the '
'available space and the avatar is present', (WidgetTester tester) async {
await _testConstrainedLabel(
tester,
avatar: const CircleAvatar(
child: const Text('A')
),
);
});
testWidgets(
'Chip constrains the size of the label widget when it exceeds the '
'available space and the delete icon is present',
(WidgetTester tester) async {
await _testConstrainedLabel(
tester,
onDeleted: () {},
);
});
testWidgets(
'Chip constrains the size of the label widget when it exceeds the '
'available space and both avatar and delete icons are present',
(WidgetTester tester) async {
await _testConstrainedLabel(
tester,
avatar: const CircleAvatar(
child: const Text('A')
),
onDeleted: () {},
);
});
}