#include <catch2/catch.hpp>
#include <iostream>
#include "optional.hpp"
namespace datasketches {
class tt {
public:
tt() = delete; tt(int val): val_(val) {}
tt(const tt& other): val_(other.val_) { std::cout << "tt copy constructor\n"; }
tt(tt&& other): val_(other.val_) { std::cout << "tt move constructor\n"; }
tt& operator=(const tt& other) { val_ = other.val_; std::cout << "tt copy assignment\n"; return *this; }
tt& operator=(tt&& other) { val_ = other.val_; std::cout << "tt move assignment\n"; return *this; }
int get_val() const { return val_; }
private:
int val_;
};
TEST_CASE("optional", "[common]") {
optional<tt> opt;
REQUIRE_FALSE(opt);
opt.emplace(5);
REQUIRE(bool(opt));
REQUIRE((*opt).get_val() == 5);
REQUIRE(opt->get_val() == 5);
opt.reset();
REQUIRE_FALSE(opt);
optional<tt> opt2(opt);
REQUIRE_FALSE(opt2);
opt2.emplace(3);
if (opt2) *opt2 = 6; REQUIRE(opt2->get_val() == 6);
opt.reset();
REQUIRE_FALSE(opt);
optional<tt> opt3(std::move(opt));
REQUIRE_FALSE(opt3);
*opt3 = 7; REQUIRE_FALSE(opt3);
opt3.emplace(8);
REQUIRE(bool(opt3));
REQUIRE(opt3->get_val() == 8);
std::swap(opt2, opt3);
REQUIRE(opt2->get_val() == 8);
REQUIRE(opt3->get_val() == 6);
std::swap(opt2, opt);
REQUIRE_FALSE(opt2);
REQUIRE(bool(opt));
REQUIRE(opt->get_val() == 8);
}
TEST_CASE("optional conversion", "[common]") {
optional<float> opt_f(1);
optional<double> opt_d(opt_f);
REQUIRE(bool(opt_d));
REQUIRE(*opt_d == static_cast<double>(*opt_f));
}
}