/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   /* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/Assertions.h"
#include "mozilla/Function.h"

using mozilla::Function;

#define CHECK(c) \
  do { \
    bool cond = !!(c); \
    MOZ_RELEASE_ASSERT(cond, "Failed assertion: " #c); \
  } while (false)

struct ConvertibleToInt
{
  operator int() const { return 42; }
};

int increment(int arg) { return arg + 1; }

struct S {
  S() {}
  static int increment(int arg) { return arg + 1; }
  int decrement(int arg) { return arg - 1;}
  int sum(int arg1, int arg2) const { return arg1 + arg2;}
};

struct Incrementor {
  int operator()(int arg) { return arg + 1; }
};

static void
TestNonmemberFunction()
{
  Function<int(int)> f = &increment;
  CHECK(f(42) == 43);
}

static void
TestStaticMemberFunction()
{
  Function<int(int)> f = &S::increment;
  CHECK(f(42) == 43);
}

static void
TestFunctionObject()
{
  Function<int(int)> f = Incrementor();
  CHECK(f(42) == 43);
}

static void
TestLambda()
{
  // Test non-capturing lambda
  Function<int(int)> f = [](int arg){ return arg + 1; };
  CHECK(f(42) == 43);

  // Test capturing lambda
  int one = 1;
  Function<int(int)> g = [one](int arg){ return arg + one; };
  CHECK(g(42) == 43);
}

static void
TestDefaultConstructionAndAssignmentLater()
{
  Function<int(int)> f;  // allowed
  // Would get an assertion if we tried calling f now.
  f = &increment;
  CHECK(f(42) == 43);
}

static void
TestReassignment()
{
  Function<int(int)> f = &increment;
  CHECK(f(42) == 43);
  f = [](int arg){ return arg + 2; };
  CHECK(f(42) == 44);
}

static void
TestMemberFunction()
{
  Function<int(S&, int)> f = &S::decrement;
  S s;
  CHECK((f(s, 1) == 0));
}

static void
TestConstMemberFunction()
{
  Function<int(const S*, int, int)> f = &S::sum;
  const S s;
  CHECK((f(&s, 1, 1) == 2));
}
int
main()
{
  TestNonmemberFunction();
  TestStaticMemberFunction();
  TestFunctionObject();
  TestLambda();
  TestDefaultConstructionAndAssignmentLater();
  TestReassignment();
  TestMemberFunction();
  TestConstMemberFunction();
  return 0;
}
