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