|  | // Copyright (c) 2020, 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. | 
|  | // | 
|  | // Test that dynamic invocation of closures works as expected, including | 
|  | // appropriate type checks. | 
|  |  | 
|  | import 'package:expect/expect.dart'; | 
|  |  | 
|  | class A { | 
|  | final int nonce_; | 
|  |  | 
|  | const A(this.nonce_); | 
|  | } | 
|  |  | 
|  | class B { | 
|  | final int nonce_; | 
|  |  | 
|  | const B(this.nonce_); | 
|  | } | 
|  |  | 
|  | class C extends A { | 
|  | const C(int nonce) : super(nonce); | 
|  | } | 
|  |  | 
|  | void main() { | 
|  | dynamic f = | 
|  | ( | 
|  | String a1, | 
|  | int a2, | 
|  | A a3, { | 
|  | String n1 = "default_named", | 
|  | int n2 = -1, | 
|  | A n3 = const A(-1), | 
|  | }) {}; | 
|  |  | 
|  | f("test_fixed", 1, A(1), n1: "test_named", n2: 2, n3: A(2)); | 
|  |  | 
|  | // Test named argument permutations | 
|  | f("test_fixed", 1, A(1), n1: "test_named", n3: A(2), n2: 2); | 
|  | f("test_fixed", 1, A(1), n2: 2, n1: "test_named", n3: A(2)); | 
|  | f("test_fixed", 1, A(1), n2: 2, n3: A(2), n1: "test_named"); | 
|  | f("test_fixed", 1, A(1), n3: A(2), n1: "test_named", n2: 2); | 
|  | f("test_fixed", 1, A(1), n3: A(2), n2: 2, n1: "test_named"); | 
|  |  | 
|  | // Test subclasses match the type | 
|  | f("test_fixed", 1, C(1), n1: "test_named", n2: 2, n3: A(2)); | 
|  | f("test_fixed", 1, A(1), n1: "test_named", n2: 2, n3: C(2)); | 
|  |  | 
|  | // Should fail with no such method errors | 
|  | Expect.throwsNoSuchMethodError(() => f()); | 
|  | Expect.throwsNoSuchMethodError(() => f("test_fixed", 1, A(1), n4: 4)); | 
|  |  | 
|  | // Should fail with type errors | 
|  | Expect.throwsTypeError( | 
|  | () => f(100, 1, A(1), n1: "test_named", n2: 2, n3: A(2)), | 
|  | ); | 
|  | Expect.throwsTypeError( | 
|  | () => f("test_fixed", 1.1, A(1), n1: "test_named", n2: 2, n3: A(2)), | 
|  | ); | 
|  | Expect.throwsTypeError( | 
|  | () => f("test_fixed", 1, B(1), n1: "test_named", n2: 2, n3: A(2)), | 
|  | ); | 
|  | Expect.throwsTypeError( | 
|  | () => f("test_fixed", 1, A(1), n1: 100, n2: 2, n3: A(2)), | 
|  | ); | 
|  | Expect.throwsTypeError( | 
|  | () => f("test_fixed", 1, A(1), n1: "test_named", n2: 2.2, n3: A(2)), | 
|  | ); | 
|  | Expect.throwsTypeError( | 
|  | () => f("test_fixed", 1, A(1), n1: "test_named", n2: 2, n3: B(2)), | 
|  | ); | 
|  | } |