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

import 'dart:mirrors';

const string = 'a metadata string';

const symbol = const Symbol('symbol');

const hest = 'hest';

@symbol
@string
class MyClass {
  @hest
  @hest
  @symbol
  var x;
  var y;

  @string
  @symbol
  @string
  myMethod() => 1;
  myOtherMethod() => 2;
}

checkMetadata(DeclarationMirror mirror, List expectedMetadata) {
  List metadata = mirror.metadata.map((m) => m.reflectee).toList();
  if (metadata == null) {
    throw 'Null metadata on $mirror';
  }
  int expectedLength = expectedMetadata.length;
  int actualLength = metadata.length;
  if (expectedLength != actualLength) {
    throw 'Expected length = $expectedLength, but got length = $actualLength.';
  }
  for (int i = 0; i < expectedLength; i++) {
    if (metadata[i] != expectedMetadata[i]) {
      throw '${metadata[i]} is not "${expectedMetadata[i]}"'
          ' in $mirror at index $i';
    }
  }
  print(metadata);
}

@symbol
@string
@symbol
main() {
  if (MirrorSystem.getName(symbol) != 'symbol') {
    // This happened in dart2js due to how early library metadata is
    // computed.
    throw 'Bad constant: $symbol';
  }

  MirrorSystem mirrors = currentMirrorSystem();
  ClassMirror myClassMirror = reflectClass(MyClass);
  checkMetadata(myClassMirror, [symbol, string]);
  LibraryMirror lib = mirrors.findLibrary(#test.metadata_test);
  MethodMirror function = lib.declarations[#main] as MethodMirror;
  checkMetadata(function, [symbol, string, symbol]);
  MethodMirror method = myClassMirror.declarations[#myMethod] as MethodMirror;
  checkMetadata(method, [string, symbol, string]);
  method = myClassMirror.declarations[#myOtherMethod] as MethodMirror;
  checkMetadata(method, []);

  VariableMirror xMirror = myClassMirror.declarations[#x] as VariableMirror;
  checkMetadata(xMirror, [hest, hest, symbol]);

  VariableMirror yMirror = myClassMirror.declarations[#y] as VariableMirror;
  checkMetadata(yMirror, []);

  // TODO(ahe): Test local functions.
}
