// 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);
}
