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

// Test that everything reachable from a [MirrorSystem] can be accessed.

library test.mirrors.reader;

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

class RuntimeMirrorsReader extends MirrorsReader {
  final MirrorSystem mirrorSystem;
  final String mirrorSystemType;

  RuntimeMirrorsReader(MirrorSystem mirrorSystem,
      {bool verbose: false, bool includeStackTrace: false})
      : this.mirrorSystem = mirrorSystem,
        this.mirrorSystemType = '${mirrorSystem.runtimeType}',
        super(verbose: verbose, includeStackTrace: includeStackTrace);

  visitLibraryMirror(LibraryMirror mirror) {
    super.visitLibraryMirror(mirror);
    Expect.equals(mirror, mirrorSystem.libraries[mirror.uri]);
  }

  visitClassMirror(ClassMirror mirror) {
    super.visitClassMirror(mirror);
    Expect.isNotNull(mirror.owner);
  }

  bool allowUnsupported(var receiver, String tag, UnsupportedError exception) {
    if (mirrorSystemType == '_MirrorSystem') {
      // VM mirror system.
      if (tag.endsWith('location')) {
        return receiver is ParameterMirror;
      }
    } else if (mirrorSystemType == 'JsMirrorSystem') {
      // Dart2js runtime mirror system.
      if (tag.endsWith('.metadata')) {
        return true; // Issue 10905.
      }
    }
    return false;
  }

  bool expectUnsupported(var receiver, String tag, UnsupportedError exception) {
    // [DeclarationMirror.location] is intentionally not supported in runtime
    // mirrors.

    if (mirrorSystemType == '_MirrorSystem') {
      // VM mirror system.
    } else if (mirrorSystemType == 'JsMirrorSystem') {
      // Dart2js runtime mirror system.
      if (receiver is DeclarationMirror && tag == 'location') {
        return true;
      }
    }
    return false;
  }
}

void main([List<String> arguments = const <String>[]]) {
  MirrorSystem mirrors = currentMirrorSystem();
  MirrorsReader reader = new RuntimeMirrorsReader(mirrors,
      verbose: arguments.contains('-v'),
      includeStackTrace: arguments.contains('-s'));
  reader.checkMirrorSystem(mirrors);
}
