405 lines
9.5 KiB
C++
405 lines
9.5 KiB
C++
//
|
|
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
|
|
//
|
|
// 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)
|
|
//
|
|
// Official repository: https://github.com/boostorg/json
|
|
//
|
|
|
|
// Test that header file is self-contained.
|
|
#include <boost/json/value_ref.hpp>
|
|
|
|
#include <boost/json/value.hpp>
|
|
#include <boost/json/serialize.hpp>
|
|
|
|
#include "test_suite.hpp"
|
|
|
|
BOOST_JSON_NS_BEGIN
|
|
|
|
//----------------------------------------------------------
|
|
|
|
// From the javadoc
|
|
|
|
class my_type
|
|
{
|
|
json::value jv_;
|
|
|
|
public:
|
|
my_type( std::initializer_list< json::value_ref > init )
|
|
: jv_(init)
|
|
{
|
|
}
|
|
};
|
|
|
|
//----------------------------------------------------------
|
|
|
|
class value_ref_test
|
|
{
|
|
public:
|
|
using init_list =
|
|
std::initializer_list<value_ref>;
|
|
|
|
void
|
|
testCtors()
|
|
{
|
|
// scalars
|
|
(void)value_ref((signed char)1);
|
|
(void)value_ref((short)1);
|
|
(void)value_ref((int)1);
|
|
(void)value_ref((long)1);
|
|
(void)value_ref((long long)1);
|
|
(void)value_ref((unsigned char)1);
|
|
(void)value_ref((unsigned short)1);
|
|
(void)value_ref((unsigned int)1);
|
|
(void)value_ref((unsigned long)1);
|
|
(void)value_ref((unsigned long long)1);
|
|
(void)value_ref((float)1.);
|
|
(void)value_ref((double)1.);
|
|
(void)value_ref(true);
|
|
(void)value_ref(nullptr);
|
|
|
|
// string_view, char const*
|
|
(void)(value_ref)string_view("test");
|
|
(void)(value_ref)("test");
|
|
|
|
// init-list
|
|
value_ref({1,2,3,4,5});
|
|
|
|
// value
|
|
(value_ref)value();
|
|
{
|
|
value jv;
|
|
(value_ref)jv;
|
|
}
|
|
{
|
|
value const jv;
|
|
(value_ref)jv;
|
|
}
|
|
|
|
// object
|
|
(value_ref)object();
|
|
{
|
|
object o;
|
|
(value_ref)o;
|
|
}
|
|
{
|
|
object const o{};
|
|
(value_ref)o;
|
|
}
|
|
|
|
// array
|
|
(value_ref)object();
|
|
{
|
|
array a;
|
|
(value_ref)a;
|
|
}
|
|
{
|
|
array const a{};
|
|
(value_ref)a;
|
|
}
|
|
|
|
// string
|
|
(value_ref)string();
|
|
{
|
|
string s;
|
|
(value_ref)s;
|
|
}
|
|
{
|
|
string const s{};
|
|
(value_ref)s;
|
|
}
|
|
|
|
// construct from a const rvalue
|
|
{
|
|
const value val;
|
|
(void)value_ref(std::move(val));
|
|
}
|
|
}
|
|
|
|
void
|
|
testInitList()
|
|
{
|
|
// string_view, char const*
|
|
(void)init_list{string_view("test")};
|
|
(void)init_list{"test"};
|
|
|
|
// scalars
|
|
(void)init_list{(short)1};
|
|
(void)init_list{(int)1};
|
|
(void)init_list{(long)1};
|
|
(void)init_list{(long long)1};
|
|
(void)init_list{(unsigned short)1};
|
|
(void)init_list{(unsigned int)1};
|
|
(void)init_list{(unsigned long)1};
|
|
(void)init_list{(unsigned long long)1};
|
|
(void)init_list{(float)1.};
|
|
(void)init_list{(double)1.};
|
|
(void)init_list{true};
|
|
(void)init_list{nullptr};
|
|
|
|
// bool
|
|
{
|
|
bool b = true;
|
|
auto const cb = b;
|
|
BOOST_TEST(value_ref::make_value(init_list{b}, {}).at(0).is_bool());
|
|
BOOST_TEST(value_ref::make_value(init_list{cb}, {}).at(0).is_bool());
|
|
}
|
|
|
|
// value
|
|
(void)init_list{value()};
|
|
{
|
|
value jv;
|
|
(void)init_list{jv};
|
|
}
|
|
{
|
|
value const jv{};
|
|
(void)init_list{jv};
|
|
}
|
|
|
|
// object
|
|
(void)init_list{object()};
|
|
{
|
|
object o;
|
|
(void)init_list{o};
|
|
}
|
|
{
|
|
object const o{};
|
|
(void)init_list{o};
|
|
}
|
|
|
|
// array
|
|
(void)init_list{object()};
|
|
{
|
|
array a;
|
|
(void)init_list{a};
|
|
}
|
|
{
|
|
array const a{};
|
|
(void)init_list{a};
|
|
}
|
|
|
|
// string
|
|
(void)init_list{string()};
|
|
{
|
|
string s;
|
|
(void)init_list{s};
|
|
}
|
|
{
|
|
string const s{};
|
|
(void)init_list{s};
|
|
}
|
|
|
|
// init_list
|
|
(void)init_list{{1,2,3,4,5}};
|
|
(void)init_list{{{1,2},{3,4,5}}};
|
|
(void)init_list{{1,2,{3,{4,5}}}};
|
|
|
|
{
|
|
init_list init =
|
|
{ { "key", true } };
|
|
(void)init;
|
|
}
|
|
}
|
|
|
|
void
|
|
make_value(
|
|
init_list init,
|
|
string_view s)
|
|
{
|
|
auto const jv =
|
|
value_ref(init).make_value({});
|
|
auto const js = serialize(jv);
|
|
BOOST_TEST(js == s);
|
|
}
|
|
|
|
void
|
|
testMakeValue()
|
|
{
|
|
// scalars
|
|
make_value({(short)-1}, "[-1]");
|
|
make_value({(int)-2}, "[-2]");
|
|
make_value({(long)-3}, "[-3]");
|
|
make_value({(long long)-4}, "[-4]");
|
|
make_value({(unsigned short)1}, "[1]");
|
|
make_value({(unsigned int)2}, "[2]");
|
|
make_value({(unsigned long)3}, "[3]");
|
|
make_value({(unsigned long long)4}, "[4]");
|
|
//make_value({(float)1.}, "[1]");
|
|
//make_value({(double)1.}, "[1]");
|
|
make_value({true}, "[true]");
|
|
make_value({nullptr}, "[null]");
|
|
|
|
// string_view
|
|
make_value({string_view("5")}, "[\"5\"]");
|
|
make_value({"6"}, "[\"6\"]");
|
|
|
|
// value
|
|
{
|
|
make_value({value(1)}, "[1]");
|
|
value const v(1);
|
|
make_value({v}, "[1]");
|
|
make_value({value(2)}, "[2]");
|
|
}
|
|
|
|
// object
|
|
{
|
|
make_value({object({{"k1",1},{"k2",2}})}, "[{\"k1\":1,\"k2\":2}]");
|
|
object const obj({{"k1",1},{"k2",2}});
|
|
make_value({obj}, "[{\"k1\":1,\"k2\":2}]");
|
|
}
|
|
|
|
// array
|
|
{
|
|
make_value({array({1,2,3})}, "[[1,2,3]]");
|
|
array const arr({1,2,3});
|
|
make_value({arr}, "[[1,2,3]]");
|
|
}
|
|
|
|
// string
|
|
{
|
|
make_value({string("test")}, "[\"test\"]");
|
|
string const str("test");
|
|
make_value({str}, "[\"test\"]");
|
|
}
|
|
|
|
// init list with size != 2
|
|
{
|
|
make_value({{1,2,3}}, "[[1,2,3]]");
|
|
}
|
|
|
|
// `string` as key
|
|
{
|
|
make_value({
|
|
{string("k1"), 1},
|
|
{string("k2"), 2}},
|
|
"{\"k1\":1,\"k2\":2}");
|
|
}
|
|
|
|
// object/array conversion
|
|
|
|
make_value(
|
|
{1,2,{3,{4,5}}},
|
|
"[1,2,[3,[4,5]]]" );
|
|
|
|
make_value(
|
|
{{"k1",1}},
|
|
"{\"k1\":1}");
|
|
|
|
make_value(
|
|
{{"k1",1}, {"k2",2}},
|
|
"{\"k1\":1,\"k2\":2}");
|
|
|
|
make_value(
|
|
{{"k1",1}, {"k2",{{"k3",3}, {"k4",4}}}},
|
|
"{\"k1\":1,\"k2\":{\"k3\":3,\"k4\":4}}");
|
|
|
|
make_value({value(1)}, "[1]");
|
|
make_value({array({1,2,3,4})}, "[[1,2,3,4]]");
|
|
}
|
|
|
|
using kv_init_list =
|
|
std::initializer_list<
|
|
std::pair<string_view, value_ref>>;
|
|
|
|
void
|
|
make_object(
|
|
kv_init_list init,
|
|
string_view s)
|
|
{
|
|
auto const jv = value(object(init));
|
|
auto const js = serialize(jv);
|
|
BOOST_TEST(js == s);
|
|
}
|
|
|
|
void
|
|
testObjects()
|
|
{
|
|
make_object({
|
|
{"k1",1}
|
|
}, "{\"k1\":1}");
|
|
make_object({
|
|
{"k1",1}, {"k2",2}
|
|
}, "{\"k1\":1,\"k2\":2}");
|
|
make_object({
|
|
{"k1", {1,2}}, {"k2", {1,2,3}}
|
|
}, "{\"k1\":[1,2],\"k2\":[1,2,3]}");
|
|
make_object({
|
|
{"k1", {{"k2",2}, {"k3",3}}}
|
|
}, "{\"k1\":{\"k2\":2,\"k3\":3}}");
|
|
}
|
|
|
|
void
|
|
testMoveFrom()
|
|
{
|
|
{
|
|
string a = "abcdefghijklmnopqrstuvwxyz";
|
|
BOOST_TEST(!a.empty());
|
|
array b{std::move(a), string()};
|
|
BOOST_TEST(a.empty());
|
|
}
|
|
{
|
|
string a = "abcdefghijklmnopqrstuvwxyz";
|
|
BOOST_TEST(!a.empty());
|
|
array b{a, string()};
|
|
BOOST_TEST(!a.empty());
|
|
}
|
|
{
|
|
string const a = "abcdefghijklmnopqrstuvwxyz";
|
|
BOOST_TEST(!a.empty());
|
|
array b{a, string()};
|
|
BOOST_TEST(!a.empty());
|
|
}
|
|
{
|
|
array a{value()};
|
|
BOOST_TEST(a.begin() != a.end());
|
|
array b{std::move(a), array()};
|
|
BOOST_TEST(a.begin() == a.end());
|
|
}
|
|
{
|
|
array a{value()};
|
|
BOOST_TEST(a.begin() != a.end());
|
|
array b{a, array()};
|
|
BOOST_TEST(a.begin() != a.end());
|
|
}
|
|
{
|
|
const array a{value()};
|
|
BOOST_TEST(a.begin() != a.end());
|
|
array b{a, array()};
|
|
BOOST_TEST(a.begin() != a.end());
|
|
}
|
|
{
|
|
object a{{"a", 1}, {"b", 2}};
|
|
BOOST_TEST(a.capacity() > 0);
|
|
array b{std::move(a), object()};
|
|
BOOST_TEST(a.capacity() == 0);
|
|
}
|
|
{
|
|
object a{{"a", 1}, {"b", 2}};
|
|
BOOST_TEST(a.capacity() > 0);
|
|
array b{a, object()};
|
|
BOOST_TEST(a.capacity() > 0);
|
|
}
|
|
{
|
|
const object a{{"a", 1}, {"b", 2}};
|
|
BOOST_TEST(a.capacity() > 0);
|
|
array b{a, object()};
|
|
BOOST_TEST(a.capacity() > 0);
|
|
}
|
|
}
|
|
|
|
void
|
|
run()
|
|
{
|
|
testCtors();
|
|
testInitList();
|
|
testMakeValue();
|
|
testObjects();
|
|
testMoveFrom();
|
|
}
|
|
};
|
|
|
|
TEST_SUITE(value_ref_test, "boost.json.value_ref");
|
|
|
|
BOOST_JSON_NS_END
|