| // 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/rendering.dart'; | |
| import 'package:flutter_test/flutter_test.dart'; | |
| import 'package:sample_catalog/custom_semantics.dart' as custom_semantics show main; | |
| import 'package:sample_catalog/custom_semantics.dart'; | |
| void main() { | |
| testWidgets('custom_semantics sample smoke test', (WidgetTester tester) async { | |
| // Turn on Semantics | |
| final SemanticsHandle semanticsHandler = tester.binding.pipelineOwner.ensureSemantics(); | |
| final SemanticsOwner semanticsOwner = tester.binding.pipelineOwner.semanticsOwner; | |
| // Build the sample app | |
| custom_semantics.main(); | |
| await tester.pump(); | |
| // Verify it correctly exposes its semantics. | |
| // TODO(goderbauer): Use `SemanticsTester` after https://github.com/flutter/flutter/issues/12286. | |
| final SemanticsNode semantics = tester | |
| .renderObject(find.byType(AdjustableDropdownListTile)) | |
| .debugSemantics; | |
| expectAdjustable(semantics, | |
| hasIncreaseAction: true, | |
| hasDecreaseAction: true, | |
| label: 'Timeout', | |
| decreasedValue: '5 seconds', | |
| value: '15 seconds', | |
| increasedValue: '30 seconds', | |
| ); | |
| // Increase | |
| semanticsOwner.performAction(semantics.id, SemanticsAction.increase); | |
| await tester.pump(); | |
| expectAdjustable(semantics, | |
| hasIncreaseAction: true, | |
| hasDecreaseAction: true, | |
| label: 'Timeout', | |
| decreasedValue: '15 seconds', | |
| value: '30 seconds', | |
| increasedValue: '1 minute', | |
| ); | |
| // Increase all the way to highest value | |
| semanticsOwner.performAction(semantics.id, SemanticsAction.increase); | |
| await tester.pump(); | |
| expectAdjustable(semantics, | |
| hasIncreaseAction: false, | |
| hasDecreaseAction: true, | |
| label: 'Timeout', | |
| decreasedValue: '30 seconds', | |
| value: '1 minute', | |
| ); | |
| // Decrease | |
| semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); | |
| await tester.pump(); | |
| expectAdjustable(semantics, | |
| hasIncreaseAction: true, | |
| hasDecreaseAction: true, | |
| label: 'Timeout', | |
| decreasedValue: '15 seconds', | |
| value: '30 seconds', | |
| increasedValue: '1 minute', | |
| ); | |
| // Decrease all the way to lowest value | |
| semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); | |
| await tester.pump(); | |
| semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); | |
| await tester.pump(); | |
| semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); | |
| await tester.pump(); | |
| expectAdjustable(semantics, | |
| hasIncreaseAction: true, | |
| hasDecreaseAction: false, | |
| label: 'Timeout', | |
| value: '1 second', | |
| increasedValue: '5 seconds', | |
| ); | |
| // Clean-up | |
| semanticsHandler.dispose(); | |
| }); | |
| } | |
| void expectAdjustable( | |
| SemanticsNode node, { | |
| bool hasIncreaseAction = true, | |
| bool hasDecreaseAction = true, | |
| String label = '', | |
| String decreasedValue = '', | |
| String value = '', | |
| String increasedValue = '', | |
| }) { | |
| final SemanticsData semanticsData = node.getSemanticsData(); | |
| int actions = 0; | |
| if (hasIncreaseAction) | |
| actions |= SemanticsAction.increase.index; | |
| if (hasDecreaseAction) | |
| actions |= SemanticsAction.decrease.index; | |
| expect(semanticsData.actions, actions); | |
| expect(semanticsData.label, label); | |
| expect(semanticsData.decreasedValue, decreasedValue); | |
| expect(semanticsData.value, value); | |
| expect(semanticsData.increasedValue, increasedValue); | |
| } |