Пример #1
0
        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));
                }
            }
        }
Пример #2
0
        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));
        }
Пример #3
0
        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));
        }
Пример #4
0
        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));
        }
Пример #5
0
        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));
        }