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

// @dart = 2.9

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) {}

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