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

import "dart:mirrors";

import "package:expect/expect.dart";

class Superclass {}

class Subclass1 extends Superclass {}

class Subclass2 extends Superclass {}

typedef bool NumberPredicate(num x);
typedef bool IntegerPredicate(int x);
typedef bool DoublePredicate(double x);

typedef num NumberGenerator();
typedef int IntegerGenerator();
typedef double DoubleGenerator();

test(MirrorSystem mirrors) {
  LibraryMirror coreLibrary = mirrors.findLibrary(#dart.core);
  LibraryMirror thisLibrary = mirrors.findLibrary(#test.relation_subclass);

  ClassMirror Super = thisLibrary.declarations[#Superclass] as ClassMirror;
  ClassMirror Sub1 = thisLibrary.declarations[#Subclass1] as ClassMirror;
  ClassMirror Sub2 = thisLibrary.declarations[#Subclass2] as ClassMirror;
  ClassMirror Obj = coreLibrary.declarations[#Object] as ClassMirror;
  ClassMirror Nul = coreLibrary.declarations[#Null] as ClassMirror;

  Expect.isTrue(Obj.isSubclassOf(Obj));
  Expect.isTrue(Super.isSubclassOf(Super));
  Expect.isTrue(Sub1.isSubclassOf(Sub1));
  Expect.isTrue(Sub2.isSubclassOf(Sub2));
  Expect.isTrue(Nul.isSubclassOf(Nul));

  Expect.isTrue(Sub1.isSubclassOf(Super));
  Expect.isFalse(Super.isSubclassOf(Sub1));

  Expect.isTrue(Sub2.isSubclassOf(Super));
  Expect.isFalse(Super.isSubclassOf(Sub2));

  Expect.isFalse(Sub2.isSubclassOf(Sub1));
  Expect.isFalse(Sub1.isSubclassOf(Sub2));

  Expect.isTrue(Sub1.isSubclassOf(Obj));
  Expect.isFalse(Obj.isSubclassOf(Sub1));

  Expect.isTrue(Sub2.isSubclassOf(Obj));
  Expect.isFalse(Obj.isSubclassOf(Sub2));

  Expect.isTrue(Super.isSubclassOf(Obj));
  Expect.isFalse(Obj.isSubclassOf(Super));

  Expect.isTrue(Nul.isSubclassOf(Obj));
  Expect.isFalse(Obj.isSubclassOf(Nul));
  Expect.isFalse(Nul.isSubclassOf(Super));
  Expect.isFalse(Super.isSubclassOf(Nul));

  ClassMirror Func = coreLibrary.declarations[#Function] as ClassMirror;
  Expect.isTrue(Func.isSubclassOf(Obj));
  Expect.isFalse(Obj.isSubclassOf(Func));

  // Function typedef.
  dynamic NumPred = thisLibrary.declarations[#NumberPredicate];
  dynamic IntPred = thisLibrary.declarations[#IntegerPredicate];
  dynamic DubPred = thisLibrary.declarations[#DoublePredicate];
  dynamic NumGen = thisLibrary.declarations[#NumberGenerator];
  dynamic IntGen = thisLibrary.declarations[#IntegerGenerator];
  dynamic DubGen = thisLibrary.declarations[#DoubleGenerator];

  isArgumentOrTypeError(e) => e is ArgumentError || e is TypeError;
  Expect.throws(() => Func.isSubclassOf(NumPred), isArgumentOrTypeError);
  Expect.throws(() => Func.isSubclassOf(IntPred), isArgumentOrTypeError);
  Expect.throws(() => Func.isSubclassOf(DubPred), isArgumentOrTypeError);
  Expect.throws(() => Func.isSubclassOf(NumGen), isArgumentOrTypeError);
  Expect.throws(() => Func.isSubclassOf(IntGen), isArgumentOrTypeError);
  Expect.throws(() => Func.isSubclassOf(DubGen), isArgumentOrTypeError);

  Expect.throwsNoSuchMethodError(() => NumPred.isSubclassOf(Func));
  Expect.throwsNoSuchMethodError(() => IntPred.isSubclassOf(Func));
  Expect.throwsNoSuchMethodError(() => DubPred.isSubclassOf(Func));
  Expect.throwsNoSuchMethodError(() => NumGen.isSubclassOf(Func));
  Expect.throwsNoSuchMethodError(() => IntGen.isSubclassOf(Func));
  Expect.throwsNoSuchMethodError(() => DubGen.isSubclassOf(Func));

  // Function type.
  TypeMirror NumPredRef = (NumPred as TypedefMirror).referent;
  TypeMirror IntPredRef = (IntPred as TypedefMirror).referent;
  TypeMirror DubPredRef = (DubPred as TypedefMirror).referent;
  TypeMirror NumGenRef = (NumGen as TypedefMirror).referent;
  TypeMirror IntGenRef = (IntGen as TypedefMirror).referent;
  TypeMirror DubGenRef = (DubGen as TypedefMirror).referent;

  Expect.isFalse(Func.isSubclassOf(NumPredRef));
  Expect.isFalse(Func.isSubclassOf(IntPredRef));
  Expect.isFalse(Func.isSubclassOf(DubPredRef));
  Expect.isFalse(Func.isSubclassOf(NumGenRef));
  Expect.isFalse(Func.isSubclassOf(IntGenRef));
  Expect.isFalse(Func.isSubclassOf(DubGenRef));

  // The spec doesn't require these to be either value, only that they implement
  // Function.
  // NumPredRef.isSubclassOf(Func);
  // IntPredRef.isSubclassOf(Func);
  // DubPredRef.isSubclassOf(Func);
  // NumGenRef.isSubclassOf(Func);
  // IntGenRef.isSubclassOf(Func);
  // DubGenRef.isSubclassOf(Func);
}

main() {
  test(currentMirrorSystem());
}
