| /* |
| * 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 */ |