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