// 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 long substitution of long redirection chains.

import 'package:expect/expect.dart';

class C {
  const factory C() = D<int>;
}

class D<T> implements C {
  const factory D() = E<double, T>;
}

class E<S, T> implements D<T> {
  final field = 42;
  const E();
}

class X<T> {
  const factory X() = Y<T>;
}

class X1<T1> {
  const factory X1() = Y<T1>;
}

class X2 {
  const factory X2() = Y<int>;
}

class Y<S> implements X<S>, X1<S>, X2 {
  const factory Y() = Y1<S>;
}

class Y1<U> implements Y<U> {
  const factory Y1() = Z<U>;
}

class Z<V> implements Y1<V> {
  final field = 87;
  const Z();
}

void main() {
  testC(new C());
  testC(const C());
  testZ(new X<int>());
  testZ(new X1<int>());
  testZ(new X2());
  testZ(const X<int>());
  testZ(const X1<int>());
  testZ(const X2());
}

void testC(var c) {
  Expect.isTrue(c is C);
  Expect.isTrue(c is D<int>);
  Expect.isTrue(c is! D<String>);
  Expect.isTrue(c is E<double, int>);
  Expect.isTrue(c is! E<String, int>);
  Expect.isTrue(c is! E<double, String>);
  Expect.equals(42, c.field);
}

void testZ(var z) {
  Expect.isTrue(z is X<int>);
  Expect.isTrue(z is! X<String>);
  Expect.isTrue(z is X1<int>);
  Expect.isTrue(z is! X1<String>);
  Expect.isTrue(z is X2);
  Expect.isTrue(z is Y<int>);
  Expect.isTrue(z is! Y<String>);
  Expect.isTrue(z is Y1<int>);
  Expect.isTrue(z is! Y1<String>);
  Expect.isTrue(z is Z<int>);
  Expect.isTrue(z is! Z<String>);
  Expect.equals(87, z.field);
}
