Files
M5Utility/test/optional/issues.cpp
T

60 lines
1.2 KiB
C++
Raw Permalink Normal View History

2024-08-08 14:30:50 +09:00
#include <gtest/gtest.h>
#include <m5_utility/stl/optional.hpp>
#include <type_traits>
namespace issues {
2024-08-08 14:44:12 +09:00
struct foo {
2024-09-25 18:24:01 +09:00
int& v()
{
2024-08-08 14:44:12 +09:00
return i;
}
2024-08-08 14:30:50 +09:00
int i = 0;
};
2024-08-08 14:44:12 +09:00
} // namespace issues
2024-09-25 18:24:01 +09:00
int& x(int& i)
{
2024-08-08 14:44:12 +09:00
i = 42;
return i;
2024-08-08 14:30:50 +09:00
}
2024-09-25 18:24:01 +09:00
TEST(Optional, issue14)
{
2024-08-08 14:30:50 +09:00
m5::stl::optional<issues::foo> f = issues::foo{};
2024-08-08 14:44:12 +09:00
auto v = f.map(&issues::foo::v).map(x);
2024-08-08 14:30:50 +09:00
static_assert(std::is_same<decltype(v), m5::stl::optional<int&>>::value, "Must return a reference");
EXPECT_TRUE(f->i == 42);
EXPECT_TRUE(*v == 42);
EXPECT_TRUE((&f->i) == (&*v));
}
struct fail_on_copy_self {
int value;
2024-09-25 18:24:01 +09:00
fail_on_copy_self(int v) : value(v)
{
2024-08-08 14:44:12 +09:00
}
2024-09-25 18:24:01 +09:00
fail_on_copy_self(const fail_on_copy_self& other) : value(other.value)
{
2024-08-08 14:30:50 +09:00
EXPECT_TRUE(&other != this);
}
};
2024-09-25 18:24:01 +09:00
TEST(Optional, issue15)
{
2024-08-08 14:30:50 +09:00
m5::stl::optional<fail_on_copy_self> o = fail_on_copy_self(42);
o = o;
EXPECT_TRUE(o->value == 42);
}
2024-09-25 18:24:01 +09:00
TEST(Optional, issue33)
{
2024-08-08 14:44:12 +09:00
int i = 0;
int j = 0;
2024-08-08 14:30:50 +09:00
m5::stl::optional<int&> a = i;
a.emplace(j);
*a = 42;
EXPECT_TRUE(j == 42);
EXPECT_TRUE(*a == 42);
EXPECT_TRUE(a.has_value());
}