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

import 'dart:mirrors';

import 'metadata_test.dart';

const m1 = 'm1';
const m2 = #m2;
const m3 = const CustomAnnotation(3);

class CustomAnnotation {
  final value;
  const CustomAnnotation(this.value);
  toString() => 'CustomAnnotation($value)';
}

class B {
  B.foo(int x) {}
  factory B.bar(@m3 @m2 int z, x) => new B.foo(0);

  baz(@m1 final int x, @m2 int y, @m3 final int z) {}
  qux(int x, [@m3 @m2 @m1 int y = 3 + 1]) {}
  quux(int x, {String str: "foo"}) {}
  corge({@m1 int x: 3 * 17, @m2 String str: "bar"}) {}

  set x(@m2 final value) {}
}

main() {
  ClassMirror cm = reflectClass(B);
  MethodMirror mm;

  mm = cm.declarations[#B.foo] as MethodMirror;
  checkMetadata(mm.parameters[0], []);

  mm = cm.declarations[#B.bar] as MethodMirror;
  checkMetadata(mm.parameters[0], [m3, m2]);
  checkMetadata(mm.parameters[1], []);

  mm = cm.declarations[#baz] as MethodMirror;
  checkMetadata(mm.parameters[0], [m1]);
  checkMetadata(mm.parameters[1], [m2]);
  checkMetadata(mm.parameters[2], [m3]);

  mm = cm.declarations[#qux] as MethodMirror;
  checkMetadata(mm.parameters[0], []);
  checkMetadata(mm.parameters[1], [m3, m2, m1]);

  mm = cm.declarations[#quux] as MethodMirror;
  checkMetadata(mm.parameters[0], []);
  checkMetadata(mm.parameters[1], []);

  mm = cm.declarations[#corge] as MethodMirror;
  checkMetadata(mm.parameters[0], [m1]);
  checkMetadata(mm.parameters[1], [m2]);

  mm = cm.declarations[const Symbol('x=')] as MethodMirror;
  checkMetadata(mm.parameters[0], [m2]);
}
