• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2014 Google Inc. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 using System;
18 using System.Runtime.InteropServices;
19 
20 namespace FlatBuffers.Test
21 {
22     [FlatBuffersTestClass]
23     public class ByteBufferTests
24     {
25 
26         [FlatBuffersTestMethod]
ByteBuffer_Length_MatchesBufferLength()27         public void ByteBuffer_Length_MatchesBufferLength()
28         {
29             var buffer = new byte[1000];
30             var uut = new ByteBuffer(buffer);
31             Assert.AreEqual(buffer.Length, uut.Length);
32         }
33 
34         [FlatBuffersTestMethod]
ByteBuffer_PutBytePopulatesBufferAtZeroOffset()35         public void ByteBuffer_PutBytePopulatesBufferAtZeroOffset()
36         {
37             var buffer = new byte[1];
38             var uut = new ByteBuffer(buffer);
39             uut.PutByte(0, (byte)99);
40 
41             Assert.AreEqual((byte)99, buffer[0]);
42         }
43 
44 #if !BYTEBUFFER_NO_BOUNDS_CHECK
45         [FlatBuffersTestMethod]
ByteBuffer_PutByteCannotPutAtOffsetPastLength()46         public void ByteBuffer_PutByteCannotPutAtOffsetPastLength()
47         {
48             var uut = new ByteBuffer(1);
49             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutByte(1, 99));
50         }
51 #endif
52 
53         [FlatBuffersTestMethod]
ByteBuffer_PutShortPopulatesBufferCorrectly()54         public void ByteBuffer_PutShortPopulatesBufferCorrectly()
55         {
56             var buffer = new byte[2];
57             var uut = new ByteBuffer(buffer);
58             uut.PutShort(0, (short)1);
59 
60             // Ensure Endianness was written correctly
61             Assert.AreEqual((byte)1, buffer[0]);
62             Assert.AreEqual((byte)0, buffer[1]);
63         }
64 
65 #if !BYTEBUFFER_NO_BOUNDS_CHECK
66         [FlatBuffersTestMethod]
ByteBuffer_PutShortCannotPutAtOffsetPastLength()67         public void ByteBuffer_PutShortCannotPutAtOffsetPastLength()
68         {
69             var uut = new ByteBuffer(2);
70             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(2, 99));
71         }
72 #endif
73 
74 #if !BYTEBUFFER_NO_BOUNDS_CHECK
75         [FlatBuffersTestMethod]
ByteBuffer_PutShortChecksLength()76         public void ByteBuffer_PutShortChecksLength()
77         {
78             var uut = new ByteBuffer(1);
79             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(0, 99));
80         }
81 
82         [FlatBuffersTestMethod]
ByteBuffer_PutShortChecksLengthAndOffset()83         public void ByteBuffer_PutShortChecksLengthAndOffset()
84         {
85             var uut = new ByteBuffer(2);
86             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutShort(1, 99));
87         }
88 #endif
89 
90         [FlatBuffersTestMethod]
ByteBuffer_PutIntPopulatesBufferCorrectly()91         public void ByteBuffer_PutIntPopulatesBufferCorrectly()
92         {
93             var buffer = new byte[4];
94             var uut = new ByteBuffer(buffer);
95             uut.PutInt(0, 0x0A0B0C0D);
96 
97             // Ensure Endianness was written correctly
98             Assert.AreEqual(0x0D, buffer[0]);
99             Assert.AreEqual(0x0C, buffer[1]);
100             Assert.AreEqual(0x0B, buffer[2]);
101             Assert.AreEqual(0x0A, buffer[3]);
102         }
103 
104 #if !BYTEBUFFER_NO_BOUNDS_CHECK
105         [FlatBuffersTestMethod]
ByteBuffer_PutIntCannotPutAtOffsetPastLength()106         public void ByteBuffer_PutIntCannotPutAtOffsetPastLength()
107         {
108             var uut = new ByteBuffer(4);
109             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutInt(2, 0x0A0B0C0D));
110         }
111 
112         [FlatBuffersTestMethod]
ByteBuffer_PutIntChecksLength()113         public void ByteBuffer_PutIntChecksLength()
114         {
115             var uut = new ByteBuffer(1);
116             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutInt(0, 0x0A0B0C0D));
117         }
118 
119         [FlatBuffersTestMethod]
ByteBuffer_PutIntChecksLengthAndOffset()120         public void ByteBuffer_PutIntChecksLengthAndOffset()
121         {
122             var uut = new ByteBuffer(4);
123             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutInt(2, 0x0A0B0C0D));
124         }
125 #endif
126 
127         [FlatBuffersTestMethod]
ByteBuffer_PutLongPopulatesBufferCorrectly()128         public void ByteBuffer_PutLongPopulatesBufferCorrectly()
129         {
130             var buffer = new byte[8];
131             var uut = new ByteBuffer(buffer);
132             uut.PutLong(0, 0x010203040A0B0C0D);
133 
134             // Ensure Endianness was written correctly
135             Assert.AreEqual(0x0D, buffer[0]);
136             Assert.AreEqual(0x0C, buffer[1]);
137             Assert.AreEqual(0x0B, buffer[2]);
138             Assert.AreEqual(0x0A, buffer[3]);
139             Assert.AreEqual(0x04, buffer[4]);
140             Assert.AreEqual(0x03, buffer[5]);
141             Assert.AreEqual(0x02, buffer[6]);
142             Assert.AreEqual(0x01, buffer[7]);
143         }
144 
145 #if !BYTEBUFFER_NO_BOUNDS_CHECK
146         [FlatBuffersTestMethod]
ByteBuffer_PutLongCannotPutAtOffsetPastLength()147         public void ByteBuffer_PutLongCannotPutAtOffsetPastLength()
148         {
149             var uut = new ByteBuffer(8);
150             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutLong(2, 0x010203040A0B0C0D));
151         }
152 
153         [FlatBuffersTestMethod]
ByteBuffer_PutLongChecksLength()154         public void ByteBuffer_PutLongChecksLength()
155         {
156             var uut = new ByteBuffer(1);
157             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutLong(0, 0x010203040A0B0C0D));
158         }
159 
160         [FlatBuffersTestMethod]
ByteBuffer_PutLongChecksLengthAndOffset()161         public void ByteBuffer_PutLongChecksLengthAndOffset()
162         {
163             var uut = new ByteBuffer(8);
164             Assert.Throws<ArgumentOutOfRangeException>(() => uut.PutLong(2, 0x010203040A0B0C0D));
165         }
166 #endif
167 
168         [FlatBuffersTestMethod]
ByteBuffer_GetByteReturnsCorrectData()169         public void ByteBuffer_GetByteReturnsCorrectData()
170         {
171             var buffer = new byte[1];
172             buffer[0] = 99;
173             var uut = new ByteBuffer(buffer);
174             Assert.AreEqual((byte)99, uut.Get(0));
175         }
176 
177 #if !BYTEBUFFER_NO_BOUNDS_CHECK
178         [FlatBuffersTestMethod]
ByteBuffer_GetByteChecksOffset()179         public void ByteBuffer_GetByteChecksOffset()
180         {
181             var uut = new ByteBuffer(1);
182             Assert.Throws<ArgumentOutOfRangeException>(() => uut.Get(1));
183         }
184 #endif
185 
186         [FlatBuffersTestMethod]
ByteBuffer_GetShortReturnsCorrectData()187         public void ByteBuffer_GetShortReturnsCorrectData()
188         {
189             var buffer = new byte[2];
190             buffer[0] = 1;
191             buffer[1] = 0;
192             var uut = new ByteBuffer(buffer);
193             Assert.AreEqual(1, uut.GetShort(0));
194         }
195 
196 #if !BYTEBUFFER_NO_BOUNDS_CHECK
197         [FlatBuffersTestMethod]
ByteBuffer_GetShortChecksOffset()198         public void ByteBuffer_GetShortChecksOffset()
199         {
200             var uut = new ByteBuffer(2);
201             Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetShort(2));
202         }
203 
204         [FlatBuffersTestMethod]
ByteBuffer_GetShortChecksLength()205         public void ByteBuffer_GetShortChecksLength()
206         {
207             var uut = new ByteBuffer(2);
208             Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetShort(1));
209         }
210 #endif
211 
212         [FlatBuffersTestMethod]
ByteBuffer_GetIntReturnsCorrectData()213         public void ByteBuffer_GetIntReturnsCorrectData()
214         {
215             var buffer = new byte[4];
216             buffer[0] = 0x0D;
217             buffer[1] = 0x0C;
218             buffer[2] = 0x0B;
219             buffer[3] = 0x0A;
220             var uut = new ByteBuffer(buffer);
221             Assert.AreEqual(0x0A0B0C0D, uut.GetInt(0));
222         }
223 
224 #if !BYTEBUFFER_NO_BOUNDS_CHECK
225         [FlatBuffersTestMethod]
ByteBuffer_GetIntChecksOffset()226         public void ByteBuffer_GetIntChecksOffset()
227         {
228             var uut = new ByteBuffer(4);
229             Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetInt(4));
230         }
231 
232         [FlatBuffersTestMethod]
ByteBuffer_GetIntChecksLength()233         public void ByteBuffer_GetIntChecksLength()
234         {
235             var uut = new ByteBuffer(2);
236             Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetInt(0));
237         }
238 #endif
239 
240         [FlatBuffersTestMethod]
ByteBuffer_GetLongReturnsCorrectData()241         public void ByteBuffer_GetLongReturnsCorrectData()
242         {
243             var buffer = new byte[8];
244             buffer[0] = 0x0D;
245             buffer[1] = 0x0C;
246             buffer[2] = 0x0B;
247             buffer[3] = 0x0A;
248             buffer[4] = 0x04;
249             buffer[5] = 0x03;
250             buffer[6] = 0x02;
251             buffer[7] = 0x01;
252             var uut = new ByteBuffer(buffer);
253             Assert.AreEqual(0x010203040A0B0C0D, uut.GetLong(0));
254         }
255 
256 #if !BYTEBUFFER_NO_BOUNDS_CHECK
257         [FlatBuffersTestMethod]
ByteBuffer_GetLongChecksOffset()258         public void ByteBuffer_GetLongChecksOffset()
259         {
260             var uut = new ByteBuffer(8);
261             Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetLong(8));
262         }
263 
264         [FlatBuffersTestMethod]
ByteBuffer_GetLongChecksLength()265         public void ByteBuffer_GetLongChecksLength()
266         {
267             var uut = new ByteBuffer(7);
268             Assert.Throws<ArgumentOutOfRangeException>(() => uut.GetLong(0));
269         }
270 #endif
271 
272         [FlatBuffersTestMethod]
ByteBuffer_ReverseBytesUshort()273         public void ByteBuffer_ReverseBytesUshort()
274         {
275             const ushort original = (ushort)0x1234U;
276             var reverse = ByteBuffer.ReverseBytes(original);
277             Assert.AreEqual(0x3412U, reverse);
278 
279             var rereverse = ByteBuffer.ReverseBytes(reverse);
280             Assert.AreEqual(original, rereverse);
281         }
282 
283         [FlatBuffersTestMethod]
ByteBuffer_ReverseBytesUint()284         public void ByteBuffer_ReverseBytesUint()
285         {
286             const uint original = 0x12345678;
287             var reverse = ByteBuffer.ReverseBytes(original);
288             Assert.AreEqual(0x78563412U, reverse);
289 
290             var rereverse = ByteBuffer.ReverseBytes(reverse);
291             Assert.AreEqual(original, rereverse);
292         }
293 
294         [FlatBuffersTestMethod]
ByteBuffer_ReverseBytesUlong()295         public void ByteBuffer_ReverseBytesUlong()
296         {
297             const ulong original = 0x1234567890ABCDEFUL;
298             var reverse = ByteBuffer.ReverseBytes(original);
299             Assert.AreEqual(0xEFCDAB9078563412UL, reverse);
300 
301             var rereverse = ByteBuffer.ReverseBytes(reverse);
302             Assert.AreEqual(original, rereverse);
303         }
304 
305         [FlatBuffersTestMethod]
ByteBuffer_ToFullArray_MatchesBuffer()306         public void ByteBuffer_ToFullArray_MatchesBuffer()
307         {
308             var buffer = new byte[4];
309             buffer[0] = 0x0D;
310             buffer[1] = 0x0C;
311             buffer[2] = 0x0B;
312             buffer[3] = 0x0A;
313             var uut = new ByteBuffer(buffer);
314             Assert.ArrayEqual(buffer, uut.ToFullArray());
315         }
316 
317         [FlatBuffersTestMethod]
ByteBuffer_ToSizedArray_MatchesBuffer()318         public void ByteBuffer_ToSizedArray_MatchesBuffer()
319         {
320             var buffer = new byte[4];
321             buffer[0] = 0x0D;
322             buffer[1] = 0x0C;
323             buffer[2] = 0x0B;
324             buffer[3] = 0x0A;
325             var uut = new ByteBuffer(buffer);
326             Assert.ArrayEqual(buffer, uut.ToFullArray());
327         }
328 
329         [FlatBuffersTestMethod]
ByteBuffer_Duplicate_MatchesBuffer()330         public void ByteBuffer_Duplicate_MatchesBuffer()
331         {
332             var buffer = new byte[4];
333             buffer[0] = 0x0D;
334             buffer[1] = 0x0C;
335             buffer[2] = 0x0B;
336             buffer[3] = 0x0A;
337             var uut = new ByteBuffer(buffer);
338             Assert.AreEqual(0x0A0B0C0D, uut.GetInt(0));
339 
340             // Advance by two bytes
341             uut.Position = 2; uut = uut.Duplicate();
342             Assert.AreEqual(0x0A0B, uut.GetShort(2));
343 
344             // Advance by one more byte
345             uut.Position = 1; uut = uut.Duplicate();
346             Assert.AreEqual(0x0A, uut.Get(3));
347         }
348 
349         [FlatBuffersTestMethod]
ByteBuffer_To_Array_Float()350         public void ByteBuffer_To_Array_Float()
351         {
352             const int len = 9;
353 
354             // Construct the data array
355             var fData = new float[len];
356             fData[0] = 1.0079F;
357             fData[1] = 4.0026F;
358             fData[2] = 6.941F;
359             fData[3] = 9.0122F;
360             fData[4] = 10.811F;
361             fData[5] = 12.0107F;
362             fData[6] = 14.0067F;
363             fData[7] = 15.9994F;
364             fData[8] = 18.9984F;
365 
366             // Tranfer it to a byte array
367             var buffer = new byte[sizeof(float) * fData.Length];
368             Buffer.BlockCopy(fData, 0, buffer, 0, buffer.Length);
369 
370             // Create the Byte Buffer from byte array
371             var uut = new ByteBuffer(buffer);
372 
373             // Get the full array back out and ensure they are equivalent
374             var bbArray = uut.ToArray<float>(0, len);
375             Assert.ArrayEqual(fData, bbArray);
376 
377             // Get a portion of the full array back out and ensure the
378             // subrange agrees
379             var bbArray2 = uut.ToArray<float>(4, len - 1);
380             Assert.AreEqual(bbArray2.Length, len - 1);
381             for (int i = 1; i < len - 1; i++)
382             {
383                 Assert.AreEqual(fData[i], bbArray2[i - 1]);
384             }
385 
386             // Get a sub portion of the full array back out and ensure the
387             // subrange agrees
388             var bbArray3 = uut.ToArray<float>(8, len - 4);
389             Assert.AreEqual(bbArray3.Length, len - 4);
390             for (int i = 2; i < len - 4; i++)
391             {
392                 Assert.AreEqual(fData[i], bbArray3[i - 2]);
393             }
394         }
395 
396         public void ByteBuffer_Put_Array_Helper<T>(T[] data, int typeSize)
397             where T : struct
398         {
399             // Create the Byte Buffer
400             var uut = new ByteBuffer(1024);
401 
402             // Put the data into the buffer and make sure the offset is
403             // calculated correctly
404             int nOffset = uut.Put(1024, data);
405             Assert.AreEqual(1024 - typeSize * data.Length, nOffset);
406 
407             // Get the full array back out and ensure they are equivalent
408             var bbArray = uut.ToArray<T>(nOffset, data.Length);
Assert.ArrayEqualFlatBuffers.Test.ByteBufferTests.__anon1409             Assert.ArrayEqual(data, bbArray);
410         }
411 
412         public void ByteBuffer_Put_ArraySegment_Helper<T>(ArraySegment<T> data, int typeSize)
413             where T : struct
414         {
415             // Create the Byte Buffer
416             var uut = new ByteBuffer(1024);
417 
418             // Put the data into the buffer and make sure the offset is
419             // calculated correctly
420             int nOffset = uut.Put(1024, data);
421             Assert.AreEqual(1024 - typeSize * data.Count, nOffset);
422 
423             // Get the full array back out and ensure they are equivalent
424             var bbArray = uut.ToArray<T>(nOffset, data.Count);
data.ToArrayFlatBuffers.Test.ByteBufferTests.__anon2425             Assert.ArrayEqual(data.ToArray(), bbArray);
426         }
427 
428         public unsafe void ByteBuffer_Put_IntPtr_Helper<T>(T[] data, int typeSize)
429             where T : struct
430         {
431             GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);
432             try
433             {
434                 var dataPtr = handle.AddrOfPinnedObject();
435                 var sizeInBytes = data.Length * typeSize;
436 
437                 // Create the Byte Buffer
438                 var uut = new ByteBuffer(1024);
439 
440                 // Put the data into the buffer and make sure the offset is
441                 // calculated correctly
442                 int nOffset = uut.Put<T>(1024, dataPtr, sizeInBytes);
443                 Assert.AreEqual(1024 - sizeInBytes, nOffset);
444 
445                 // Get the full array back out and ensure they are equivalent
446                 var bbArray = uut.ToArray<T>(nOffset, data.Length);
447                 Assert.ArrayEqual(data, bbArray);
448             }
449             finally
450             {
451                 handle.Free();
452             }
453         }
454 
455         public void ByteBuffer_Put_ArrayTypes_Helper<T>(T[] data, int typeSize)
456             where T : struct
457         {
ByteBuffer_Put_Array_HelperFlatBuffers.Test.ByteBufferTests.__anon4458             ByteBuffer_Put_Array_Helper(data, typeSize);
459 
460             var arraySegment = CreateArraySegment(data);
ByteBuffer_Put_ArraySegment_HelperFlatBuffers.Test.ByteBufferTests.__anon4461             ByteBuffer_Put_ArraySegment_Helper(arraySegment, typeSize);
462 
ByteBuffer_Put_IntPtr_HelperFlatBuffers.Test.ByteBufferTests.__anon4463             ByteBuffer_Put_IntPtr_Helper(data, typeSize);
464         }
465 
466         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Float()467         public void ByteBuffer_Put_Array_Float()
468         {
469             const int len = 9;
470 
471             // Construct the data array
472             var data = new float[len];
473             data[0] = 1.0079F;
474             data[1] = 4.0026F;
475             data[2] = 6.941F;
476             data[3] = 9.0122F;
477             data[4] = 10.811F;
478             data[5] = 12.0107F;
479             data[6] = 14.0067F;
480             data[7] = 15.9994F;
481             data[8] = 18.9984F;
482 
483             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(float));
484         }
485 
486         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Double()487         public void ByteBuffer_Put_Array_Double()
488         {
489             const int len = 9;
490 
491             // Construct the data array
492             var data = new double[len];
493             data[0] = 1.0079;
494             data[1] = 4.0026;
495             data[2] = 6.941;
496             data[3] = 9.0122;
497             data[4] = 10.811;
498             data[5] = 12.0107;
499             data[6] = 14.0067;
500             data[7] = 15.9994;
501             data[8] = 18.9984;
502 
503             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(double));
504         }
505 
506         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Int()507         public void ByteBuffer_Put_Array_Int()
508         {
509             const int len = 9;
510 
511             // Construct the data array
512             var data = new int[len];
513             data[0] = 1;
514             data[1] = 4;
515             data[2] = 6;
516             data[3] = 9;
517             data[4] = 10;
518             data[5] = 12;
519             data[6] = 14;
520             data[7] = 15;
521             data[8] = 18;
522 
523             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(int));
524         }
525 
526 
527         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_UInt()528         public void ByteBuffer_Put_Array_UInt()
529         {
530             const int len = 9;
531 
532             // Construct the data array
533             var data = new uint[len];
534             data[0] = 1;
535             data[1] = 4;
536             data[2] = 6;
537             data[3] = 9;
538             data[4] = 10;
539             data[5] = 12;
540             data[6] = 14;
541             data[7] = 15;
542             data[8] = 18;
543 
544             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(uint));
545         }
546 
547         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Bool()548         public void ByteBuffer_Put_Array_Bool()
549         {
550             const int len = 9;
551 
552             // Construct the data array
553             var data = new bool[len];
554             data[0] = true;
555             data[1] = true;
556             data[2] = false;
557             data[3] = true;
558             data[4] = false;
559             data[5] = true;
560             data[6] = true;
561             data[7] = true;
562             data[8] = false;
563 
564             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(bool));
565         }
566 
567         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Long()568         public void ByteBuffer_Put_Array_Long()
569         {
570             const int len = 9;
571 
572             // Construct the data array
573             var data = new long[len];
574             data[0] = 1;
575             data[1] = 4;
576             data[2] = 6;
577             data[3] = 9;
578             data[4] = 10;
579             data[5] = 12;
580             data[6] = 14;
581             data[7] = 15;
582             data[8] = 18;
583 
584             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(long));
585         }
586 
587         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Byte()588         public void ByteBuffer_Put_Array_Byte()
589         {
590             const int len = 9;
591 
592             // Construct the data array
593             var data = new byte[len];
594             data[0] = 1;
595             data[1] = 4;
596             data[2] = 6;
597             data[3] = 9;
598             data[4] = 10;
599             data[5] = 12;
600             data[6] = 14;
601             data[7] = 15;
602             data[8] = 18;
603 
604             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(byte));
605         }
606 
607         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_SByte()608         public void ByteBuffer_Put_Array_SByte()
609         {
610             const int len = 9;
611 
612             // Construct the data array
613             var data = new sbyte[len];
614             data[0] = 1;
615             data[1] = 4;
616             data[2] = 6;
617             data[3] = 9;
618             data[4] = 10;
619             data[5] = 12;
620             data[6] = 14;
621             data[7] = 15;
622             data[8] = 18;
623 
624             ByteBuffer_Put_ArrayTypes_Helper(data, sizeof(sbyte));
625         }
626 
627         private static ArraySegment<T> CreateArraySegment<T>(T[] data)
628             where T : struct
629         {
630             const int arraySegmentPadding = 7;
631             var newData = new T[data.Length + 2 * arraySegmentPadding];
Array.CopyFlatBuffers.Test.ByteBufferTests.__anon5632             Array.Copy(data, 0, newData, arraySegmentPadding, data.Length);
633             return new ArraySegment<T>(newData, arraySegmentPadding, data.Length);
634         }
635 
636         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Null_Throws()637         public void ByteBuffer_Put_Array_Null_Throws()
638         {
639             // Create the Byte Buffer
640             var uut = new ByteBuffer(1024);
641 
642             // create a null array and try to put it into the buffer
643             float[] data = null;
644             Assert.Throws<ArgumentNullException>(() => uut.Put(1024, data));
645 
646             ArraySegment<float> dataArraySegment = default;
647             Assert.Throws<ArgumentNullException>(() => uut.Put(1024, dataArraySegment));
648 
649             IntPtr dataPtr = IntPtr.Zero;
650             int dataPtrLength = 100;
651             Assert.Throws<ArgumentNullException>(() => uut.Put<float>(1024, dataPtr, dataPtrLength));
652         }
653 
654         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_Empty_Throws()655         public unsafe void ByteBuffer_Put_Array_Empty_Throws()
656         {
657             // Create the Byte Buffer
658             var uut = new ByteBuffer(1024);
659 
660             // create an array of length == 0, and try to put it into the buffer
661             float[] data = new float[0];
662             Assert.Throws<ArgumentException>(() => uut.Put(1024, data));
663 
664             var dataArraySegment = new ArraySegment<float>(new float[10], 5, 0);
665             Assert.Throws<ArgumentException>(() => uut.Put(1024, dataArraySegment));
666 
667             fixed(float* floatPtr = data)
668             {
669                 var dataPtr = (IntPtr)floatPtr;
670                 var dataPtrLength = 0;
671                 Assert.Throws<ArgumentException>(() => uut.Put<float>(1024, dataPtr, dataPtrLength));
672             }
673         }
674 
675         [FlatBuffersTestMethod]
ByteBuffer_Put_IntPtr_NegativeSize_Throws()676         public unsafe void ByteBuffer_Put_IntPtr_NegativeSize_Throws()
677         {
678             // Create the Byte Buffer
679             var uut = new ByteBuffer(1024);
680 
681             // create an array of length == 0, and try to put it into the buffer
682             float[] data = new float[10];
683             fixed(float* floatPtr = data)
684             {
685                 var dataPtr = (IntPtr)floatPtr;
686                 var dataPtrLength = -1;
687                 Assert.Throws<ArgumentException>(() => uut.Put<float>(1024, dataPtr, dataPtrLength));
688             }
689         }
690 
691         #pragma warning disable 0169
692         // These are purposely not used and the warning is suppress
693         private struct dummyStruct
694         {
695             int a;
696             float b;
697         }
698         #pragma warning restore 0169
699 
700         [FlatBuffersTestMethod]
ByteBuffer_Put_Array_IncorrectType_Throws()701         public unsafe void ByteBuffer_Put_Array_IncorrectType_Throws()
702         {
703             // Create the Byte Buffer
704             var uut = new ByteBuffer(1024);
705 
706             // Create an array of dummy structures that shouldn't be
707             // able to be put into the buffer
708             var data = new dummyStruct[10];
709             Assert.Throws<ArgumentException>(() => uut.Put(1024, data));
710 
711             var dataArraySegment = new ArraySegment<dummyStruct>(data);
712             Assert.Throws<ArgumentException>(() => uut.Put(1024, dataArraySegment));
713 
714             fixed(dummyStruct* floatPtr = data)
715             {
716                 var dataPtr = (IntPtr)floatPtr;
717                 var dataPtrLength = data.Length * sizeof(dummyStruct);
718                 Assert.Throws<ArgumentException>(() => uut.Put<dummyStruct>(1024, dataPtr, dataPtrLength));
719             }
720         }
721 
722         [FlatBuffersTestMethod]
ByteBuffer_Get_Double()723         public void ByteBuffer_Get_Double()
724         {
725             var uut = new ByteBuffer(1024);
726             double value = 3.14159265;
727             uut.PutDouble(900, value);
728             double getValue = uut.GetDouble(900);
729             Assert.AreEqual(value, getValue);
730         }
731 
732         [FlatBuffersTestMethod]
ByteBuffer_Get_Float()733         public void ByteBuffer_Get_Float()
734         {
735             var uut = new ByteBuffer(1024);
736             float value = 3.14159265F;
737             uut.PutFloat(900, value);
738             double getValue = uut.GetFloat(900);
739             Assert.AreEqual(value, getValue);
740         }
741     }
742 }
743