TestEndian.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <EAStdC/EAEndian.h>
  5. #include <EAStdCTest/EAStdCTest.h>
  6. #include <EATest/EATest.h>
  7. #ifdef _MSC_VER
  8. #pragma warning(push, 0)
  9. #endif
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <limits.h>
  13. #include <float.h>
  14. #ifdef _MSC_VER
  15. #pragma warning(pop)
  16. #endif
  17. int TestEndian()
  18. {
  19. using namespace EA::StdC;
  20. int nErrorCount(0);
  21. EA::UnitTest::Report("TestEndian\n");
  22. /////////////////////////////////////////////////////////////////////
  23. // Test Swizzle
  24. /////////////////////////////////////////////////////////////////////
  25. {
  26. uint16_t n16 = 0x0011;
  27. n16 = Swizzle(n16);
  28. EATEST_VERIFY(n16 == 0x1100);
  29. }
  30. {
  31. uint32_t n32 = 0x00112233;
  32. n32 = Swizzle(n32);
  33. EATEST_VERIFY(n32 == 0x33221100);
  34. }
  35. {
  36. uint64_t n64 = UINT64_C(0x0011223344556677);
  37. n64 = Swizzle(n64);
  38. EATEST_VERIFY(n64 == UINT64_C(0x7766554433221100));
  39. }
  40. {
  41. EA::StdC::uint128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  42. EA::StdC::uint128_t n128Swizzled("0xffeeddccbbaa99887766554433221100", 16);
  43. EA::StdC::uint128_t n128 = Swizzle(n128Local);
  44. EATEST_VERIFY(n128 == n128Swizzled);
  45. }
  46. {
  47. int16_t n16 = 0x0011;
  48. n16 = Swizzle(n16);
  49. EATEST_VERIFY(n16 == 0x1100);
  50. }
  51. {
  52. uint32_t n32 = 0x00112233;
  53. n32 = Swizzle(n32);
  54. EATEST_VERIFY(n32 == 0x33221100);
  55. }
  56. {
  57. uint64_t n64 = UINT64_C(0x0011223344556677);
  58. n64 = Swizzle(n64);
  59. EATEST_VERIFY(n64 == UINT64_C(0x7766554433221100));
  60. }
  61. {
  62. EA::StdC::int128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  63. EA::StdC::int128_t n128Swizzled("0xffeeddccbbaa99887766554433221100", 16);
  64. EA::StdC::int128_t n128 = Swizzle(n128Local);
  65. EATEST_VERIFY(n128 == n128Swizzled);
  66. }
  67. {
  68. // void Swizzle(float* pFloat)
  69. // void Swizzle(double* pDouble)
  70. float f = 1234.5678f;
  71. Swizzle(&f);
  72. // The representation of f at this point is not necessarily a valid floating point representation. That may present a problem
  73. // for this unit test if the compiler loads the f into a floating point register and then moves it back to memory for the rest
  74. // of this test, as that could result in the bits no longer being what they were after the above swizzle.
  75. Swizzle(&f);
  76. EATEST_VERIFY(f == 1234.5678f);
  77. double d = 1234.5678;
  78. Swizzle(&d);
  79. // The representation of f at this point is not necessarily a valid floating point representation. That may present a problem
  80. // for this unit test if the compiler loads the f into a floating point register and then moves it back to memory for the rest
  81. // of this test, as that could result in the bits no longer being what they were after the above swizzle.
  82. Swizzle(&d);
  83. EATEST_VERIFY(d == 1234.5678);
  84. }
  85. /////////////////////////////////////////////////////////////////////
  86. // Test ToBigEndian
  87. /////////////////////////////////////////////////////////////////////
  88. {
  89. uint16_t n16Local = 0x0011;
  90. uint16_t n16 = ToBigEndian(n16Local);
  91. uint8_t* p16 = (uint8_t*)&n16;
  92. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11));
  93. }
  94. {
  95. uint32_t n32Local = 0x00112233;
  96. uint32_t n32 = ToBigEndian(n32Local);
  97. uint8_t* p32 = (uint8_t*)&n32;
  98. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33));
  99. }
  100. {
  101. uint64_t n64Local = UINT64_C(0x0011223344556677);
  102. uint64_t n64 = ToBigEndian(n64Local);
  103. uint8_t* p64 = (uint8_t*)&n64;
  104. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  105. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77));
  106. }
  107. {
  108. EA::StdC::uint128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  109. EA::StdC::uint128_t n128 = ToBigEndian(n128Local);
  110. uint8_t* p128 = (uint8_t*)&n128;
  111. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  112. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  113. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  114. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff));
  115. }
  116. {
  117. int16_t n16Local = 0x0011;
  118. int16_t n16 = ToBigEndian(n16Local);
  119. int8_t* p16 = (int8_t*)&n16;
  120. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11));
  121. }
  122. {
  123. int32_t n32Local = 0x00112233;
  124. int32_t n32 = ToBigEndian(n32Local);
  125. int8_t* p32 = (int8_t*)&n32;
  126. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33));
  127. }
  128. {
  129. int64_t n64Local = UINT64_C(0x0011223344556677);
  130. int64_t n64 = ToBigEndian(n64Local);
  131. int8_t* p64 = (int8_t*)&n64;
  132. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  133. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77));
  134. }
  135. {
  136. EA::StdC::int128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  137. EA::StdC::int128_t n128 = ToBigEndian(n128Local);
  138. uint8_t* p128 = (uint8_t*)&n128;
  139. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  140. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  141. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  142. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff));
  143. }
  144. /////////////////////////////////////////////////////////////////////
  145. // Test ToLittleEndian
  146. /////////////////////////////////////////////////////////////////////
  147. {
  148. uint16_t n16Local = 0x0011;
  149. uint16_t n16 = ToLittleEndian(n16Local);
  150. uint8_t* p16 = (uint8_t*)&n16;
  151. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00));
  152. }
  153. {
  154. uint32_t n32Local = 0x00112233;
  155. uint32_t n32 = ToLittleEndian(n32Local);
  156. uint8_t* p32 = (uint8_t*)&n32;
  157. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00));
  158. }
  159. {
  160. uint64_t n64Local = UINT64_C(0x0011223344556677);
  161. uint64_t n64 = ToLittleEndian(n64Local);
  162. uint8_t* p64 = (uint8_t*)&n64;
  163. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  164. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00));
  165. }
  166. {
  167. EA::StdC::uint128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  168. EA::StdC::uint128_t n128 = ToLittleEndian(n128Local);
  169. uint8_t* p128 = (uint8_t*)&n128;
  170. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  171. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  172. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  173. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00));
  174. }
  175. {
  176. int16_t n16Local = 0x0011;
  177. int16_t n16 = ToLittleEndian(n16Local);
  178. int8_t* p16 = (int8_t*)&n16;
  179. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00));
  180. }
  181. {
  182. int32_t n32Local = 0x00112233;
  183. int32_t n32 = ToLittleEndian(n32Local);
  184. int8_t* p32 = (int8_t*)&n32;
  185. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00));
  186. }
  187. {
  188. int64_t n64Local = UINT64_C(0x0011223344556677);
  189. int64_t n64 = ToLittleEndian(n64Local);
  190. int8_t* p64 = (int8_t*)&n64;
  191. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  192. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00));
  193. }
  194. {
  195. EA::StdC::int128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  196. EA::StdC::int128_t n128 = ToLittleEndian(n128Local);
  197. uint8_t* p128 = (uint8_t*)&n128;
  198. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  199. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  200. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  201. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00));
  202. }
  203. /////////////////////////////////////////////////////////////////////
  204. // Test ToBigEndianConst
  205. /////////////////////////////////////////////////////////////////////
  206. {
  207. uint16_t n16 = ToBigEndianConst((uint16_t)(0x0011));
  208. uint8_t* p16 = (uint8_t*)&n16;
  209. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11));
  210. }
  211. {
  212. uint32_t n32 = ToBigEndianConst((uint32_t)(0x00112233));
  213. uint8_t* p32 = (uint8_t*)&n32;
  214. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33));
  215. }
  216. {
  217. uint64_t n64 = ToBigEndianConst(UINT64_C(0x0011223344556677));
  218. uint8_t* p64 = (uint8_t*)&n64;
  219. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  220. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77));
  221. }
  222. {
  223. EA::StdC::uint128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  224. EA::StdC::uint128_t n128 = ToBigEndianConst(n128Local);
  225. uint8_t* p128 = (uint8_t*)&n128;
  226. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  227. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  228. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  229. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff));
  230. }
  231. /////////////////////////////////////////////////////////////////////
  232. // Test ToLittleEndianConst
  233. /////////////////////////////////////////////////////////////////////
  234. {
  235. uint16_t n16 = ToLittleEndian((uint16_t)(0x0011));
  236. uint8_t* p16 = (uint8_t*)&n16;
  237. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00));
  238. }
  239. {
  240. uint32_t n32 = ToLittleEndianConst((uint32_t)(0x00112233));
  241. uint8_t p32[4];
  242. memcpy(p32, &n32, sizeof(n32));
  243. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00));
  244. }
  245. {
  246. uint64_t n64 = ToLittleEndianConst(UINT64_C(0x0011223344556677));
  247. uint8_t p64[8];
  248. memcpy(p64, &n64, sizeof(n64));
  249. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  250. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00));
  251. }
  252. {
  253. EA::StdC::uint128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  254. EA::StdC::uint128_t n128 = ToLittleEndianConst(n128Local);
  255. uint8_t* p128 = (uint8_t*)&n128;
  256. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  257. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  258. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  259. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00));
  260. }
  261. /////////////////////////////////////////////////////////////////////
  262. // Test ReadFromBigEndian
  263. /////////////////////////////////////////////////////////////////////
  264. {
  265. uint8_t pBuffer[sizeof(uint16_t)] = { 0x00, 0x11 };
  266. uint16_t n16 = ReadFromBigEndianUint16(pBuffer);
  267. uint8_t* p16 = (uint8_t*)&n16;
  268. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  269. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00));
  270. #else
  271. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11));
  272. #endif
  273. }
  274. {
  275. uint8_t pBuffer[sizeof(uint32_t)] = { 0x00, 0x11, 0x22, 0x33 };
  276. uint32_t n32 = ReadFromBigEndianUint32(pBuffer);
  277. uint8_t* p32 = (uint8_t*)&n32;
  278. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  279. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00));
  280. #else
  281. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33));
  282. #endif
  283. }
  284. {
  285. uint8_t pBuffer[sizeof(uint64_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
  286. uint64_t n64 = ReadFromBigEndianUint64(pBuffer);
  287. uint8_t* p64 = (uint8_t*)&n64;
  288. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  289. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  290. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00));
  291. #else
  292. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  293. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77));
  294. #endif
  295. }
  296. {
  297. int8_t pBuffer[sizeof(int16_t)] = { 0x00, 0x11 };
  298. int16_t n16 = ReadFromBigEndianInt16(pBuffer);
  299. int8_t* p16 = (int8_t*)&n16;
  300. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  301. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00));
  302. #else
  303. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11));
  304. #endif
  305. }
  306. {
  307. int8_t pBuffer[sizeof(int32_t)] = { 0x00, 0x11, 0x22, 0x33 };
  308. int32_t n32 = ReadFromBigEndianInt32(pBuffer);
  309. int8_t* p32 = (int8_t*)&n32;
  310. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  311. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00));
  312. #else
  313. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33));
  314. #endif
  315. }
  316. {
  317. int8_t pBuffer[sizeof(int64_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
  318. int64_t n64 = ReadFromBigEndianInt64(pBuffer);
  319. int8_t* p64 = (int8_t*)&n64;
  320. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  321. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  322. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00));
  323. #else
  324. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  325. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77));
  326. #endif
  327. }
  328. {
  329. // This is a bit hard to test fully, as we need to hit a lot of floating point values
  330. // to make sure no invalid floating point values are put into FPU registers. We can't
  331. // just test random 32 bit memory patterns. With respect to NANs, a swizzled NAN is
  332. // converted by the FPU to some other NAN and so we can't do a bit comparison.
  333. size_t i;
  334. char buffer[32];
  335. const float fTestValues[] = { FLT_MIN, FLT_MAX, 0.f, -0.f, 1.f, -1.f };
  336. const double dTestValues[] = { DBL_MIN, DBL_MAX, 0.f, -0.f, 1.f, -1.f };
  337. for(i = 0; i < (sizeof(fTestValues) / sizeof(fTestValues[0])); i++)
  338. {
  339. WriteToBigEndian(buffer, fTestValues[i]);
  340. float f = ReadFromBigEndianFloat(buffer);
  341. EATEST_VERIFY(f == fTestValues[i]);
  342. }
  343. for(i = 0; i < (sizeof(dTestValues) / sizeof(dTestValues[0])); i++)
  344. {
  345. WriteToBigEndian(buffer, dTestValues[i]);
  346. double d = ReadFromBigEndianDouble(buffer);
  347. EATEST_VERIFY(d == dTestValues[i]);
  348. }
  349. }
  350. {
  351. uint8_t pBuffer[sizeof(EA::StdC::uint128_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
  352. EA::StdC::uint128_t n128 = ReadFromBigEndianUint128(pBuffer);
  353. uint8_t* p128 = (uint8_t*)&n128;
  354. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  355. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  356. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  357. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  358. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00));
  359. #else
  360. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  361. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  362. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  363. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff));
  364. #endif
  365. }
  366. {
  367. uint8_t pBuffer[sizeof(EA::StdC::int128_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
  368. EA::StdC::int128_t n128 = ReadFromBigEndianInt128(pBuffer);
  369. uint8_t* p128 = (uint8_t*)&n128;
  370. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  371. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  372. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  373. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  374. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00));
  375. #else
  376. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  377. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  378. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  379. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff));
  380. #endif
  381. }
  382. {
  383. // uint32_t ReadFromBigEndian(const void* pSource, int32_t nSourceBytes)
  384. // To do: Improve this test. Currently it's hardly more than a compile test.
  385. uint32_t n32, nSource = 0x00112233;
  386. n32 = ReadFromBigEndian(&nSource, 4);
  387. EATEST_VERIFY(n32 != 0);
  388. }
  389. /////////////////////////////////////////////////////////////////////
  390. // Test ReadFromLittleEndian
  391. /////////////////////////////////////////////////////////////////////
  392. {
  393. uint8_t pBuffer[sizeof(uint16_t)] = { 0x00, 0x11 };
  394. uint16_t n16 = ReadFromLittleEndianUint16(pBuffer);
  395. uint8_t* p16 = (uint8_t*)&n16;
  396. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  397. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11));
  398. #else
  399. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00));
  400. #endif
  401. }
  402. {
  403. uint8_t pBuffer[sizeof(uint32_t)] = { 0x00, 0x11, 0x22, 0x33 };
  404. uint32_t n32 = ReadFromLittleEndianUint32(pBuffer);
  405. uint8_t* p32 = (uint8_t*)&n32;
  406. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  407. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33));
  408. #else
  409. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00));
  410. #endif
  411. }
  412. {
  413. uint8_t pBuffer[sizeof(uint64_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
  414. uint64_t n64 = ReadFromLittleEndianUint64(pBuffer);
  415. uint8_t* p64 = (uint8_t*)&n64;
  416. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  417. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  418. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77));
  419. #else
  420. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  421. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00));
  422. #endif
  423. }
  424. {
  425. int8_t pBuffer[sizeof(int16_t)] = { 0x00, 0x11 };
  426. int16_t n16 = ReadFromLittleEndianInt16(pBuffer);
  427. int8_t* p16 = (int8_t*)&n16;
  428. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  429. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11));
  430. #else
  431. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00));
  432. #endif
  433. }
  434. {
  435. int8_t pBuffer[sizeof(int32_t)] = { 0x00, 0x11, 0x22, 0x33 };
  436. int32_t n32 = ReadFromLittleEndianInt32(pBuffer);
  437. int8_t* p32 = (int8_t*)&n32;
  438. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  439. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33));
  440. #else
  441. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00));
  442. #endif
  443. }
  444. {
  445. int8_t pBuffer[sizeof(int64_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
  446. int64_t n64 = ReadFromLittleEndianInt64(pBuffer);
  447. int8_t* p64 = (int8_t*)&n64;
  448. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  449. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  450. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77));
  451. #else
  452. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  453. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00));
  454. #endif
  455. }
  456. {
  457. // This is a bit hard to test fully, as we need to hit a lot of floating point values
  458. // to make sure no invalid floating point values are put into FPU registers. We can't
  459. // just test random 32 bit memory patterns. With respect to NANs, a swizzled NAN is
  460. // converted by the FPU to some other NAN and so we can't do a bit comparison.
  461. size_t i;
  462. char buffer[32];
  463. const float fTestValues[] = { FLT_MIN, FLT_MAX, 0.f, -0.f, 1.f, -1.f };
  464. const double dTestValues[] = { DBL_MIN, DBL_MAX, 0.f, -0.f, 1.f, -1.f };
  465. for(i = 0; i < (sizeof(fTestValues) / sizeof(fTestValues[0])); i++)
  466. {
  467. WriteToLittleEndian(buffer, fTestValues[i]);
  468. float f = ReadFromLittleEndianFloat(buffer);
  469. EATEST_VERIFY(f == fTestValues[i]);
  470. }
  471. for(i = 0; i < (sizeof(dTestValues) / sizeof(dTestValues[0])); i++)
  472. {
  473. WriteToLittleEndian(buffer, dTestValues[i]);
  474. double d = ReadFromLittleEndianDouble(buffer);
  475. EATEST_VERIFY(d == dTestValues[i]);
  476. }
  477. }
  478. {
  479. uint8_t pBuffer[sizeof(EA::StdC::uint128_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
  480. EA::StdC::uint128_t n128 = ReadFromLittleEndianUint128(pBuffer);
  481. uint8_t* p128 = (uint8_t*)&n128;
  482. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  483. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  484. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  485. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  486. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff));
  487. #else
  488. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  489. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  490. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  491. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00));
  492. #endif
  493. }
  494. {
  495. uint8_t pBuffer[sizeof(EA::StdC::int128_t)] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
  496. EA::StdC::int128_t n128 = ReadFromLittleEndianInt128(pBuffer);
  497. uint8_t* p128 = (uint8_t*)&n128;
  498. #ifdef EA_SYSTEM_LITTLE_ENDIAN
  499. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  500. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  501. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  502. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff));
  503. #else
  504. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  505. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  506. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  507. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00));
  508. #endif
  509. }
  510. /////////////////////////////////////////////////////////////////////
  511. // Test WriteToBigEndian
  512. /////////////////////////////////////////////////////////////////////
  513. {
  514. uint8_t p16[sizeof(uint16_t) + 1];
  515. p16[sizeof(uint16_t)] = 0xfe;
  516. WriteToBigEndian(p16, (uint16_t)0x0011);
  517. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11) && p16[sizeof(uint16_t)] == 0xfe);
  518. }
  519. {
  520. uint8_t p32[sizeof(uint32_t) + 1];
  521. p32[sizeof(uint32_t)] = 0xfe;
  522. WriteToBigEndian(p32, (uint32_t)0x00112233);
  523. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33) && p32[sizeof(uint32_t)] == 0xfe);
  524. }
  525. {
  526. uint8_t p64[sizeof(uint64_t) + 1];
  527. p64[sizeof(uint64_t)] = 0xfe;
  528. WriteToBigEndian(p64, UINT64_C(0x0011223344556677));
  529. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  530. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77) &&
  531. p64[sizeof(uint64_t)] == 0xfe);
  532. }
  533. {
  534. uint8_t p16[sizeof(int16_t) + 1];
  535. p16[sizeof(int16_t)] = 0xfe;
  536. WriteToBigEndian(p16, (int16_t)0x0011);
  537. EATEST_VERIFY((p16[0] == 0x00) && (p16[1] == 0x11) && p16[sizeof(int16_t)] == 0xfe);
  538. }
  539. {
  540. uint8_t p32[sizeof(int32_t) + 1];
  541. p32[sizeof(int32_t)] = 0xfe;
  542. WriteToBigEndian(p32, (int32_t)0x00112233);
  543. EATEST_VERIFY((p32[0] == 0x00) && (p32[1] == 0x11) && (p32[2] == 0x22) && (p32[3] == 0x33) && p32[sizeof(int32_t)] == 0xfe);
  544. }
  545. {
  546. uint8_t p64[sizeof(int64_t) + 1];
  547. p64[sizeof(int64_t)] = 0xfe;
  548. WriteToBigEndian(p64, INT64_C(0x0011223344556677));
  549. EATEST_VERIFY((p64[0] == 0x00) && (p64[1] == 0x11) && (p64[2] == 0x22) && (p64[3] == 0x33) &&
  550. (p64[4] == 0x44) && (p64[5] == 0x55) && (p64[6] == 0x66) && (p64[7] == 0x77) &&
  551. p64[sizeof(int64_t)] == 0xfe);
  552. }
  553. {
  554. // WriteToBigEndian Float
  555. // WriteToBigEndian Double
  556. // These are covered in the ReadFromBigEndian tests.
  557. }
  558. {
  559. uint8_t p128[sizeof(EA::StdC::uint128_t) + 1];
  560. p128[sizeof(EA::StdC::uint128_t)] = 0xfe;
  561. EA::StdC::uint128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  562. WriteToBigEndian(p128, n128Local);
  563. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  564. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  565. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  566. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff) &&
  567. p128[sizeof(EA::StdC::uint128_t)] == 0xfe);
  568. }
  569. {
  570. uint8_t p128[sizeof(EA::StdC::int128_t) + 1];
  571. p128[sizeof(EA::StdC::int128_t)] = 0xfe;
  572. EA::StdC::int128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  573. WriteToBigEndian(p128, n128Local);
  574. EATEST_VERIFY((p128[0] == 0x00) && (p128[1] == 0x11) && (p128[2] == 0x22) && (p128[3] == 0x33) &&
  575. (p128[4] == 0x44) && (p128[5] == 0x55) && (p128[6] == 0x66) && (p128[7] == 0x77) &&
  576. (p128[8] == 0x88) && (p128[9] == 0x99) && (p128[10] == 0xaa) && (p128[11] == 0xbb) &&
  577. (p128[12] == 0xcc) && (p128[13] == 0xdd) && (p128[14] == 0xee) && (p128[15] == 0xff) &&
  578. p128[sizeof(EA::StdC::int128_t)] == 0xfe);
  579. }
  580. {
  581. // void WriteToBigEndian(const void* pDest, uint32_t data, int32_t nSourceBytes)
  582. // To do: Improve this test. Currently it's hardly more than a compile test.
  583. uint32_t n32 = 0, nSource = 0x00112233;
  584. WriteToBigEndian(&n32, nSource, 4);
  585. EATEST_VERIFY(n32 != 0);
  586. }
  587. /////////////////////////////////////////////////////////////////////
  588. // Test WriteToLittleEndian
  589. /////////////////////////////////////////////////////////////////////
  590. {
  591. uint8_t p16[sizeof(uint16_t) + 1];
  592. p16[sizeof(uint16_t)] = 0xfe;
  593. WriteToLittleEndian(p16, (uint16_t)0x0011);
  594. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00) && p16[sizeof(uint16_t)] == 0xfe);
  595. }
  596. {
  597. uint8_t p32[sizeof(uint32_t) + 1];
  598. p32[sizeof(uint32_t)] = 0xfe;
  599. WriteToLittleEndian(p32, (uint32_t)0x00112233);
  600. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00) && p32[sizeof(uint32_t)] == 0xfe);
  601. }
  602. {
  603. uint8_t p64[sizeof(uint64_t) + 1];
  604. p64[sizeof(uint64_t)] = 0xfe;
  605. WriteToLittleEndian(p64, UINT64_C(0x0011223344556677));
  606. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  607. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00) &&
  608. p64[sizeof(uint64_t)] == 0xfe);
  609. }
  610. {
  611. uint8_t p16[sizeof(int16_t) + 1];
  612. p16[sizeof(int16_t)] = 0xfe;
  613. WriteToLittleEndian(p16, (int16_t)0x0011);
  614. EATEST_VERIFY((p16[0] == 0x11) && (p16[1] == 0x00) && p16[sizeof(int16_t)] == 0xfe);
  615. }
  616. {
  617. uint8_t p32[sizeof(int32_t) + 1];
  618. p32[sizeof(int32_t)] = 0xfe;
  619. WriteToLittleEndian(p32, (int32_t)0x00112233);
  620. EATEST_VERIFY((p32[0] == 0x33) && (p32[1] == 0x22) && (p32[2] == 0x11) && (p32[3] == 0x00) && p32[sizeof(int32_t)] == 0xfe);
  621. }
  622. {
  623. uint8_t p64[sizeof(int64_t) + 1];
  624. p64[sizeof(int64_t)] = 0xfe;
  625. WriteToLittleEndian(p64, UINT64_C(0x0011223344556677));
  626. EATEST_VERIFY((p64[0] == 0x77) && (p64[1] == 0x66) && (p64[2] == 0x55) && (p64[3] == 0x44) &&
  627. (p64[4] == 0x33) && (p64[5] == 0x22) && (p64[6] == 0x11) && (p64[7] == 0x00) &&
  628. p64[sizeof(int64_t)] == 0xfe);
  629. }
  630. {
  631. // To do
  632. // WriteToLittleEndian Float
  633. // WriteToLittleEndian Double
  634. // These are covered in the ReadFromLittleEndian tests.
  635. }
  636. {
  637. uint8_t p128[sizeof(EA::StdC::uint128_t) + 1];
  638. p128[sizeof(EA::StdC::uint128_t)] = 0xfe;
  639. EA::StdC::uint128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  640. WriteToLittleEndian(p128, n128Local);
  641. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  642. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  643. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  644. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00) &&
  645. p128[sizeof(EA::StdC::uint128_t)] == 0xfe);
  646. }
  647. {
  648. uint8_t p128[sizeof(EA::StdC::int128_t) + 1];
  649. p128[sizeof(EA::StdC::int128_t)] = 0xfe;
  650. EA::StdC::int128_t n128Local("0x00112233445566778899aabbccddeeff", 16);
  651. WriteToLittleEndian(p128, n128Local);
  652. EATEST_VERIFY((p128[0] == 0xff) && (p128[1] == 0xee) && (p128[2] == 0xdd) && (p128[3] == 0xcc) &&
  653. (p128[4] == 0xbb) && (p128[5] == 0xaa) && (p128[6] == 0x99) && (p128[7] == 0x88) &&
  654. (p128[8] == 0x77) && (p128[9] == 0x66) && (p128[10] == 0x55) && (p128[11] == 0x44) &&
  655. (p128[12] == 0x33) && (p128[13] == 0x22) && (p128[14] == 0x11) && (p128[15] == 0x00) &&
  656. p128[sizeof(EA::StdC::int128_t)] == 0xfe);
  657. }
  658. return nErrorCount;
  659. }