library;
import self as self;
import "dart:core" as core;

static method f_1_1_no_default(dynamic a, [dynamic b = null]) → dynamic {
  return a.+(b);
}
static method f_1_1_default(dynamic a, [dynamic b = 2]) → dynamic {
  return a.+(b);
}
static method f_1_b_no_default(dynamic a, {dynamic b = null}) → dynamic {
  return a.+(b);
}
static method f_1_b_default(dynamic a, {dynamic b = 2}) → dynamic {
  return a.+(b);
}
static method test_1_1(core::Function f, core::bool hasDefault) → dynamic {
  dynamic result = f.call(40, 2);
  if(!42.==(result))
    throw "Unexpected result: ${result}";
  self::test_1(f, hasDefault);
}
static method test_1_b(core::Function f, core::bool hasDefault) → dynamic {
  dynamic result = f.call(40, b: 2);
  if(!42.==(result))
    throw "Unexpected result: ${result}";
  self::test_1(f, hasDefault);
}
static method test_1(core::Function f, core::bool hasDefault) → dynamic {
  dynamic result = 0;
  core::bool threw = true;
  try {
    result = f.call(40);
    threw = false;
  }
  on dynamic catch(final dynamic _) {
  }
  if(hasDefault) {
    if(threw)
      throw "Unexpected exception.";
    if(!42.==(result))
      throw "Unexpected result: ${result}.";
  }
  else {
    if(!threw)
      throw "Expected exception missing.";
    if(!0.==(result))
      throw "Unexpected result: ${result}.";
  }
}
static method main(dynamic arguments) → dynamic {
  self::test_1_1(MakeClosure<(dynamic, [dynamic]) → dynamic>(self::closure#f_1_1_no_default, null), false);
  self::test_1_1(MakeClosure<(dynamic, [dynamic]) → dynamic>(self::closure#f_1_1_default, null), true);
  self::test_1_b(MakeClosure<(dynamic, {b: dynamic}) → dynamic>(self::closure#f_1_b_no_default, null), false);
  self::test_1_b(MakeClosure<(dynamic, {b: dynamic}) → dynamic>(self::closure#f_1_b_default, null), true);
}
static method closure#f_1_1_no_default(Vector #contextParameter, dynamic a, [dynamic b = null]) → dynamic
  return self::f_1_1_no_default(a, b);
static method closure#f_1_1_default(Vector #contextParameter, dynamic a, [dynamic b = 2]) → dynamic
  return self::f_1_1_default(a, b);
static method closure#f_1_b_no_default(Vector #contextParameter, dynamic a, {dynamic b = null}) → dynamic
  return self::f_1_b_no_default(a, b: b);
static method closure#f_1_b_default(Vector #contextParameter, dynamic a, {dynamic b = 2}) → dynamic
  return self::f_1_b_default(a, b: b);
