blob: ea415eec456de2763afaef410906a53e68e6c023 [file] [log] [blame]
#include <gtest/gtest.h>
#include <c10/util/MaybeOwned.h>
#include <string>
template<typename T>
using MaybeOwned = c10::MaybeOwned<T>;
TEST(MaybeOwnedTest, SimpleDereferencingInt) {
int x = 123;
auto borrowed = MaybeOwned<int>::borrowed(x);
auto owned = MaybeOwned<int>::owned(c10::in_place, x);
EXPECT_EQ(*borrowed, x);
EXPECT_EQ(*owned, x);
EXPECT_EQ(&*borrowed, &x);
EXPECT_NE(&*owned, &x);
}
TEST(MaybeOwnedTest, SimpleDereferencingString) {
std::string x = "hello";
std::string y = x;
auto borrowed = MaybeOwned<std::string>::borrowed(x);
auto owned = MaybeOwned<std::string>::owned(c10::in_place, x);
auto owned2 = MaybeOwned<std::string>::owned(std::move(y));
EXPECT_EQ(*borrowed, x);
EXPECT_EQ(*owned, x);
EXPECT_EQ(*owned2, x);
EXPECT_EQ(&*borrowed, &x);
EXPECT_NE(&*owned, &x);
EXPECT_NE(&*owned2, &x);
EXPECT_EQ(borrowed->size(), x.size());
EXPECT_EQ(owned->size(), x.size());
EXPECT_EQ(owned2->size(), x.size());
}
TEST(MaybeOwnedTest, DefaultCtorInt) {
int x = 123;
MaybeOwned<int> borrowed, owned;
borrowed = MaybeOwned<int>::borrowed(x);
owned = MaybeOwned<int>::owned(c10::in_place, x);
EXPECT_EQ(*borrowed, x);
EXPECT_EQ(*owned, x);
EXPECT_EQ(&*borrowed, &x);
EXPECT_NE(&*owned, &x);
}
TEST(MaybeOwnedTest, MoveConstructor) {
std::string x = "hello";
auto borrowed = MaybeOwned<std::string>::borrowed(x);
auto owned = MaybeOwned<std::string>::owned(c10::in_place, x);
auto owned2 = MaybeOwned<std::string>::owned(std::string(x));
auto movedBorrowed(std::move(borrowed));
auto movedOwned(std::move(owned));
auto movedOwned2(std::move(owned2));
for (auto *mo : {&movedBorrowed, &movedOwned, &movedOwned2}) {
EXPECT_EQ(**mo, x);
EXPECT_EQ((*mo)->size(), x.size());
}
}
TEST(MaybeOwnedTest, MoveAssignmentIntoOwned) {
std::string x = "hello";
auto borrowed = MaybeOwned<std::string>::borrowed(x);
auto owned = MaybeOwned<std::string>::owned(c10::in_place, x);
auto owned2 = MaybeOwned<std::string>::owned(std::string(x));
auto movedBorrowed = MaybeOwned<std::string>::owned(c10::in_place, "");
auto movedOwned = MaybeOwned<std::string>::owned(c10::in_place, "");
auto movedOwned2 = MaybeOwned<std::string>::owned(c10::in_place, "");
movedBorrowed = std::move(borrowed);
movedOwned = std::move(owned);
movedOwned2 = std::move(owned2);
for (auto *mo : {&movedBorrowed, &movedOwned, &movedOwned2}) {
EXPECT_EQ(**mo, x);
EXPECT_EQ((*mo)->size(), x.size());
}
}
TEST(MaybeOwnedTest, MoveAssignmentIntoBorrowed) {
std::string x = "hello";
auto borrowed = MaybeOwned<std::string>::borrowed(x);
auto owned = MaybeOwned<std::string>::owned(c10::in_place, x);
auto owned2 = MaybeOwned<std::string>::owned(std::string(x));
std::string y = "goodbye";
auto movedBorrowed = MaybeOwned<std::string>::borrowed(y);
auto movedOwned = MaybeOwned<std::string>::borrowed(y);
auto movedOwned2 = MaybeOwned<std::string>::borrowed(y);
movedBorrowed = std::move(borrowed);
movedOwned = std::move(owned);
movedOwned2 = std::move(owned2);
for (auto *mo : {&movedBorrowed, &movedOwned, &movedOwned2}) {
EXPECT_EQ(**mo, x);
EXPECT_EQ((*mo)->size(), x.size());
}
}