示例#1
0
        public void DisposedTest()
        {
            var ms = new NativeMemoryStream(20);

            ms.Dispose();
            Assert.That(ms.CanRead, Is.False);
            Assert.That(ms.CanSeek, Is.False);
            Assert.That(ms.CanWrite, Is.False);
            Assert.That(() => ms.Capacity > 0, Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Read <int>(), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Read(typeof(int)), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Read(new byte[3], 0, 3), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.ReadByte(), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.ReadArray(typeof(byte), 1, false), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.ReadReference <int>(), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.ReadReference <string>(), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Seek(0, SeekOrigin.Begin), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.SetLength(20), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Write("X"), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Write("X", CharSet.Ansi), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Write(new[] { "X", "Y" }), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Write(new byte[3], 0, 3), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Write(new[] { 1, 2 }), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.Write(256), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.WriteByte(1), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.WriteObject(Guid.NewGuid()), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.WriteReference("X"), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.WriteReference(256), Throws.InstanceOf <ObjectDisposedException>());
            Assert.That(() => ms.WriteReferenceObject(Guid.NewGuid()), Throws.InstanceOf <ObjectDisposedException>());
        }
示例#2
0
        public void RefStringTest()
        {
            using (var ms = new NativeMemoryStream(20, 20))
            {
                Assert.That(() => ms.WriteReference(""), Throws.Nothing);
                Assert.That(ms.Length, Is.EqualTo(2 + IntPtr.Size));
                Assert.That(ms.Position, Is.EqualTo(IntPtr.Size));
                Assert.That(ms.Capacity, Is.EqualTo(20));
                Assert.That(() => ms.WriteReference(testStr), Throws.Nothing);
                Assert.That(ms.Length, Is.EqualTo(24 + IntPtr.Size * 2));
                Assert.That(ms.Position, Is.EqualTo(IntPtr.Size * 2));
                Assert.That(() => ms.WriteReference((string)null), Throws.Nothing);
                Assert.That(ms.Length, Is.EqualTo(24 + IntPtr.Size * 3));
                Assert.That(ms.Position, Is.EqualTo(IntPtr.Size * 3));
                var ptrs = ms.Pointer.ToArray <IntPtr>(3);
                Assert.That(ptrs, Is.EquivalentTo(new[] { IntPtr.Zero, IntPtr.Zero, IntPtr.Zero }));
                ms.Flush();
                Assert.That(ms.Capacity, Is.EqualTo(40));
                ptrs = ms.Pointer.ToArray <IntPtr>(3);
                Assert.That(ptrs, Is.Not.EquivalentTo(new[] { IntPtr.Zero, IntPtr.Zero, IntPtr.Zero }));
                Assert.That(StringHelper.GetString(ptrs[0], ms.CharSet), Is.EqualTo(""));
                Assert.That(StringHelper.GetString(ptrs[1], ms.CharSet), Is.EqualTo(testStr));
                Assert.That(StringHelper.GetString(ptrs[2], ms.CharSet), Is.Null);

                TestContext.WriteLine(ms.Pointer.ToHexDumpString((int)ms.Length, 32));
                ms.Position = 0;

                Assert.That(ms.ReadReference <string>(), Is.EqualTo(string.Empty));
                Assert.That(ms.Position, Is.EqualTo(IntPtr.Size));
                Assert.That(ms.ReadReference <string>(), Is.EqualTo(testStr));
                Assert.That(ms.ReadReference <string>(), Is.Null);
                Assert.That(ms.Read <string>(), Is.EqualTo(string.Empty));
                Assert.That(ms.Read <string>(), Is.EqualTo(testStr));
            }
        }
示例#3
0
        public void StructTest()
        {
            using (var ms = new NativeMemoryStream(8, 16, 48))
            {
                Assert.That(() => ms.Write(256), Throws.Nothing);
                var isz = sizeof(int);
                Assert.That(ms.Length, Is.EqualTo(Len()));
                Assert.That(ms.Position, Is.EqualTo(Pos()));
                Assert.That(ms.Capacity, Is.EqualTo(8));
                Assert.That(() => ms.Write((ushort)256), Throws.Nothing);
                isz += sizeof(ushort);
                Assert.That(ms.Length, Is.EqualTo(Len()));
                Assert.That(ms.Position, Is.EqualTo(Pos()));
                Assert.That(ms.Capacity, Is.EqualTo(8));
                Assert.That(() => ms.Write((long)1), Throws.Nothing);
                isz += sizeof(long);
                Assert.That(ms.Length, Is.EqualTo(Len()));
                Assert.That(ms.Position, Is.EqualTo(Pos()));
                Assert.That(ms.Capacity, Is.EqualTo(24));
                var newGuid = Guid.NewGuid();
                Assert.That(() => ms.Write(newGuid), Throws.Nothing);
                isz += Marshal.SizeOf(typeof(Guid));
                Assert.That(ms.Length, Is.EqualTo(Len()));
                Assert.That(ms.Position, Is.EqualTo(Pos()));
                Assert.That(ms.Capacity, Is.EqualTo(40));

                Assert.That(ms.Length, Is.EqualTo(ms.Position));
                Assert.That(ms.Capacity, Is.GreaterThanOrEqualTo(ms.Length));

                Assert.That(() => ms.Write(new Unblittable()), Throws.Exception);

                TestContext.WriteLine(ms.Pointer.ToHexDumpString((int)ms.Length, 32));
                ms.Position = 0;

                Assert.That(() => ms.Read(null), Throws.ArgumentNullException);

                Assert.That(ms.Read <int>(), Is.EqualTo(256));
                Assert.That(ms.Read <ushort>(), Is.EqualTo(256));
                Assert.That(ms.Read <long>(), Is.EqualTo(1));
                Assert.That(ms.Read <Guid>(), Is.EqualTo(newGuid));

                int Len() => isz;
                int Pos() => isz;
            }
        }
