public static byte[] PackRpcDefinition(NtRpcDefinition def, out UIntPtr packedLen)
        {
            WireEncoder enc = new WireEncoder();
            enc.Write8((byte)def.Version);
            enc.WriteString(def.Name);

            int paramsSize = def.ParamsArray.Length;
            if (paramsSize > 0xff) paramsSize = 0xff;
            enc.Write8((byte)paramsSize);
            for (int i = 0; i < paramsSize; ++i)
            {
                enc.WriteType(def.ParamsArray[i].Value.Type);
                enc.WriteString(def.ParamsArray[i].Name);
                enc.WriteValue(def.ParamsArray[i].Value);
            }

            int resultsSize = def.ResultsArray.Length;
            if (resultsSize > 0xff) resultsSize = 0xff;
            enc.Write8((byte)resultsSize);
            for (int i = 0; i < resultsSize; ++i)
            {
                enc.WriteType(def.ResultsArray[i].Type);
                enc.WriteString(def.ResultsArray[i].Name);
            }
            packedLen = (UIntPtr)enc.Buffer.Length;
            return enc.Buffer;
        }
        public void TestWireEncoderWriteType()
        {
            int off = BUFSIZE - 1;
            WireEncoder e = new WireEncoder();
            for (int i = 0; i < off; i++)
            {
                e.Write8(0);
            }
            e.WriteType(NtType.Boolean);
            e.WriteType(NtType.Double);
            e.WriteType(NtType.String);
            e.WriteType(NtType.Raw);
            e.WriteType(NtType.BooleanArray);
            e.WriteType(NtType.DoubleArray);
            e.WriteType(NtType.StringArray);
            e.WriteType(NtType.Rpc);

            Assert.That(e.Buffer.Length - off, Is.EqualTo(8));
            byte[] checkArray = { 0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x20 };
            byte[] bufferArray = new byte[checkArray.Length];
            Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length);
            Assert.That(bufferArray, Is.EquivalentTo(checkArray));
        }
        public void TestWireEncoderWriteLeb128()
        {
            int off = BUFSIZE - 2;
            WireEncoder e = new WireEncoder();
            for (int i = 0; i < off; i++)
            {
                e.Write8(0);
            }
            e.WriteUleb128(0ul);
            e.WriteUleb128(0x7ful);
            e.WriteUleb128(0x80ul);

            Assert.That(e.Buffer.Length - off, Is.EqualTo(4));
            byte[] checkArray = { 0x00, 0x7f, 0x80, 0x01 };
            byte[] bufferArray = new byte[checkArray.Length];
            Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length);
            Assert.That(bufferArray, Is.EquivalentTo(checkArray));
        }
        public void TestWireEncoderWriteDouble()
        {
            int off = BUFSIZE - 8;
            WireEncoder e = new WireEncoder();
            for (int i = 0; i < off; i++)
            {
                e.Write8(0);
            }
            e.WriteDouble(0.0);
            e.WriteDouble(2.3e5);
            e.WriteDouble(double.PositiveInfinity);
            e.WriteDouble(2.2250738585072014e-308);//Minimum double size
            e.WriteDouble(double.MaxValue);

            Assert.That(e.Buffer.Length - off, Is.EqualTo(40));
            byte[] checkArray =
            {
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x41, 0x0c, 0x13, 0x80, 0x00, 0x00, 0x00, 0x00,
                0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
            };
            byte[] bufferArray = new byte[checkArray.Length];
            Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length);
            Assert.That(bufferArray, Is.EquivalentTo(checkArray));
        }
        public void TestWireEncoderWrite8()
        {
            int off = BUFSIZE - 1;
            WireEncoder e = new WireEncoder();
            for (int i = 0; i < off; i++)
            {
                e.Write8(0);
            }
            e.Write8(5);
            unchecked
            {
                e.Write8((byte)0x101u);
            }
            e.Write8(0);

            Assert.That(e.Buffer.Length - off, Is.EqualTo(3));
            byte[] checkArray = { 0x05, 0x01, 0x00 };
            byte[] bufferArray = new byte[checkArray.Length];
            Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length);
            Assert.That(bufferArray, Is.EquivalentTo(checkArray));
        }
        public void TestWireEncoderWrite32()
        {
            int off = BUFSIZE - 4;
            WireEncoder e = new WireEncoder();
            for (int i = 0; i < off; i++)
            {
                e.Write8(0);
            }
            e.Write32(5);
            e.Write32(1);
            e.Write32(0xabcd);
            e.Write32(0x12345678);
            e.Write32(0);

            Assert.That(e.Buffer.Length - off, Is.EqualTo(20));
            byte[] checkArray = { 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xab, 0xcd, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00 };
            byte[] bufferArray = new byte[checkArray.Length];
            Array.Copy(e.Buffer, off, bufferArray, 0, checkArray.Length);
            Assert.That(bufferArray, Is.EquivalentTo(checkArray));
        }
        public void TestReset()
        {
            WireEncoder e = new WireEncoder();
            e.WriteType(NtType.Unassigned);
            Assert.That(e.Error, Is.Not.Null);
            e.Reset();
            Assert.That(e.Error, Is.Null);

            e.Write8(0);
            Assert.That(e.Buffer.Length, Is.EqualTo(1));
            e.Reset();
            Assert.That(e.Buffer, Is.Empty);
        }