// Copyright (c) 2012, 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.

// VMOptions=
// VMOptions=--dwarf_stack_traces --no-retain_function_objects --no-retain_code_objects

import "package:expect/expect.dart";

apply(Function function, List? positional, Map<Symbol, dynamic>? named) {
  return Function.apply(function, positional, named);
}

void throwsNSME(
    Function function, List? positional, Map<Symbol, dynamic>? named) {
  Expect.throwsNoSuchMethodError(() => apply(function, positional, named));
}

main() {
  var c1 = () => 'c1';
  var c2 = (a) => 'c2 $a';
  var c3 = ([a = 1]) => 'c3 $a';
  var c4 = ({a = 1}) => 'c4 $a';
  var c5 = ({a = 1, b = 2}) => 'c5 $a $b';
  var c6 = ({b = 1, a = 2}) => 'c6 $a $b';
  var c7 = (x, {b = 1, a = 2}) => 'c7 $x $a $b';
  var c8 = (x, y, [a = 2, b = 3]) => 'c8 $x $y $a $b';

  Expect.equals('c1', apply(c1, null, null));
  Expect.equals('c1', apply(c1, [], null));
  Expect.equals('c1', apply(c1, [], {}));
  Expect.equals('c1', apply(c1, null, {}));
  throwsNSME(c1, [1], null);
  throwsNSME(c1, [1], {#a: 2});
  throwsNSME(c1, null, {#a: 2});

  Expect.equals('c2 1', apply(c2, [1], null));
  Expect.equals('c2 1', apply(c2, [1], {}));
  throwsNSME(c2, null, null);
  throwsNSME(c2, [], null);
  throwsNSME(c2, null, {});
  throwsNSME(c2, null, {#a: 1});
  throwsNSME(c2, [2], {#a: 1});

  Expect.equals('c3 1', apply(c3, null, null));
  Expect.equals('c3 1', apply(c3, [], null));
  Expect.equals('c3 2', apply(c3, [2], {}));
  throwsNSME(c3, [1, 2], null);
  throwsNSME(c3, null, {#a: 1});

  Expect.equals('c4 1', apply(c4, [], null));
  Expect.equals('c4 2', apply(c4, [], {#a: 2}));
  Expect.equals('c4 1', apply(c4, null, null));
  Expect.equals('c4 1', apply(c4, [], {}));
  throwsNSME(c4, [1], {#a: 1});
  throwsNSME(c4, [1], {});
  throwsNSME(c4, [], {#a: 1, #b: 2});

  Expect.equals('c5 1 2', apply(c5, [], null));
  Expect.equals('c5 3 2', apply(c5, [], {#a: 3}));
  Expect.equals('c5 1 2', apply(c5, null, null));
  Expect.equals('c5 1 2', apply(c5, [], {}));
  Expect.equals('c5 3 4', apply(c5, [], {#a: 3, #b: 4}));
  Expect.equals('c5 4 3', apply(c5, [], {#b: 3, #a: 4}));
  Expect.equals('c5 1 3', apply(c5, [], {#b: 3}));
  throwsNSME(c5, [1], {#a: 1});
  throwsNSME(c5, [1], {});
  throwsNSME(c5, [], {#a: 1, #b: 2, #c: 3});

  Expect.equals('c6 2 1', apply(c6, [], null));
  Expect.equals('c6 3 1', apply(c6, [], {#a: 3}));
  Expect.equals('c6 2 1', apply(c6, null, null));
  Expect.equals('c6 2 1', apply(c6, [], {}));
  Expect.equals('c6 3 4', apply(c6, [], {#a: 3, #b: 4}));
  Expect.equals('c6 4 3', apply(c6, [], {#b: 3, #a: 4}));
  Expect.equals('c6 2 3', apply(c6, [], {#b: 3}));
  throwsNSME(c6, [1], {#a: 1});
  throwsNSME(c6, [1], {});
  throwsNSME(c6, [], {#a: 1, #b: 2, #c: 3});

  Expect.equals('c7 7 2 1', apply(c7, [7], null));
  Expect.equals('c7 7 3 1', apply(c7, [7], {#a: 3}));
  Expect.equals('c7 7 2 1', apply(c7, [7], {}));
  Expect.equals('c7 7 3 4', apply(c7, [7], {#a: 3, #b: 4}));
  Expect.equals('c7 7 4 3', apply(c7, [7], {#b: 3, #a: 4}));
  Expect.equals('c7 7 2 3', apply(c7, [7], {#b: 3}));
  throwsNSME(c7, [], {#a: 1});
  throwsNSME(c7, [], {});
  throwsNSME(c7, [7], {#a: 1, #b: 2, #c: 3});

  Expect.equals('c8 7 8 2 3', apply(c8, [7, 8], null));
  Expect.equals('c8 7 8 2 3', apply(c8, [7, 8], {}));
  Expect.equals('c8 7 8 3 3', apply(c8, [7, 8, 3], null));
  Expect.equals('c8 7 8 3 4', apply(c8, [7, 8, 3, 4], null));
  throwsNSME(c8, [], null);
  throwsNSME(c8, [], {});
  throwsNSME(c8, [1], null);
  throwsNSME(c8, [7, 8, 9, 10, 11], null);
}
