2
0
mirror of https://github.com/boostorg/json.git synced 2026-02-13 00:22:21 +00:00

array work

This commit is contained in:
Vinnie Falco
2019-09-29 18:53:17 -07:00
parent 5c1b523702
commit 5f25cdff99
29 changed files with 2587 additions and 927 deletions

View File

@@ -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 ;

View File

@@ -46,7 +46,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,stack);
BEAST_DEFINE_TESTSUITE(boost,json,stack);
} // detail
} // json

View File

@@ -43,7 +43,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,allocator);
BEAST_DEFINE_TESTSUITE(boost,json,allocator);
} // json
} // boost

File diff suppressed because it is too large Load Diff

View File

@@ -41,7 +41,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,assign_string);
BEAST_DEFINE_TESTSUITE(boost,json,assign_string);
} // json
} // boost

View File

@@ -50,7 +50,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,assign_vector);
BEAST_DEFINE_TESTSUITE(boost,json,assign_vector);
} // json
} // boost

View File

@@ -312,7 +312,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,basic_parser);
BEAST_DEFINE_TESTSUITE(boost,json,basic_parser);
} // json
} // boost

View File

@@ -62,7 +62,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,error);
BEAST_DEFINE_TESTSUITE(boost,json,error);
} // json
} // boost

View File

@@ -111,7 +111,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,iterator);
BEAST_DEFINE_TESTSUITE(boost,json,iterator);
} // json
} // boost

View File

@@ -35,7 +35,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,kind);
BEAST_DEFINE_TESTSUITE(boost,json,kind);
} // json
} // boost

View File

@@ -316,7 +316,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,number);
BEAST_DEFINE_TESTSUITE(boost,json,number);
} // json
} // boost

View File

@@ -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

View File

@@ -76,7 +76,7 @@ R"xx({
}
};
BEAST_DEFINE_TESTSUITE(beast,json,parser);
BEAST_DEFINE_TESTSUITE(boost,json,parser);
} // json
} // boost

View File

@@ -60,7 +60,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,serializer);
BEAST_DEFINE_TESTSUITE(boost,json,serializer);
} // json
} // boost

View File

@@ -32,7 +32,7 @@ public:
}
};
BEAST_DEFINE_TESTSUITE(beast,json,storage);
BEAST_DEFINE_TESTSUITE(boost,json,storage);
} // json
} // boost

View File

@@ -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

View File

@@ -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

View File

@@ -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