Adding tests for #8, fixed bug re #8

Added a test case for versioning which exposed a small bug that related to loading versioned data due to an improper use
of static.
This commit is contained in:
Shane Grant 2013-12-21 23:21:24 -08:00
parent 7ef5a9311b
commit 9085b6dc79
2 changed files with 94 additions and 25 deletions

View File

@ -782,7 +782,7 @@ namespace cereal
ArchiveType &>::type
processImpl(T & t)
{
static const auto version = loadClassVersion<T>();
const auto version = loadClassVersion<T>();
access::member_serialize(*self, t, version);
return *self;
}
@ -794,7 +794,7 @@ namespace cereal
ArchiveType &>::type
processImpl(T & t)
{
static const auto version = loadClassVersion<T>();
const auto version = loadClassVersion<T>();
serialize(*self, t, version);
return *self;
}
@ -806,7 +806,7 @@ namespace cereal
ArchiveType &>::type
processImpl(T & t)
{
static const auto version = loadClassVersion<T>();
const auto version = loadClassVersion<T>();
access::member_load(*self, t, version);
return *self;
}
@ -818,7 +818,7 @@ namespace cereal
ArchiveType &>::type
processImpl(T & t)
{
static const auto version = loadClassVersion<T>();
const auto version = loadClassVersion<T>();
load(*self, t, version);
return *self;
}

View File

@ -3136,17 +3136,20 @@ BOOST_AUTO_TEST_CASE( json_unordered_loads )
}
// ######################################################################
struct VersionStructMS
class VersionStructMS
{
bool x;
std::uint32_t v;
template <class Archive>
void serialize( Archive & ar, std::uint32_t const version )
{
ar( x );
std::cerr << "VersionStructMS " << version << std::endl;
v = version;
}
public:
bool x;
std::uint32_t v;
private:
friend class cereal::access;
template <class Archive>
void serialize( Archive & ar, std::uint32_t const version )
{
ar( x );
v = version;
}
};
struct VersionStructMSP
@ -3154,22 +3157,54 @@ struct VersionStructMSP
uint8_t x;
std::uint32_t v;
template <class Archive>
void save( Archive & ar, std::uint32_t const version ) const
{
void save( Archive & ar, std::uint32_t const /*version*/ ) const
{
ar( x );
std::cerr << "VersionStructMSP Save " << version << std::endl;
}
template <class Archive>
void load( Archive & ar, std::uint32_t const version )
{
{
ar( x );
v = version;
std::cerr << "VersionStructMSP Load " << version << std::endl;
}
};
struct VersionStructNMS
{
std::int32_t x;
std::uint32_t v;
};
template <class Archive>
void serialize( Archive & ar, VersionStructNMS & vnms, const std::uint32_t version )
{
ar( vnms.x );
vnms.v = version;
}
struct VersionStructNMSP
{
double x;
std::uint32_t v;
};
template <class Archive>
void save( Archive & ar, VersionStructNMSP const & vnms, const std::uint32_t /*version*/ )
{
ar( vnms.x );
}
template <class Archive>
void load( Archive & ar, VersionStructNMSP & vnms, const std::uint32_t version )
{
ar( vnms.x );
vnms.v = version;
}
CEREAL_CLASS_VERSION( VersionStructMSP, 33 )
CEREAL_CLASS_VERSION( VersionStructNMS, 66 )
CEREAL_CLASS_VERSION( VersionStructNMSP, 99 )
template <class IArchive, class OArchive>
void test_versioning()
@ -3179,33 +3214,67 @@ void test_versioning()
for(size_t i=0; i<100; ++i)
{
VersionStructMS o_MS = {random_value<uint8_t>(gen) % 2 ? true : false, -1};
VersionStructMSP o_MSP = {random_value<uint8_t>(gen), -1};
VersionStructMS o_MS = {random_value<uint8_t>(gen) % 2 ? true : false, 1};
VersionStructMSP o_MSP = {random_value<uint8_t>(gen), 1};
VersionStructNMS o_NMS = {random_value<int32_t>(gen), 1};
VersionStructNMSP o_NMSP = {random_value<double>(gen), 1};
VersionStructMS o_MS2 = {random_value<uint8_t>(gen) % 2 ? true : false, 1};
VersionStructMSP o_MSP2 = {random_value<uint8_t>(gen), 1};
VersionStructNMS o_NMS2 = {random_value<int32_t>(gen), 1};
VersionStructNMSP o_NMSP2 = {random_value<double>(gen), 1};
std::ostringstream os;
{
OArchive oar(os);
OArchive oar2(std::cout);
oar( o_MS );
oar( o_MSP );
oar2( o_MS );
oar2( o_MSP );
oar( o_NMS );
oar( o_NMSP );
oar( o_MS2 );
oar( o_MSP2 );
oar( o_NMS2 );
oar( o_NMSP2 );
}
decltype(o_MS) i_MS;
decltype(o_MSP) i_MSP;
decltype(o_NMS) i_NMS;
decltype(o_NMSP) i_NMSP;
decltype(o_MS2) i_MS2;
decltype(o_MSP2) i_MSP2;
decltype(o_NMS2) i_NMS2;
decltype(o_NMSP2) i_NMSP2;
std::istringstream is(os.str());
{
IArchive iar(is);
iar( i_MS );
iar( i_MSP );
iar( i_NMS );
iar( i_NMSP );
iar( i_MS2 );
iar( i_MSP2 );
iar( i_NMS2 );
iar( i_NMSP2 );
}
BOOST_CHECK_EQUAL(o_MS.x, i_MS.x);
BOOST_CHECK_EQUAL(i_MS.v, 0);
BOOST_CHECK_EQUAL(o_MSP.x, i_MSP.x);
BOOST_CHECK_EQUAL(i_MSP.v, 33);
BOOST_CHECK_EQUAL(o_NMS.x, i_NMS.x);
BOOST_CHECK_EQUAL(i_NMS.v, 66);
BOOST_CHECK_CLOSE(o_NMSP.x, i_NMSP.x, 1e-5);
BOOST_CHECK_EQUAL(i_NMSP.v, 99);
BOOST_CHECK_EQUAL(o_MS2.x, i_MS2.x);
BOOST_CHECK_EQUAL(i_MS2.v, 0);
BOOST_CHECK_EQUAL(o_MSP2.x, i_MSP2.x);
BOOST_CHECK_EQUAL(i_MSP2.v, 33);
BOOST_CHECK_EQUAL(o_NMS2.x, i_NMS2.x);
BOOST_CHECK_EQUAL(i_NMS2.v, 66);
BOOST_CHECK_CLOSE(o_NMSP2.x, i_NMSP2.x, 1e-5);
BOOST_CHECK_EQUAL(i_NMSP2.v, 99);
}
}
@ -3227,4 +3296,4 @@ BOOST_AUTO_TEST_CASE( xml_versioning )
BOOST_AUTO_TEST_CASE( json_versioning )
{
test_versioning<cereal::JSONInputArchive, cereal::JSONOutputArchive>();
}
}