// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. 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:matcher/matcher.dart'; import 'package:test/test.dart' show test; import 'test_utils.dart'; class _BadCustomMatcher extends CustomMatcher { _BadCustomMatcher() : super('feature', 'description', {1: 'a'}); @override Object? featureValueOf(dynamic actual) => throw Exception('bang'); } class _HasPrice extends CustomMatcher { _HasPrice(Object? matcher) : super('Widget with a price that is', 'price', matcher); @override Object? featureValueOf(Object? actual) => (actual as Widget).price; } void main() { test('Feature Matcher', () { var w = Widget(); w.price = 10; shouldPass(w, _HasPrice(10)); shouldPass(w, _HasPrice(greaterThan(0))); shouldFail( w, _HasPrice(greaterThan(10)), 'Expected: Widget with a price that is a value greater than <10> ' "Actual: " 'Which: has price with value <10> which is not ' 'a value greater than <10>', ); }); test('Custom Matcher Exception', () { shouldFail( 'a', _BadCustomMatcher(), allOf([ contains("Expected: feature {1: 'a'} "), contains("Actual: 'a' "), contains("Which: threw 'Exception: bang' "), ]), ); }); }