示例#4
0
        public void StringTest()
        {
            using (var ms = new NativeMemoryStream(20))
            {
                Assert.That(() => ms.Write(""), Throws.Nothing);
                Assert.That(ms.Length, Is.EqualTo(2));
                Assert.That(ms.Position, Is.EqualTo(2));
                Assert.That(ms.Capacity, Is.EqualTo(20));
                Assert.That(() => ms.Write(testStr), Throws.Nothing);
                Assert.That(ms.Length, Is.EqualTo(24));
                Assert.That(ms.Position, Is.EqualTo(24));
                Assert.That(ms.Capacity, Is.GreaterThan(20));

                ms.Flush();
                ms.Position = 0;

                Assert.That(ms.Read <string>(), Is.EqualTo(string.Empty));
                Assert.That(ms.Position, Is.EqualTo(StringHelper.GetCharSize(ms.CharSet)));
                Assert.That(ms.Read <string>(), Is.EqualTo(testStr));
            }
        }
示例#5
0
        public void MixedReadWriteTest()
        {
            using (var m = new SafeHGlobalHandle(512))
            {
                var  str  = "Test1";
                var  guid = Guid.NewGuid();
                var  lVal = 1208L;
                byte b    = 18;
                using (var ms = new NativeMemoryStream(m)
                {
                    CharSet = CharSet.Unicode
                })
                {
                    Assert.That(() => ms.WriteReference(str), Throws.Nothing);
                    Assert.That(() => ms.Write(str), Throws.Nothing);
                    Assert.That(() => ms.WriteReference(guid), Throws.Nothing);
                    Assert.That(() => ms.Write(guid), Throws.Nothing);
                    Assert.That(() => ms.WriteReference(lVal), Throws.Nothing);
                    Assert.That(() => ms.Write(lVal), Throws.Nothing);
                    Assert.That(() => ms.WriteReference(b), Throws.Nothing);
                    Assert.That(() => ms.Write(b), Throws.Nothing);
                    Assert.That(() => ms.WriteReference(str), Throws.Nothing);

                    ms.Flush();
                    ms.Position = 0;

                    Assert.That(ms.ReadReference <string>(CharSet.Unicode), Is.EqualTo(str));
                    Assert.That(ms.Read <string>(CharSet.Unicode), Is.EqualTo(str));
                    Assert.That(ms.ReadReference <Guid>(), Is.EqualTo(guid));
                    Assert.That(ms.Read <Guid>(), Is.EqualTo(guid));
                    Assert.That(ms.ReadReference <long>(), Is.EqualTo(lVal));
                    Assert.That(ms.Read <long>(), Is.EqualTo(lVal));
                    Assert.That(ms.ReadReference <byte>(), Is.EqualTo(b));
                    Assert.That(ms.Read <byte>(), Is.EqualTo(b));
                    Assert.That(ms.ReadReference <string>(CharSet.Unicode), Is.EqualTo(str));
                }
            }
        }
