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

// @dart = 2.9

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"]);
}
