// TODO(multitest): This was automatically migrated from a multitest and may
// contain strange or dead code.

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

// Check that both `=` and `:` are allowed for named parameters.

import "package:expect/expect.dart";

// Default values are not allowed on typedefs.


typedef functype({x, y, z});

int topF({x = 3, y: 5, z}) => x * y * (z ?? 2);

class A {
  int x;
  int y;
  int z;
  A({this.x = 3, this.y: 5, z}) : z = z ?? 2;
  A.redirect({int x = 3, int y: 5, int? z}) : this(x: x, y: y, z: z);
  factory A.factory({int x = 3, int y: 5, int? z}) =>
      new A(x: x, y: y, z: z ?? 2);
  factory A.redirectFactory({int x, int y, int z}) = A;

  // Default values are not allowed on redirecting factory constructors.



  int get value => x * y * z;

  static int staticF({x = 3, y: 5, z}) => x * y * (z ?? 2);
  int instanceF({x = 3, y: 5, z}) => x * y * (z ?? 2);
}

main() {
  // Reference the type, or dart2js won't see that the declaration is invalid


  var a = new A();

  int local({x = 3, y: 5, z}) => x * y * (z ?? 2);
  var expr = ({x = 3, y: 5, z}) => x * y * (z ?? 2);
  var tearOff = a.instanceF;

  test(function) {
    Expect.equals(30, function());
    Expect.equals(70, function(x: 7));
    Expect.equals(42, function(y: 7));
    Expect.equals(28, function(x: 7, y: 2));
    Expect.equals(15, function(z: 1));
    Expect.equals(21, function(y: 7, z: 1));
    Expect.equals(35, function(x: 7, z: 1));
    Expect.equals(14, function(x: 7, y: 2, z: 1));
    Expect.isTrue(function is functype);
  }

  test(topF);
  test(A.staticF);
  test(a.instanceF);
  test(local);
  test(expr);
  test(tearOff);

  // Can't tear off constructors.
  Expect.equals(30, new A().value);
  Expect.equals(70, new A(x: 7).value);
  Expect.equals(42, new A(y: 7).value);
  Expect.equals(28, new A(x: 7, y: 2).value);
  Expect.equals(15, new A(z: 1).value);
  Expect.equals(21, new A(y: 7, z: 1).value);
  Expect.equals(35, new A(x: 7, z: 1).value);
  Expect.equals(14, new A(x: 7, y: 2, z: 1).value);

  Expect.equals(30, new A.redirect().value);
  Expect.equals(70, new A.redirect(x: 7).value);
  Expect.equals(42, new A.redirect(y: 7).value);
  Expect.equals(28, new A.redirect(x: 7, y: 2).value);
  Expect.equals(15, new A.redirect(z: 1).value);
  Expect.equals(21, new A.redirect(y: 7, z: 1).value);
  Expect.equals(35, new A.redirect(x: 7, z: 1).value);
  Expect.equals(14, new A.redirect(x: 7, y: 2, z: 1).value);

  Expect.equals(30, new A.factory().value);
  Expect.equals(70, new A.factory(x: 7).value);
  Expect.equals(42, new A.factory(y: 7).value);
  Expect.equals(28, new A.factory(x: 7, y: 2).value);
  Expect.equals(15, new A.factory(z: 1).value);
  Expect.equals(21, new A.factory(y: 7, z: 1).value);
  Expect.equals(35, new A.factory(x: 7, z: 1).value);
  Expect.equals(14, new A.factory(x: 7, y: 2, z: 1).value);

  Expect.equals(30, new A.redirectFactory().value);
  Expect.equals(70, new A.redirectFactory(x: 7).value);
  Expect.equals(42, new A.redirectFactory(y: 7).value);
  Expect.equals(28, new A.redirectFactory(x: 7, y: 2).value);
  Expect.equals(15, new A.redirectFactory(z: 1).value);
  Expect.equals(21, new A.redirectFactory(y: 7, z: 1).value);
  Expect.equals(35, new A.redirectFactory(x: 7, z: 1).value);
  Expect.equals(14, new A.redirectFactory(x: 7, y: 2, z: 1).value);
}
