// Copyright (c) 2019, 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.

/**
 * @assertion Execution of a superinitializer of the form
 *   super(a1, ..., an; xn+1: an+1,...,xn+k: an+k)
 *   (respectively super.id(a1, ..., an; xn+1: an+1,...,xn+k: an+k)
 * proceeds as follows:
 * First, the argument list (a1, ..., an; xn+1: an+1,...,xn+k: an+k) is
 * evaluated.
 * Let C be the class in which the superinitializer appears and let S be the
 * superclass of C. If S is generic, let U1,...,Um be the actual type
 * parameters passed to S in the superclass clause of C.
 * Then, the initializer list of the constructor S (respectively S.id) is
 * executed with respect to the bindings that resulted from the evaluation of
 * the argument list, with this bound to the current binding of this, and the
 * type parameters (if any) of class S bound to the current bindings of
 * U1,...,Um.
 * @description Checks that the execution order as well as type parameters
 * binding for both named and unnamed superinitializers are correct. Test type
 * aliases
 * @author sgrekhov@unipro.ru
 */
// SharedOptions=--enable-experiment=nonfunction-type-aliases
import "../../../../Utils/expect.dart";

var log;
f(var entry) {
  log.add(entry.toString());
  return f;
}

class S<T, U> {
  S(var x, var y, [var o]) : this.s1 = x("s1${1 is T}"),
      this.s2 = y("s2${"1" is U}"), this.s3 = x(1 is U),
      this.s4 = x(1.5 is T) {

    s1("ok");
  }
  S.named(var x, var y, {var o}) : this.s1 = x("s1${1 is T}"),
      this.s2 = y("s2${"1" is U}"),  this.s3 = x(1 is U),
      this.s4 = x(1.5 is T) {

    s1("named!");
  }

  var s1;
  var s2;
  var s3, s4;
}

typedef SAlias = S<int, String>;

class C extends SAlias {
  C() : super(f("a1"), f("a2"), f("o"));
  C.named() : super.named(f("a1"), f("a2"), o : f("o"));
}

main() {
  log = [];
  new C();
  Expect.listEquals(["a1","a2", "o", "s1true", "s2true", "false", "false",
    "ok"], log, "Wrong superinitializer evaluation order!");

  log = [];
  new C.named();
  Expect.listEquals(["a1","a2", "o", "s1true", "s2true", "false", "false",
    "named!"], log, "Wrong superinitializer evaluation order!");

}
