protected void DoTest <T>(IEmittingCodec codec, T value, Action <T, T> assert) { Assert.That(codec.Type, Is.EqualTo(typeof(T))); var manualCodec = new ManualCodec <T>(CodecContainer, codec); if (codec.FixedSize.HasValue) { Assert.That(manualCodec.CalculateSize(value), Is.EqualTo(codec.FixedSize)); } int size = manualCodec.CalculateSize(value); var data = new byte[size]; fixed(byte *pData = data) { var p = pData; manualCodec.Encode(ref p, value); Assert.That(p - pData, Is.EqualTo(size)); p = pData; int remainingBytes = size; var decodedValue = manualCodec.Decode(ref p, ref remainingBytes, false); assert(decodedValue, value); Assert.That(p - pData, Is.EqualTo(size)); Assert.That(remainingBytes, Is.EqualTo(0)); p = pData; remainingBytes = size; decodedValue = manualCodec.Decode(ref p, ref remainingBytes, true); assert(decodedValue, value); Assert.That(p - pData, Is.EqualTo(size)); Assert.That(remainingBytes, Is.EqualTo(0)); if (size > 0) { p = pData; remainingBytes = size - 1; Assert.Throws <InvalidDataException>(() => manualCodec.Decode(ref p, ref remainingBytes, false)); } } }
private void DoTestDecode(bool fast) { const int expectedValue = 123123; const int expectedPointerDistance = 234; const int expetedRemainingBytesDistance = 345; var emittingCodec = Substitute.For <IEmittingCodec>(); emittingCodec.When(x => x.EmitDecode(Arg.Any <ILGenerator>(), Arg.Any <ILocalVariableCollection>(), fast)) .Do(x => { var il = x.Arg <ILGenerator>(); var locals = x.Arg <LocalVariableCollection>(); il.Emit_Ldc_I4(expectedValue); il.Emit(OpCodes.Newobj, MyClass.Constructor); il.Emit_IncreasePointer(locals.DataPointer, expectedPointerDistance); il.Emit_DecreaseInteger(locals.RemainingBytes, expetedRemainingBytesDistance); }); var manualCodec = new ManualCodec <MyClass>(emittingCodec); int value; int pointerDistance; int remainingBytesDistance; var data = new byte[4]; fixed(byte *pData = data) { var p = pData; int remainingBytes = 0; value = manualCodec.Decode(ref p, ref remainingBytes, fast).Value; pointerDistance = (int)(p - pData); remainingBytesDistance = -remainingBytes; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); Assert.That(remainingBytesDistance, Is.EqualTo(expetedRemainingBytesDistance)); }
private void DoTestDecode(bool fast) { const int expectedValue = 123123; const int expectedPointerDistance = 234; const int expetedRemainingBytesDistance = 345; var emittingCodec = Substitute.For <IEmittingCodec>(); emittingCodec.When(x => x.EmitDecode(Arg.Any <IEmittingContext>(), fast)).Do(x => { var context = x.Arg <EmittingContextBase>(); var il = context.IL; il.Ldc_I4(expectedValue); il.Newobj(MyClass.Constructor); il.IncreasePointer(context.DataPointerVar, expectedPointerDistance); il.DecreaseInteger(context.RemainingBytesVar, expetedRemainingBytesDistance); }); var manualCodec = new ManualCodec <MyClass>(null, emittingCodec); int value; int pointerDistance; int remainingBytesDistance; var data = new byte[4]; fixed(byte *pData = data) { var p = pData; int remainingBytes = 0; value = manualCodec.Decode(ref p, ref remainingBytes, fast).Value; pointerDistance = (int)(p - pData); remainingBytesDistance = -remainingBytes; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); Assert.That(remainingBytesDistance, Is.EqualTo(expetedRemainingBytesDistance)); }
private void DoTestDecode(bool fast) { const int expectedValue = 123123; const int expectedPointerDistance = 234; const int expetedRemainingBytesDistance = 345; var emittingCodec = Substitute.For<IEmittingCodec>(); emittingCodec.When(x => x.EmitDecode(Arg.Any<IEmittingContext>(), fast)).Do(x => { var context = x.Arg<EmittingContextBase>(); var il = context.IL; il.Ldc_I4(expectedValue); il.Newobj(MyClass.Constructor); il.IncreasePointer(context.DataPointerVar, expectedPointerDistance); il.DecreaseInteger(context.RemainingBytesVar, expetedRemainingBytesDistance); }); var manualCodec = new ManualCodec<MyClass>(null, emittingCodec); int value; int pointerDistance; int remainingBytesDistance; var data = new byte[4]; fixed (byte* pData = data) { var p = pData; int remainingBytes = 0; value = manualCodec.Decode(ref p, ref remainingBytes, fast).Value; pointerDistance = (int)(p - pData); remainingBytesDistance = -remainingBytes; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); Assert.That(remainingBytesDistance, Is.EqualTo(expetedRemainingBytesDistance)); }
private void DoTestDecode(bool fast) { const int expectedValue = 123123; const int expectedPointerDistance = 234; const int expetedRemainingBytesDistance = 345; var emittingCodec = Substitute.For<IEmittingCodec>(); emittingCodec.When(x => x.EmitDecode(Arg.Any<ILGenerator>(), Arg.Any<ILocalVariableCollection>(), fast)) .Do(x => { var il = x.Arg<ILGenerator>(); var locals = x.Arg<LocalVariableCollection>(); il.Emit_Ldc_I4(expectedValue); il.Emit(OpCodes.Newobj, MyClass.Constructor); il.Emit_IncreasePointer(locals.DataPointer, expectedPointerDistance); il.Emit_DecreaseInteger(locals.RemainingBytes, expetedRemainingBytesDistance); }); var manualCodec = new ManualCodec<MyClass>(emittingCodec); int value; int pointerDistance; int remainingBytesDistance; var data = new byte[4]; fixed (byte* pData = data) { var p = pData; int remainingBytes = 0; value = manualCodec.Decode(ref p, ref remainingBytes, fast).Value; pointerDistance = (int)(p - pData); remainingBytesDistance = -remainingBytes; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); Assert.That(remainingBytesDistance, Is.EqualTo(expetedRemainingBytesDistance)); }