test_tracking.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
  2. // test_tracking_save.cpp
  3. // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
  4. // Use, modification and distribution is subject to the Boost Software
  5. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. // should pass compilation and execution
  8. #include <cstddef> // NULL
  9. #include <fstream>
  10. #include <boost/config.hpp>
  11. #include <cstdio> // remove
  12. #if defined(BOOST_NO_STDC_NAMESPACE)
  13. namespace std{
  14. using ::remove;
  15. }
  16. #endif
  17. #include "test_tools.hpp"
  18. #include <boost/serialization/tracking.hpp>
  19. #include <boost/serialization/nvp.hpp>
  20. #define TEST_CLASS(N, TRACKING) \
  21. class N \
  22. { \
  23. friend class boost::serialization::access; \
  24. template<class Archive> \
  25. void serialize(Archive & /* ar */, const unsigned int /* file_version */){ \
  26. ++count; \
  27. } \
  28. public: \
  29. static unsigned int count; \
  30. }; \
  31. unsigned int N::count = 0;\
  32. BOOST_CLASS_TRACKING(N, TRACKING)
  33. TEST_CLASS(AN, ::boost::serialization::track_never)
  34. TEST_CLASS(AS, ::boost::serialization::track_selectively)
  35. TEST_CLASS(AA, ::boost::serialization::track_always)
  36. // test pointers
  37. TEST_CLASS(PAN, ::boost::serialization::track_never)
  38. TEST_CLASS(PAS, ::boost::serialization::track_selectively)
  39. TEST_CLASS(PAA, ::boost::serialization::track_always)
  40. void out(const char *testfile)
  41. {
  42. test_ostream os(testfile, TEST_STREAM_FLAGS);
  43. test_oarchive oa(os, TEST_ARCHIVE_FLAGS);
  44. // write object twice to check tracking
  45. AN an;
  46. AS as;
  47. AA aa;
  48. oa << BOOST_SERIALIZATION_NVP(an) << BOOST_SERIALIZATION_NVP(an);
  49. BOOST_CHECK(an.count == 2);
  50. oa << BOOST_SERIALIZATION_NVP(as) << BOOST_SERIALIZATION_NVP(as);
  51. BOOST_CHECK(as.count == 2);
  52. oa << BOOST_SERIALIZATION_NVP(aa) << BOOST_SERIALIZATION_NVP(aa);
  53. BOOST_CHECK(aa.count == 1);
  54. PAN *pan = new PAN;
  55. PAS *pas = new PAS;
  56. PAA *paa = new PAA;
  57. oa << BOOST_SERIALIZATION_NVP(pan) << BOOST_SERIALIZATION_NVP(pan);
  58. BOOST_CHECK(pan->count == 2);
  59. oa << BOOST_SERIALIZATION_NVP(pas) << BOOST_SERIALIZATION_NVP(pas);
  60. BOOST_CHECK(pas->count == 1);
  61. oa << BOOST_SERIALIZATION_NVP(paa) << BOOST_SERIALIZATION_NVP(paa);
  62. BOOST_CHECK(paa->count == 1);
  63. delete pan;
  64. delete pas;
  65. delete paa;
  66. }
  67. void in(const char *testfile)
  68. {
  69. test_istream is(testfile, TEST_STREAM_FLAGS);
  70. test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
  71. // read object twice to check tracking
  72. AN an;
  73. AS as;
  74. AA aa;
  75. AN::count = 0;
  76. AS::count = 0;
  77. AA::count = 0;
  78. ia >> BOOST_SERIALIZATION_NVP(an) >> BOOST_SERIALIZATION_NVP(an);
  79. BOOST_CHECK(an.count == 2);
  80. ia >> BOOST_SERIALIZATION_NVP(as) >> BOOST_SERIALIZATION_NVP(as);
  81. BOOST_CHECK(as.count == 2);
  82. ia >> BOOST_SERIALIZATION_NVP(aa) >> BOOST_SERIALIZATION_NVP(aa);
  83. BOOST_CHECK(aa.count == 1);
  84. PAN::count = 0;
  85. PAS::count = 0;
  86. PAA::count = 0;
  87. PAN *pan = NULL;
  88. PAS *pas = NULL;
  89. PAA *paa = NULL;
  90. ia >> BOOST_SERIALIZATION_NVP(pan);
  91. ia >> BOOST_SERIALIZATION_NVP(pan);
  92. BOOST_CHECK(pan->count == 2);
  93. ia >> BOOST_SERIALIZATION_NVP(pas);
  94. ia >> BOOST_SERIALIZATION_NVP(pas);
  95. BOOST_CHECK(pas->count == 1);
  96. ia >> BOOST_SERIALIZATION_NVP(paa);
  97. ia >> BOOST_SERIALIZATION_NVP(paa);
  98. BOOST_CHECK(paa->count == 1);
  99. delete pan;
  100. delete pas;
  101. delete paa;
  102. }
  103. int
  104. test_main( int /* argc */, char* /* argv */[] )
  105. {
  106. const char * testfile = boost::archive::tmpnam(NULL);
  107. BOOST_REQUIRE(NULL != testfile);
  108. out(testfile);
  109. in(testfile);
  110. std::remove(testfile);
  111. return EXIT_SUCCESS;
  112. }