Arquivos
magenta/kernel/app/tests/forward_tests.cpp
T
The Fuchsia Authors 53b9e1c8de [magenta] Initial commit
2016-06-15 00:31:24 -07:00

95 linhas
2.3 KiB
C++

// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <app/tests.h>
#include <stdio.h>
#include <unittest.h>
#include <utils/type_support.h>
enum Category { CAT_LVALUE, CAT_RVALUE };
int category(const int& arg) { return CAT_LVALUE; }
int category(int&& arg) { return CAT_RVALUE; }
template <typename T>
int passing(T&& t)
{
return category(t);
}
template <typename T>
int moving(T&& t)
{
return category(utils::move(t));
}
template <typename T>
int forwarding(T&& t)
{
return category(utils::forward<T>(t));
}
template <typename T>
int forward_copy(T&& t)
{
return category(utils::forward<T&>(t));
}
struct A {
A(int&& n) : category(CAT_RVALUE) {}
A(int& n) : category(CAT_LVALUE) {}
int category;
};
template <typename T, typename U>
T make_object(U&& u)
{
return T(utils::forward<U>(u));
}
extern "C" int forward_tests(int argc, const cmd_args* argv)
{
bool all_ok = true;
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, "");
if (all_ok) printf("all tests passed\n");
return 0;
}