public void TryReadWriteCycleWithAllBlocksOnDisk()
        {
            VirtualDisk virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            for (int i = 0; i < virtualDisk.NumberOfBlocks; i++)
            {
                byte[] bytesToWrite = new byte[virtualDisk.BlockSizeInBytes];
                byte   byteToPutInEveryPlaceInArray = (byte)i;

                for (int j = 0; j < virtualDisk.BlockSizeInBytes; j++)
                {
                    bytesToWrite[j] = byteToPutInEveryPlaceInArray;
                }

                virtualDisk.WriteBytesToBlock(i, bytesToWrite);
            }

            for (int i = 0; i < virtualDisk.NumberOfBlocks; i++)
            {
                byte[] bytesRead = virtualDisk.ReadAllBytesFromBlock(i);
                byte   byteThatMustBeInEveryPlaceInArray = (byte)i;

                Assert.AreEqual(virtualDisk.BlockSizeInBytes, bytesRead.Length);

                for (int j = 0; j < virtualDisk.BlockSizeInBytes; j++)
                {
                    Assert.AreEqual(byteThatMustBeInEveryPlaceInArray, bytesRead[j]);
                }
            }
        }
        public void MakeSureYouCannotReadTooMuchDataFromDisk()
        {
            VirtualDisk virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentException>(
                delegate()
            {
                virtualDisk.ReadBytesFromBlock(0, 0, virtualDisk.BlockSizeInBytes + 1);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentException>(
                delegate()
            {
                virtualDisk.ReadBytesFromBlock(0, 3, virtualDisk.BlockSizeInBytes - 2);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentException>(
                delegate()
            {
                virtualDisk.ReadBytesFromBlock(0, int.MaxValue, 0);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentException>(
                delegate()
            {
                virtualDisk.ReadBytesFromBlock(0, 0, int.MaxValue);
            });
        }
        public void MakeSureTheBlockChecksArgumentsBeforeWritingAnything()
        {
            var virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            DiskBlock block = new DiskBlock(virtualDisk, 10, 0, 0);

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentNullException>(
                delegate
            {
                block.WriteBytes(null, 10, 11);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentException>(
                delegate
            {
                block.WriteBytes(new byte[2], 10, 11);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate
            {
                block.WriteBytes(new byte[2], -10, 11);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate
            {
                block.WriteBytes(new byte[2], 10, -1);
            });
        }
        public void TryWriteReadCycleForABuffer()
        {
            var virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            DiskBlock block = new DiskBlock(virtualDisk, 10, 0, 0);

            for (int i = 0; i < 2048 / 4; i++)
            {
                byte[]       fourByteBlock = new byte[4];
                MemoryStream writerStream  = new MemoryStream(fourByteBlock);
                BinaryWriter writer        = new BinaryWriter(writerStream);

                writer.Write(i);

                block.WriteBytes(fourByteBlock, 0, fourByteBlock.Length);
            }

            byte[] allBytes = block.ReadAll();

            MemoryStream readerStream = new MemoryStream(allBytes);
            BinaryReader reader       = new BinaryReader(readerStream);

            for (int i = 0; i < 2048 / 4; i++)
            {
                Assert.AreEqual(i, reader.ReadInt32());
            }

            Assert.IsFalse(block.CanAcceptBytesAtCurrentPosition);
        }
        public void MakeSureYouCannotWriteTooMuchDataIntoDiskBlock()
        {
            VirtualDisk virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            byte[] bytesToWrite = new byte[virtualDisk.BlockSizeInBytes * 2];

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentException>(
                delegate()
            {
                virtualDisk.WriteBytesToBlock(0, bytesToWrite);
            });
        }
        public void MakeSureVirtualDisksCorrectlyInitializeThemselvesFromSuitableStreams()
        {
            VirtualDiskWithItsStream virtualDiskConstructionResult = VirtualDiskTestFactory.ConstructDefaultTestDiskWithStream();

            var virtualDisk = virtualDiskConstructionResult.Disk;

            Assert.AreEqual(VirtualDiskTestFactory.DefaultDiskBlockSize, virtualDisk.BlockSizeInBytes);
            Assert.AreEqual(VirtualDiskTestFactory.DefaultDiskSize, virtualDisk.DiskSizeInBytes);

            VirtualDisk diskRecreatedFromTheSameStream = VirtualDisk.CreateFromStream(virtualDiskConstructionResult.BackingStream);

            Assert.AreEqual(virtualDisk.BlockSizeInBytes, diskRecreatedFromTheSameStream.BlockSizeInBytes);
            Assert.AreEqual(VirtualDiskTestFactory.DefaultDiskSize, diskRecreatedFromTheSameStream.DiskSizeInBytes);
        }
        public void MakeSureThePositionChangesAsYouAreWritingToTheBlock()
        {
            var virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            DiskBlock block = new DiskBlock(virtualDisk, 10, 0, 0);

            Assert.AreEqual(0, block.Position);

            block.WriteBytes(new byte[15], 0, 15);

            Assert.AreEqual(15, block.Position); // после последнего записанного байта.

            block.WriteBytes(new byte[15], 9, 6);

            Assert.AreEqual(21, block.Position); // после последнего записанного байта.
        }
        public void MakeSureBlockConstructionIsPossibleOnlyWithSaneArguments()
        {
            var virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            DiskBlock block = new DiskBlock(virtualDisk, 10, 0, 0);

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate
            {
                new DiskBlock(virtualDisk, 100000000, 0, 0);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentNullException>(
                delegate
            {
                new DiskBlock(null, 10, 0, 0);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate
            {
                new DiskBlock(virtualDisk, -2, 0, 0);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate
            {
                new DiskBlock(virtualDisk, 15, virtualDisk.BlockSizeInBytes * 5, 0);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate
            {
                new DiskBlock(virtualDisk, 15, virtualDisk.BlockSizeInBytes, 56789);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate
            {
                new DiskBlock(virtualDisk, 15, virtualDisk.BlockSizeInBytes, -56789);
            });
        }
        public void TryReadingFromNonExistingBlocksOnDisk()
        {
            VirtualDisk virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate()
            {
                virtualDisk.ReadAllBytesFromBlock(int.MaxValue);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate()
            {
                virtualDisk.ReadAllBytesFromBlock(virtualDisk.NumberOfBlocks);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate()
            {
                virtualDisk.ReadAllBytesFromBlock(-3);
            });
        }
        public void TryWritingToNonExistingBlocksOnDisk()
        {
            VirtualDisk virtualDisk = VirtualDiskTestFactory.ConstructDefaultTestDisk();

            byte[] bytesToWrite = new byte[100];

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate()
            {
                virtualDisk.WriteBytesToBlock(-2, bytesToWrite);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate()
            {
                virtualDisk.WriteBytesToBlock(virtualDisk.NumberOfBlocks, bytesToWrite);
            });

            ExceptionAssert.MakeSureExceptionIsRaisedBy <ArgumentOutOfRangeException>(
                delegate()
            {
                virtualDisk.WriteBytesToBlock(int.MaxValue, bytesToWrite);
            });
        }