blob: 3d2b8b3581a79f3f495e7a6808ea1d8766b9da11 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <catch2/catch.hpp>
#include <iostream>
#include "optional.hpp"
namespace datasketches {
class tt {
public:
tt() = delete; // make sure it cannot be default constructed
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; // good if it is initialized
REQUIRE(opt2->get_val() == 6);
opt.reset();
REQUIRE_FALSE(opt);
optional<tt> opt3(std::move(opt));
REQUIRE_FALSE(opt3);
*opt3 = 7; // don't do this! may be dangerous for arbitrary T, and it still thinks it is not initialized
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));
}
} /* namespace datasketches */