コード例 #1
0
        public void StreamPeek2()
        {
            var gAbcsString = "abcdefghijklmnopqrstuvwxyz";
            var gAbcs       = StringUtilities.GetEncodedText(gAbcsString, SKTextEncoding.Utf8);

            var memStream = new SKMemoryStream(gAbcs);

            for (var bufferSize = 1; bufferSize < memStream.Length; bufferSize++)
            {
                var bufferedStream = new SKFrontBufferedManagedStream(memStream, bufferSize);

                var peeked = 0;
                for (var i = 1; !bufferedStream.IsAtEnd; i++)
                {
                    var unpeekableBytes = compare_peek_to_read(bufferedStream, i);
                    if (unpeekableBytes > 0)
                    {
                        // This could not have returned a number greater than i.
                        Assert.True(unpeekableBytes <= i);

                        // We have reached the end of the buffer. Verify that it was at least
                        // bufferSize.
                        Assert.True(peeked + i - unpeekableBytes >= bufferSize);
                        // No more peeking is supported.
                        break;
                    }
                    peeked += i;
                }
            }
        }
コード例 #2
0
        public void IncrementalBuffering(int bufferSize)
        {
            var memStream      = new SKMemoryStream(gAbcs);
            var bufferedStream = new SKFrontBufferedManagedStream(memStream, bufferSize);

            test_hasLength(bufferedStream, memStream);

            // First, test reading less than the max buffer size.
            test_read(bufferedStream, gAbcs, bufferSize / 2);

            // Now test rewinding back to the beginning and reading less than what was
            // already buffered.
            test_rewind(bufferedStream, true);
            test_read(bufferedStream, gAbcs, bufferSize / 4);

            // Now test reading part of what was buffered, and buffering new data.
            test_read(bufferedStream, gAbcs.Skip(bufferSize / 4).ToArray(), bufferSize / 2);

            // Now test reading what was buffered, buffering new data, and
            // reading directly from the stream.
            test_rewind(bufferedStream, true);
            test_read(bufferedStream, gAbcs, bufferSize << 1);

            // We have reached the end of the buffer, so rewinding will fail.
            // This test assumes that the stream is larger than the buffer; otherwise the
            // result of rewind should be true.
            test_rewind(bufferedStream, false);
        }
コード例 #3
0
        public void InitialOffset(int bufferSize)
        {
            var memStream = new SKMemoryStream(gAbcs);

            // Skip a few characters into the memStream, so that bufferedStream represents an offset into
            // the stream it wraps.
            var arbitraryOffset = 17;

            memStream.Skip(arbitraryOffset);
            var bufferedStream = new SKFrontBufferedManagedStream(memStream, bufferSize);

            // Since SkMemoryStream has a length, bufferedStream must also.
            Assert.True(bufferedStream.HasLength);

            var amountToRead    = 10;
            var bufferedLength  = bufferedStream.Length;
            var currentPosition = 0;

            // Read the stream in chunks. After each read, the position must match currentPosition,
            // which sums the amount attempted to read, unless the end of the stream has been reached.
            // Importantly, the end should not have been reached until currentPosition == bufferedLength.
            while (currentPosition < bufferedLength)
            {
                Assert.False(bufferedStream.IsAtEnd);
                test_read(bufferedStream, gAbcs.Skip(arbitraryOffset + currentPosition).ToArray(), amountToRead);
                currentPosition = Math.Min(currentPosition + amountToRead, bufferedLength);
                Assert.Equal(currentPosition, memStream.Position - arbitraryOffset);
            }
            Assert.True(bufferedStream.IsAtEnd);
            Assert.Equal(bufferedLength, currentPosition);
        }
