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; } } }
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); }
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); }
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); }
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()); } } }
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); }
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); } }