anchor.diff:  
   Matcher _badCustomMatcher() => const TypeMatcher<Widget>()
       .having((e) => throw Exception('bang'), 'feature', {1: 'a'});
  +
  +class CustomRangeError extends RangeError {
  +  CustomRangeError.range(num invalidValue, int minValue, int maxValue)
  +      : super.range(invalidValue, minValue, maxValue);
  +
  +  @override
  +  String toString() => 'RangeError: Invalid value: details';
  +}
  
positive.code:             .having((e) => e.end, 'end', lessThanOrEqualTo(20))));
    });
  
    group('CustomMater copy', () {
      test('Feature Matcher', () {
        var w = Widget();
        w.price = 10;
  
negative.code: 
    test('failure', () {
      shouldFail(
        CustomRangeError.range(-1, 1, 10),
        _rangeMatcher,
        "Expected: <Instance of 'RangeError'> with "
        "`message`: contains 'details' and `start`: null and `end`: null "
        'Actual: CustomRangeError:<RangeError: Invalid value: details> '
        "Which: has `message` with value 'Invalid value'",
      );
    });
  
    // This code is used in the [TypeMatcher] doc comments.
    test('integration and example', () {
      void shouldThrowRangeError(int value) {
        throw RangeError.range(value, 10, 20);
      }
  