示例#6
0
        public void ReadWriteOnlyTest()
        {
            using (var m = new SafeHGlobalHandle(10))
                using (var ms = new NativeMemoryStream((IntPtr)m, m.Size))
                {
                    Assert.That(ms.CanWrite, Is.False);
                    Assert.That(ms.CanSeek, Is.True);
                    Assert.That(ms.CanRead, Is.True);

                    Assert.That(() => ms.Write("X"), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.Write("X", CharSet.Ansi), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.Write(new[] { "X", "Y" }), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.Write(new byte[3], 0, 3), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.Write(new[] { 1, 2 }), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.Write(256), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.WriteByte(1), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.WriteObject(Guid.NewGuid()), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.WriteReference("X"), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.WriteReference(256), Throws.InstanceOf <NotSupportedException>());
                    Assert.That(() => ms.WriteReferenceObject(Guid.NewGuid()), Throws.InstanceOf <NotSupportedException>());
                }

            using (var ms = new NativeMemoryStream(10, 10, 20, FileAccess.Write))
            {
                Assert.That(ms.CanWrite, Is.True);
                Assert.That(ms.CanSeek, Is.True);
                Assert.That(ms.CanRead, Is.False);

                Assert.That(() => ms.Read <int>(), Throws.InstanceOf <NotSupportedException>());
                Assert.That(() => ms.Read(typeof(int)), Throws.InstanceOf <NotSupportedException>());
                Assert.That(() => ms.Read(new byte[3], 0, 3), Throws.InstanceOf <NotSupportedException>());
                Assert.That(() => ms.ReadByte(), Throws.InstanceOf <NotSupportedException>());
                Assert.That(() => ms.ReadArray(typeof(byte), 1, false), Throws.InstanceOf <NotSupportedException>());
                Assert.That(() => ms.ReadReference <int>(), Throws.InstanceOf <NotSupportedException>());
                Assert.That(() => ms.ReadReference <string>(), Throws.InstanceOf <NotSupportedException>());
            }
        }
示例#7
0
        public void BytesTest()
        {
            using (var ms = new NativeMemoryStream(20, 10))
            {
                Assert.That(ms.Length, Is.EqualTo(0));
                Assert.That(() => ms.Write(null, 0, 0), Throws.ArgumentNullException);
                var bytes = new byte[] { 0, 0, 0, 0, 0, 0, 0, 3 };
                Assert.That(() => ms.Write(bytes, 1, 8), Throws.ArgumentException);
                Assert.That(() => ms.Write(bytes, -1, 8), Throws.TypeOf <ArgumentOutOfRangeException>());
                Assert.That(() => ms.Write(bytes, 1, -8), Throws.TypeOf <ArgumentOutOfRangeException>());
                Assert.That(() => ms.Write(bytes, 0, 8), Throws.Nothing);
                Assert.That(ms.Length, Is.EqualTo(8));
                Assert.That(ms.Position, Is.EqualTo(8));
                Assert.That(ms.Capacity, Is.EqualTo(20));
                var ones = new byte[22];
                for (var i = 0; i < ones.Length; i++)
                {
                    ones[i] = 1;
                }
                Array.ForEach(ones, b => b = 1);
                Assert.That(() => ms.Write(ones, 0, ones.Length), Throws.Nothing);
                Assert.That(ms.Length, Is.EqualTo(30));
                Assert.That(ms.Position, Is.EqualTo(30));
                Assert.That(ms.Capacity, Is.EqualTo(30));

                ms.Flush();
                ms.Position = 0;

                Assert.That(() => ms.Read(null, 0, 0), Throws.ArgumentNullException);
                var rbytes = new byte[bytes.Length];
                Assert.That(() => ms.Read(rbytes, 5, bytes.Length), Throws.ArgumentException);
                Assert.That(() => ms.Read(rbytes, -1, 1), Throws.InstanceOf <ArgumentOutOfRangeException>());
                Assert.That(() => ms.Read(rbytes, 0, -1), Throws.InstanceOf <ArgumentOutOfRangeException>());
                Assert.That(ms.Read(rbytes, 0, bytes.Length), Is.EqualTo(bytes.Length));
                Assert.That(rbytes, Is.EquivalentTo(bytes));
                Assert.That(ms.Position, Is.EqualTo(bytes.Length));
                rbytes = new byte[ms.Length];
                Assert.That(() => ms.Read(rbytes, (int)ms.Position, 40), Throws.ArgumentException);
                Assert.That(ms.Read(rbytes, (int)ms.Position, ones.Length), Is.EqualTo(ones.Length));
                for (var i = bytes.Length; i < ms.Position; i++)
                {
                    Assert.That(rbytes[i], Is.EqualTo(1));
                }
                Assert.That(() => ms.Read(rbytes, 0, 2), Throws.InstanceOf <ArgumentOutOfRangeException>());
            }
        }
示例#8
0
 private static Bitmap GetTransparentBitmap(HBITMAP hbitmap)
 {
     try
     {
         var dibsection = GetObject <BITMAP>(hbitmap);
         var bitmap     = new Bitmap(dibsection.bmWidth, dibsection.bmHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
         using var mstr = new NativeMemoryStream(dibsection.bmBits, dibsection.bmBitsPixel * dibsection.bmHeight * dibsection.bmWidth);
         for (var x = 0; x < dibsection.bmWidth; x++)
         {
             for (var y = 0; y < dibsection.bmHeight; y++)
             {
                 var rgbquad = mstr.Read <RGBQUAD>();
                 if (rgbquad.rgbReserved != 0)
                 {
                     bitmap.SetPixel(x, y, rgbquad.Color);
                 }
             }
         }
         return(bitmap);
     }
     catch { }
     return(Image.FromHbitmap((IntPtr)hbitmap));
 }