コード例 #4
0
        public void PerfectlySizedBuffer(int bufferSize)
        {
            var memStream      = new SKMemoryStream(gAbcs);
            var bufferedStream = new SKFrontBufferedManagedStream(memStream, bufferSize);

            test_hasLength(bufferedStream, memStream);

            // Read exactly the amount that fits in the buffer.
            test_read(bufferedStream, gAbcs, bufferSize);

            // Rewinding should succeed.
            test_rewind(bufferedStream, true);

            // Once again reading buffered info should succeed
            test_read(bufferedStream, gAbcs, bufferSize);

            // Read past the size of the buffer. At this point, we cannot return.
            test_read(bufferedStream, gAbcs.Skip(memStream.Position).ToArray(), 1);
            test_rewind(bufferedStream, false);
        }
コード例 #5
0
        public void StreamPeek3()
        {
            var gAbcsString = "abcdefghijklmnopqrstuvwxyz";
            var gAbcs       = StringUtilities.GetEncodedText(gAbcsString, SKTextEncoding.Utf8);

            for (var bufferSize = 1; bufferSize < gAbcs.Length; bufferSize++)
            {
                var memStream      = new SKMemoryStream(gAbcs);
                var bufferedStream = new SKFrontBufferedManagedStream(memStream, bufferSize);

                var bytesToPeek = bufferSize + 1;

                var peekStorage = SKData.Create(bytesToPeek);
                var readStorage = SKData.Create(bytesToPeek);

                for (var start = 0; start <= bufferSize; start++)
                {
                    // Skip to the starting point
                    Assert.Equal(start, bufferedStream.Skip(start));

                    var bytesPeeked = bufferedStream.Peek(peekStorage.Data, bytesToPeek);
                    if (0 == bytesPeeked)
                    {
                        // Peeking should only fail completely if we have read/skipped beyond the buffer.
                        Assert.True(start >= bufferSize);
                        break;
                    }

                    // Only read the amount that was successfully peeked.
                    var bytesRead = bufferedStream.Read(readStorage.Data, bytesPeeked);
                    Assert.Equal(bytesPeeked, bytesRead);
                    Assert.Equal(peekStorage.ToArray().Take(bytesPeeked), readStorage.ToArray().Take(bytesPeeked));

                    // This should be safe to rewind.
                    Assert.True(bufferedStream.Rewind());
                }
            }
        }
コード例 #6
0
        public void SkippingDoesNotPreventReading(int bufferSize)
        {
            var memStream      = new SKMemoryStream(gAbcs);
            var bufferedStream = new SKFrontBufferedManagedStream(memStream, bufferSize);

            test_hasLength(bufferedStream, memStream);

            // Skip half the buffer.
            bufferedStream.Skip(bufferSize / 2);

            // Rewind, then read part of the buffer, which should have been read.
            test_rewind(bufferedStream, true);
            test_read(bufferedStream, gAbcs, bufferSize / 4);

            // Now skip beyond the buffered piece, but still within the total buffer.
            bufferedStream.Skip(bufferSize / 2);

            // Test that reading will still work.
            test_read(bufferedStream, gAbcs.Skip(memStream.Position).ToArray(), bufferSize / 4);

            test_rewind(bufferedStream, true);
            test_read(bufferedStream, gAbcs, bufferSize);
        }
コード例 #7
0
 public void LengthCombinations(int bufferSize)
 {
     {
         var stream   = new LengthOptionalStream(true, true);
         var buffered = new SKFrontBufferedManagedStream(stream, bufferSize);
         test_hasLength(buffered, stream);
     }
     {
         var stream   = new LengthOptionalStream(true, false);
         var buffered = new SKFrontBufferedManagedStream(stream, bufferSize);
         test_hasLength(buffered, stream);
     }
     {
         var stream   = new LengthOptionalStream(false, true);
         var buffered = new SKFrontBufferedManagedStream(stream, bufferSize);
         test_hasLength(buffered, stream);
     }
     {
         var stream   = new LengthOptionalStream(false, false);
         var buffered = new SKFrontBufferedManagedStream(stream, bufferSize);
         test_hasLength(buffered, stream);
     }
 }