// 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/src/widgets/framework.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('InheritedTreeCache returns null if element is not found', (WidgetTester tester) async { final InheritedTreeCache parent = InheritedTreeCache(); expect(parent[InheritedElementA], isNull); }); testWidgets('InheritedTreeCache can look up element from parent', (WidgetTester tester) async { final InheritedTreeCache parent = InheritedTreeCache(); final InheritedTreeCache child = InheritedTreeCache(parent); final InheritedElementA elementA = InheritedElementA(const InheritedWidgetA()); parent[InheritedElementA] = elementA; expect(child[InheritedElementA], elementA); }); testWidgets('InheritedTreeCache can look up multiple elements from parent', (WidgetTester tester) async { final InheritedTreeCache parent = InheritedTreeCache(); final InheritedTreeCache child = InheritedTreeCache(parent); final InheritedElementA elementA = InheritedElementA(const InheritedWidgetA()); final InheritedElementA elementB = InheritedElementA(const InheritedWidgetB()); parent[InheritedElementA] = elementA; parent[InheritedElementB] = elementB; expect(child[InheritedElementA], elementA); expect(child[InheritedElementB], elementB); }); testWidgets('InheritedTreeCache does not cache nulls', (WidgetTester tester) async { final InheritedTreeCache parent = InheritedTreeCache(); final InheritedTreeCache child = InheritedTreeCache(parent); final InheritedElementA elementA = InheritedElementA(const InheritedWidgetA()); // First look up element that has not been cached. expect(child[InheritedElementA], null); // Then manually add element to parent. parent[InheritedElementA] = elementA; // Then the child should be able to find it. expect(child[InheritedElementA], elementA); }); } class InheritedElementA extends InheritedElement { InheritedElementA(InheritedWidget widget) : super(widget); } class InheritedWidgetA extends InheritedWidget { const InheritedWidgetA({ Key? key }) : super(child: const SizedBox(), key: key); @override bool updateShouldNotify(covariant InheritedWidget oldWidget) { return true; } } class InheritedElementB extends InheritedElement { InheritedElementB(InheritedWidget widget) : super(widget); } class InheritedWidgetB extends InheritedWidget { const InheritedWidgetB({ Key? key }) : super(child: const SizedBox(), key: key); @override bool updateShouldNotify(covariant InheritedWidget oldWidget) { return true; } }