stateful_components_test.dart 2.62 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
import 'package:test/test.dart';

9 10
class InnerWidget extends StatefulWidget {
  InnerWidget({ Key key }) : super(key: key);
11 12

  @override
13
  InnerWidgetState createState() => new InnerWidgetState();
14
}
15

16
class InnerWidgetState extends State<InnerWidget> {
17 18
  bool _didInitState = false;

19
  @override
20 21
  void initState() {
    super.initState();
22 23 24
    _didInitState = true;
  }

25
  @override
26
  Widget build(BuildContext context) {
27 28 29 30
    return new Container();
  }
}

31
class OuterContainer extends StatefulWidget {
32
  OuterContainer({ Key key, this.child }) : super(key: key);
33

34
  final InnerWidget child;
35

36
  @override
37 38
  OuterContainerState createState() => new OuterContainerState();
}
39

40
class OuterContainerState extends State<OuterContainer> {
41
  @override
42 43
  Widget build(BuildContext context) {
    return config.child;
44 45 46 47 48
  }
}

void main() {
  test('resync stateful widget', () {
49
    testElementTree((ElementTreeTester tester) {
50 51
      Key innerKey = new Key('inner');
      Key outerKey = new Key('outer');
52

53 54
      InnerWidget inner1 = new InnerWidget(key: innerKey);
      InnerWidget inner2;
55 56
      OuterContainer outer1 = new OuterContainer(key: outerKey, child: inner1);
      OuterContainer outer2;
57

58
      tester.pumpWidget(outer1);
59

60 61
      StatefulElement innerElement = tester.findElementByKey(innerKey);
      InnerWidgetState innerElementState = innerElement.state;
62 63 64
      expect(innerElementState.config, equals(inner1));
      expect(innerElementState._didInitState, isTrue);
      expect(innerElement.renderObject.attached, isTrue);
65

66
      inner2 = new InnerWidget(key: innerKey);
67
      outer2 = new OuterContainer(key: outerKey, child: inner2);
68

69
      tester.pumpWidget(outer2);
70

71 72
      expect(tester.findElementByKey(innerKey), equals(innerElement));
      expect(innerElement.state, equals(innerElementState));
73

74 75 76
      expect(innerElementState.config, equals(inner2));
      expect(innerElementState._didInitState, isTrue);
      expect(innerElement.renderObject.attached, isTrue);
77

78
      StatefulElement outerElement = tester.findElementByKey(outerKey);
79 80 81
      expect(outerElement.state.config, equals(outer2));
      outerElement.state.setState(() {});
      tester.pump();
82

83 84 85 86 87
      expect(tester.findElementByKey(innerKey), equals(innerElement));
      expect(innerElement.state, equals(innerElementState));
      expect(innerElementState.config, equals(inner2));
      expect(innerElement.renderObject.attached, isTrue);
    });
88 89
  });
}