2
0

ObjectStreamTest.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include "UnitTestFramework.h"
  5. #include <Jolt/Core/Factory.h>
  6. #include <Jolt/ObjectStream/ObjectStreamTextIn.h>
  7. #include <Jolt/ObjectStream/ObjectStreamTextOut.h>
  8. #include <Jolt/ObjectStream/SerializableObject.h>
  9. #include <Jolt/ObjectStream/TypeDeclarations.h>
  10. enum TestEnum
  11. {
  12. A,
  13. B,
  14. C
  15. };
  16. class TestSerializableBase : public RefTarget<TestSerializableBase>
  17. {
  18. JPH_DECLARE_SERIALIZABLE_VIRTUAL_BASE(JPH_NO_EXPORT, TestSerializableBase)
  19. public:
  20. virtual ~TestSerializableBase() = default;
  21. uint8 mUInt8 = 0;
  22. uint16 mUInt16 = 0;
  23. int mInt = 0;
  24. uint32 mUInt32 = 0;
  25. uint64 mUInt64 = 0;
  26. float mFloat = 0;
  27. double mDouble = 0;
  28. bool mBool = false;
  29. Float3 mFloat3 = { };
  30. Float4 mFloat4 = { };
  31. Double3 mDouble3 = { };
  32. Quat mQuat = Quat::sIdentity();
  33. Vec3 mVec3 = Vec3::sZero();
  34. DVec3 mDVec3 = DVec3::sZero();
  35. Vec4 mVec4 = Vec4::sZero();
  36. UVec4 mUVec4 = UVec4::sZero();
  37. Mat44 mMat44 = Mat44::sIdentity();
  38. DMat44 mDMat44 = DMat44::sIdentity();
  39. JPH::String mString;
  40. };
  41. class TestSerializableBase2
  42. {
  43. JPH_DECLARE_SERIALIZABLE_VIRTUAL_BASE(JPH_NO_EXPORT, TestSerializableBase2)
  44. public:
  45. virtual ~TestSerializableBase2() = default;
  46. uint32 mBase2 = 0;
  47. };
  48. class TestSerializable : public TestSerializableBase, public TestSerializableBase2
  49. {
  50. JPH_DECLARE_SERIALIZABLE_VIRTUAL(JPH_NO_EXPORT, TestSerializable)
  51. public:
  52. TestEnum mEnum = A;
  53. Array<int> mIntVector;
  54. StaticArray<bool, 10> mBoolVector;
  55. float mFloatVector[3] = { 0, 0, 0 };
  56. Array<float> mArrayOfVector[3];
  57. Array<Array<int>> mVectorOfVector;
  58. TestSerializable * mPointer = nullptr;
  59. Ref<TestSerializable> mReference;
  60. RefConst<TestSerializable> mReferenceConst;
  61. };
  62. JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(TestSerializableBase)
  63. {
  64. JPH_ADD_ATTRIBUTE(TestSerializableBase, mUInt8)
  65. JPH_ADD_ATTRIBUTE(TestSerializableBase, mUInt16)
  66. JPH_ADD_ATTRIBUTE(TestSerializableBase, mInt)
  67. JPH_ADD_ATTRIBUTE(TestSerializableBase, mUInt32)
  68. JPH_ADD_ATTRIBUTE(TestSerializableBase, mUInt64)
  69. JPH_ADD_ATTRIBUTE(TestSerializableBase, mFloat)
  70. JPH_ADD_ATTRIBUTE(TestSerializableBase, mDouble)
  71. JPH_ADD_ATTRIBUTE(TestSerializableBase, mBool)
  72. JPH_ADD_ATTRIBUTE(TestSerializableBase, mFloat3)
  73. JPH_ADD_ATTRIBUTE(TestSerializableBase, mFloat4)
  74. JPH_ADD_ATTRIBUTE(TestSerializableBase, mDouble3)
  75. JPH_ADD_ATTRIBUTE(TestSerializableBase, mQuat)
  76. JPH_ADD_ATTRIBUTE(TestSerializableBase, mVec3)
  77. JPH_ADD_ATTRIBUTE(TestSerializableBase, mDVec3)
  78. JPH_ADD_ATTRIBUTE(TestSerializableBase, mVec4)
  79. JPH_ADD_ATTRIBUTE(TestSerializableBase, mUVec4)
  80. JPH_ADD_ATTRIBUTE(TestSerializableBase, mMat44)
  81. JPH_ADD_ATTRIBUTE(TestSerializableBase, mDMat44)
  82. JPH_ADD_ATTRIBUTE(TestSerializableBase, mString)
  83. }
  84. JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(TestSerializableBase2)
  85. {
  86. JPH_ADD_ATTRIBUTE(TestSerializableBase2, mBase2)
  87. }
  88. JPH_IMPLEMENT_SERIALIZABLE_VIRTUAL(TestSerializable)
  89. {
  90. JPH_ADD_BASE_CLASS(TestSerializable, TestSerializableBase)
  91. JPH_ADD_BASE_CLASS(TestSerializable, TestSerializableBase2)
  92. JPH_ADD_ENUM_ATTRIBUTE(TestSerializable, mEnum)
  93. JPH_ADD_ATTRIBUTE(TestSerializable, mIntVector)
  94. JPH_ADD_ATTRIBUTE(TestSerializable, mBoolVector)
  95. JPH_ADD_ATTRIBUTE(TestSerializable, mFloatVector)
  96. JPH_ADD_ATTRIBUTE(TestSerializable, mArrayOfVector)
  97. JPH_ADD_ATTRIBUTE(TestSerializable, mVectorOfVector)
  98. JPH_ADD_ATTRIBUTE(TestSerializable, mPointer)
  99. JPH_ADD_ATTRIBUTE(TestSerializable, mReference)
  100. JPH_ADD_ATTRIBUTE(TestSerializable, mReferenceConst)
  101. }
  102. TEST_SUITE("ObjectStreamTest")
  103. {
  104. static TestSerializable *CreateTestObject()
  105. {
  106. TestSerializable *test = new TestSerializable();
  107. test->mUInt8 = 0xff;
  108. test->mUInt16 = 0xffff;
  109. test->mInt = -1;
  110. test->mUInt32 = 0xf1f2f3f4;
  111. test->mUInt64 = 0xf5f6f7f8f9fafbfc;
  112. test->mFloat = 0.12345f;
  113. test->mDouble = DBL_EPSILON;
  114. test->mBool = true;
  115. test->mFloat3 = Float3(9, 10, 11);
  116. test->mFloat4 = Float4(11, 9, 10, 12);
  117. test->mDouble3 = Double3(10, 11, 12);
  118. test->mVec3 = Vec3(6, 7, 8);
  119. test->mDVec3 = DVec3(7, 8, 9);
  120. test->mVec4 = Vec4(9, 10, 11, 12);
  121. test->mUVec4 = UVec4(12, 11, 9, 10);
  122. test->mQuat = Quat::sRotation(Vec3::sAxisX(), 0.1234f);
  123. test->mMat44 = Mat44::sRotationTranslation(Quat::sRotation(Vec3::sAxisY(), 0.4567f), Vec3(13, 14, 15));
  124. test->mDMat44 = DMat44::sRotationTranslation(Quat::sRotation(Vec3::sAxisY(), 0.789f), DVec3(20, 21, 22));
  125. test->mString = "\"test string\"";
  126. test->mEnum = B;
  127. test->mIntVector = { 1, 2, 3, 4, 5 };
  128. test->mBoolVector.push_back(true);
  129. test->mBoolVector.push_back(false);
  130. test->mBoolVector.push_back(true);
  131. test->mFloatVector[0] = 1.0f;
  132. test->mFloatVector[1] = 2.0f;
  133. test->mFloatVector[2] = 3.0f;
  134. test->mArrayOfVector[0] = { 1, 2, 3 };
  135. test->mArrayOfVector[1] = { 4, 5 };
  136. test->mArrayOfVector[2] = { 6, 7, 8, 9 };
  137. test->mVectorOfVector = { { 10, 11 }, { 12, 13, 14 }, { 15, 16, 17, 18 }};
  138. test->mBase2 = 0x9876;
  139. TestSerializable *test2 = new TestSerializable();
  140. test2->mFloat = 4.5f;
  141. test->mPointer = test2;
  142. test->mReference = test2;
  143. test->mReferenceConst = test2;
  144. return test;
  145. }
  146. static void CompareObjects(TestSerializable *inInput, TestSerializable *inOutput)
  147. {
  148. CHECK(inInput->mUInt8 == inOutput->mUInt8);
  149. CHECK(int(inInput->mUInt16) == int(inOutput->mUInt16));
  150. CHECK(inInput->mInt == inOutput->mInt);
  151. CHECK(inInput->mUInt32 == inOutput->mUInt32);
  152. CHECK(inInput->mUInt64 == inOutput->mUInt64);
  153. CHECK(inInput->mFloat == inOutput->mFloat);
  154. CHECK(inInput->mDouble == inOutput->mDouble);
  155. CHECK(inInput->mBool == inOutput->mBool);
  156. CHECK(inInput->mFloat3 == inOutput->mFloat3);
  157. CHECK(inInput->mFloat4 == inOutput->mFloat4);
  158. CHECK(inInput->mDouble3 == inOutput->mDouble3);
  159. CHECK(inInput->mQuat == inOutput->mQuat);
  160. CHECK(inInput->mVec3 == inOutput->mVec3);
  161. CHECK(inInput->mDVec3 == inOutput->mDVec3);
  162. CHECK(inInput->mVec4 == inOutput->mVec4);
  163. CHECK(inInput->mUVec4 == inOutput->mUVec4);
  164. CHECK(inInput->mMat44 == inOutput->mMat44);
  165. CHECK(inInput->mDMat44 == inOutput->mDMat44);
  166. CHECK(inInput->mString == inOutput->mString);
  167. CHECK(inInput->mEnum == inOutput->mEnum);
  168. CHECK(inInput->mIntVector == inOutput->mIntVector);
  169. CHECK(inInput->mBoolVector == inOutput->mBoolVector);
  170. for (uint32 i = 0; i < size(inInput->mFloatVector); ++i)
  171. CHECK(inInput->mFloatVector[i] == inOutput->mFloatVector[i]);
  172. for (uint32 i = 0; i < size(inInput->mArrayOfVector); ++i)
  173. CHECK(inInput->mArrayOfVector[i] == inOutput->mArrayOfVector[i]);
  174. CHECK(inInput->mVectorOfVector == inOutput->mVectorOfVector);
  175. CHECK(inOutput->mPointer == inOutput->mReference);
  176. CHECK(inOutput->mPointer == inOutput->mReferenceConst);
  177. if (inInput->mPointer == nullptr)
  178. CHECK(inOutput->mPointer == nullptr);
  179. else
  180. {
  181. CHECK(inInput->mPointer != inOutput->mPointer);
  182. CompareObjects(inInput->mPointer, inOutput->mPointer);
  183. CHECK(inOutput->mReference->GetRefCount() == uint32(2));
  184. CHECK(inOutput->mReferenceConst->GetRefCount() == uint32(2));
  185. }
  186. CHECK(inInput->mBase2 == inOutput->mBase2);
  187. }
  188. TEST_CASE("TestObjectStreamLoadSaveText")
  189. {
  190. Factory::sInstance->Register(JPH_RTTI(TestSerializable));
  191. TestSerializable *test = CreateTestObject();
  192. stringstream stream;
  193. CHECK(ObjectStreamOut::sWriteObject(stream, ObjectStreamOut::EStreamType::Text, *test));
  194. TestSerializable *test_out = nullptr;
  195. CHECK(ObjectStreamIn::sReadObject(stream, test_out));
  196. if (test_out == nullptr)
  197. return;
  198. // Check that DynamicCast returns the right offsets
  199. CHECK(DynamicCast<TestSerializable>(test_out) == test_out);
  200. CHECK(DynamicCast<TestSerializableBase>(test_out) == static_cast<TestSerializableBase *>(test_out));
  201. CHECK(DynamicCast<TestSerializableBase2>(test_out) == static_cast<TestSerializableBase2 *>(test_out));
  202. CompareObjects(test, test_out);
  203. delete test;
  204. delete test_out;
  205. }
  206. TEST_CASE("TestObjectStreamLoadSaveBinary")
  207. {
  208. Factory::sInstance->Register(JPH_RTTI(TestSerializable));
  209. TestSerializable *test = CreateTestObject();
  210. stringstream stream;
  211. CHECK(ObjectStreamOut::sWriteObject(stream, ObjectStreamOut::EStreamType::Binary, *test));
  212. TestSerializable *test_out = nullptr;
  213. CHECK(ObjectStreamIn::sReadObject(stream, test_out));
  214. if (test_out == nullptr)
  215. return;
  216. CompareObjects(test, test_out);
  217. delete test;
  218. delete test_out;
  219. }
  220. }