// Copyright (c) 2013, 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.

library test.instance_members;

import 'dart:mirrors';
import 'package:expect/expect.dart';

import 'declarations_model.dart' as declarations_model;

selectKeys<K, V>(Map<K, V> map, bool Function(V) predicate) {
  return map.keys.where((K key) => predicate(map[key] as V));
}

main() {
  ClassMirror cm = reflectClass(declarations_model.Class);

  Expect.setEquals([
    #+,
    #instanceVariable,
    const Symbol('instanceVariable='),
    #instanceGetter,
    const Symbol('instanceSetter='),
    #instanceMethod,
    #-,
    #inheritedInstanceVariable,
    const Symbol('inheritedInstanceVariable='),
    #inheritedInstanceGetter,
    const Symbol('inheritedInstanceSetter='),
    #inheritedInstanceMethod,
    #*,
    #mixinInstanceVariable,
    const Symbol('mixinInstanceVariable='),
    #mixinInstanceGetter,
    const Symbol('mixinInstanceSetter='),
    #mixinInstanceMethod,
    #hashCode,
    #runtimeType,
    #==,
    #noSuchMethod,
    #toString
  ], selectKeys(cm.instanceMembers, (dynamic dm) => !dm.isPrivate));
  // Filter out private to avoid implementation-specific members of Object.

  Expect.setEquals(
      [
        #instanceVariable,
        const Symbol('instanceVariable='),
        #inheritedInstanceVariable,
        const Symbol('inheritedInstanceVariable='),
        #mixinInstanceVariable,
        const Symbol('mixinInstanceVariable=')
      ],
      selectKeys(
          cm.instanceMembers, (dynamic dm) => !dm.isPrivate && dm.isSynthetic));
}
