// 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 Calling a redirecting factory constructor k causes the
/// constructor k' denoted by type (respectively, type.identifier) to be called
/// with the actual arguments passed to k, and returns the result of k' as the
/// result of k. The resulting constructor call is governed by the same rules
/// as an instance creation expression using new.
/// @description Checks that a call to redirecting factory constructor indeed
/// results in a call to referenced constructor with the same actual arguments.
/// Test type aliases
/// @author sgrekhov@unipro.ru
/// @issue 45051

// SharedOptions=--enable-experiment=nonfunction-type-aliases
import "../../../../Utils/expect.dart";

class F {
  factory F(x) = CAlias;
  factory F.foo(x, [y]) = CAlias.foo;
  factory F.bar(x, {z}) = CAlias.bar;
}
typedef FAlias = F;

class C implements FAlias {
  var x, y, z;

  C(this.x);
  C.foo(this.x, [this.y]);
  C.bar(this.x, {this.z});
}
typedef CAlias = C;

main() {
  F f = new F(1);
  Expect.isTrue(f is C);
  if (f is C) {
    Expect.equals(1, f.x);
  }

  f = new F.foo(1, 2);
  Expect.isTrue(f is C);
  if (f is C) {
    Expect.equals(1, f.x);
    Expect.equals(2, f.y);
  }

  f = new F.bar(1, z:3);
  Expect.isTrue(f is C);
  if (f is C) {
    Expect.equals(1, f.x);
    Expect.equals(3, f.z);
  }
}
