| // 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. |
| // |
| // VMOptions=--lazy-dispatchers |
| // VMOptions=--no-lazy-dispatchers |
| |
| 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))); |
| } |