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

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