From 7b3cbfff23d601706bf8257009d1d6b8277e6165 Mon Sep 17 00:00:00 2001 From: Nikita Ofitserov Date: Sun, 23 Jul 2017 23:47:15 +0300 Subject: [PATCH] Add some tests for std::move from std::initializer_list --- test/src/unit-constructor1.cpp | 119 +++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/test/src/unit-constructor1.cpp b/test/src/unit-constructor1.cpp index 7822b6344..a8f5deb85 100644 --- a/test/src/unit-constructor1.cpp +++ b/test/src/unit-constructor1.cpp @@ -1034,6 +1034,125 @@ TEST_CASE("constructors") CHECK(j.type() == json::value_t::array); } } + + SECTION("move from initializer_list") + { + SECTION("string") + { + // This should break through any short string optimization in std::string + std::string source(1024, '!'); + const char* source_addr = source.data(); + + SECTION("constructor with implicit types (array)") + { + json j = {std::move(source)}; + CHECK(j[0].get_ref().data() == source_addr); + } + + SECTION("constructor with implicit types (object)") + { + json j = {{"key", std::move(source)}}; + CHECK(j["key"].get_ref().data() == source_addr); + } + + SECTION("constructor with implicit types (object key)") + { + json j = {{std::move(source), 42}}; + CHECK(j.get_ref().begin()->first.data() == source_addr); + } + } + + SECTION("array") + { + json::array_t source = {1, 2, 3}; + const json* source_addr = source.data(); + + SECTION("constructor with implicit types (array)") + { + json j {std::move(source)}; + CHECK(j[0].get_ref().data() == source_addr); + } + + SECTION("constructor with implicit types (object)") + { + json j {{"key", std::move(source)}}; + CHECK(j["key"].get_ref().data() == source_addr); + } + + SECTION("assignment with implicit types (array)") + { + json j = {std::move(source)}; + CHECK(j[0].get_ref().data() == source_addr); + } + + SECTION("assignment with implicit types (object)") + { + json j = {{"key", std::move(source)}}; + CHECK(j["key"].get_ref().data() == source_addr); + } + } + + SECTION("object") + { + json::object_t source = {{"hello", "world"}}; + const json* source_addr = &source.at("hello"); + + SECTION("constructor with implicit types (array)") + { + json j {std::move(source)}; + CHECK(&(j[0].get_ref().at("hello")) == source_addr); + } + + SECTION("constructor with implicit types (object)") + { + json j {{"key", std::move(source)}}; + CHECK(&(j["key"].get_ref().at("hello")) == source_addr); + } + + SECTION("assignment with implicit types (array)") + { + json j = {std::move(source)}; + CHECK(&(j[0].get_ref().at("hello")) == source_addr); + } + + SECTION("assignment with implicit types (object)") + { + json j = {{"key", std::move(source)}}; + CHECK(&(j["key"].get_ref().at("hello")) == source_addr); + } + } + + SECTION("json") + { + json source {1, 2, 3}; + const json* source_addr = &source[0]; + + SECTION("constructor with implicit types (array)") + { + json j {std::move(source)}; + CHECK(&j[0][0] == source_addr); + } + + SECTION("constructor with implicit types (object)") + { + json j {{"key", std::move(source)}}; + CHECK(&j["key"][0] == source_addr); + } + + SECTION("assignment with implicit types (array)") + { + json j = {std::move(source)}; + CHECK(&j[0][0] == source_addr); + } + + SECTION("assignment with implicit types (object)") + { + json j = {{"key", std::move(source)}}; + CHECK(&j["key"][0] == source_addr); + } + } + + } } SECTION("create an array of n copies of a given value")