stateful_components_test.dart 2.61 KB
Newer Older
Hixie's avatar
Hixie committed
1 2 3 4
// 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.

Adam Barth's avatar
Adam Barth committed
5
import 'package:flutter_test/flutter_test.dart';
6
import 'package:flutter/widgets.dart';
7 8 9
import 'package:test/test.dart';

class InnerComponent extends StatefulComponent {
10 11 12
  InnerComponent({ Key key }) : super(key: key);
  InnerComponentState createState() => new InnerComponentState();
}
13

14
class InnerComponentState extends State<InnerComponent> {
15 16
  bool _didInitState = false;

17 18
  void initState() {
    super.initState();
19 20 21
    _didInitState = true;
  }

22
  Widget build(BuildContext context) {
23 24 25 26
    return new Container();
  }
}

27
class OuterContainer extends StatefulComponent {
28
  OuterContainer({ Key key, this.child }) : super(key: key);
29

30
  final InnerComponent child;
31

32 33
  OuterContainerState createState() => new OuterContainerState();
}
34

35 36 37
class OuterContainerState extends State<OuterContainer> {
  Widget build(BuildContext context) {
    return config.child;
38 39 40 41 42
  }
}

void main() {
  test('resync stateful widget', () {
43 44 45
    testWidgets((WidgetTester tester) {
      Key innerKey = new Key('inner');
      Key outerKey = new Key('outer');
46

47 48 49 50
      InnerComponent inner1 = new InnerComponent(key: innerKey);
      InnerComponent inner2;
      OuterContainer outer1 = new OuterContainer(key: outerKey, child: inner1);
      OuterContainer outer2;
51

52
      tester.pumpWidget(outer1);
53

54 55 56 57 58
      StatefulComponentElement innerElement = tester.findElementByKey(innerKey);
      InnerComponentState innerElementState = innerElement.state;
      expect(innerElementState.config, equals(inner1));
      expect(innerElementState._didInitState, isTrue);
      expect(innerElement.renderObject.attached, isTrue);
59

60 61
      inner2 = new InnerComponent(key: innerKey);
      outer2 = new OuterContainer(key: outerKey, child: inner2);
62

63
      tester.pumpWidget(outer2);
64

65 66
      expect(tester.findElementByKey(innerKey), equals(innerElement));
      expect(innerElement.state, equals(innerElementState));
67

68 69 70
      expect(innerElementState.config, equals(inner2));
      expect(innerElementState._didInitState, isTrue);
      expect(innerElement.renderObject.attached, isTrue);
71

72 73 74 75
      StatefulComponentElement outerElement = tester.findElementByKey(outerKey);
      expect(outerElement.state.config, equals(outer2));
      outerElement.state.setState(() {});
      tester.pump();
76

77 78 79 80 81
      expect(tester.findElementByKey(innerKey), equals(innerElement));
      expect(innerElement.state, equals(innerElementState));
      expect(innerElementState.config, equals(inner2));
      expect(innerElement.renderObject.attached, isTrue);
    });
82 83
  });
}