// Copyright (c) 2011, 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 MirrorsTest;

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

bool isNSMContainingFieldName(e, String fieldName, bool isSetter) {
  if (e is! NoSuchMethodError) return false;
  String needle = fieldName;
  if (isSetter) needle += "=";
  return "$e".contains(needle) && !"$e".contains(needle + "=");
}

final finalTopLevel = 0;

class A {
  final finalInstance = 0;
  static final finalStatic = 0;
}

class B {
  B(a, b);
  factory B.fac(a, b) => new B(a, b);
}

testMessageContents() {
  var mirrors = currentMirrorSystem();
  var libMirror = mirrors.findLibrary(#MirrorsTest);
  Expect.throws(() => libMirror.invoke(#foo, []),
      (e) => isNSMContainingFieldName(e, "foo", false));
  Expect.throws(() => libMirror.getField(#foo),
      (e) => isNSMContainingFieldName(e, "foo", false));
  Expect.throws(() => libMirror.setField(#foo, null),
      (e) => isNSMContainingFieldName(e, "foo", true));
  Expect.throws(() => libMirror.setField(#finalTopLevel, null),
      (e) => isNSMContainingFieldName(e, "finalTopLevel", true));

  var classMirror = reflectClass(A);
  Expect.throws(() => classMirror.invoke(#foo, []),
      (e) => isNSMContainingFieldName(e, "foo", false));
  Expect.throws(() => classMirror.getField(#foo),
      (e) => isNSMContainingFieldName(e, "foo", false));
  Expect.throws(() => classMirror.setField(#foo, null),
      (e) => isNSMContainingFieldName(e, "foo", true));
  Expect.throws(() => classMirror.setField(#finalStatic, null),
      (e) => isNSMContainingFieldName(e, "finalStatic", true));

  var instanceMirror = reflect(new A());
  Expect.throws(() => instanceMirror.invoke(#foo, []),
      (e) => isNSMContainingFieldName(e, "foo", false));
  Expect.throws(() => instanceMirror.getField(#foo),
      (e) => isNSMContainingFieldName(e, "foo", false));
  Expect.throws(() => instanceMirror.setField(#foo, null),
      (e) => isNSMContainingFieldName(e, "foo", true));
  Expect.throws(() => instanceMirror.setField(#finalInstance, null),
      (e) => isNSMContainingFieldName(e, "finalInstance", true));
}

expectMatchingErrors(reflectiveAction, baseAction) {
  var reflectiveError, baseError;
  try {
    reflectiveAction();
  } catch (e) {
    reflectiveError = e;
  }

  try {
    baseAction();
  } catch (e) {
    baseError = e;
  }

  if (baseError.toString() != reflectiveError.toString()) {
    print("\n==Base==\n $baseError");
    print("\n==Reflective==\n $reflectiveError");
    throw "Expected matching errors";
  }
}

testMatchingMessages() {
  var mirrors = currentMirrorSystem();
  var libMirror = mirrors.findLibrary(#MirrorsTest);
  expectMatchingErrors(() => libMirror.invoke(#foo, []), () => foo());
  expectMatchingErrors(() => libMirror.getField(#foo), () => foo);
  expectMatchingErrors(() => libMirror.setField(#foo, null), () => foo = null);
  expectMatchingErrors(() => libMirror.setField(#finalTopLevel, null),
      () => finalTopLevel = null);

  var classMirror = reflectClass(A);
  expectMatchingErrors(() => classMirror.invoke(#foo, []), () => A.foo());
  expectMatchingErrors(() => classMirror.getField(#foo), () => A.foo);
  expectMatchingErrors(
      () => classMirror.setField(#foo, null), () => A.foo = null);
  expectMatchingErrors(() => classMirror.setField(#finalStatic, null),
      () => A.finalStatic = null);
  expectMatchingErrors(() => classMirror.newInstance(#constructor, [1, 2, 3]),
      () => new A.constructor(1, 2, 3));

  var instanceMirror = reflect(new A());
  expectMatchingErrors(
      () => instanceMirror.invoke(#foo, []), () => new A().foo());
  expectMatchingErrors(() => instanceMirror.getField(#foo), () => new A().foo);
  expectMatchingErrors(
      () => instanceMirror.setField(#foo, null), () => new A().foo = null);
  expectMatchingErrors(() => instanceMirror.setField(#finalInstance, null),
      () => new A().finalInstance = null);
}

main() {
  testMessageContents();
  testMatchingMessages(); //# dart2js: ok
}
