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