Beispiel #1
0
        /// <summary>
        /// Sets the length of the stream.
        /// </summary>
        /// <param name="value">The new length in bytes.</param>
        /// <remarks>
        /// The stream will be truncated if the new length is less than
        /// the current length.  The stream will be extended if the new
        /// length is greater than the current length.  In this case,
        /// the contents of the extended portion will be undefined.
        /// </remarks>
        public override void SetLength(long value)
        {
            int cb;

            if (value < 0 || value > int.MaxValue)
            {
                throw new IOException(TooLongError);
            }

            cb = (int)value;

            if (cb < length)
            {
                length = cb;
                blocks.TruncateTo(length);

                if (pos > length)
                {
                    pos = length;
                }
            }
            else if (cb > length)
            {
                length = cb;
                blocks.ExtendTo(length);
            }
        }
Beispiel #2
0
        public void TruncateTo()
        {
            BlockArray blocks;

            blocks = new BlockArray();
            blocks.TruncateTo(0);
            Assert.Equal(0, blocks.Size);
            Assert.Empty(blocks.GetBlocks());

            blocks.ExtendTo(1);
            blocks.TruncateTo(1);
            Assert.Equal(blocks.BlockSize, blocks.Size);
            Assert.Single(blocks.GetBlocks());

            blocks.TruncateTo(1000000);
            blocks.TruncateTo(1);
            Assert.Equal(blocks.BlockSize, blocks.Size);
            Assert.Single(blocks.GetBlocks());

            blocks.TruncateTo(0);
            Assert.Equal(0, blocks.Size);
            Assert.Empty(blocks.GetBlocks());

            blocks.ExtendTo(blocks.BlockSize * 4);
            blocks.GetBlocks()[0].Buffer[0] = 0;
            blocks.GetBlocks()[1].Buffer[0] = 1;
            blocks.GetBlocks()[2].Buffer[0] = 2;
            blocks.GetBlocks()[3].Buffer[0] = 3;

            blocks.TruncateTo(blocks.BlockSize * 3);
            Assert.Equal(blocks.BlockSize * 3, blocks.Size);
            Assert.Equal(3, blocks.GetBlocks().Length);
            Assert.Equal(0, blocks.GetBlocks()[0].Buffer[0]);
            Assert.Equal(1, blocks.GetBlocks()[1].Buffer[0]);
            Assert.Equal(2, blocks.GetBlocks()[2].Buffer[0]);

            blocks.TruncateTo(blocks.BlockSize * 2 + 1);
            Assert.Equal(blocks.BlockSize * 3, blocks.Size);
            Assert.Equal(3, blocks.GetBlocks().Length);
            Assert.Equal(0, blocks.GetBlocks()[0].Buffer[0]);
            Assert.Equal(1, blocks.GetBlocks()[1].Buffer[0]);
            Assert.Equal(2, blocks.GetBlocks()[2].Buffer[0]);

            blocks.TruncateTo(blocks.BlockSize);
            Assert.Equal(blocks.BlockSize, blocks.Size);
            Assert.Single(blocks.GetBlocks());
            Assert.Equal(0, blocks.GetBlocks()[0].Buffer[0]);
        }
Beispiel #3
0
        public void Reload()
        {
            BlockArray ba;
            Block      b;
            byte       v;

            ba = new BlockArray(0, 10, 5);
            ba.ExtendTo(10);
            Assert.Equal(10, ba.Size);

            v = ba[5];

            b        = ba.GetBlock(0);
            b.Offset = 0;
            b.Length = b.Buffer.Length;
            for (int i = 0; i < b.Length; i++)
            {
                b.Buffer[i] = (byte)i;
            }

            b        = ba.GetBlock(1);
            b.Offset = 0;
            b.Length = b.Buffer.Length;
            for (int i = 0; i < b.Length; i++)
            {
                b.Buffer[i] = (byte)(i + 100);
            }

            ba.Reload();

            Assert.Equal(20, ba.Size);
            Assert.Equal(5, ba[5]);
        }
