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

// Test expectations for 'class_mirror_type_variables_data.dart'.

library class_mirror_type_variables_expect;

import "dart:mirrors";

import "package:expect/expect.dart";

/// The interface of [Env] is shared between the runtime and the source mirrors
/// test.
abstract class Env {
  ClassMirror getA();
  ClassMirror getB();
  ClassMirror getC();
  ClassMirror getD();
  ClassMirror getE();
  ClassMirror getF();
  ClassMirror getNoTypeParams();
  ClassMirror getObject();
  ClassMirror getString();
  ClassMirror getHelperOfString();
}

void test(Env env) {
  testNoTypeParams(env);
  testA(env);
  testBAndC(env);
  testD(env);
  testE(env);
  testF(env);
}

testNoTypeParams(Env env) {
  ClassMirror cm = env.getNoTypeParams();
  Expect.equals(cm.typeVariables.length, 0);
}

void testA(Env env) {
  ClassMirror a = env.getA();
  Expect.equals(2, a.typeVariables.length);

  TypeVariableMirror aT = a.typeVariables[0];
  TypeVariableMirror aS = a.typeVariables[1];
  ClassMirror aTBound = aT.upperBound as ClassMirror;
  ClassMirror aSBound = aS.upperBound as ClassMirror;

  Expect.isTrue(aTBound.isOriginalDeclaration);
  Expect.isTrue(aSBound.isOriginalDeclaration);

  Expect.equals(env.getObject(), aTBound);
  Expect.equals(env.getString(), aSBound);
}

void testBAndC(Env env) {
  ClassMirror b = env.getB();
  ClassMirror c = env.getC();

  Expect.equals(1, b.typeVariables.length);
  Expect.equals(1, c.typeVariables.length);

  TypeVariableMirror bZ = b.typeVariables[0];
  TypeVariableMirror cZ = c.typeVariables[0];
  ClassMirror bZBound = bZ.upperBound as ClassMirror;
  ClassMirror cZBound = cZ.upperBound as ClassMirror;

  Expect.isFalse(bZBound.isOriginalDeclaration);
  Expect.isFalse(cZBound.isOriginalDeclaration);

  Expect.equals(b, bZBound.originalDeclaration);
  Expect.equals(b, cZBound.originalDeclaration);

  TypeMirror bZBoundTypeArgument = bZBound.typeArguments.single;
  TypeMirror cZBoundTypeArgument = cZBound.typeArguments.single;
  TypeVariableMirror bZBoundTypeVariable = bZBound.typeVariables.single;
  TypeVariableMirror cZBoundTypeVariable = cZBound.typeVariables.single;

  Expect.equals(b, bZ.owner);
  Expect.equals(c, cZ.owner);
  Expect.equals(b, bZBoundTypeVariable.owner);
  Expect.equals(b, cZBoundTypeVariable.owner);

  Expect.equals(bZ, bZBoundTypeArgument);
  Expect.equals(cZ, cZBoundTypeArgument);
  Expect.equals(bZ, bZBoundTypeVariable);
  Expect.equals(bZ, cZBoundTypeVariable);
}

testD(Env env) {
  ClassMirror cm = env.getD();
  Expect.equals(3, cm.typeVariables.length);
  var values = cm.typeVariables;
  values.forEach((e) {
    Expect.equals(true, e is TypeVariableMirror);
  });

  // Names of type variables are not preserved after type canonicalization
  // and are therefore not compared to expected names.
}

void testE(Env env) {
  ClassMirror e = env.getE();
  TypeVariableMirror eR = e.typeVariables.single;
  ClassMirror mapRAndHelperOfString = eR.upperBound as ClassMirror;

  Expect.isFalse(mapRAndHelperOfString.isOriginalDeclaration);
  Expect.equals(eR, mapRAndHelperOfString.typeArguments.first);
  Expect.equals(
      env.getHelperOfString(), mapRAndHelperOfString.typeArguments.last);
}

void testF(Env env) {
  ClassMirror f = env.getF();
  TypeVariableMirror fZ = f.typeVariables[0];
  ClassMirror fZBound = fZ.upperBound as ClassMirror;
  ClassMirror fZBoundTypeArgument = fZBound.typeArguments.single as ClassMirror;

  Expect.equals(1, f.typeVariables.length);
  Expect.isFalse(fZBound.isOriginalDeclaration);
  Expect.isFalse(fZBoundTypeArgument.isOriginalDeclaration);
  Expect.equals(f, fZBoundTypeArgument.originalDeclaration);
  Expect.equals(fZ, fZBoundTypeArgument.typeArguments.single);
}
