// 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/material.dart'; import 'package:test/test.dart'; bool _hasAncestorOfType(Element element, Type targetType) { expect(element, isNotNull); bool result = false; element.visitAncestorElements((Element ancestor) { if (ancestor.widget.runtimeType == targetType) { result = true; return false; } return true; }); return result; } class _IsOnStage extends Matcher { const _IsOnStage(); bool matches(item, Map matchState) => !_hasAncestorOfType(item, OffStage); Description describe(Description description) => description.add('onstage'); } class _IsOffStage extends Matcher { const _IsOffStage(); bool matches(item, Map matchState) => _hasAncestorOfType(item, OffStage); Description describe(Description description) => description.add('offstage'); } class _IsInCard extends Matcher { const _IsInCard(); bool matches(item, Map matchState) => _hasAncestorOfType(item, Card); Description describe(Description description) => description.add('in card'); } class _IsNotInCard extends Matcher { const _IsNotInCard(); bool matches(item, Map matchState) => !_hasAncestorOfType(item, Card); Description describe(Description description) => description.add('not in card'); } const Matcher isOnStage = const _IsOnStage(); const Matcher isOffStage = const _IsOffStage(); const Matcher isInCard = const _IsInCard(); const Matcher isNotInCard = const _IsNotInCard();