Beispiel #4
0
        public void ExtendTo()
        {
            BlockArray blocks;

            blocks = new BlockArray();
            blocks.ExtendTo(1);
            Assert.Equal(blocks.BlockSize, blocks.Size);
            Assert.Single(blocks.GetBlocks());

            blocks.ExtendTo(blocks.BlockSize / 2);
            Assert.Equal(blocks.BlockSize, blocks.Size);
            Assert.Single(blocks.GetBlocks());
            Assert.Equal(blocks.BlockSize, blocks.GetBlocks()[0].Length);

            blocks.ExtendTo(blocks.BlockSize + 1);
            Assert.Equal(blocks.BlockSize * 2, blocks.Size);
            Assert.Equal(2, blocks.GetBlocks().Length);
            Assert.Equal(blocks.BlockSize, blocks.GetBlocks()[0].Length);
            Assert.Equal(blocks.BlockSize, blocks.GetBlocks()[1].Length);
        }
Beispiel #5
0
        public void BlockOffset()
        {
            BlockArray ba;

            ba = new BlockArray(0, 10, 5);
            ba.ExtendTo(10);
            Assert.Equal(10, ba.Size);
            Assert.Equal(10, ba.GetBlock(0).Buffer.Length);
            Assert.Equal(5, ba.GetBlock(0).Length);
            Assert.Equal(5, ba.GetBlock(0).Offset);
            Assert.Equal(10, ba.GetBlock(1).Buffer.Length);
            Assert.Equal(5, ba.GetBlock(1).Length);
            Assert.Equal(5, ba.GetBlock(1).Offset);
        }
Beispiel #6
0
        public void SetExactSize()
        {
            BlockArray blocks;

            blocks = new BlockArray();
            blocks.SetExactSize(0);
            Assert.Equal(0, blocks.Size);
            Assert.Equal(0, blocks.Count);

            blocks.SetExactSize(1);
            Assert.Equal(1, blocks.Size);
            Assert.Equal(1, blocks.Count);
            Assert.Equal(1, blocks.GetBlock(0).Length);

            blocks.SetExactSize(blocks.BlockSize);
            Assert.Equal(blocks.BlockSize, blocks.Size);
            Assert.Equal(2, blocks.Count);
            Assert.Equal(1, blocks.GetBlock(0).Length);
            Assert.Equal(blocks.BlockSize - 1, blocks.GetBlock(1).Length);

            blocks.SetExactSize(blocks.BlockSize + 1);
            Assert.Equal(blocks.BlockSize + 1, blocks.Size);
            Assert.Equal(3, blocks.Count);
            Assert.Equal(1, blocks.GetBlock(0).Length);
            Assert.Equal(blocks.BlockSize - 1, blocks.GetBlock(1).Length);
            Assert.Equal(1, blocks.GetBlock(2).Length);

            blocks = new BlockArray();
            blocks.ExtendTo(blocks.BlockSize * 3);
            blocks.SetExactSize(blocks.Size - blocks.BlockSize / 2);
            Assert.Equal(3, blocks.Count);
            Assert.Equal(blocks.BlockSize, blocks.GetBlock(0).Length);
            Assert.Equal(blocks.BlockSize, blocks.GetBlock(1).Length);
            Assert.Equal(blocks.BlockSize - blocks.BlockSize / 2, blocks.GetBlock(2).Length);

            blocks.SetExactSize(blocks.BlockSize * 2);
            Assert.Equal(2, blocks.Count);
            Assert.Equal(blocks.BlockSize, blocks.GetBlock(0).Length);
            Assert.Equal(blocks.BlockSize, blocks.GetBlock(1).Length);

            blocks.SetExactSize(blocks.BlockSize + 1);
            Assert.Equal(2, blocks.Count);
            Assert.Equal(blocks.BlockSize, blocks.GetBlock(0).Length);
            Assert.Equal(1, blocks.GetBlock(1).Length);
        }
Beispiel #7
0
        public void Construction()
        {
            BlockArray blocks;

            blocks = new BlockArray();
            Assert.Equal(0, blocks.Size);

            blocks.ExtendTo(1);
            Assert.Equal(blocks.BlockSize, blocks.Size);

            blocks = new BlockArray(1);
            Assert.Equal(blocks.BlockSize, blocks.Size);

            blocks = new BlockArray(1, 10);
            Assert.Equal(10, blocks.Size);

            blocks = new BlockArray(10, 10);
            Assert.Equal(10, blocks.Size);

            blocks = new BlockArray(new Block(10), new Block(10), new Block(10));
            Assert.Equal(30, blocks.Size);
        }