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

@MirrorsUsed(targets: "test.instance_members")
import 'dart:mirrors';
import 'package:expect/expect.dart';

import 'declarations_model.dart' as declarations_model;

selectKeys(map, predicate) {
  return map.keys.where((key) => predicate(map[key]));
}

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, (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, (dm) => !dm.isPrivate && dm.isSynthetic));
}
