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 CalculateSize() { var item = new MyClass(222); const int size = 123123; var emittingCodec = Substitute.For<IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitCalculateSize(null, null)).Do(x => { var context = x.Arg<IEmittingContext>(); context.IL.Ldc_I4(size); }); var manualCodec = new ManualCodec<MyClass>(null, emittingCodec); Assert.That(manualCodec.CalculateSize(item), Is.EqualTo(size)); }
public void CalculateSize() { var item = new MyClass(222); const int size = 123123; var emittingCodec = Substitute.For <IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitCalculateSize(null, null)).Do(x => { var context = x.Arg <IEmittingContext>(); context.IL.Ldc_I4(size); }); var manualCodec = new ManualCodec <MyClass>(null, emittingCodec); Assert.That(manualCodec.CalculateSize(item), Is.EqualTo(size)); }
public void UseOwnCodecContainer() { var innerCodec = Substitute.For <IManualCodec <int> >(); var codecContainer = Substitute.For <ICodecContainer>(); codecContainer.GetManualCodecFor <int>().Returns(innerCodec); var emittingCodec = Substitute.For <IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitCalculateSize(null, null)).Do(x => { var context = x.Arg <IEmittingContext>(); context.EmitLoadManualCodecFor(typeof(int)); context.IL.Callvirt(typeof(object).GetMethod("GetHashCode")); }); var manualCodec = new ManualCodec <object>(codecContainer, emittingCodec); var result = manualCodec.CalculateSize(null); Assert.That(result, Is.EqualTo(innerCodec.GetHashCode())); }
public void UseOwnCodecContainer() { var innerCodec = Substitute.For<IManualCodec<int>>(); var codecContainer = Substitute.For<ICodecContainer>(); codecContainer.GetManualCodecFor<int>().Returns(innerCodec); var emittingCodec = Substitute.For<IEmittingCodec>(); emittingCodec.WhenForAnyArgs(x => x.EmitCalculateSize(null, null)).Do(x => { var context = x.Arg<IEmittingContext>(); context.EmitLoadManualCodecFor(typeof(int)); context.IL.Callvirt(typeof(object).GetMethod("GetHashCode")); }); var manualCodec = new ManualCodec<object>(codecContainer, emittingCodec); var result = manualCodec.CalculateSize(null); Assert.That(result, Is.EqualTo(innerCodec.GetHashCode())); }