// 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_easier.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));
}

class EasierSuperclass {
  shuper() {}
  static staticShuper() {}
}

class EasierMixin {
  mixin() {}
  static staticMixin() {}
}

class EasierMixinApplication extends EasierSuperclass with EasierMixin {
  application() {}
  static staticApplication() {}
}

class Derived extends EasierMixinApplication {
  derived() {}
  static staticDerived() {}
}

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,
    #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=')
      ],
      selectKeys(
          cm.instanceMembers, (dynamic dm) => !dm.isPrivate && dm.isSynthetic));

  cm = reflectClass(Derived);
  Expect.setEquals([
    #derived,
    #shuper,
    #mixin,
    #application,
    #hashCode,
    #runtimeType,
    #==,
    #noSuchMethod,
    #toString
  ], selectKeys(cm.instanceMembers, (dynamic dm) => !dm.isPrivate));

  cm = reflectClass(EasierMixinApplication);
  Expect.setEquals([
    #shuper,
    #mixin,
    #application,
    #hashCode,
    #runtimeType,
    #==,
    #noSuchMethod,
    #toString
  ], selectKeys(cm.instanceMembers, (dynamic dm) => !dm.isPrivate));
}
