// 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.

// ignore_for_file: deprecated_member_use_from_same_package

@TestOn('vm')

import 'package:matcher/mirror_matchers.dart';
import 'package:test/test.dart';

import 'test_utils.dart';

class C {
  var instanceField = 1;
  int get instanceGetter => 2;
  static var staticField = 3;
  static int get staticGetter => 4;
}

void main() {
  test('hasProperty', () {
    var foo = [3];
    shouldPass(foo, hasProperty('length', 1));
    shouldFail(
        foo,
        hasProperty('foo'),
        'Expected: has property "foo" '
        'Actual: [3] '
        'Which: has no property named "foo"');
    shouldFail(
        foo,
        hasProperty('length', 2),
        'Expected: has property "length" which matches <2> '
        'Actual: [3] '
        'Which: has property "length" with value <1>');
    var c = C();
    shouldPass(c, hasProperty('instanceField', 1));
    shouldPass(c, hasProperty('instanceGetter', 2));
    shouldFail(
        c,
        hasProperty('staticField'),
        'Expected: has property "staticField" '
        'Actual: <Instance of \'C\'> '
        'Which: has a member named "staticField",'
        ' but it is not an instance property');
    shouldFail(
        c,
        hasProperty('staticGetter'),
        'Expected: has property "staticGetter" '
        'Actual: <Instance of \'C\'> '
        'Which: has a member named "staticGetter",'
        ' but it is not an instance property');
  });
}
