// Copyright (c) Glyn Matthews 2016. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include TEST(optional_test, empty_optional) { network::optional opt; ASSERT_FALSE(opt); } TEST(optional_test, empty_optional_constructed_with_nullopt) { network::optional opt{network::nullopt}; ASSERT_FALSE(opt); } TEST(optional_test, empty_optional_string) { network::optional opt{}; ASSERT_FALSE(opt); } TEST(optional_test, empty_optional_string_with_nullopt) { network::optional opt{network::nullopt}; ASSERT_FALSE(opt); } TEST(optional_test, value_constructor) { network::optional opt{42}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_constructor_string) { network::optional opt{"banana"}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, rvalue_ref_constructor) { int value = 42; network::optional opt{std::move(value)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, rvalue_ref_constructor_string) { std::string value = "banana"; network::optional opt{std::move(value)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, nullopt_copy_constructor) { network::optional other{network::nullopt}; network::optional opt{other}; ASSERT_FALSE(opt); } TEST(optional_test, nullopt_move_constructor) { network::optional other{network::nullopt}; network::optional opt{std::move(other)}; ASSERT_FALSE(opt); } TEST(optional_test, value_copy_constructor) { network::optional other{42}; network::optional opt{other}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_move_constructor) { network::optional other{42}; network::optional opt{std::move(other)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_copy_constructor_string) { network::optional other{"banana"}; network::optional opt{other}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, value_move_constructor_string) { network::optional other{"banana"}; network::optional opt{std::move(other)}; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, nullopt_assignment) { network::optional opt(42); opt = network::nullopt; ASSERT_FALSE(opt); } TEST(optional_test, nullopt_assignment_string) { network::optional opt("banana"); opt = network::nullopt; ASSERT_FALSE(opt); } TEST(optional_test, value_copy_assigment) { network::optional opt{}; network::optional other{42}; opt = other; ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_move_assignment) { network::optional opt{}; network::optional other{42}; opt = std::move(other); ASSERT_TRUE(opt); ASSERT_EQ(*opt, 42); } TEST(optional_test, value_copy_assignment_string) { network::optional opt{}; network::optional other{"banana"}; opt = other; ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, value_move_assignment_string) { network::optional opt{}; network::optional other{"banana"}; opt = std::move(other); ASSERT_TRUE(opt); ASSERT_EQ(*opt, "banana"); } TEST(optional_test, value_or_reference) { network::optional opt; auto result = opt.value_or("other"); ASSERT_EQ("other", result); } TEST(optional_test, value_or_reference_with_value) { network::optional opt("this"); auto result = opt.value_or("other"); ASSERT_EQ("this", result); } TEST(optional_test, value_or_rvalue_reference) { std::string other("other"); auto result = network::optional().value_or(other); ASSERT_EQ("other", result); } TEST(optional_test, value_or_rvalue_reference_with_value) { std::string other("other"); auto result = network::optional("this").value_or(other); ASSERT_EQ("this", result); } TEST(optional_test, assign_nullopt_to_nullopt) { network::optional opt; opt = network::nullopt; }