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