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)); } } }
public void Encode() { const int expectedValue = 123123; const int expectedPointerDistance = 234; var emittingCodec = Substitute.For <IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitEncode(null, 0)) .Do(x => { var context = x.Arg <IEmittingContext>(); var il = context.IL; il.Ldloc(context.DataPointerVar); il.Ldc_I4(expectedValue); il.Stind_I4(); il.IncreasePointer(context.DataPointerVar, expectedPointerDistance); }); var manualCodec = new ManualCodec <MyClass>(null, emittingCodec); int value; long pointerDistance; var data = new byte[4]; fixed(byte *pData = data) { var p = pData; manualCodec.Encode(ref p, new MyClass(222)); value = *(int *)pData; pointerDistance = p - pData; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); }
public void Encode() { const int expectedValue = 123123; const int expectedPointerDistance = 234; var emittingCodec = Substitute.For <IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitEncode(null, null, 0)) .Do(x => { var il = x.Arg <ILGenerator>(); var locals = x.Arg <LocalVariableCollection>(); il.Emit(OpCodes.Ldloc, locals.DataPointer); il.Emit_Ldc_I4(expectedValue); il.Emit(OpCodes.Stind_I4); il.Emit_IncreasePointer(locals.DataPointer, expectedPointerDistance); }); var manualCodec = new ManualCodec <MyClass>(emittingCodec); int value; long pointerDistance; var data = new byte[4]; fixed(byte *pData = data) { var p = pData; manualCodec.Encode(ref p, new MyClass(222)); value = *(int *)pData; pointerDistance = p - pData; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); }
public void Encode() { const int expectedValue = 123123; const int expectedPointerDistance = 234; var emittingCodec = Substitute.For<IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitEncode(null, 0)) .Do(x => { var context = x.Arg<IEmittingContext>(); var il = context.IL; il.Ldloc(context.DataPointerVar); il.Ldc_I4(expectedValue); il.Stind_I4(); il.IncreasePointer(context.DataPointerVar, expectedPointerDistance); }); var manualCodec = new ManualCodec<MyClass>(null, emittingCodec); int value; long pointerDistance; var data = new byte[4]; fixed (byte* pData = data) { var p = pData; manualCodec.Encode(ref p, new MyClass(222)); value = *(int*)pData; pointerDistance = p - pData; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); }
public void Encode() { const int expectedValue = 123123; const int expectedPointerDistance = 234; var emittingCodec = Substitute.For<IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitEncode(null, null, 0)) .Do(x => { var il = x.Arg<ILGenerator>(); var locals = x.Arg<LocalVariableCollection>(); il.Emit(OpCodes.Ldloc, locals.DataPointer); il.Emit_Ldc_I4(expectedValue); il.Emit(OpCodes.Stind_I4); il.Emit_IncreasePointer(locals.DataPointer, expectedPointerDistance); }); var manualCodec = new ManualCodec<MyClass>(emittingCodec); int value; long pointerDistance; var data = new byte[4]; fixed (byte* pData = data) { var p = pData; manualCodec.Encode(ref p, new MyClass(222)); value = *(int*)pData; pointerDistance = p - pData; } Assert.That(value, Is.EqualTo(expectedValue)); Assert.That(pointerDistance, Is.EqualTo(expectedPointerDistance)); }