// 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

// @dart = 2.9

import 'package:expect/expect.dart';

class A {
  final int nonce_;

  A(this.nonce_);
}

class B {
  final int nonce_;

  B(this.nonce_);
}

class C extends A {
  C(int nonce) : super(nonce);
}

void main() {
  dynamic f = (String a1, int a2, A a3, {String n1, int n2, A n3}) {};

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