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

library test.basic_types_in_dart_core;

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

main() {
  LibraryMirror dartcore = currentMirrorSystem().findLibrary(#dart.core);
  ClassMirror cm;
  TypeMirror tm;

  cm = dartcore.declarations[#int] as ClassMirror;
  Expect.equals(reflectClass(int), cm);
  Expect.equals(#int, cm.simpleName);

  cm = dartcore.declarations[#double] as ClassMirror;
  Expect.equals(reflectClass(double), cm);
  Expect.equals(#double, cm.simpleName);

  cm = dartcore.declarations[#num] as ClassMirror;
  Expect.equals(reflectClass(num), cm);
  Expect.equals(#num, cm.simpleName);

  cm = dartcore.declarations[#bool] as ClassMirror;
  Expect.equals(reflectClass(bool), cm);
  Expect.equals(#bool, cm.simpleName);

  cm = dartcore.declarations[#String] as ClassMirror;
  Expect.equals(reflectClass(String), cm);
  Expect.equals(#String, cm.simpleName);

  cm = dartcore.declarations[#List] as ClassMirror;
  Expect.equals(reflectClass(List), cm);
  Expect.equals(#List, cm.simpleName);

  cm = dartcore.declarations[#Null] as ClassMirror;
  Expect.equals(reflectClass(Null), cm);
  Expect.equals(#Null, cm.simpleName);

  cm = dartcore.declarations[#Object] as ClassMirror;
  Expect.equals(reflectClass(Object), cm);
  Expect.equals(#Object, cm.simpleName);

  tm = dartcore.declarations[#dynamic] as TypeMirror;
  Expect.isNull(tm);

  tm = dartcore.declarations[const Symbol('void')] as TypeMirror;
  Expect.isNull(tm);
}
