// Copyright (c) 2014, 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.

import "dart:mirrors";

import 'package:expect/expect.dart';

class ParameterAnnotation {
  final String value;
  const ParameterAnnotation(this.value);
}

class Foo {
  Foo(@ParameterAnnotation("vogel") p) {}
  Foo.named(@ParameterAnnotation("hamster") p) {}
  Foo.named2(
      @ParameterAnnotation("hamster") p, @ParameterAnnotation("wurm") p2) {}

  f1(@ParameterAnnotation("hest") p) {}
  f2(@ParameterAnnotation("hest") @ParameterAnnotation("fisk") p) {}
  f3(a, @ParameterAnnotation("fugl") p) {}
  f4(@ParameterAnnotation("fisk") a, {@ParameterAnnotation("hval") p}) {}
  f5(@ParameterAnnotation("fisk") a, [@ParameterAnnotation("hval") p]) {}
  f6({@ParameterAnnotation("fisk") z, @ParameterAnnotation("hval") p}) {}

  set s1(@ParameterAnnotation("cheval") p) {}
}

expectAnnotations(
    Type type, Symbol method, int parameterIndex, List<String> expectedValues) {
  MethodMirror mirror = reflectClass(type).declarations[method] as MethodMirror;
  ParameterMirror parameter = mirror.parameters[parameterIndex];
  List<InstanceMirror> annotations = parameter.metadata;
  Expect.equals(annotations.length, expectedValues.length,
      "wrong number of parameter annotations");
  for (int i = 0; i < annotations.length; i++) {
    Expect.equals(
        expectedValues[i],
        annotations[i].reflectee.value,
        "annotation #$i of parameter #$parameterIndex "
        "of $type.$method.");
  }
}

main() {
  expectAnnotations(Foo, #Foo, 0, ["vogel"]);
  expectAnnotations(Foo, #Foo.named, 0, ["hamster"]);
  expectAnnotations(Foo, #Foo.named2, 0, ["hamster"]);
  expectAnnotations(Foo, #Foo.named2, 1, ["wurm"]);

  expectAnnotations(Foo, #f1, 0, ["hest"]);
  expectAnnotations(Foo, #f2, 0, ["hest", "fisk"]);
  expectAnnotations(Foo, #f3, 0, []);
  expectAnnotations(Foo, #f3, 1, ["fugl"]);
  expectAnnotations(Foo, #f4, 0, ["fisk"]);
  expectAnnotations(Foo, #f4, 1, ["hval"]);
  expectAnnotations(Foo, #f5, 0, ["fisk"]);
  expectAnnotations(Foo, #f5, 1, ["hval"]);
  expectAnnotations(Foo, #f6, 0, ["fisk"]);
  expectAnnotations(Foo, #f6, 1, ["hval"]);

  expectAnnotations(Foo, const Symbol('s1='), 0, ["cheval"]);
}
