private byte[] GetInternalBuffer(ExpandableBuffer expandableBuffer)
		{
			var bufferFieldInfo = typeof (ExpandableBuffer).GetField("_buffer", BindingFlags.NonPublic | BindingFlags.Instance);
			Assert.IsNotNull(bufferFieldInfo);

			return (byte[]) bufferFieldInfo.GetValue(expandableBuffer);
		}
		public void GetRangeFailsForEmptyBuffer()
		{
			var buffer = new ExpandableBuffer();

			var tempBuffer = new byte[100];
			buffer.GetRange(0, tempBuffer, 0, tempBuffer.Length);
		}
        public void RepeatedAddRangeIncreasesCapacityToTwoTimesWithFillFactor05Test()
        {
            // Arrange
            var buffer     = new ExpandableBuffer(0.5);
            var tempBuffer = new byte[10];

            // Act
            const int repeatCount = 5;

            for (var i = 0; i < repeatCount; i++)
            {
                buffer.AddRange(tempBuffer, tempBuffer.Length);
            }

            // Assert
            var internalBuffer = GetInternalBuffer(buffer);

            Assert.AreEqual(60, internalBuffer.Length);

            /* Attempt  Length   InternalBufferLength
             *  before     0            0
             *    0.      10           20     <--- increases with fillfactor = 0.5
             *    1.      20           20
             *    2.      30           60     <--- increases with fillfactor = 0.5
             *    3.      40           60
             *    4.      50           60
             */
        }
		public void GetRangeFailsWithIncorrectPositionArgument()
		{
			var incorrectPosition = -1;
			var buffer = new ExpandableBuffer();

			var tempBuffer = new byte[100];
			buffer.GetRange(incorrectPosition, tempBuffer, 0, tempBuffer.Length);
		}
        private byte[] GetInternalBuffer(ExpandableBuffer expandableBuffer)
        {
            var bufferFieldInfo = typeof(ExpandableBuffer).GetField("_buffer", BindingFlags.NonPublic | BindingFlags.Instance);

            Assert.IsNotNull(bufferFieldInfo);

            return((byte[])bufferFieldInfo.GetValue(expandableBuffer));
        }
        public void ExpandableBufferCleansTest()
        {
            var buffer     = new ExpandableBuffer();
            var tempBuffer = new byte[] { 1, 2, 3, 4, 5, 6, 7 };

            buffer.AddRange(tempBuffer, tempBuffer.Length);
            Assert.AreEqual(tempBuffer.Length, buffer.Length);

            buffer.Clear();
            Assert.AreEqual(0, buffer.Length);
        }
        public void ExpandableBufferFailsToAddRangeWithNullBufferTest()
        {
            var buffer = new ExpandableBuffer();

            var exception = Assert.Throws <ArgumentNullException>
                            (
                () =>
            {
                const byte[] nullBuffer = null;
                buffer.AddRange(nullBuffer, 100);
            }
                            );

            Assert.AreEqual(@"buffer", exception.ParamName);
        }
        public void ExpandableBufferFailsToAddRangeWithLengthGreaterThanBufferLengthTest()
        {
            var buffer     = new ExpandableBuffer();
            var tempBuffer = new byte[] { 1, 2, 3, 4, 5, 6, 7 };

            var exception = Assert.Throws <ArgumentOutOfRangeException>
                            (
                () =>
            {
                var tooLargeCount = tempBuffer.Length + 1;
                buffer.AddRange(tempBuffer, tooLargeCount);
            }
                            );

            Assert.AreEqual(@"count", exception.ParamName);
        }
        public void GetRangeFailsWithIncorrectPositionArgumentTest()
        {
            var buffer = new ExpandableBuffer();

            var exception = Assert.Throws <ArgumentOutOfRangeException>
                            (
                () =>
            {
                const int incorrectPosition = -1;
                var tempBuffer = new byte[100];
                buffer.GetRange(incorrectPosition, tempBuffer, 0, tempBuffer.Length);
            }
                            );

            Assert.AreEqual(@"position", exception.ParamName);
        }
        public void ExpandableBufferFailsToAddRangeWithZeroLengthTest()
        {
            var buffer     = new ExpandableBuffer();
            var tempBuffer = new byte[] { 1, 2, 3, 4, 5, 6, 7 };

            var exception = Assert.Throws <ArgumentOutOfRangeException>
                            (
                () =>
            {
                const int incorrectZeroCount = 0;
                buffer.AddRange(tempBuffer, incorrectZeroCount);
            }
                            );

            Assert.AreEqual(@"count", exception.ParamName);
        }
        public void GetRangeFailsWithNullBufferArgumentTest()
        {
            var buffer = new ExpandableBuffer();

            buffer.AddRange(new byte[10], 10);

            var exception = Assert.Throws <ArgumentNullException>
                            (
                () =>
            {
                const byte[] incorrectTempBuffer = null;
                buffer.GetRange(0, incorrectTempBuffer, 0, 100);
            }
                            );

            Assert.AreEqual(@"buffer", exception.ParamName);
        }
        public void GetRangeFailsWithIncorrectOffsetArgumentTest()
        {
            var buffer = new ExpandableBuffer();

            buffer.AddRange(new byte[10], 10);

            var exception = Assert.Throws <ArgumentOutOfRangeException>
                            (
                () =>
            {
                const int incorrectOffset = -1;
                var tempBuffer            = new byte[100];
                buffer.GetRange(0, tempBuffer, incorrectOffset, tempBuffer.Length);
            }
                            );

            Assert.AreEqual(@"offset", exception.ParamName);
        }
        public void AddRangeIncreasesCapacityToTwoTimesWithFillFactor05Test()
        {
            // Arrange
            var buffer     = new ExpandableBuffer(0.5);
            var tempBuffer = new byte[10];

            // Act
            buffer.AddRange(tempBuffer, tempBuffer.Length);

            // Assert
            var internalBuffer = GetInternalBuffer(buffer);

            Assert.AreEqual(20, internalBuffer.Length);

            /* Attempt  Length   InternalBufferLength
             *  before     0            0
             *    0.      10           20     <--- increases with fillfactor = 0.5
             */
        }
        public void SuccessReadAndWriteBufferTest()
        {
            // Arrange
            var buffer     = new ExpandableBuffer();
            var tempBuffer = new byte[] { 1, 2, 3, 4, 5, 6, 7 };

            // Act
            buffer.AddRange(tempBuffer, tempBuffer.Length);

            var outputBuffer = new byte[tempBuffer.Length];
            var readBytes    = buffer.GetRange(0, outputBuffer, 0, outputBuffer.Length);

            // Assert
            Assert.AreEqual(readBytes, outputBuffer.Length);
            for (var i = 0; i < outputBuffer.Length; i++)
            {
                Assert.AreEqual(tempBuffer[i], outputBuffer[i]);
            }
        }
		public void GetRangeFailsWithNullBufferArgument()
		{
			var buffer = new ExpandableBuffer();
			buffer.AddRange(new byte[10], 10);

			const byte[] incorrectTempBuffer = null;
			buffer.GetRange(0, incorrectTempBuffer, 0, 100);
		}
		public void AddRangeIncreasesCapacityToTwoTimesWithFillFactor05()
		{
			// Assign
			var buffer = new ExpandableBuffer(0.5);
			var tempBuffer = new byte[10];

			// Act
			buffer.AddRange(tempBuffer, tempBuffer.Length);

			// Assert
			var internalBuffer = GetInternalBuffer(buffer);
			Assert.AreEqual(2*tempBuffer.Length, internalBuffer.Length);
		}
		public void ZeroLengthOfNewBuffer()
		{
			var buffer = new ExpandableBuffer();

			Assert.AreEqual(0, buffer.Length);
		}
		public void RepeatedAddRangeIncreasesCapacityToTwoTimesWithFillFactor05()
		{
			// Assign
			var buffer = new ExpandableBuffer(0.5);
			var tempBuffer = new byte[10];

			var bufferFieldInfo = typeof (ExpandableBuffer).GetField("_buffer", BindingFlags.NonPublic | BindingFlags.Instance);
			Assert.IsNotNull(bufferFieldInfo);

			// Act
			const int repeatCount = 5;
			for (var i = 0; i < repeatCount; i++)
			{
				buffer.AddRange(tempBuffer, tempBuffer.Length);
			}

			// Assert
			var internalBuffer = GetInternalBuffer(buffer);
			Assert.AreEqual(2*repeatCount*tempBuffer.Length, internalBuffer.Length);
		}
		public void SuccessReadAndWriteBuffers()
		{
			// Assign
			var buffer = new ExpandableBuffer();
			var tempBuffer = new byte[] {1, 2, 3, 4, 5, 6, 7};
			const int repeatCount = 5;

			// Act
			for (var i = 0; i < repeatCount; i++)
			{
				buffer.AddRange(tempBuffer, tempBuffer.Length);
			}

			var outputBuffer = new byte[tempBuffer.Length*repeatCount];
			var readBytes = buffer.GetRange(0, outputBuffer, 0, outputBuffer.Length);

			// Assert
			Assert.AreEqual(readBytes, outputBuffer.Length);
			for (var i = 0; i < outputBuffer.Length; i++)
			{
				Assert.AreEqual(tempBuffer[i%tempBuffer.Length], outputBuffer[i]);
			}
		}
		public void GetRangeFailsWithIncorrectOffsetArgument()
		{
			var buffer = new ExpandableBuffer();
			buffer.AddRange(new byte[10], 10);

			var tempBuffer = new byte[100];
			const int incorrectOffset = -1;
			buffer.GetRange(0, tempBuffer, incorrectOffset, tempBuffer.Length);
		}
        public void ZeroLengthOfNewBufferTest()
        {
            var buffer = new ExpandableBuffer();

            Assert.AreEqual(0, buffer.Length);
        }