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

// @dart = 2.9

library lib;

import "dart:mirrors";

import "package:expect/expect.dart";

doNothing42() {}

int _x = 5;
int get topGetter => _x;
void set topSetter(x) {
  _x = x;
}

abstract class AbstractC {
  AbstractC();

  void bar();
  get priv;
  set priv(value);
}

abstract class C extends AbstractC {
  static foo() {}

  C();
  C.other();
  C.other2() : this.other();

  var _priv;
  get priv => _priv;
  set priv(value) => _priv = value;
}

checkKinds(method, kinds) {
  Expect.equals(kinds[0], method.isStatic, "isStatic");
  Expect.equals(kinds[1], method.isAbstract, "isAbstract");
  Expect.equals(kinds[2], method.isGetter, "isGetter");
  Expect.equals(kinds[3], method.isSetter, "isSetter");
  Expect.equals(kinds[4], method.isConstructor, "isConstructor");
  Expect.equals(false, method.isExtensionMember, "isExtension");
}

main() {
  // Top level functions should be static.
  var closureMirror = reflect(doNothing42) as ClosureMirror;
  checkKinds(closureMirror.function, [true, false, false, false, false]);
  var libraryMirror = reflectClass(C).owner as LibraryMirror;
  checkKinds(libraryMirror.declarations[#topGetter],
      [true, false, true, false, false]);
  checkKinds(libraryMirror.declarations[const Symbol("topSetter=")],
      [true, false, false, true, false]);
  var classMirror;
  classMirror = reflectClass(C);
  checkKinds(
      classMirror.declarations[#foo], [true, false, false, false, false]);
  checkKinds(
      classMirror.declarations[#priv], [false, false, true, false, false]);
  checkKinds(classMirror.declarations[const Symbol("priv=")],
      [false, false, false, true, false]);
  checkKinds(classMirror.declarations[#C], [false, false, false, false, true]);
  checkKinds(
      classMirror.declarations[#C.other], [false, false, false, false, true]);
  checkKinds(
      classMirror.declarations[#C.other2], [false, false, false, false, true]);
  classMirror = reflectClass(AbstractC);
  checkKinds(
      classMirror.declarations[#AbstractC], [false, false, false, false, true]);
  checkKinds(
      classMirror.declarations[#bar], [false, true, false, false, false]);
  checkKinds(
      classMirror.declarations[#priv], [false, true, true, false, false]);
  checkKinds(classMirror.declarations[const Symbol("priv=")],
      [false, true, false, true, false]);
}
