blob: c4992bfc634080814cbcbcd590f59a06df2fc062 [file] [log] [blame]
// 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);
}