// Copyright 2015 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_test/flutter_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:test/test.dart'; Widget buildFrame({ List<String> tabs, String value, bool isScrollable: false }) { return new Material( child: new TabBarSelection<String>( value: value, values: tabs, child: new TabBar<String>( labels: new Map<String, TabLabel>.fromIterable(tabs, value: (String tab) => new TabLabel(text: tab)), isScrollable: isScrollable ) ) ); } void main() { test('TabBar tap selects tab', () { testWidgets((WidgetTester tester) { List<String> tabs = <String>['A', 'B', 'C']; tester.pumpWidget(buildFrame(tabs: tabs, value: 'C', isScrollable: false)); TabBarSelectionState<String> selection = TabBarSelection.of(tester.findText('A')); expect(selection, isNotNull); expect(selection.indexOf('A'), equals(0)); expect(selection.indexOf('B'), equals(1)); expect(selection.indexOf('C'), equals(2)); expect(tester.findText('A'), isNotNull); expect(tester.findText('B'), isNotNull); expect(tester.findText('C'), isNotNull); expect(selection.index, equals(2)); expect(selection.previousIndex, equals(2)); expect(selection.value, equals('C')); expect(selection.previousValue, equals('C')); tester.pumpWidget(buildFrame(tabs: tabs, value: 'C' ,isScrollable: false)); tester.tap(tester.findText('B')); tester.pump(); expect(selection.valueIsChanging, true); tester.pump(const Duration(seconds: 1)); // finish the animation expect(selection.valueIsChanging, false); expect(selection.value, equals('B')); expect(selection.previousValue, equals('C')); expect(selection.index, equals(1)); expect(selection.previousIndex, equals(2)); tester.pumpWidget(buildFrame(tabs: tabs, value: 'C', isScrollable: false)); tester.tap(tester.findText('C')); tester.pump(); tester.pump(const Duration(seconds: 1)); expect(selection.value, equals('C')); expect(selection.previousValue, equals('B')); expect(selection.index, equals(2)); expect(selection.previousIndex, equals(1)); tester.pumpWidget(buildFrame(tabs: tabs, value: 'C', isScrollable: false)); tester.tap(tester.findText('A')); tester.pump(); tester.pump(const Duration(seconds: 1)); expect(selection.value, equals('A')); expect(selection.previousValue, equals('C')); expect(selection.index, equals(0)); expect(selection.previousIndex, equals(2)); }); }); test('Scrollable TabBar tap selects tab', () { testWidgets((WidgetTester tester) { List<String> tabs = <String>['A', 'B', 'C']; tester.pumpWidget(buildFrame(tabs: tabs, value: 'C', isScrollable: true)); TabBarSelectionState<String> selection = TabBarSelection.of(tester.findText('A')); expect(selection, isNotNull); expect(tester.findText('A'), isNotNull); expect(tester.findText('B'), isNotNull); expect(tester.findText('C'), isNotNull); expect(selection.value, equals('C')); tester.pumpWidget(buildFrame(tabs: tabs, value: 'C', isScrollable: true)); tester.tap(tester.findText('B')); tester.pump(); expect(selection.value, equals('B')); tester.pumpWidget(buildFrame(tabs: tabs, value: 'C', isScrollable: true)); tester.tap(tester.findText('C')); tester.pump(); expect(selection.value, equals('C')); tester.pumpWidget(buildFrame(tabs: tabs, value: 'C', isScrollable: true)); tester.tap(tester.findText('A')); tester.pump(); expect(selection.value, equals('A')); }); }); }