blob: 5731c909bd1599c8eac081e475b1a857f1d7d795 [file] [log] [blame]
// 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)),
);
}