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

// Ensure that classes handled specially by dart2js can be reflected on.

library test.intercepted_class_test;

import 'dart:mirrors';

import 'stringify.dart' show stringify, expect;

checkClassMirrorMethods(ClassMirror cls) {
  var variables = new Map();
  cls.declarations.forEach((Symbol key, DeclarationMirror value) {
    if (value is VariableMirror && !value.isStatic && !value.isPrivate) {
      variables[key] = value;
    }
  });
  expect('{}', variables);
}

checkClassMirror(ClassMirror cls, String name) {
  expect('s($name)', cls.simpleName);
  checkClassMirrorMethods(cls);
}

main() {
  checkClassMirror(reflectClass(String), 'String');
  checkClassMirror(reflectClass(int), 'int');
  checkClassMirror(reflectClass(double), 'double');
  checkClassMirror(reflectClass(num), 'num');
  checkClassMirror(reflectClass(bool), 'bool');
  checkClassMirror(reflectClass(List), 'List');
}
