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

// Regression test for Issue 13817.

library test.metadata_constructor_arguments;

import 'dart:mirrors';
import 'package:expect/expect.dart';

class Tag {
  final name;
  const Tag({named}) : this.name = named;
}

@Tag(named: undefined) // //# 01: compile-time error
class A {}

@Tag(named: 'valid')
class B {}

@Tag(named: C.STATIC_FIELD)
class C {
  static const STATIC_FIELD = 3;
}

@Tag(named: D.instanceMethod()) // //# 02: compile-time error
class D {
  instanceMethod() {}
}

@Tag(named: instanceField) // //# 03: compile-time error
class E {
  var instanceField;
}

@Tag(named: F.nonConstStaticField) // //# 04: compile-time error
class F {
  static var nonConstStaticField = 6;
}

@Tag(named: instanceMethod) // //# 05: compile-time error
class G {
  instanceMethod() {}
}

@Tag(named: this) // //# 06: compile-time error
class H {
  instanceMethod() {}
}

@Tag(named: super) // //# 07: compile-time error
class I {
  instanceMethod() {}
}

checkMetadata(DeclarationMirror mirror, List expectedMetadata) {
  Expect.listEquals(expectedMetadata.map(reflect).toList(), mirror.metadata);
}

main() {
  reflectClass(A).metadata;
  checkMetadata(reflectClass(B), [const Tag(named: 'valid')]);
  checkMetadata(reflectClass(C), [const Tag(named: C.STATIC_FIELD)]);
  reflectClass(D).metadata;
  reflectClass(E).metadata;
  reflectClass(F).metadata;
  reflectClass(G).metadata;
  reflectClass(H).metadata;
  reflectClass(I).metadata;
}
