1 #include <gtest/gtest.h>
2
3 #include <c10/util/Optional.h>
4
5 struct TestValue {
TestValueTestValue6 explicit TestValue(const int& x) : lvalue_(x) {}
TestValueTestValue7 explicit TestValue(int&& x) : rvalue_(x) {}
8
9 std::optional<int> lvalue_;
10 std::optional<int> rvalue_;
11 };
12
TEST(MakeUniqueTest,ForwardRvaluesCorrectly)13 TEST(MakeUniqueTest, ForwardRvaluesCorrectly) {
14 auto ptr = std::make_unique<TestValue>(123);
15 ASSERT_FALSE(ptr->lvalue_.has_value());
16 ASSERT_TRUE(ptr->rvalue_.has_value());
17 ASSERT_EQ(*ptr->rvalue_, 123);
18 }
19
TEST(MakeUniqueTest,ForwardLvaluesCorrectly)20 TEST(MakeUniqueTest, ForwardLvaluesCorrectly) {
21 int x = 5;
22 auto ptr = std::make_unique<TestValue>(x);
23 ASSERT_TRUE(ptr->lvalue_.has_value());
24 ASSERT_EQ(*ptr->lvalue_, 5);
25 ASSERT_FALSE(ptr->rvalue_.has_value());
26 }
27
TEST(MakeUniqueTest,CanConstructUniquePtrOfArray)28 TEST(MakeUniqueTest, CanConstructUniquePtrOfArray) {
29 // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
30 auto ptr = std::make_unique<int[]>(3);
31 // Value initialization is required by the standard.
32 ASSERT_EQ(ptr[0], 0);
33 ASSERT_EQ(ptr[1], 0);
34 ASSERT_EQ(ptr[2], 0);
35 }
36