#include "src/__support/CPP/optional.h"
#include "test/UnitTest/Test.h"
using LIBC_NAMESPACE::cpp::nullopt;
using LIBC_NAMESPACE::cpp::optional;
class Contrived {
int *_a;
public:
Contrived(int *a) : _a(a) {}
~Contrived() { (*_a)++; }
int get_a() { return *_a; }
void inc_a() { (*_a)++; }
};
TEST(LlvmLibcOptionalTest, Tests) {
optional<int> Trivial1(12);
ASSERT_TRUE(Trivial1.has_value());
ASSERT_EQ(Trivial1.value(), 12);
ASSERT_EQ(*Trivial1, 12);
Trivial1.reset();
ASSERT_FALSE(Trivial1.has_value());
optional<int> Trivial2(12);
ASSERT_TRUE(Trivial2.has_value());
Trivial2 = nullopt;
ASSERT_FALSE(Trivial2.has_value());
int holding = 1;
{
optional<Contrived> Complicated(&holding);
ASSERT_EQ(holding, 2);
Complicated.reset();
ASSERT_EQ(holding, 3);
Complicated.reset();
ASSERT_EQ(holding, 3);
}
ASSERT_EQ(holding, 3);
optional<int> Trivial3(12);
optional<int> Trivial4 = Trivial3;
ASSERT_TRUE(Trivial4.has_value());
ASSERT_EQ(Trivial4.value(), 12);
optional<int> Trivial5;
ASSERT_FALSE(Trivial5.has_value());
optional<int> Trivial6 = Trivial5;
ASSERT_FALSE(Trivial6.has_value());
int arrow_num = 5;
optional<Contrived> arrow_test(&arrow_num);
ASSERT_TRUE(arrow_test.has_value());
ASSERT_EQ(arrow_test->get_a(), arrow_num);
arrow_num = 10;
ASSERT_EQ(arrow_test->get_a(), arrow_num);
arrow_test->inc_a();
ASSERT_EQ(arrow_test->get_a(), arrow_num);
ASSERT_EQ(arrow_num, 11);
arrow_test.reset();
}