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

import 'dart:mirrors';

import 'package:expect/expect.dart';

import 'model.dart';
import 'stringify.dart';

variablesOf(ClassMirror cm) {
  var result = new Map();
  cm.declarations.forEach((k, v) {
    if (v is VariableMirror) result[k] = v;
  });
  return result;
}

gettersOf(ClassMirror cm) {
  var result = new Map();
  cm.declarations.forEach((k, v) {
    if (v is MethodMirror && v.isGetter) result[k] = v;
  });
  return result;
}

settersOf(ClassMirror cm) {
  var result = new Map();
  cm.declarations.forEach((k, v) {
    if (v is MethodMirror && v.isSetter) result[k] = v;
  });
  return result;
}

methodsOf(ClassMirror cm) {
  var result = new Map();
  cm.declarations.forEach((k, v) {
    if (v is MethodMirror && v.isRegularMethod) result[k] = v;
  });
  return result;
}

main() {
  var unnamed = new Symbol('');
  var field = new Symbol('field');
  var instanceMethod = new Symbol('instanceMethod');
  var accessor = new Symbol('accessor');
  var aMethod = new Symbol('aMethod');
  var bMethod = new Symbol('bMethod');
  var cMethod = new Symbol('cMethod');

  var aClass = reflectClass(A);
  var bClass = reflectClass(B);
  var cClass = reflectClass(C);
  var a = aClass.newInstance(unnamed, []);
  var b = bClass.newInstance(unnamed, []);
  var c = cClass.newInstance(unnamed, []);

  expect('{field: Variable(s(field) in s(A))}', variablesOf(aClass));
  expect('{}', variablesOf(bClass));
  expect('{}', variablesOf(cClass));

  Expect.isNull(a.getField(field).reflectee);
  Expect.equals('B:get field', b.getField(field).reflectee);
  Expect.equals('B:get field', c.getField(field).reflectee);

  Expect.equals(42, a.setField(field, 42).reflectee);
  Expect.equals(87, b.setField(field, 87).reflectee);
  Expect.equals(89, c.setField(field, 89).reflectee);

  Expect.equals(42, a.getField(field).reflectee);
  Expect.equals('B:get field', b.getField(field).reflectee);
  Expect.equals('B:get field', c.getField(field).reflectee);
  Expect.equals(89, fieldC);

  expect(
    '{accessor: Method(s(accessor) in s(A), getter)'
    '}',
    gettersOf(aClass),
  );
  expect(
    '{accessor: Method(s(accessor) in s(B), getter)'
    ', field: Method(s(field) in s(B), getter)}',
    gettersOf(bClass),
  );
  expect('{accessor: Method(s(accessor) in s(C), getter)}', gettersOf(cClass));

  expect(
    '{accessor=: Method(s(accessor=) in s(A), setter)'
    '}',
    settersOf(aClass),
  );
  expect(
    '{accessor=: Method(s(accessor=) in s(B), setter)}',
    settersOf(bClass),
  );
  expect(
    '{accessor=: Method(s(accessor=) in s(C), setter)'
    ', field=: Method(s(field=) in s(C), setter)}',
    settersOf(cClass),
  );

  Expect.equals('A:instanceMethod(7)', a.invoke(instanceMethod, [7]).reflectee);
  Expect.equals('B:instanceMethod(9)', b.invoke(instanceMethod, [9]).reflectee);
  Expect.equals(
    'C:instanceMethod(13)',
    c.invoke(instanceMethod, [13]).reflectee,
  );

  expect(
    '{aMethod: Method(s(aMethod) in s(A))'
    ', instanceMethod: Method(s(instanceMethod) in s(A))}',
    methodsOf(aClass),
  );

  expect(
    '{bMethod: Method(s(bMethod) in s(B))'
    ', instanceMethod: Method(s(instanceMethod) in s(B))}',
    methodsOf(bClass),
  );
  expect(
    '{cMethod: Method(s(cMethod) in s(C))'
    ', instanceMethod: Method(s(instanceMethod) in s(C))}',
    methodsOf(cClass),
  );

  Expect.equals('A:get accessor', a.getField(accessor).reflectee);
  Expect.equals('B:get accessor', b.getField(accessor).reflectee);
  Expect.equals('C:get accessor', c.getField(accessor).reflectee);

  Expect.equals('foo', a.setField(accessor, 'foo').reflectee);
  Expect.equals('bar', b.setField(accessor, 'bar').reflectee);
  Expect.equals('baz', c.setField(accessor, 'baz').reflectee);

  Expect.equals('foo', accessorA);
  Expect.equals('bar', accessorB);
  Expect.equals('baz', accessorC);

  Expect.equals('aMethod', a.invoke(aMethod, []).reflectee);
  Expect.equals('aMethod', b.invoke(aMethod, []).reflectee);
  Expect.equals('aMethod', c.invoke(aMethod, []).reflectee);

  Expect.throwsNoSuchMethodError(() => a.invoke(bMethod, []));
  Expect.equals('bMethod', b.invoke(bMethod, []).reflectee);
  Expect.equals('bMethod', c.invoke(bMethod, []).reflectee);

  Expect.throwsNoSuchMethodError(() => a.invoke(cMethod, []));
  Expect.throwsNoSuchMethodError(() => b.invoke(cMethod, []));
  Expect.equals('cMethod', c.invoke(cMethod, []).reflectee);
}
