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

library test.mirrors;

import 'dart:mirrors';

import 'package:expect/expect.dart';

class RemoteClass {
  final String name;
  const RemoteClass([this.name = "default"]);
}

class A {}

@RemoteClass("ASF")
class B extends A {}

class C extends B {}

void main() {
  bool foundB = false;

  MirrorSystem mirrorSystem = currentMirrorSystem();
  mirrorSystem.libraries.forEach((lk, l) {
    l.declarations.forEach((dk, d) {
      if (d is ClassMirror) {
        d.metadata.forEach((md) {
          InstanceMirror metadata = md as InstanceMirror;
          // Metadata must not be inherited.
          if (metadata.type == reflectClass(RemoteClass)) {
            Expect.isFalse(foundB);
            Expect.equals(#B, d.simpleName);
            foundB = true;
          }
        });
      }
    });
  });

  Expect.isTrue(foundB);
}
