// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdio.h>
#include <unittest/unittest.h>

#include <utility>

enum Category { CAT_LVALUE, CAT_RVALUE };

static int category(const int& arg) { return CAT_LVALUE; }

static int category(int&& arg) { return CAT_RVALUE; }

template <typename T>
static int passing(T&& t) {
  return category(t);
}

template <typename T>
static int moving(T&& t) {
  return category(std::move(t));
}

template <typename T>
static int forwarding(T&& t) {
  return category(std::forward<T>(t));
}

template <typename T>
static int forward_copy(T&& t) {
  return category(std::forward<T&>(t));
}

struct A {
  A(int&& n) : category(CAT_RVALUE) {}
  A(int& n) : category(CAT_LVALUE) {}
  int category;
};

template <typename T, typename U>
static T make_object(U&& u) {
  return T(std::forward<U>(u));
}

static bool forward_test() {
  BEGIN_TEST;
  int val = 42;
  int& ref = val;
  const int& cref = val;

  EXPECT_EQ(CAT_LVALUE, passing(42));
  EXPECT_EQ(CAT_LVALUE, passing(val));
  EXPECT_EQ(CAT_LVALUE, passing(ref));
  EXPECT_EQ(CAT_LVALUE, passing(cref));
  EXPECT_EQ(CAT_LVALUE, passing(val + 1));

  EXPECT_EQ(CAT_RVALUE, moving(42));
  EXPECT_EQ(CAT_RVALUE, moving(val));
  EXPECT_EQ(CAT_RVALUE, moving(ref));
  EXPECT_EQ(CAT_LVALUE, moving(cref));
  EXPECT_EQ(CAT_RVALUE, moving(val + 1));

  EXPECT_EQ(CAT_RVALUE, forwarding(42));
  EXPECT_EQ(CAT_LVALUE, forwarding(val));
  EXPECT_EQ(CAT_LVALUE, forwarding(ref));
  EXPECT_EQ(CAT_LVALUE, forward_copy(cref));
  EXPECT_EQ(CAT_RVALUE, forwarding(val + 1));

  EXPECT_EQ(CAT_LVALUE, forward_copy(42));
  EXPECT_EQ(CAT_LVALUE, forward_copy(val));
  EXPECT_EQ(CAT_LVALUE, forward_copy(ref));
  EXPECT_EQ(CAT_LVALUE, forward_copy(cref));
  EXPECT_EQ(CAT_LVALUE, forward_copy(val + 1));

  auto a1 = make_object<A>(42);
  auto a2 = make_object<A>(val);

  EXPECT_EQ(CAT_RVALUE, a1.category);
  EXPECT_EQ(CAT_LVALUE, a2.category);

  END_TEST;
}

BEGIN_TEST_CASE(forward_tests)
RUN_NAMED_TEST("Forward test", forward_test)
END_TEST_CASE(forward_tests)
