Nenhuma descrição
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

DataStreamTests.cs 33KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. using System;
  2. using NUnit.Framework;
  3. using Unity.Collections.NotBurstCompatible;
  4. using Unity.Collections.LowLevel.Unsafe;
  5. using Unity.Jobs;
  6. using UnityEngine.TestTools;
  7. using UnityEngine;
  8. namespace Unity.Collections.Tests
  9. {
  10. internal class DataStreamTests
  11. {
  12. internal class ReadAndWrite
  13. {
  14. [TestCase(ushort.MaxValue)]
  15. [TestCase(ushort.MinValue)]
  16. public void UShort(ushort expected)
  17. {
  18. bool Write(ref DataStreamWriter writer) => writer.WriteUShort(expected);
  19. CheckReadWrite(sizeof(ushort), reader => reader.ReadUShort(), Write, expected);
  20. }
  21. [TestCase((uint)0b101010)]
  22. [TestCase((uint)0b111111)]
  23. public void RawBits(uint expected)
  24. {
  25. bool Write(ref DataStreamWriter writer) => writer.WriteRawBits(expected, 6);
  26. CheckReadWrite(6, reader => reader.ReadRawBits(6), Write, expected);
  27. }
  28. [Test]
  29. public void RawBits_OutOfCapacity()
  30. {
  31. const uint expected = 0b101011001;
  32. var writer = new DataStreamWriter(1, Allocator.Temp);
  33. Assert.False(writer.WriteRawBits(expected, 9));
  34. Assert.True(writer.HasFailedWrites);
  35. }
  36. [TestCase(uint.MaxValue)]
  37. [TestCase(uint.MinValue)]
  38. public void UInt(uint expected)
  39. {
  40. bool Write(ref DataStreamWriter writer) => writer.WriteUInt(expected);
  41. CheckReadWrite(sizeof(uint), reader => reader.ReadUInt(), Write, expected);
  42. }
  43. [TestCase(float.MaxValue)]
  44. [TestCase(float.MinValue)]
  45. public void Float(float expected)
  46. {
  47. bool Write(ref DataStreamWriter writer) => writer.WriteFloat(expected);
  48. CheckReadWrite(sizeof(float), reader => reader.ReadFloat(), Write, expected);
  49. }
  50. [TestCase(short.MaxValue)]
  51. [TestCase(short.MinValue)]
  52. public void Short(short expected)
  53. {
  54. bool Write(ref DataStreamWriter writer) => writer.WriteShort(expected);
  55. CheckReadWrite(sizeof(short), reader => reader.ReadShort(), Write, expected);
  56. }
  57. [Test]
  58. public void FixedString32()
  59. {
  60. var expected = new FixedString32Bytes("This is a string");
  61. bool Write(ref DataStreamWriter writer) => writer.WriteFixedString32(expected);
  62. CheckReadWrite(expected.Length + FixedStringHeader, reader => reader.ReadFixedString32(), Write, expected);
  63. }
  64. [Test]
  65. public void FixedString64()
  66. {
  67. var expected = new FixedString64Bytes("This is a string");
  68. bool Write(ref DataStreamWriter writer) => writer.WriteFixedString64(expected);
  69. CheckReadWrite(expected.Length + FixedStringHeader, reader => reader.ReadFixedString64(), Write, expected);
  70. }
  71. [Test]
  72. public void FixedString128()
  73. {
  74. var expected = new FixedString128Bytes("This is a string");
  75. bool Write(ref DataStreamWriter writer) => writer.WriteFixedString128(expected);
  76. CheckReadWrite(expected.Length + FixedStringHeader, reader => reader.ReadFixedString128(), Write, expected);
  77. }
  78. [Test]
  79. public void FixedString512()
  80. {
  81. var expected = new FixedString512Bytes("This is a string");
  82. bool Write(ref DataStreamWriter writer) => writer.WriteFixedString512(expected);
  83. CheckReadWrite(expected.Length + FixedStringHeader, reader => reader.ReadFixedString512(), Write, expected);
  84. }
  85. [Test]
  86. public void FixedString4096()
  87. {
  88. var expected = new FixedString4096Bytes("This is a string");
  89. bool Write(ref DataStreamWriter writer) => writer.WriteFixedString4096(expected);
  90. CheckReadWrite(expected.Length + FixedStringHeader, reader => reader.ReadFixedString4096(), Write,
  91. expected);
  92. }
  93. [Test]
  94. public void LongLooped()
  95. {
  96. const long baseVal = -99;
  97. const long expected = -1979;
  98. bool Write(ref DataStreamWriter writer, long value) => writer.WriteLong(value);
  99. long Read(ref DataStreamReader reader) => reader.ReadLong();
  100. CheckReadWriteLooped(sizeof(long), baseVal, expected, Write, Read, (l, u) => l + u);
  101. }
  102. }
  103. internal class ReadAndWriteNetworkOrder
  104. {
  105. [TestCase(int.MaxValue)]
  106. [TestCase(int.MinValue)]
  107. public void Int(int expected)
  108. {
  109. bool Write(ref DataStreamWriter writer) => writer.WriteIntNetworkByteOrder(expected);
  110. CheckReadWrite(sizeof(int), reader => reader.ReadIntNetworkByteOrder(), Write, expected);
  111. }
  112. [TestCase(uint.MaxValue)]
  113. [TestCase(uint.MinValue)]
  114. public void UInt(uint expected)
  115. {
  116. bool Write(ref DataStreamWriter writer) => writer.WriteUIntNetworkByteOrder(expected);
  117. CheckReadWrite(sizeof(uint), reader => reader.ReadUIntNetworkByteOrder(), Write, expected);
  118. }
  119. [TestCase(short.MaxValue)]
  120. [TestCase(short.MinValue)]
  121. public void Short(short expected)
  122. {
  123. bool Write(ref DataStreamWriter writer) => writer.WriteShortNetworkByteOrder(expected);
  124. CheckReadWrite(sizeof(short), reader => reader.ReadShortNetworkByteOrder(), Write, expected);
  125. }
  126. [TestCase(ushort.MaxValue)]
  127. [TestCase(ushort.MinValue)]
  128. public void UShort(ushort expected)
  129. {
  130. bool Write(ref DataStreamWriter writer) => writer.WriteUShortNetworkByteOrder(expected);
  131. CheckReadWrite(sizeof(ushort), reader => reader.ReadUShortNetworkByteOrder(), Write, expected);
  132. }
  133. [Test]
  134. public void ReadIncorrect()
  135. {
  136. var dataStream = new DataStreamWriter(4, Allocator.Temp);
  137. dataStream.WriteIntNetworkByteOrder(1979);
  138. dataStream.Flush();
  139. var reader = new DataStreamReader(dataStream.AsNativeArray());
  140. Assert.AreNotEqual(1979, reader.ReadInt());
  141. }
  142. }
  143. internal class ReadWritePacked
  144. {
  145. [Test]
  146. public void UInt()
  147. {
  148. const uint expected = 1979;
  149. const uint baseVal = 2000;
  150. bool Write(ref DataStreamWriter writer) => writer.WriteUInt(expected);
  151. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model, uint value) => writer.WritePackedUInt(value, model);
  152. uint Read(ref DataStreamReader reader) => reader.ReadUInt();
  153. uint ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedUInt(model);
  154. CheckReadWritePackedLooped(sizeof(uint), baseVal, expected, Write, WritePacked, Read, ReadPacked, (l, u) => l + u);
  155. }
  156. [Test]
  157. public void IntExistingData()
  158. {
  159. unsafe
  160. {
  161. var n = 300 * 4;
  162. var data = stackalloc byte[n];
  163. var compressionModel = StreamCompressionModel.Default;
  164. var dataStream = new DataStreamWriter(data, n);
  165. const int base_val = -10;
  166. const int count = 20;
  167. for (int i = 0; i < count; ++i)
  168. dataStream.WritePackedInt(base_val + i, compressionModel);
  169. dataStream.WriteInt((int)1979);
  170. dataStream.Flush();
  171. var na = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<byte>(data, n, Allocator.Invalid);
  172. #if ENABLE_UNITY_COLLECTIONS_CHECKS
  173. NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref na, AtomicSafetyHandle.GetTempMemoryHandle());
  174. #endif
  175. var reader = new DataStreamReader(na);
  176. for (int i = 0; i < count; ++i)
  177. {
  178. var val = reader.ReadPackedInt(compressionModel);
  179. Assert.AreEqual(base_val + i, val);
  180. }
  181. Assert.AreEqual(1979, reader.ReadInt());
  182. }
  183. }
  184. [Test]
  185. public void Int()
  186. {
  187. const int expected = -1979;
  188. const int baseVal = -10;
  189. bool Write(ref DataStreamWriter writer) => writer.WriteInt(expected);
  190. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model, int value) => writer.WritePackedInt(value, model);
  191. int Read(ref DataStreamReader reader) => reader.ReadInt();
  192. int ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedInt(model);
  193. CheckReadWritePackedLooped(sizeof(int), baseVal, expected, Write, WritePacked, Read, ReadPacked, (i, u) => (int)(i + u));
  194. }
  195. [Test]
  196. public void Long()
  197. {
  198. const long expected = -1979;
  199. const long baseVal = -99;
  200. bool Write(ref DataStreamWriter writer) => writer.WriteLong(expected);
  201. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model, long value) => writer.WritePackedLong(value, model);
  202. long Read(ref DataStreamReader reader) => reader.ReadLong();
  203. long ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedLong(model);
  204. CheckReadWritePackedLooped(sizeof(long), baseVal, expected, Write, WritePacked, Read, ReadPacked, (l, u) => l + u);
  205. }
  206. [Test]
  207. public void ULong()
  208. {
  209. const ulong expected = 1979;
  210. const ulong baseVal = 2000;
  211. bool Write(ref DataStreamWriter writer) => writer.WriteULong(expected);
  212. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model, ulong value) => writer.WritePackedULong(value, model);
  213. ulong Read(ref DataStreamReader reader) => reader.ReadULong();
  214. ulong ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedULong(model);
  215. CheckReadWritePackedLooped(sizeof(ulong), baseVal, expected, Write, WritePacked, Read, ReadPacked, (l, u) => l + u);
  216. }
  217. [Test]
  218. public void Float()
  219. {
  220. const float expected = 1979.1f;
  221. const float baseVal = 2000.1f;
  222. bool Write(ref DataStreamWriter writer) => writer.WriteFloat(expected);
  223. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model, float value) => writer.WritePackedFloat(value, model);
  224. float Read(ref DataStreamReader reader) => reader.ReadFloat();
  225. float ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedFloat(model);
  226. CheckReadWritePackedLooped(sizeof(float), baseVal, expected, Write, WritePacked, Read, ReadPacked, (l, u) => l + u);
  227. }
  228. [Test]
  229. public void Double()
  230. {
  231. const double expected = 1979.1989;
  232. const double baseVal = 2000.2000;
  233. bool Write(ref DataStreamWriter writer) => writer.WriteDouble(expected);
  234. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model, double value) => writer.WritePackedDouble(value, model);
  235. double Read(ref DataStreamReader reader) => reader.ReadDouble();
  236. double ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedDouble(model);
  237. CheckReadWritePackedLooped(sizeof(double), baseVal, expected, Write, WritePacked, Read, ReadPacked, (l, u) => l + u);
  238. }
  239. [Test]
  240. public void WriteOutSideOfCapacity_Fails()
  241. {
  242. var model = StreamCompressionModel.Default;
  243. var writer = new DataStreamWriter(sizeof(uint) / 2, Allocator.Temp);
  244. Assert.False(writer.HasFailedWrites);
  245. Assert.False(writer.WritePackedUInt(uint.MaxValue, model), "Writing a uint where there is no room should fail.");
  246. Assert.That(writer.HasFailedWrites);
  247. }
  248. [Test]
  249. [TestRequiresDotsDebugOrCollectionChecks]
  250. public void ReadOutSideOfCapacity_Fails()
  251. {
  252. var model = StreamCompressionModel.Default;
  253. var reader = new DataStreamReader(new NativeArray<byte>(0, Allocator.Temp));
  254. LogAssert.Expect(LogType.Error, "Trying to read 2 bits from a stream where only 0 are available");
  255. Assert.That(reader.ReadPackedUInt(model), Is.EqualTo(0));
  256. Assert.That(reader.HasFailedReads);
  257. }
  258. }
  259. internal class ReadWritePackedDelta
  260. {
  261. [Test]
  262. public void Int()
  263. {
  264. const int expected = int.MaxValue;
  265. const int baseline = int.MinValue;
  266. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedIntDelta(expected, baseline, model);
  267. int ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedIntDelta(baseline, model);
  268. CheckReadWritePacked(sizeof(int), ReadPacked, WritePacked, expected);
  269. }
  270. [Test]
  271. public void Long()
  272. {
  273. const long expected = long.MaxValue;
  274. const long baseline = long.MinValue;
  275. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedLongDelta(expected, baseline, model);
  276. long ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedLongDelta(baseline, model);
  277. CheckReadWritePacked(sizeof(long), ReadPacked, WritePacked, expected);
  278. }
  279. [Test]
  280. public void ULong()
  281. {
  282. const ulong expected = ulong.MaxValue;
  283. const ulong baseline = ulong.MinValue;
  284. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedULongDelta(expected, baseline, model);
  285. ulong ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedULongDelta(baseline, model);
  286. CheckReadWritePacked(sizeof(ulong), ReadPacked, WritePacked, expected);
  287. }
  288. [Test]
  289. public void FixedString32()
  290. {
  291. var expected = new FixedString32Bytes("This is a string");
  292. var baseline = new FixedString32Bytes("This is another string");
  293. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedFixedString32Delta(expected, baseline, model);
  294. FixedString32Bytes ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedFixedString32Delta(baseline, model);
  295. CheckReadWritePacked(expected.Length + FixedStringHeader, ReadPacked, WritePacked, expected);
  296. }
  297. [Test]
  298. public void FixedString32_LargerBaseline()
  299. {
  300. var expected = new FixedString32Bytes("This is another string");
  301. var baseline = new FixedString32Bytes("This is a string");
  302. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedFixedString32Delta(expected, baseline, model);
  303. FixedString32Bytes ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedFixedString32Delta(baseline, model);
  304. CheckReadWritePacked(expected.Length + FixedStringHeader, ReadPacked, WritePacked, expected);
  305. }
  306. [Test]
  307. public void FixedString64()
  308. {
  309. var expected = new FixedString64Bytes("This is a string");
  310. var baseline = new FixedString64Bytes("This is another string");
  311. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedFixedString64Delta(expected, baseline, model);
  312. FixedString64Bytes ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedFixedString64Delta(baseline, model);
  313. CheckReadWritePacked(expected.Length + FixedStringHeader, ReadPacked, WritePacked, expected);
  314. }
  315. [Test]
  316. public void FixedString128()
  317. {
  318. var expected = new FixedString128Bytes("This is a string");
  319. var baseline = new FixedString128Bytes("This is another string");
  320. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedFixedString128Delta(expected, baseline, model);
  321. FixedString128Bytes ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedFixedString128Delta(baseline, model);
  322. CheckReadWritePacked(expected.Length + FixedStringHeader, ReadPacked, WritePacked, expected);
  323. }
  324. [Test]
  325. public void FixedString512()
  326. {
  327. var expected = new FixedString512Bytes("This is a string");
  328. var baseline = new FixedString512Bytes("This is another string");
  329. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedFixedString512Delta(expected, baseline, model);
  330. FixedString512Bytes ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedFixedString512Delta(baseline, model);
  331. CheckReadWritePacked(expected.Length + FixedStringHeader, ReadPacked, WritePacked, expected);
  332. }
  333. [Test]
  334. public void FixedString4096()
  335. {
  336. var expected = new FixedString4096Bytes("This is a string");
  337. var baseline = new FixedString4096Bytes("This is another string");
  338. bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model) => writer.WritePackedFixedString4096Delta(expected, baseline, model);
  339. FixedString4096Bytes ReadPacked(ref DataStreamReader reader, StreamCompressionModel model) => reader.ReadPackedFixedString4096Delta(baseline, model);
  340. CheckReadWritePacked(expected.Length + FixedStringHeader, ReadPacked, WritePacked, expected);
  341. }
  342. [Test]
  343. public void Float_OutOfBoundsFails()
  344. {
  345. const float expected = float.MaxValue;
  346. const float baseline = float.MinValue;
  347. var model = StreamCompressionModel.Default;
  348. var writer = new DataStreamWriter(sizeof(float) / 2, Allocator.Temp);
  349. Assert.False(writer.HasFailedWrites);
  350. Assert.False(writer.WritePackedFloatDelta(expected, baseline, model));
  351. Assert.That(writer.HasFailedWrites);
  352. }
  353. [Test]
  354. public void Float_UnchangedData()
  355. {
  356. const float expected = float.MaxValue;
  357. const float baseline = float.MaxValue;
  358. var model = StreamCompressionModel.Default;
  359. var writer = new DataStreamWriter(1, Allocator.Temp);
  360. Assert.True(writer.WritePackedFloatDelta(expected, baseline, model));
  361. var reader = new DataStreamReader(writer.AsNativeArray());
  362. Assert.AreEqual(baseline, reader.ReadPackedFloatDelta(baseline, model));
  363. Assert.That(reader.GetBitsRead(), Is.EqualTo(1));
  364. }
  365. [Test]
  366. public void Float_ChangedData()
  367. {
  368. const float expected = float.MaxValue;
  369. const float baseline = float.MinValue;
  370. var model = StreamCompressionModel.Default;
  371. var writer = new DataStreamWriter(sizeof(float) + 1, Allocator.Temp);
  372. Assert.True(writer.WritePackedFloatDelta(expected, baseline, model));
  373. var reader = new DataStreamReader(writer.AsNativeArray());
  374. Assert.AreEqual(1, reader.ReadRawBits(1));
  375. var uf = new UIntFloat
  376. {
  377. intValue = reader.ReadRawBits(32)
  378. };
  379. Assert.AreEqual(expected, uf.floatValue);
  380. }
  381. [Test]
  382. [TestRequiresDotsDebugOrCollectionChecks]
  383. public void UInt_OutOfCapacity()
  384. {
  385. var model = StreamCompressionModel.Default;
  386. var writer = new DataStreamWriter(0, Allocator.Temp);
  387. var reader = new DataStreamReader(writer.AsNativeArray());
  388. LogAssert.Expect(LogType.Error, "Trying to read 2 bits from a stream where only 0 are available");
  389. Assert.That(reader.ReadPackedUInt(model), Is.EqualTo(0));
  390. Assert.That(reader.HasFailedReads);
  391. }
  392. }
  393. [Test]
  394. public void IsCreated_ReturnsTrueAfterConstructor()
  395. {
  396. var dataStream = new DataStreamWriter(4, Allocator.Temp);
  397. Assert.True(dataStream.IsCreated, "Buffer must be created after calling constructor.");
  398. }
  399. [Test]
  400. public void LengthInBits_MatchesWrittenCount()
  401. {
  402. var dataStream = new DataStreamWriter(4, Allocator.Temp);
  403. dataStream.WriteByte(0);
  404. Assert.That(dataStream.LengthInBits, Is.EqualTo(1 * 8));
  405. dataStream.WriteByte(1);
  406. dataStream.WriteByte(1);
  407. Assert.That(dataStream.LengthInBits, Is.EqualTo(3 * 8));
  408. }
  409. [Test]
  410. public void CreateStreamWithPartOfSourceByteArray()
  411. {
  412. byte[] byteArray =
  413. {
  414. (byte)'s', (byte)'o', (byte)'m', (byte)'e',
  415. (byte)' ', (byte)'d', (byte)'a', (byte)'t', (byte)'a'
  416. };
  417. DataStreamWriter dataStream;
  418. dataStream = new DataStreamWriter(4, Allocator.Temp);
  419. dataStream.WriteBytes(new NativeArray<byte>(byteArray, Allocator.Temp).GetSubArray(0, 4));
  420. Assert.AreEqual(dataStream.Length, 4);
  421. var reader = new DataStreamReader(dataStream.AsNativeArray());
  422. for (int i = 0; i < dataStream.Length; ++i)
  423. {
  424. Assert.AreEqual(byteArray[i], reader.ReadByte());
  425. }
  426. #if ENABLE_UNITY_COLLECTIONS_CHECKS || UNITY_DOTS_DEBUG
  427. LogAssert.Expect(LogType.Error, "Trying to read 1 bytes from a stream where only 0 are available");
  428. Assert.AreEqual(0, reader.ReadByte());
  429. #endif
  430. }
  431. [Test]
  432. public void CreateStreamWithSourceByteArray()
  433. {
  434. byte[] byteArray = new byte[100];
  435. byteArray[0] = (byte)'a';
  436. byteArray[1] = (byte)'b';
  437. byteArray[2] = (byte)'c';
  438. DataStreamWriter dataStream1, dataStream2;
  439. dataStream1 = new DataStreamWriter(byteArray.Length, Allocator.Temp);
  440. dataStream2 = new DataStreamWriter(byteArray.Length, Allocator.Temp);
  441. dataStream1.WriteBytes(new NativeArray<byte>(byteArray, Allocator.Temp));
  442. dataStream2.WriteBytes(byteArray);
  443. var arr1 = dataStream1.AsNativeArray();
  444. var arr2 = dataStream2.AsNativeArray();
  445. var reader1 = new DataStreamReader(arr1);
  446. var reader2 = new DataStreamReader(arr2);
  447. for (var i = 0; i < byteArray.Length; ++i)
  448. {
  449. Assert.AreEqual(byteArray[i], reader1.ReadByte());
  450. Assert.AreEqual(byteArray[i], reader2.ReadByte());
  451. }
  452. }
  453. [Test]
  454. public void ReadIntoExistingNativeByteArray()
  455. {
  456. var byteArray = new NativeArray<byte>(100, Allocator.Temp);
  457. DataStreamWriter dataStream;
  458. dataStream = new DataStreamWriter(3, Allocator.Temp);
  459. {
  460. dataStream.WriteByte((byte)'a');
  461. dataStream.WriteByte((byte)'b');
  462. dataStream.WriteByte((byte)'c');
  463. var reader = new DataStreamReader(dataStream.AsNativeArray());
  464. reader.ReadBytes(byteArray.GetSubArray(0, dataStream.Length));
  465. reader = new DataStreamReader(dataStream.AsNativeArray());
  466. for (int i = 0; i < reader.Length; ++i)
  467. {
  468. Assert.AreEqual(byteArray[i], reader.ReadByte());
  469. }
  470. }
  471. }
  472. [Test]
  473. public void ReadIntoExistingByteArray()
  474. {
  475. var byteArray = new byte[3];
  476. DataStreamWriter dataStream;
  477. dataStream = new DataStreamWriter(3, Allocator.Temp);
  478. {
  479. dataStream.WriteByte((byte)'a');
  480. dataStream.WriteByte((byte)'b');
  481. dataStream.WriteByte((byte)'c');
  482. var reader = new DataStreamReader(dataStream.AsNativeArray());
  483. reader.ReadBytes(byteArray);
  484. reader = new DataStreamReader(dataStream.AsNativeArray());
  485. for (int i = 0; i < reader.Length; ++i)
  486. {
  487. Assert.AreEqual(byteArray[i], reader.ReadByte());
  488. }
  489. }
  490. }
  491. [Test]
  492. public void ReadingDataFromStreamWithSliceOffset()
  493. {
  494. var dataStream = new DataStreamWriter(100, Allocator.Temp);
  495. dataStream.WriteByte((byte)'a');
  496. dataStream.WriteByte((byte)'b');
  497. dataStream.WriteByte((byte)'c');
  498. dataStream.WriteByte((byte)'d');
  499. dataStream.WriteByte((byte)'e');
  500. dataStream.WriteByte((byte)'f');
  501. var reader = new DataStreamReader(dataStream.AsNativeArray().GetSubArray(3, 3));
  502. Assert.AreEqual('d', reader.ReadByte());
  503. Assert.AreEqual('e', reader.ReadByte());
  504. Assert.AreEqual('f', reader.ReadByte());
  505. }
  506. [Test]
  507. public void GetStreamReaderUnsafePtr()
  508. {
  509. var a = new NativeArray<byte>(1, Allocator.Temp);
  510. a[0] = (byte)42;
  511. var reader = new DataStreamReader(a);
  512. unsafe
  513. {
  514. var ptr = (byte*)reader.GetUnsafeReadOnlyPtr();
  515. Assert.AreEqual((byte)42, *ptr);
  516. }
  517. }
  518. [Test]
  519. public void WriteOutOfBounds()
  520. {
  521. var dataStream = new DataStreamWriter(9, Allocator.Temp);
  522. Assert.IsTrue(dataStream.WriteInt(42));
  523. Assert.AreEqual(4, dataStream.Length);
  524. Assert.IsTrue(dataStream.WriteInt(42));
  525. Assert.AreEqual(8, dataStream.Length);
  526. Assert.IsFalse(dataStream.HasFailedWrites);
  527. Assert.IsFalse(dataStream.WriteInt(42));
  528. Assert.AreEqual(8, dataStream.Length);
  529. Assert.IsTrue(dataStream.HasFailedWrites);
  530. Assert.IsFalse(dataStream.WriteShort(42));
  531. Assert.AreEqual(8, dataStream.Length);
  532. Assert.IsTrue(dataStream.HasFailedWrites);
  533. Assert.IsTrue(dataStream.WriteByte(42));
  534. Assert.AreEqual(9, dataStream.Length);
  535. Assert.IsTrue(dataStream.HasFailedWrites);
  536. Assert.IsFalse(dataStream.WriteByte(42));
  537. Assert.AreEqual(9, dataStream.Length);
  538. Assert.IsTrue(dataStream.HasFailedWrites);
  539. }
  540. [Test]
  541. public void ReadWritePackedUIntWithDeferred()
  542. {
  543. var compressionModel = StreamCompressionModel.Default;
  544. var dataStream = new DataStreamWriter(300 * 4, Allocator.Temp);
  545. uint base_val = 2000;
  546. uint count = 277;
  547. var def = dataStream;
  548. dataStream.WriteInt((int)0);
  549. for (uint i = 0; i < count; ++i)
  550. dataStream.WritePackedUInt(base_val + i, compressionModel);
  551. dataStream.Flush();
  552. def.WriteInt(1979);
  553. def = dataStream;
  554. dataStream.WriteInt((int)0);
  555. def.WriteInt(1979);
  556. dataStream.Flush();
  557. var reader = new DataStreamReader(dataStream.AsNativeArray());
  558. Assert.AreEqual(1979, reader.ReadInt());
  559. for (uint i = 0; i < count; ++i)
  560. {
  561. var val = reader.ReadPackedUInt(compressionModel);
  562. Assert.AreEqual(base_val + i, val);
  563. }
  564. Assert.AreEqual(1979, reader.ReadInt());
  565. }
  566. [Test]
  567. public void PassDataStreamReaderToJob()
  568. {
  569. using (var returnValue = new NativeArray<int>(1, Allocator.TempJob))
  570. {
  571. var writer = new DataStreamWriter(sizeof(int), Allocator.Temp);
  572. writer.WriteInt(42);
  573. var reader = new DataStreamReader(writer.AsNativeArray());
  574. new ReaderTestJob
  575. {
  576. Reader = reader,
  577. ReturnValue = returnValue
  578. }.Run();
  579. Assert.AreEqual(42, returnValue[0]);
  580. }
  581. }
  582. private struct ReaderTestJob : IJob
  583. {
  584. public DataStreamReader Reader;
  585. public NativeArray<int> ReturnValue;
  586. public void Execute()
  587. {
  588. ReturnValue[0] = Reader.ReadInt();
  589. }
  590. }
  591. delegate T Read<out T>(ref DataStreamReader reader);
  592. delegate T ReadPacked<out T>(ref DataStreamReader reader, StreamCompressionModel model);
  593. delegate bool Write(ref DataStreamWriter writer);
  594. delegate T Sum<T>(T x, uint y);
  595. delegate bool WriteWithValue<in T>(ref DataStreamWriter writer, T value);
  596. delegate bool WritePacked(ref DataStreamWriter writer, StreamCompressionModel model);
  597. delegate bool WritePackedWithValue<in T>(ref DataStreamWriter writer, StreamCompressionModel model, T value);
  598. const int FixedStringHeader = 2;
  599. static void CheckReadWritePackedLooped<T>(int size, T baseVal, T expected,
  600. Write write, WritePackedWithValue<T> writePackedWithValue,
  601. Read<T> read, ReadPacked<T> readPacked, Sum<T> sum)
  602. {
  603. var compressionModel = StreamCompressionModel.Default;
  604. var dataStream = new DataStreamWriter(300 * size, Allocator.Temp);
  605. const int count = 277;
  606. for (uint i = 0; i < count; ++i)
  607. {
  608. T res = sum(baseVal, i);
  609. writePackedWithValue(ref dataStream, compressionModel, res);
  610. }
  611. write(ref dataStream);
  612. dataStream.Flush();
  613. var reader = new DataStreamReader(dataStream.AsNativeArray());
  614. for (uint i = 0; i < count; ++i)
  615. {
  616. var val = readPacked(ref reader, compressionModel);
  617. Assert.AreEqual(sum(baseVal, i), val);
  618. }
  619. Assert.AreEqual(expected, read(ref reader));
  620. }
  621. static void CheckReadWritePacked<T>(int size, ReadPacked<T> read, WritePacked write, T value)
  622. {
  623. var model = StreamCompressionModel.Default;
  624. var writer = new DataStreamWriter(size, Allocator.Temp);
  625. write(ref writer, model);
  626. writer.Flush();
  627. var reader = new DataStreamReader(writer.AsNativeArray());
  628. Assert.That(read(ref reader, model), Is.EqualTo(value));
  629. }
  630. static void CheckReadWrite<T>(int size, Func<DataStreamReader, T> read, Write write, T value)
  631. {
  632. var writer = new DataStreamWriter(size, Allocator.Temp);
  633. write(ref writer);
  634. writer.Flush();
  635. Assert.That(read(new DataStreamReader(writer.AsNativeArray())), Is.EqualTo(value));
  636. }
  637. static void CheckReadWriteLooped<T>(int size, T baseVal, T expected, WriteWithValue<T> write, Read<T> read, Sum<T> sum)
  638. {
  639. var writer = new DataStreamWriter(300 * size, Allocator.Temp);
  640. const int count = 277;
  641. for (uint i = 0; i < count; ++i)
  642. {
  643. write(ref writer, sum(baseVal, i));
  644. }
  645. write(ref writer, expected);
  646. writer.Flush();
  647. var reader = new DataStreamReader(writer.AsNativeArray());
  648. for (uint i = 0; i < count; ++i)
  649. {
  650. var val = read(ref reader);
  651. Assert.AreEqual(sum(baseVal, i), val);
  652. }
  653. Assert.AreEqual(expected, read(ref reader));
  654. }
  655. [Test]
  656. public void MiNiCheck()
  657. {
  658. var model = StreamCompressionModel.Default;
  659. Assert.That(model.ToString(), Is.EqualTo("Unity.Collections.StreamCompressionModel"));
  660. }
  661. }
  662. }