diff --git a/include/boost/yaml/yaml.hpp b/include/boost/yaml/yaml.hpp index ece5fd37..3f8b3f96 100644 --- a/include/boost/yaml/yaml.hpp +++ b/include/boost/yaml/yaml.hpp @@ -159,6 +159,15 @@ namespace boost { namespace yaml { template bool is() const noexcept { + switch (storage_.local_.kind_) { + case value::null_k: return std::is_same::value; + case value::boolean_k: return std::is_same::value; + case value::int_k: return std::is_same::value; + case value::double_k: return std::is_same::value; + case value::local_string_k: + return std::is_same::value; + default: break; + } return storage_.remote_.ptr_->type_id() == typeindex::type_id(); } diff --git a/include/boost/yaml/yaml_fwd.hpp b/include/boost/yaml/yaml_fwd.hpp index 769f4580..acd11da6 100644 --- a/include/boost/yaml/yaml_fwd.hpp +++ b/include/boost/yaml/yaml_fwd.hpp @@ -68,6 +68,15 @@ namespace boost { namespace yaml { explicit operator bool() const { return tag_ != "" || anchor_ != ""; } + bool operator==(properties const & rhs) const noexcept + { + return tag_ == rhs.tag_ && anchor_ == rhs.anchor_; + } + bool operator!=(properties const & rhs) const noexcept + { + return !(*this == rhs); + } + std::string tag_; std::string anchor_; }; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4e1387ab..986fc635 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -48,10 +48,11 @@ add_test_executable(parser_action_with_params) add_test_executable(parser_symbol_table) ################################################## -# Parser tests +# YAML/JSON datA type tests ################################################## add_test_executable(json_value) +add_test_executable(yaml_value) ################################################## # Header-only build test diff --git a/test/yaml_value.cpp b/test/yaml_value.cpp new file mode 100644 index 00000000..0ea23d7f --- /dev/null +++ b/test/yaml_value.cpp @@ -0,0 +1,1415 @@ +// Copyright (C) 2018 T. Zachary Laine +// +// 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 + + +using namespace boost::yaml; + +struct udt +{ + int data_; + + bool operator==(udt const & rhs) const noexcept + { + return data_ == rhs.data_; + } + bool operator!=(udt const & rhs) const noexcept { return !(*this == rhs); } +}; + +int const int_num = 42; +double const double_num = 42.13; +std::string_view short_string = "short"; +std::string_view long_string = + "this is not going to fix within the SSO of value, so it'll have to go on " + "the heap instead."; +map const yaml_map = {map::value_type{int_num, double_num}}; +seq const yaml_seq = {double_num, short_string}; +alias const yaml_alias{"first", std::make_shared(value("second"))}; +property_node const yaml_property_node{{"tag", "anchor"}, value(int_num)}; +udt const user_defined{-1}; + +TEST(yaml_value, default_ctor) +{ + value v; + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); +} + +TEST(yaml_value, null_ctor) +{ + value v(null_t{}); + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); +} + +TEST(yaml_value, bool_ctor) +{ + value v(true); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(true)); + EXPECT_NE(v, value(false)); + EXPECT_EQ(v.kind(), value_kind::boolean); + EXPECT_FALSE(v.is_null()); + EXPECT_TRUE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), true); +} + +TEST(yaml_value, int_ctor) +{ + value v(int_num); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(int_num)); + EXPECT_NE(v, value(0)); + EXPECT_EQ(v.kind(), value_kind::int_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_TRUE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), int_num); +} + +TEST(yaml_value, double_ctor) +{ + value v(double_num); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(double_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::double_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_TRUE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), double_num); +} + +TEST(yaml_value, string_ctor) +{ + { + std::string s(short_string); + value v(s); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + std::string s(long_string); + value v(s); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + + { + std::vector s(short_string.begin(), short_string.end()); + value v(s); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + std::vector s(long_string.begin(), long_string.end()); + value v(s); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + + { + value v(std::string{short_string}); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(std::string{long_string}); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + + { + value v(short_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(long_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } +} + +TEST(yaml_value, map_ctor) +{ + { + value v(yaml_map); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } + { + value v(map{yaml_map}); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } +} + +TEST(yaml_value, seq_ctor) +{ + { + value v(yaml_seq); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } + { + seq a = yaml_seq; + value v(std::move(a)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } +} + +TEST(yaml_value, udt_ctor) +{ + value v(user_defined); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(user_defined)); + EXPECT_NE(v, value(udt{})); + EXPECT_EQ(v.kind(), value_kind::user_defined); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_TRUE(v.is_user_defined()); + EXPECT_TRUE(v.is()); + EXPECT_EQ(get(v), user_defined); +} + +TEST(yaml_value, copy_ctor) +{ + value v_default; + value v_true(true); + value v_int(int_num); + value v_double(double_num); + value v_short_string(short_string); + value v_long_string(long_string); + value v_map(yaml_map); + value v_seq(yaml_seq); + + { + value v(v_default); + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); + } + { + value v(v_true); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(true)); + EXPECT_NE(v, value(false)); + EXPECT_EQ(v.kind(), value_kind::boolean); + EXPECT_FALSE(v.is_null()); + EXPECT_TRUE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), true); + } + { + value v(v_double); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(double_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::double_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_TRUE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), double_num); + } + { + value v(v_int); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(int_num)); + EXPECT_NE(v, value(0)); + EXPECT_EQ(v.kind(), value_kind::int_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_TRUE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), int_num); + } + { + value v(v_short_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(v_long_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + { + value v(v_map); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } + { + value v(v_seq); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } +} + +TEST(yaml_value, move_ctor) +{ + value v_default; + value v_true(true); + value v_double(double_num); + value v_int(int_num); + value v_short_string(short_string); + value v_long_string(long_string); + value v_map(yaml_map); + value v_seq(yaml_seq); + + { + value v(std::move(v_default)); + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); + } + { + value v(std::move(v_true)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(true)); + EXPECT_NE(v, value(false)); + EXPECT_EQ(v.kind(), value_kind::boolean); + EXPECT_FALSE(v.is_null()); + EXPECT_TRUE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), true); + } + { + value v(std::move(v_int)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(int_num)); + EXPECT_NE(v, value(0)); + EXPECT_EQ(v.kind(), value_kind::int_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_TRUE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), int_num); + } + { + value v(std::move(v_double)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(double_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::double_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_TRUE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), double_num); + } + { + value v(std::move(v_short_string)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(std::move(v_long_string)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + { + value v(std::move(v_map)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } + { + value v(std::move(v_seq)); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } +} + +TEST(yaml_value, copy_assign) +{ + value v_default; + value v_true(true); + value v_int(int_num); + value v_double(double_num); + value v_short_string(short_string); + value v_long_string(long_string); + value v_map(yaml_map); + value v_seq(yaml_seq); + + // assign to local + { + value v(true); + v = v_default; + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); + } + { + value v(double_num); + v = v_true; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(true)); + EXPECT_NE(v, value(false)); + EXPECT_EQ(v.kind(), value_kind::boolean); + EXPECT_FALSE(v.is_null()); + EXPECT_TRUE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), true); + } + { + value v(short_string); + v = v_int; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(int_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::int_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_TRUE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), int_num); + } + { + value v(short_string); + v = v_double; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(double_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::double_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_TRUE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), double_num); + } + { + value v; + v = v_short_string; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(false); + v = v_long_string; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + { + value v(double_num); + v = v_map; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } + { + value v; + v = v_seq; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } + + // assign to remote + { + value v(yaml_map); + v = v_default; + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); + } + { + value v(yaml_seq); + v = v_true; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(true)); + EXPECT_NE(v, value(false)); + EXPECT_EQ(v.kind(), value_kind::boolean); + EXPECT_FALSE(v.is_null()); + EXPECT_TRUE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), true); + } + { + value v(long_string); + v = v_int; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(int_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::int_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_TRUE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), int_num); + } + { + value v(long_string); + v = v_double; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(double_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::double_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_TRUE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), double_num); + } + { + value v(yaml_map); + v = v_short_string; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(yaml_seq); + v = v_long_string; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + { + value v(long_string); + v = v_map; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } + { + value v(yaml_map); + v = v_seq; + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } +} + +TEST(yaml_value, move_assign) +{ + // assign to local + { + value v_default; + value v_true(true); + value v_int(int_num); + value v_double(double_num); + value v_short_string(short_string); + value v_long_string(long_string); + value v_map(yaml_map); + value v_seq(yaml_seq); + + { + value v(true); + v = std::move(v_default); + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); + } + { + value v(double_num); + v = std::move(v_true); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(true)); + EXPECT_NE(v, value(false)); + EXPECT_EQ(v.kind(), value_kind::boolean); + EXPECT_FALSE(v.is_null()); + EXPECT_TRUE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), true); + } + { + value v(short_string); + v = std::move(v_int); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(int_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::int_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_TRUE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), int_num); + } + { + value v(short_string); + v = std::move(v_double); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(double_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::double_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_TRUE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), double_num); + } + { + value v; + v = std::move(v_short_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(false); + v = std::move(v_long_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + { + value v(double_num); + v = std::move(v_map); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } + { + value v; + v = std::move(v_seq); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } + } + + // assign to remote + { + value v_default; + value v_true(true); + value v_int(int_num); + value v_double(double_num); + value v_short_string(short_string); + value v_long_string(long_string); + value v_map(yaml_map); + value v_seq(yaml_seq); + + { + value v(yaml_map); + v = std::move(v_default); + EXPECT_EQ(v, value()); + EXPECT_FALSE(v != value()); + EXPECT_EQ(v.kind(), value_kind::null); + EXPECT_TRUE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), null_t{}); + } + { + value v(yaml_seq); + v = std::move(v_true); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(true)); + EXPECT_NE(v, value(false)); + EXPECT_EQ(v.kind(), value_kind::boolean); + EXPECT_FALSE(v.is_null()); + EXPECT_TRUE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), true); + } + { + value v(long_string); + v = std::move(v_int); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(int_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::int_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_TRUE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), int_num); + } + { + value v(long_string); + v = std::move(v_double); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(double_num)); + EXPECT_NE(v, value(0.0)); + EXPECT_EQ(v.kind(), value_kind::double_); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_TRUE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), double_num); + } + { + value v(yaml_map); + v = std::move(v_short_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(short_string)); + EXPECT_NE(v, value(long_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), short_string); + } + { + value v(yaml_seq); + v = std::move(v_long_string); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(long_string)); + EXPECT_NE(v, value(short_string)); + EXPECT_EQ(v.kind(), value_kind::string); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_TRUE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), long_string); + } + { + value v(long_string); + v = std::move(v_map); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_map)); + EXPECT_NE(v, value(map())); + EXPECT_EQ(v.kind(), value_kind::map); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_TRUE(v.is_map()); + EXPECT_FALSE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_map); + } + { + value v(yaml_map); + v = std::move(v_seq); + EXPECT_NE(v, value()); + EXPECT_EQ(v, value(yaml_seq)); + EXPECT_NE(v, value(seq())); + EXPECT_EQ(v.kind(), value_kind::seq); + EXPECT_FALSE(v.is_null()); + EXPECT_FALSE(v.is_boolean()); + EXPECT_FALSE(v.is_int()); + EXPECT_FALSE(v.is_double()); + EXPECT_FALSE(v.is_string()); + EXPECT_FALSE(v.is_map()); + EXPECT_TRUE(v.is_seq()); + EXPECT_FALSE(v.is_alias()); + EXPECT_FALSE(v.is_property_node()); + EXPECT_FALSE(v.is_user_defined()); + EXPECT_FALSE(v.is()); + EXPECT_EQ(get(v), yaml_seq); + } + } +}