public void UnsafeObjectStream_Reserve_ReservesSpaceForObject() { var stream = new UnsafeObjectStream(); stream.AcquirePointers(); try { unsafe { stream.Reserve(sizeof(UnsafeObjectTypeOne)); *(UnsafeObjectTypeOne*)stream.Data = new UnsafeObjectTypeOne() { ObjectType = UnsafeObjectType.TypeOne, Value1 = 123 }; stream.FinalizeObject(sizeof(UnsafeObjectTypeOne)); stream.Reserve(sizeof(UnsafeObjectTypeTwo)); *(UnsafeObjectTypeTwo*)stream.Data = new UnsafeObjectTypeTwo() { ObjectType = UnsafeObjectType.TypeTwo, Value1 = 234, Value2 = 345 }; stream.FinalizeObject(sizeof(UnsafeObjectTypeTwo)); TheResultingValue(stream.LengthInBytes).ShouldBe(sizeof(UnsafeObjectTypeOne) + sizeof(UnsafeObjectTypeTwo)); TheResultingValue(stream.LengthInObjects).ShouldBe(2); var objData0 = stream.SeekObject(0); var objType0 = *(UnsafeObjectType*)objData0; TheResultingValue(objType0).ShouldBe(UnsafeObjectType.TypeOne); var objTypeOne = *(UnsafeObjectTypeOne*)objData0; TheResultingValue(objTypeOne.Value1).ShouldBe(123); var objData1 = stream.SeekObject(1); var objType1 = *(UnsafeObjectType*)objData1; TheResultingValue(objType1).ShouldBe(UnsafeObjectType.TypeTwo); var objTypeTwo = *(UnsafeObjectTypeTwo*)objData1; TheResultingValue(objTypeTwo.Value1).ShouldBe(234); TheResultingValue(objTypeTwo.Value2).ShouldBe(345); } } finally { stream.ReleasePointers(); } }
public void UnsafeObjectStream_Reserve_ThrowsException_WhenReservingDataBeforeEndOfStream() { var stream = new UnsafeObjectStream(); try { unsafe { stream.Reserve(sizeof(UnsafeObjectTypeOne)); stream.FinalizeObject(sizeof(UnsafeObjectTypeOne)); stream.Reserve(sizeof(UnsafeObjectTypeOne)); stream.FinalizeObject(sizeof(UnsafeObjectTypeOne)); stream.SeekBeginning(); stream.Reserve(sizeof(UnsafeObjectTypeOne)); } } finally { stream.ReleasePointers(); } }
public void UnsafeObjectStream_Reserve_ThrowsException_WhenReservingDataBeforeEndOfStream() { var stream = new UnsafeObjectStream(); stream.AcquirePointers(); try { unsafe { stream.Reserve(sizeof(UnsafeObjectTypeOne)); stream.FinalizeObject(sizeof(UnsafeObjectTypeOne)); stream.Reserve(sizeof(UnsafeObjectTypeOne)); stream.FinalizeObject(sizeof(UnsafeObjectTypeOne)); stream.SeekBeginning(); Assert.That(() => stream.Reserve(sizeof(UnsafeObjectTypeOne)), Throws.TypeOf<InvalidOperationException>()); } } finally { stream.ReleasePointers(); } }