1e01aa904Sopenharmony_ci// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 2e01aa904Sopenharmony_ci// -*- Mode: C++ -*- 3e01aa904Sopenharmony_ci// 4e01aa904Sopenharmony_ci// Copyright (C) 2020-2022 Google, Inc. 5e01aa904Sopenharmony_ci// 6e01aa904Sopenharmony_ci// Author: Matthias Maennich 7e01aa904Sopenharmony_ci 8e01aa904Sopenharmony_ci/// @file 9e01aa904Sopenharmony_ci/// 10e01aa904Sopenharmony_ci/// This program tests libabigail's CXX compatibility layer. 11e01aa904Sopenharmony_ci 12e01aa904Sopenharmony_ci#include "lib/catch.hpp" 13e01aa904Sopenharmony_ci 14e01aa904Sopenharmony_ci#include "abg-cxx-compat.h" 15e01aa904Sopenharmony_ci 16e01aa904Sopenharmony_ciusing abg_compat::optional; 17e01aa904Sopenharmony_ci 18e01aa904Sopenharmony_ciTEST_CASE("OptionalConstruction", "[abg_compat::optional]") 19e01aa904Sopenharmony_ci{ 20e01aa904Sopenharmony_ci optional<bool> opt1; 21e01aa904Sopenharmony_ci REQUIRE_FALSE(opt1.has_value()); 22e01aa904Sopenharmony_ci 23e01aa904Sopenharmony_ci optional<bool> opt2(true); 24e01aa904Sopenharmony_ci REQUIRE(opt2.has_value()); 25e01aa904Sopenharmony_ci CHECK(opt2.value() == true); 26e01aa904Sopenharmony_ci 27e01aa904Sopenharmony_ci optional<bool> opt3(false); 28e01aa904Sopenharmony_ci REQUIRE(opt3.has_value()); 29e01aa904Sopenharmony_ci CHECK(opt3.value() == false); 30e01aa904Sopenharmony_ci} 31e01aa904Sopenharmony_ci 32e01aa904Sopenharmony_ciTEST_CASE("OptionalValue", "[abg_compat::optional]") 33e01aa904Sopenharmony_ci{ 34e01aa904Sopenharmony_ci optional<bool> opt; 35e01aa904Sopenharmony_ci REQUIRE_FALSE(opt.has_value()); 36e01aa904Sopenharmony_ci REQUIRE_THROWS(opt.value()); 37e01aa904Sopenharmony_ci 38e01aa904Sopenharmony_ci opt = true; 39e01aa904Sopenharmony_ci REQUIRE_NOTHROW(opt.value()); 40e01aa904Sopenharmony_ci CHECK(opt.value() == true); 41e01aa904Sopenharmony_ci} 42e01aa904Sopenharmony_ci 43e01aa904Sopenharmony_ciTEST_CASE("OptionalValueOr", "[abg_compat::optional]") 44e01aa904Sopenharmony_ci{ 45e01aa904Sopenharmony_ci optional<std::string> opt; 46e01aa904Sopenharmony_ci REQUIRE_FALSE(opt.has_value()); 47e01aa904Sopenharmony_ci 48e01aa904Sopenharmony_ci const std::string& mine = "mine"; 49e01aa904Sopenharmony_ci // Ensure we get a copy of our own value. 50e01aa904Sopenharmony_ci CHECK(opt.value_or(mine) == mine); 51e01aa904Sopenharmony_ci 52e01aa904Sopenharmony_ci // Now set the value 53e01aa904Sopenharmony_ci const std::string& other = "other"; 54e01aa904Sopenharmony_ci opt = other; 55e01aa904Sopenharmony_ci CHECK(opt.value_or(mine) != mine); 56e01aa904Sopenharmony_ci CHECK(opt.value_or(mine) == other); 57e01aa904Sopenharmony_ci} 58e01aa904Sopenharmony_ci 59e01aa904Sopenharmony_ciTEST_CASE("OptionalDeref", "[abg_compat::optional]") 60e01aa904Sopenharmony_ci{ 61e01aa904Sopenharmony_ci optional<std::string> opt("asdf"); 62e01aa904Sopenharmony_ci REQUIRE(opt.has_value()); 63e01aa904Sopenharmony_ci 64e01aa904Sopenharmony_ci CHECK(*opt == "asdf"); 65e01aa904Sopenharmony_ci CHECK(opt->size() == 4); 66e01aa904Sopenharmony_ci} 67