1 #include <pdx/status.h> 2 3 #include <gtest/gtest.h> 4 5 #include <memory> 6 7 using android::pdx::ErrorStatus; 8 using android::pdx::Status; 9 10 TEST(Status, DefaultInit) { 11 Status<int> status; 12 EXPECT_FALSE(status.ok()); 13 EXPECT_TRUE(status.empty()); 14 EXPECT_EQ(0, status.get()); 15 EXPECT_EQ(0, status.error()); 16 } 17 18 TEST(Status, InitalizeSuccess) { 19 Status<int> status_int{0}; 20 EXPECT_FALSE(status_int.empty()); 21 EXPECT_TRUE(status_int.ok()); 22 EXPECT_EQ(0, status_int.get()); 23 status_int = Status<int>(3); 24 EXPECT_FALSE(status_int.empty()); 25 EXPECT_TRUE(status_int.ok()); 26 EXPECT_EQ(3, status_int.get()); 27 status_int = Status<int>(-3); 28 EXPECT_FALSE(status_int.empty()); 29 EXPECT_TRUE(status_int.ok()); 30 EXPECT_EQ(-3, status_int.get()); 31 32 Status<std::string> status_str{"foo"}; 33 EXPECT_FALSE(status_str.empty()); 34 EXPECT_TRUE(status_str.ok()); 35 EXPECT_EQ("foo", status_str.get()); 36 } 37 38 TEST(Status, InitalizeError) { 39 Status<int> status_int = ErrorStatus(12); 40 EXPECT_FALSE(status_int.empty()); 41 EXPECT_FALSE(status_int.ok()); 42 EXPECT_EQ(0, status_int.get()); 43 EXPECT_EQ(12, status_int.error()); 44 45 Status<std::string> status_str = ErrorStatus(EIO); 46 EXPECT_FALSE(status_str.empty()); 47 EXPECT_FALSE(status_str.ok()); 48 EXPECT_EQ(EIO, status_str.error()); 49 } 50 51 TEST(Status, ErrorMessage) { 52 Status<int> status = ErrorStatus(EIO); 53 EXPECT_EQ(status.GetErrorMessage(), strerror(EIO)); 54 55 status = ErrorStatus(EINVAL); 56 EXPECT_EQ(status.GetErrorMessage(), strerror(EINVAL)); 57 } 58 59 TEST(Status, Copy) { 60 Status<int> status1; 61 Status<int> status2; 62 63 status1 = Status<int>{12}; 64 status2 = ErrorStatus(13); 65 EXPECT_FALSE(status1.empty()); 66 EXPECT_FALSE(status2.empty()); 67 EXPECT_TRUE(status1.ok()); 68 EXPECT_FALSE(status2.ok()); 69 EXPECT_EQ(12, status1.get()); 70 EXPECT_EQ(0, status1.error()); 71 EXPECT_EQ(0, status2.get()); 72 EXPECT_EQ(13, status2.error()); 73 74 status1 = status2; 75 EXPECT_FALSE(status1.empty()); 76 EXPECT_FALSE(status2.empty()); 77 EXPECT_FALSE(status1.ok()); 78 EXPECT_FALSE(status2.ok()); 79 EXPECT_EQ(0, status1.get()); 80 EXPECT_EQ(13, status1.error()); 81 EXPECT_EQ(0, status2.get()); 82 EXPECT_EQ(13, status2.error()); 83 } 84 85 TEST(Status, Move) { 86 Status<std::unique_ptr<int>> status1; 87 Status<std::unique_ptr<int>> status2; 88 89 status1 = Status<std::unique_ptr<int>>{std::make_unique<int>(int{11})}; 90 status2 = Status<std::unique_ptr<int>>{std::make_unique<int>(int{12})}; 91 EXPECT_FALSE(status1.empty()); 92 EXPECT_FALSE(status2.empty()); 93 EXPECT_TRUE(status1.ok()); 94 EXPECT_TRUE(status2.ok()); 95 EXPECT_EQ(11, *status1.get()); 96 EXPECT_EQ(12, *status2.get()); 97 98 Status<std::unique_ptr<int>> status3 = std::move(status2); 99 EXPECT_FALSE(status1.empty()); 100 EXPECT_TRUE(status2.empty()); 101 EXPECT_FALSE(status3.empty()); 102 EXPECT_TRUE(status1.ok()); 103 EXPECT_FALSE(status2.ok()); 104 EXPECT_TRUE(status3.ok()); 105 EXPECT_EQ(11, *status1.get()); 106 EXPECT_EQ(nullptr, status2.get()); 107 EXPECT_EQ(12, *status3.get()); 108 109 std::swap(status1, status3); 110 EXPECT_EQ(12, *status1.get()); 111 EXPECT_EQ(11, *status3.get()); 112 113 status3 = std::move(status1); 114 EXPECT_TRUE(status1.empty()); 115 EXPECT_EQ(12, *status3.get()); 116 } 117 118 TEST(Status, Take) { 119 Status<std::unique_ptr<int>> status{std::make_unique<int>(int{123})}; 120 EXPECT_FALSE(status.empty()); 121 EXPECT_NE(nullptr, status.get()); 122 123 auto data = status.take(); 124 EXPECT_TRUE(status.empty()); 125 EXPECT_EQ(nullptr, status.get()); 126 EXPECT_EQ(123, *data); 127 } 128