mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-07 01:06:45 +08:00
146 lines
3.0 KiB
C++
146 lines
3.0 KiB
C++
|
|
#include <utility>
|
|
#include <cstdio>
|
|
#include <cstdint>
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "libimp/expected.h"
|
|
|
|
namespace {
|
|
|
|
class test_val {
|
|
public:
|
|
int val = 0;
|
|
int dc_ = 0;
|
|
int cc_ = 0;
|
|
int mv_ = 0;
|
|
|
|
test_val() {
|
|
dc_ += 1;
|
|
std::printf("test_val construct.\n");
|
|
}
|
|
test_val(test_val const &o)
|
|
: val(o.val) {
|
|
cc_ = o.cc_ + 1;
|
|
std::printf("test_val copy construct.\n");
|
|
}
|
|
test_val(test_val &&o) noexcept
|
|
: val(std::exchange(o.val, 0)) {
|
|
mv_ = o.mv_ + 1;
|
|
std::printf("test_val move construct.\n");
|
|
}
|
|
~test_val() {
|
|
std::printf("test_val destruct.\n");
|
|
}
|
|
|
|
test_val &operator=(test_val &&o) noexcept {
|
|
mv_ = o.mv_ + 1;
|
|
val = std::exchange(o.val, 0);
|
|
return *this;
|
|
}
|
|
|
|
test_val(int v)
|
|
: val(v) {
|
|
std::printf("test_val value initialization.\n");
|
|
}
|
|
|
|
bool operator==(test_val const &rhs) const {
|
|
return val == rhs.val;
|
|
}
|
|
};
|
|
|
|
class test_err {
|
|
public:
|
|
int dc_ = 0;
|
|
int cc_ = 0;
|
|
int mv_ = 0;
|
|
std::int64_t val = 0;
|
|
|
|
test_err() {
|
|
dc_ += 1;
|
|
std::printf("test_err construct.\n");
|
|
}
|
|
test_err(test_err const &o)
|
|
: val(o.val) {
|
|
cc_ = o.cc_ + 1;
|
|
std::printf("test_err copy construct.\n");
|
|
}
|
|
test_err(test_err &&o) noexcept
|
|
: val(std::exchange(o.val, 0)) {
|
|
mv_ = o.mv_ + 1;
|
|
std::printf("test_err move construct.\n");
|
|
}
|
|
~test_err() {
|
|
std::printf("test_err destruct.\n");
|
|
}
|
|
|
|
test_err &operator=(test_err &&o) noexcept {
|
|
mv_ = o.mv_ + 1;
|
|
val = std::exchange(o.val, 0);
|
|
return *this;
|
|
}
|
|
|
|
test_err(int v)
|
|
: val(v) {
|
|
std::printf("test_err value initialization.\n");
|
|
}
|
|
|
|
bool operator==(test_err const &rhs) const {
|
|
return val == rhs.val;
|
|
}
|
|
};
|
|
|
|
} // namespace
|
|
|
|
TEST(expected, in_place) {
|
|
imp::expected<test_val, test_err> e1;
|
|
EXPECT_TRUE(e1);
|
|
EXPECT_EQ(e1.value().dc_, 1);
|
|
EXPECT_EQ(e1.value().val, 0);
|
|
|
|
imp::expected<test_val, test_err> e2 {imp::in_place, 123};
|
|
EXPECT_TRUE(e2);
|
|
EXPECT_EQ(e2.value().dc_, 0);
|
|
EXPECT_EQ(e2.value().val, 123);
|
|
}
|
|
|
|
TEST(expected, unexpected) {
|
|
imp::expected<test_val, test_err> e1 {imp::unexpected};
|
|
EXPECT_FALSE(e1);
|
|
EXPECT_EQ(e1.error().dc_, 1);
|
|
EXPECT_EQ(e1.error().val, 0);
|
|
|
|
imp::expected<test_val, test_err> e2 {imp::unexpected, 321};
|
|
EXPECT_FALSE(e2);
|
|
EXPECT_EQ(e2.error().dc_, 0);
|
|
EXPECT_EQ(e2.error().val, 321);
|
|
}
|
|
|
|
TEST(expected, copy_and_move) {
|
|
imp::expected<test_val, test_err> e1 {imp::in_place, 123};
|
|
imp::expected<test_val, test_err> e2 {e1};
|
|
EXPECT_TRUE(e1);
|
|
EXPECT_TRUE(e2);
|
|
EXPECT_EQ(e1, e2);
|
|
EXPECT_EQ(e2.value().cc_, 1);
|
|
EXPECT_EQ(e2.value().val, 123);
|
|
|
|
imp::expected<test_val, test_err> e3 {imp::unexpected, 333};
|
|
imp::expected<test_val, test_err> e4 {e3};
|
|
EXPECT_FALSE(e3);
|
|
EXPECT_FALSE(e4);
|
|
EXPECT_EQ(e3, e4);
|
|
EXPECT_EQ(e4.error().cc_, 1);
|
|
EXPECT_EQ(e4.error().val, 333);
|
|
|
|
imp::expected<test_val, test_err> e5;
|
|
e5 = e1;
|
|
EXPECT_EQ(e1, e5);
|
|
EXPECT_EQ(e5.value().val, 123);
|
|
|
|
imp::expected<test_val, test_err> e6;
|
|
e6 = std::move(e5);
|
|
EXPECT_EQ(e1, e6);
|
|
EXPECT_EQ(e5.value().val, 0);
|
|
} |