blob: e9a2640879026a809755a2e3a7400b36b57cffb4 [file] [log] [blame]
// 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/widgets.dart';
import 'test_widgets.dart';
class ProbeWidget extends StatefulWidget {
@override
ProbeWidgetState createState() => new ProbeWidgetState();
}
class ProbeWidgetState extends State<ProbeWidget> {
static int buildCount = 0;
@override
void initState() {
super.initState();
setState(() {});
}
@override
void didUpdateConfig(ProbeWidget oldConfig) {
setState(() {});
}
@override
Widget build(BuildContext context) {
setState(() {});
buildCount++;
return new Container();
}
}
class BadWidget extends StatelessWidget {
BadWidget(this.parentState);
final State parentState;
@override
Widget build(BuildContext context) {
parentState.setState(() {});
return new Container();
}
}
class BadWidgetParent extends StatefulWidget {
@override
BadWidgetParentState createState() => new BadWidgetParentState();
}
class BadWidgetParentState extends State<BadWidgetParent> {
@override
Widget build(BuildContext context) {
return new BadWidget(this);
}
}
class BadDisposeWidget extends StatefulWidget {
@override
BadDisposeWidgetState createState() => new BadDisposeWidgetState();
}
class BadDisposeWidgetState extends State<BadDisposeWidget> {
@override
Widget build(BuildContext context) {
return new Container();
}
@override
void dispose() {
setState(() { /* This is invalid behavior. */ });
super.dispose();
}
}
void main() {
testWidgets('Legal times for setState', (WidgetTester tester) async {
GlobalKey flipKey = new GlobalKey();
expect(ProbeWidgetState.buildCount, equals(0));
await tester.pumpWidget(new ProbeWidget());
expect(ProbeWidgetState.buildCount, equals(1));
await tester.pumpWidget(new ProbeWidget());
expect(ProbeWidgetState.buildCount, equals(2));
await tester.pumpWidget(new FlipWidget(
key: flipKey,
left: new Container(),
right: new ProbeWidget()
));
expect(ProbeWidgetState.buildCount, equals(2));
FlipWidgetState flipState1 = flipKey.currentState;
flipState1.flip();
await tester.pump();
expect(ProbeWidgetState.buildCount, equals(3));
FlipWidgetState flipState2 = flipKey.currentState;
flipState2.flip();
await tester.pump();
expect(ProbeWidgetState.buildCount, equals(3));
await tester.pumpWidget(new Container());
expect(ProbeWidgetState.buildCount, equals(3));
});
testWidgets('Setting parent state during build is forbidden', (WidgetTester tester) async {
await tester.pumpWidget(new BadWidgetParent());
expect(tester.takeException(), isNotNull);
await tester.pumpWidget(new Container());
});
testWidgets('Setting state during dispose is forbidden', (WidgetTester tester) async {
await tester.pumpWidget(new BadDisposeWidget());
expect(tester.takeException(), isNull);
await tester.pumpWidget(new Container());
expect(tester.takeException(), isNotNull);
});
}