dispose_ancestor_lookup_test.dart 3.84 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
// @dart = 2.8

7
import 'package:flutter_test/flutter_test.dart';
8 9
import 'package:flutter/widgets.dart';

10
typedef TestCallback = void Function(BuildContext context);
11 12

class TestWidget extends StatefulWidget {
13
  const TestWidget(this.callback, { Key key }) : super(key: key);
14 15 16 17

  final TestCallback callback;

  @override
18
  TestWidgetState createState() => TestWidgetState();
19 20 21 22 23 24 25 26 27 28
}

class TestWidgetState extends State<TestWidget> {
  @override
  void dispose() {
    widget.callback(context);
    super.dispose();
  }

  @override
Ian Hickson's avatar
Ian Hickson committed
29
  Widget build(BuildContext context) => const Text('test', textDirection: TextDirection.ltr);
30 31 32
}

void main() {
33
  testWidgets('dependOnInheritedWidgetOfExactType() called from dispose() throws error', (WidgetTester tester) async {
34 35
    bool disposeCalled = false;
    await tester.pumpWidget(
36
      TestWidget((BuildContext context) {
37
        disposeCalled = true;
38
        context.dependOnInheritedWidgetOfExactType<InheritedWidget>();
39 40
      }),
    );
41
    await tester.pumpWidget(Container());
42 43 44 45
    expect(disposeCalled, isTrue);
    expect(tester.takeException(), isFlutterError);
  });

46
  testWidgets('getElementForInheritedWidgetOfExactType() called from dispose() throws error', (WidgetTester tester) async {
47 48
    bool disposeCalled = false;
    await tester.pumpWidget(
49
      TestWidget((BuildContext context) {
50
        disposeCalled = true;
51
        context.getElementForInheritedWidgetOfExactType<InheritedWidget>();
52 53
      }),
    );
54
    await tester.pumpWidget(Container());
55 56 57 58
    expect(disposeCalled, isTrue);
    expect(tester.takeException(), isFlutterError);
  });

59
  testWidgets('findAncestorWidgetOfExactType() called from dispose() throws error', (WidgetTester tester) async {
60 61
    bool disposeCalled = false;
    await tester.pumpWidget(
62
      TestWidget((BuildContext context) {
63
        disposeCalled = true;
64
        context.findAncestorWidgetOfExactType<Container>();
65 66
      }),
    );
67
    await tester.pumpWidget(Container());
68 69 70 71
    expect(disposeCalled, isTrue);
    expect(tester.takeException(), isFlutterError);
  });

72
  testWidgets('findAncestorStateOfType() called from dispose() throws error', (WidgetTester tester) async {
73 74
    bool disposeCalled = false;
    await tester.pumpWidget(
75
      TestWidget((BuildContext context) {
76
        disposeCalled = true;
77
        context.findAncestorStateOfType<State>();
78 79
      }),
    );
80
    await tester.pumpWidget(Container());
81 82 83 84
    expect(disposeCalled, isTrue);
    expect(tester.takeException(), isFlutterError);
  });

85
  testWidgets('findAncestorRenderObjectOfType() called from dispose() throws error', (WidgetTester tester) async {
86 87
    bool disposeCalled = false;
    await tester.pumpWidget(
88
      TestWidget((BuildContext context) {
89
        disposeCalled = true;
90
        context.findAncestorRenderObjectOfType<RenderObject>();
91 92
      }),
    );
93
    await tester.pumpWidget(Container());
94 95 96 97 98 99 100
    expect(disposeCalled, isTrue);
    expect(tester.takeException(), isFlutterError);
  });

  testWidgets('visitAncestorElements() called from dispose() throws error', (WidgetTester tester) async {
    bool disposeCalled = false;
    await tester.pumpWidget(
101
      TestWidget((BuildContext context) {
102
        disposeCalled = true;
103
        context.visitAncestorElements((Element element) => true);
104 105
      }),
    );
106
    await tester.pumpWidget(Container());
107 108 109 110 111 112 113
    expect(disposeCalled, isTrue);
    expect(tester.takeException(), isFlutterError);
  });

  testWidgets('dispose() method does not unconditionally throw an error', (WidgetTester tester) async {
    bool disposeCalled = false;
    await tester.pumpWidget(
114
      TestWidget((BuildContext context) {
115 116 117
        disposeCalled = true;
      }),
    );
118
    await tester.pumpWidget(Container());
119 120 121 122 123 124
    expect(disposeCalled, isTrue);
  });



}