6cc9efe290
Change-Id: I94dfcea40566190c6bf153c108b0d0d5dbf27a4d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400148 Commit-Queue: Bob Nystrom <rnystrom@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Auto-Submit: Bob Nystrom <rnystrom@google.com>
74 lines
2.1 KiB
Dart
74 lines
2.1 KiB
Dart
// 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)),
|
|
);
|
|
}
|