mirror of
https://github.com/boostorg/json.git
synced 2026-02-13 00:22:21 +00:00
array work
This commit is contained in:
34
test/Jamfile
34
test/Jamfile
@@ -8,24 +8,24 @@
|
||||
#
|
||||
|
||||
local SOURCES =
|
||||
_detail_stack.cpp
|
||||
allocator.cpp
|
||||
#_detail_stack.cpp
|
||||
#allocator.cpp
|
||||
array.cpp
|
||||
assign_string.cpp
|
||||
assign_vector.cpp
|
||||
basic_parser.cpp
|
||||
error.cpp
|
||||
iterator.cpp
|
||||
json.cpp
|
||||
kind.cpp
|
||||
number.cpp
|
||||
object.cpp
|
||||
parse_file.cpp
|
||||
parser.cpp
|
||||
serializer.cpp
|
||||
storage.cpp
|
||||
string.cpp
|
||||
value.cpp
|
||||
#assign_string.cpp
|
||||
#assign_vector.cpp
|
||||
#basic_parser.cpp
|
||||
#error.cpp
|
||||
#iterator.cpp
|
||||
#json.cpp
|
||||
#kind.cpp
|
||||
#number.cpp
|
||||
#object.cpp
|
||||
#parse_file.cpp
|
||||
#parser.cpp
|
||||
#serializer.cpp
|
||||
#storage.cpp
|
||||
#string.cpp
|
||||
#value.cpp
|
||||
;
|
||||
|
||||
local RUN_TESTS ;
|
||||
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,stack);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,stack);
|
||||
|
||||
} // detail
|
||||
} // json
|
||||
|
||||
@@ -43,7 +43,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,allocator);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,allocator);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
849
test/array.cpp
849
test/array.cpp
File diff suppressed because it is too large
Load Diff
@@ -41,7 +41,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,assign_string);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,assign_string);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -50,7 +50,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,assign_vector);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,assign_vector);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -312,7 +312,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,basic_parser);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,basic_parser);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,error);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,error);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -111,7 +111,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,iterator);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,iterator);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -35,7 +35,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,kind);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,kind);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -316,7 +316,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,number);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,number);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -886,7 +886,7 @@ public:
|
||||
obj1 = obj;
|
||||
break;
|
||||
}
|
||||
catch(std::bad_alloc const&)
|
||||
catch(test_failure const&)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -911,7 +911,7 @@ public:
|
||||
obj1 = obj;
|
||||
break;
|
||||
}
|
||||
catch(std::bad_alloc const&)
|
||||
catch(test_failure const&)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -935,7 +935,7 @@ public:
|
||||
obj1 = obj;
|
||||
break;
|
||||
}
|
||||
catch(std::bad_alloc const&)
|
||||
catch(test_failure const&)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -958,7 +958,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,object);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,object);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -76,7 +76,7 @@ R"xx({
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,parser);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,parser);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,serializer);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,serializer);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -32,7 +32,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,storage);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,storage);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
//obj1 = obj;
|
||||
break;
|
||||
}
|
||||
catch(std::bad_alloc const&)
|
||||
catch(test_failure const&)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,string);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,string);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
@@ -10,57 +10,16 @@
|
||||
#ifndef BOOST_JSON_TEST_STORAGE_HPP
|
||||
#define BOOST_JSON_TEST_STORAGE_HPP
|
||||
|
||||
#include <boost/json/value.hpp>
|
||||
#include <boost/json/storage.hpp>
|
||||
#include <boost/beast/_experimental/unit_test/suite.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
|
||||
namespace boost {
|
||||
namespace json {
|
||||
|
||||
struct fail_storage : storage
|
||||
{
|
||||
std::size_t fail_max = 1;
|
||||
std::size_t fail = 0;
|
||||
|
||||
void*
|
||||
allocate(
|
||||
std::size_t n,
|
||||
std::size_t) override
|
||||
{
|
||||
if(++fail == fail_max)
|
||||
{
|
||||
++fail_max;
|
||||
fail = 0;
|
||||
throw std::bad_alloc{};
|
||||
}
|
||||
return std::allocator<
|
||||
char>{}.allocate(n);
|
||||
}
|
||||
|
||||
void
|
||||
deallocate(
|
||||
void* p,
|
||||
std::size_t n,
|
||||
std::size_t) noexcept override
|
||||
{
|
||||
auto cp =
|
||||
reinterpret_cast<char*>(p);
|
||||
return std::allocator<
|
||||
char>{}.deallocate(cp, n);
|
||||
}
|
||||
bool
|
||||
is_equal(
|
||||
storage const& other
|
||||
) const noexcept override
|
||||
{
|
||||
auto p = dynamic_cast<
|
||||
fail_storage const*>(&other);
|
||||
if(! p)
|
||||
return false;
|
||||
return this == p;
|
||||
}
|
||||
};
|
||||
|
||||
struct unique_storage : storage
|
||||
{
|
||||
void*
|
||||
@@ -85,17 +44,173 @@ struct unique_storage : storage
|
||||
}
|
||||
bool
|
||||
is_equal(
|
||||
storage const& other
|
||||
) const noexcept override
|
||||
storage const&) const noexcept override
|
||||
{
|
||||
auto p = dynamic_cast<
|
||||
unique_storage const*>(&other);
|
||||
if(! p)
|
||||
return false;
|
||||
return this == p;
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
struct test_failure : std::exception
|
||||
{
|
||||
virtual
|
||||
char const*
|
||||
what() const noexcept override
|
||||
{
|
||||
return "test failure";
|
||||
}
|
||||
};
|
||||
|
||||
struct fail_storage : storage
|
||||
{
|
||||
std::size_t fail_max = 1;
|
||||
std::size_t fail = 0;
|
||||
|
||||
~fail_storage()
|
||||
{
|
||||
}
|
||||
|
||||
void*
|
||||
allocate(
|
||||
std::size_t n,
|
||||
std::size_t) override
|
||||
{
|
||||
if(++fail == fail_max)
|
||||
{
|
||||
++fail_max;
|
||||
fail = 0;
|
||||
throw test_failure{};
|
||||
}
|
||||
return std::allocator<
|
||||
char>{}.allocate(n);
|
||||
}
|
||||
|
||||
void
|
||||
deallocate(
|
||||
void* p,
|
||||
std::size_t n,
|
||||
std::size_t) noexcept override
|
||||
{
|
||||
auto cp =
|
||||
reinterpret_cast<char*>(p);
|
||||
return std::allocator<
|
||||
char>{}.deallocate(cp, n);
|
||||
}
|
||||
bool
|
||||
is_equal(
|
||||
storage const&) const noexcept override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
class scoped_fail_storage
|
||||
{
|
||||
storage_ptr sp_;
|
||||
|
||||
public:
|
||||
scoped_fail_storage()
|
||||
: sp_(default_storage())
|
||||
{
|
||||
default_storage(
|
||||
make_storage<fail_storage>());
|
||||
}
|
||||
|
||||
~scoped_fail_storage()
|
||||
{
|
||||
default_storage(sp_);
|
||||
}
|
||||
};
|
||||
|
||||
template<class F>
|
||||
void
|
||||
fail_loop(F&& f)
|
||||
{
|
||||
auto sp = make_storage<fail_storage>();
|
||||
while(sp->fail < 200)
|
||||
{
|
||||
try
|
||||
{
|
||||
f(sp);
|
||||
}
|
||||
catch(test_failure const&)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
BEAST_EXPECT(sp->fail < 200);
|
||||
}
|
||||
|
||||
inline
|
||||
bool
|
||||
equal_storage(
|
||||
value const& v,
|
||||
storage_ptr const& sp);
|
||||
|
||||
inline
|
||||
bool
|
||||
equal_storage(
|
||||
array const& a,
|
||||
storage_ptr const& sp)
|
||||
{
|
||||
if(*a.get_storage() != *sp)
|
||||
return false;
|
||||
for(auto const& v : a)
|
||||
if(! equal_storage(v, sp))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
equal_storage(
|
||||
value const& v,
|
||||
storage_ptr const& sp)
|
||||
{
|
||||
switch(v.kind())
|
||||
{
|
||||
case json::kind::object:
|
||||
if(*v.as_object().get_storage() != *sp)
|
||||
return false;
|
||||
for(auto const& e : v)
|
||||
if(! equal_storage(e.second, sp))
|
||||
return false;
|
||||
return true;
|
||||
|
||||
case json::kind::array:
|
||||
if(*v.as_array().get_storage() != *sp)
|
||||
return false;
|
||||
return equal_storage(v.as_array(), sp);
|
||||
|
||||
case json::kind::string:
|
||||
return *v.as_string().get_allocator().get_storage() == *sp;
|
||||
|
||||
case json::kind::number:
|
||||
case json::kind::boolean:
|
||||
case json::kind::null:
|
||||
break;
|
||||
}
|
||||
|
||||
return *v.get_storage() == *sp;
|
||||
}
|
||||
|
||||
inline
|
||||
void
|
||||
check_storage(
|
||||
array const& a,
|
||||
storage_ptr const& sp)
|
||||
{
|
||||
BEAST_EXPECT(equal_storage(a, sp));
|
||||
}
|
||||
|
||||
inline
|
||||
void
|
||||
check_storage(
|
||||
value const& v,
|
||||
storage_ptr const& sp)
|
||||
{
|
||||
BEAST_EXPECT(equal_storage(v, sp));
|
||||
}
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
|
||||
@@ -656,7 +656,37 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
BEAST_DEFINE_TESTSUITE(beast,json,value);
|
||||
BEAST_DEFINE_TESTSUITE(boost,json,value);
|
||||
|
||||
} // json
|
||||
} // boost
|
||||
|
||||
#if 0
|
||||
|
||||
/** {brief}
|
||||
|
||||
{description}
|
||||
|
||||
@par Constraints
|
||||
|
||||
{constraints}
|
||||
|
||||
@par Requires
|
||||
|
||||
{requires}
|
||||
|
||||
@par Complexity
|
||||
|
||||
{complexity}
|
||||
|
||||
@par Exception Safety
|
||||
|
||||
Strong guarantee.
|
||||
Calls to @ref storage::allocate may throw.
|
||||
|
||||
@param {name} {desc}
|
||||
|
||||
@tparam {type} {desc}
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user