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

// TODO(rmacnak): Move the existing mirror tests here (a place for 
// cross-implementation tests).

library MirrorsTest;
import "dart:mirrors";
import "../../../pkg/unittest/lib/unittest.dart";

var topLevelField;

class Class {
  Class() { this.field = "default value"; }
  Class.withInitialValue(this.field);
  var field;
  static var staticField;
}

testFieldAccess(mirrors) {
  var instance = new Class();

  var libMirror = mirrors.libraries["MirrorsTest"];
  var classMirror = libMirror.classes["Class"];
  var instMirror = reflect(instance);

  libMirror.setField('topLevelField', 42);
  var future = libMirror.getField('topLevelField');
  future.then(expectAsync1((resultMirror) {
    expect(resultMirror.reflectee, equals(42));
    expect(topLevelField, equals(42));   
  }));
  
  classMirror.setField('staticField', 43);
  future = classMirror.getField('staticField');
  future.then(expectAsync1((resultMirror) {
    expect(resultMirror.reflectee, equals(43));
    expect(Class.staticField, equals(43)); 
  }));

  instMirror.setField('field', 44);
  future = instMirror.getField('field');
  future.then(expectAsync1((resultMirror) {
    expect(resultMirror.reflectee, equals(44));
    expect(instance.field, equals(44)); 
  }));
}

testClosureMirrors(mirrors) {
  var closure = (x, y, z) { return x + y + z; };
  
  var mirror = reflect(closure);
  expect(mirror is ClosureMirror, equals(true));
  
  var funcMirror = mirror.function;
  expect(funcMirror is MethodMirror, equals(true));
  expect(funcMirror.parameters.length, equals(3));

  var future = mirror.apply([2, 4, 8]);
  future.then(expectAsync1((resultMirror) {
    expect(resultMirror.reflectee, equals(14));
  }));
}

testInvokeConstructor(mirrors) {
  var libMirror = mirrors.libraries["MirrorsTest"];
  var classMirror = libMirror.classes["Class"];
  
  var future = classMirror.newInstance('', []);
  future.then(expectAsync1((resultMirror) {
    var instance = resultMirror.reflectee;
    expect(instance is Class, equals(true));
    expect(instance.field, equals("default value"));
  }));

  future = classMirror.newInstance('withInitialValue', [45]);
  future.then(expectAsync1((resultMirror) {
    var instance = resultMirror.reflectee;
    expect(instance is Class, equals(true));
    expect(instance.field, equals(45));
  }));
}

main() {
  var mirrors = currentMirrorSystem();

  test("Test field access", () { testFieldAccess(mirrors); });
  test("Test closure mirrors", () { testClosureMirrors(mirrors); });
  test("Test invoke constructor", () { testInvokeConstructor(mirrors); });
}

