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

/// @assertion Let F be a function with required formal parameters
/// T1 p1, ..., Tn pn, return type T0 and no optional parameters. Then the type
/// of F is (T1 , ..., Tn ) → T0.
/// Let F be a function with required formal parameters T1 p1, ..., Tn pn, return
/// type T0 and positional optional parameters Tn+1 pn+1, ..., Tn+k pn+k. Then
/// the type of F is (T1, ..., Tn, [Tn+1 pn+1, ..., Tn+k pn+k]) → T0.
/// Let F be a function with required formal parameters T1 p1, ..., Tn pn, return
/// type T0 and named optional parameters Tn+1 pn+1, ..., Tn+k pn+k. Then the
/// type of F is (T1, ..., Tn, {Tn+1 pn+1, ..., Tn+k pn+k}) → T0.
/// The run time type of a function object always implements the class Function.
/// @description Checks the type of functions with parameters. Also checks that
/// run time type of a function object always implements the class Function.
/// @author ngl@unipro.ru

import "../../../Utils/expect.dart";

typedef int F1(int i1);
typedef int F2(int i1, int i2, [int p3, int p4]);
typedef int F3(int i1, int p2, int p3, {int p4, int p5});

main() {
  int f1(int p1) {return p1;};
  Expect.isTrue(f1 is F1);
  Expect.runtimeIsType<F1>(f1);
  Function f = f1;

  int f2(int p1, int p2, [int p3 = 0, int p4 = 0]) {return p1 + p2 + p3 + p4;};
  Expect.isTrue(f2 is F2);
  Expect.runtimeIsType<F2>(f2);
  f = f2;

  int f3(int p1, int p2, int p3, {p4, p5}) {return p1 + p2 + p3;};
  Expect.isTrue(f3 is F3);
  Expect.runtimeIsType<F3>(f3);
  f = f3;

  Expect.isFalse(f1 is F2);
  Expect.isFalse(f1 is F3);
  Expect.isFalse(f2 is F1);
  Expect.isFalse(f2 is F3);
  Expect.isFalse(f3 is F1);
  Expect.isFalse(f3 is F2);
}
