| // Copyright 2014 The Flutter 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/rendering.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| |
| Future<void> pumpContainer(WidgetTester tester, Widget child) async { |
| await tester.pumpWidget( |
| DefaultSelectionStyle( |
| selectionColor: Colors.red, |
| child: child, |
| ), |
| ); |
| } |
| |
| testWidgets('updates its registrar and delegate based on the number of selectables', (WidgetTester tester) async { |
| final TestSelectionRegistrar registrar = TestSelectionRegistrar(); |
| final TestContainerDelegate delegate = TestContainerDelegate(); |
| await pumpContainer( |
| tester, |
| SelectionContainer( |
| registrar: registrar, |
| delegate: delegate, |
| child: Column( |
| children: const <Widget>[ |
| Text('column1', textDirection: TextDirection.ltr), |
| Text('column2', textDirection: TextDirection.ltr), |
| Text('column3', textDirection: TextDirection.ltr), |
| ], |
| ), |
| ), |
| ); |
| expect(registrar.selectables.length, 1); |
| expect(delegate.selectables.length, 3); |
| }); |
| |
| testWidgets('disabled container', (WidgetTester tester) async { |
| final TestSelectionRegistrar registrar = TestSelectionRegistrar(); |
| final TestContainerDelegate delegate = TestContainerDelegate(); |
| await pumpContainer( |
| tester, |
| SelectionContainer( |
| registrar: registrar, |
| delegate: delegate, |
| child: SelectionContainer.disabled( |
| child: Column( |
| children: const <Widget>[ |
| Text('column1', textDirection: TextDirection.ltr), |
| Text('column2', textDirection: TextDirection.ltr), |
| Text('column3', textDirection: TextDirection.ltr), |
| ], |
| ), |
| ), |
| ), |
| ); |
| expect(registrar.selectables.length, 0); |
| expect(delegate.selectables.length, 0); |
| }); |
| |
| testWidgets('selection container registers itself if there is a selectable child', (WidgetTester tester) async { |
| final TestSelectionRegistrar registrar = TestSelectionRegistrar(); |
| final TestContainerDelegate delegate = TestContainerDelegate(); |
| await pumpContainer( |
| tester, |
| SelectionContainer( |
| registrar: registrar, |
| delegate: delegate, |
| child: Column( |
| ), |
| ), |
| ); |
| expect(registrar.selectables.length, 0); |
| |
| await pumpContainer( |
| tester, |
| SelectionContainer( |
| registrar: registrar, |
| delegate: delegate, |
| child: Column( |
| children: const <Widget>[ |
| Text('column1', textDirection: TextDirection.ltr), |
| ], |
| ), |
| ), |
| ); |
| expect(registrar.selectables.length, 1); |
| |
| await pumpContainer( |
| tester, |
| SelectionContainer( |
| registrar: registrar, |
| delegate: delegate, |
| child: Column( |
| ), |
| ), |
| ); |
| expect(registrar.selectables.length, 0); |
| }); |
| |
| testWidgets('selection container gets registrar from context if not provided', (WidgetTester tester) async { |
| final TestSelectionRegistrar registrar = TestSelectionRegistrar(); |
| final TestContainerDelegate delegate = TestContainerDelegate(); |
| |
| await pumpContainer( |
| tester, |
| SelectionRegistrarScope( |
| registrar: registrar, |
| child: SelectionContainer( |
| delegate: delegate, |
| child: Column( |
| children: const <Widget>[ |
| Text('column1', textDirection: TextDirection.ltr), |
| ], |
| ), |
| ), |
| ), |
| ); |
| expect(registrar.selectables.length, 1); |
| }); |
| } |
| |
| class TestContainerDelegate extends MultiSelectableSelectionContainerDelegate { |
| @override |
| SelectionResult dispatchSelectionEventToChild(Selectable selectable, SelectionEvent event) { |
| throw UnimplementedError(); |
| } |
| |
| @override |
| void ensureChildUpdated(Selectable selectable) { |
| throw UnimplementedError(); |
| } |
| } |
| |
| class TestSelectionRegistrar extends SelectionRegistrar { |
| final Set<Selectable> selectables = <Selectable>{}; |
| |
| @override |
| void add(Selectable selectable) => selectables.add(selectable); |
| |
| @override |
| void remove(Selectable selectable) => selectables.remove(selectable); |
| } |