5#include <gtest/gtest.h>
7#include "kstd_unique_ptr"
13 static int destroy_count;
14 explicit TestObj(
int v) : value(v) {}
15 ~TestObj() { ++destroy_count; }
17int TestObj::destroy_count = 0;
19class UniquePtrTest :
public ::testing::Test {
21 void SetUp()
override { TestObj::destroy_count = 0; }
25TEST_F(UniquePtrTest, DefaultConstruction) {
26 kstd::unique_ptr<TestObj> p;
32TEST_F(UniquePtrTest, ConstructionFromRawPointer) {
33 kstd::unique_ptr<TestObj> p(
new TestObj(42));
40TEST_F(UniquePtrTest, DestructorDeletesObject) {
42 kstd::unique_ptr<TestObj> p(
new TestObj(5));
49TEST_F(UniquePtrTest, MoveConstruction) {
50 kstd::unique_ptr<TestObj> p1(
new TestObj(99));
51 TestObj* raw = p1.get();
53 kstd::unique_ptr<TestObj> p2(
static_cast<kstd::unique_ptr<TestObj>&&
>(p1));
60TEST_F(UniquePtrTest, MoveAssignment) {
61 kstd::unique_ptr<TestObj> p1(
new TestObj(7));
62 kstd::unique_ptr<TestObj> p2(
new TestObj(8));
63 TestObj* raw1 = p1.get();
65 p2 =
static_cast<kstd::unique_ptr<TestObj>&&
>(p1);
72TEST_F(UniquePtrTest, Release) {
73 auto* raw =
new TestObj(10);
74 kstd::unique_ptr<TestObj> p(raw);
75 TestObj* released = p.release();
83TEST_F(UniquePtrTest, ResetBecomesNull) {
84 kstd::unique_ptr<TestObj> p(
new TestObj(3));
91TEST_F(UniquePtrTest, ResetWithNewPointer) {
92 kstd::unique_ptr<TestObj> p(
new TestObj(11));
93 p.reset(
new TestObj(22));
99TEST_F(UniquePtrTest, Swap) {
100 auto* raw1 =
new TestObj(1);
101 auto* raw2 =
new TestObj(2);
102 kstd::unique_ptr<TestObj> p1(raw1);
103 kstd::unique_ptr<TestObj> p2(raw2);
111TEST_F(UniquePtrTest, NonMemberSwap) {
112 auto* raw1 =
new TestObj(10);
113 auto* raw2 =
new TestObj(20);
114 kstd::unique_ptr<TestObj> p1(raw1);
115 kstd::unique_ptr<TestObj> p2(raw2);
123TEST_F(UniquePtrTest, DereferenceOperators) {
124 kstd::unique_ptr<TestObj> p(
new TestObj(77));
132TEST_F(UniquePtrTest, BoolConversion) {
133 kstd::unique_ptr<TestObj> null_ptr;
134 kstd::unique_ptr<TestObj> valid_ptr(
new TestObj(1));
140TEST_F(UniquePtrTest, NullptrAssignment) {
141 kstd::unique_ptr<TestObj> p(
new TestObj(5));
148TEST_F(UniquePtrTest, NullptrConstruction) {
149 kstd::unique_ptr<TestObj> p(
nullptr);
155TEST_F(UniquePtrTest, CustomDeleter) {
156 static int custom_delete_count = 0;
157 custom_delete_count = 0;
159 struct CustomDeleter {
160 auto operator()(TestObj* ptr)
const noexcept ->
void {
161 ++custom_delete_count;
167 kstd::unique_ptr<TestObj, CustomDeleter> p(
new TestObj(1));
175TEST_F(UniquePtrTest, GetDeleter) {
176 kstd::unique_ptr<TestObj> p(
new TestObj(1));
177 auto& d = p.get_deleter();
183TEST_F(UniquePtrTest, MakeUnique) {
184 auto p = kstd::make_unique<TestObj>(123);
190TEST_F(UniquePtrTest, MakeUniqueMultipleArgs) {
194 Point(
int a,
int b) : x(a), y(b) {}
196 auto p = kstd::make_unique<Point>(3, 4);
202TEST_F(UniquePtrTest, Polymorphic) {
204 virtual ~Base() =
default;
205 virtual auto GetValue() ->
int {
return 0; }
207 struct Derived : Base {
209 explicit Derived(
int v) : val(v) {}
210 auto GetValue() ->
int override {
return val; }
213 kstd::unique_ptr<Base> p(
new Derived(42));
218TEST_F(UniquePtrTest, SelfMoveAssignment) {
219 kstd::unique_ptr<TestObj> p(
new TestObj(42));
220 p =
static_cast<kstd::unique_ptr<TestObj>&&
>(p);
226TEST_F(UniquePtrTest, ComparisonOperators) {
227 kstd::unique_ptr<TestObj> null_ptr;
228 kstd::unique_ptr<TestObj> p1(
new TestObj(1));
229 kstd::unique_ptr<TestObj> p2(
new TestObj(2));
243 static int destroy_count;
244 ArrayObj() : value(0) {}
245 explicit ArrayObj(
int v) : value(v) {}
246 ~ArrayObj() { ++destroy_count; }
248int ArrayObj::destroy_count = 0;
250class UniquePtrArrayTest :
public ::testing::Test {
252 void SetUp()
override { ArrayObj::destroy_count = 0; }
256TEST_F(UniquePtrArrayTest, DefaultConstruction) {
257 kstd::unique_ptr<ArrayObj[]> p;
263TEST_F(UniquePtrArrayTest, ConstructionAndDestruction) {
265 kstd::unique_ptr<ArrayObj[]> p(
new ArrayObj[3]);
273TEST_F(UniquePtrArrayTest, SubscriptOperator) {
274 kstd::unique_ptr<ArrayObj[]> p(
new ArrayObj[3]);
284TEST_F(UniquePtrArrayTest, MoveConstruction) {
285 kstd::unique_ptr<ArrayObj[]> p1(
new ArrayObj[2]);
286 ArrayObj* raw = p1.get();
287 kstd::unique_ptr<ArrayObj[]> p2(
288 static_cast<kstd::unique_ptr<ArrayObj[]>&&
>(p1));
294TEST_F(UniquePtrArrayTest, Release) {
295 auto* raw =
new ArrayObj[2];
296 kstd::unique_ptr<ArrayObj[]> p(raw);
297 ArrayObj* released = p.release();
305TEST_F(UniquePtrArrayTest, Reset) {
306 kstd::unique_ptr<ArrayObj[]> p(
new ArrayObj[2]);
313TEST_F(UniquePtrArrayTest, Swap) {
314 auto* raw1 =
new ArrayObj[1];
315 auto* raw2 =
new ArrayObj[1];
316 kstd::unique_ptr<ArrayObj[]> p1(raw1);
317 kstd::unique_ptr<ArrayObj[]> p2(raw2);
324TEST_F(UniquePtrArrayTest, NullptrAssignment) {
325 kstd::unique_ptr<ArrayObj[]> p(
new ArrayObj[2]);
TEST_F(KernelFdtTest, ConstructorTest)
#define EXPECT_TRUE(cond, msg)
#define EXPECT_NE(val1, val2, msg)
#define EXPECT_FALSE(cond, msg)
#define EXPECT_EQ(val1, val2, msg)