< Summary

Class:Azure.Core.ReadOnlyMemoryStream
Assembly:Azure.Core.Experimental
File(s):C:\Git\azure-sdk-for-net\sdk\core\Azure.Core.Experimental\src\Primitives\ReadOnlyMemoryStream.cs
Covered lines:44
Uncovered lines:8
Coverable lines:52
Total lines:130
Line coverage:84.6% (44 of 52)
Covered branches:26
Total branches:32
Branch coverage:81.2% (26 of 32)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor(...)-100%100%
get_CanRead()-100%100%
get_CanSeek()-100%100%
get_CanWrite()-100%100%
get_Length()-100%100%
get_Position()-100%100%
set_Position(...)-100%100%
Seek(...)-81.82%70%
ReadByte()-100%50%
Read(...)-100%100%
Read(...)-70%83.33%
ReadAsync(...)-100%50%
Flush()-0%100%
FlushAsync(...)-0%100%
SetLength(...)-0%100%
Write(...)-100%100%
ValidateReadArrayArguments(...)-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\core\Azure.Core.Experimental\src\Primitives\ReadOnlyMemoryStream.cs

#LineLine coverage
 1#pragma warning disable SA1636 // File header copyright text should match
 2// Licensed to the .NET Foundation under one or more agreements.
 3// The .NET Foundation licenses this file to you under the MIT license.
 4#pragma warning restore SA1636 // File header copyright text should match
 5
 6using System;
 7using System.IO;
 8using System.Threading;
 9using System.Threading.Tasks;
 10
 11namespace Azure.Core
 12{
 13    /// <summary>Provides a <see cref="Stream"/> for the contents of a <see cref="ReadOnlyMemory{Byte}"/>.</summary>
 14    internal sealed class ReadOnlyMemoryStream : Stream
 15    {
 16        private readonly ReadOnlyMemory<byte> _content;
 17        private int _position;
 18
 12019        public ReadOnlyMemoryStream(ReadOnlyMemory<byte> content)
 20        {
 12021            _content = content;
 12022        }
 23
 6424        public override bool CanRead => true;
 5625        public override bool CanSeek => true;
 426        public override bool CanWrite => false;
 27
 5628        public override long Length => _content.Length;
 29
 30        public override long Position
 31        {
 6232            get => _position;
 33            set
 34            {
 1035                if (value < 0 || value > int.MaxValue)
 36                {
 437                    throw new ArgumentOutOfRangeException(nameof(value));
 38                }
 639                _position = (int)value;
 640            }
 41        }
 42
 43        public override long Seek(long offset, SeekOrigin origin)
 44        {
 1445            long pos =
 1446                origin == SeekOrigin.Begin ? offset :
 1447                origin == SeekOrigin.Current ? _position + offset :
 1448                origin == SeekOrigin.End ? _content.Length + offset :
 1449                throw new ArgumentOutOfRangeException(nameof(origin));
 50
 1451            if (pos > int.MaxValue)
 52            {
 053                throw new ArgumentOutOfRangeException(nameof(offset));
 54            }
 1455            else if (pos < 0)
 56            {
 057                throw new IOException("An attempt was made to move the position before the beginning of the stream.");
 58            }
 59
 1460            _position = (int)pos;
 1461            return _position;
 62        }
 63
 64        public override int ReadByte()
 65        {
 666            ReadOnlySpan<byte> s = _content.Span;
 667            return _position < s.Length ? s[_position++] : -1;
 68        }
 69
 70        public override int Read(byte[] buffer, int offset, int count)
 71        {
 11072            ValidateReadArrayArguments(buffer, offset, count);
 11073            return Read(new Span<byte>(buffer, offset, count));
 74        }
 75
 76        private int Read(Span<byte> buffer)
 77        {
 22878            int remaining = _content.Length - _position;
 79
 22880            if (remaining <= 0 || buffer.Length == 0)
 81            {
 10882                return 0;
 83            }
 12084            else if (remaining <= buffer.Length)
 85            {
 12086                _content.Span.Slice(_position).CopyTo(buffer);
 12087                _position = _content.Length;
 12088                return remaining;
 89            }
 90            else
 91            {
 092                _content.Span.Slice(_position, buffer.Length).CopyTo(buffer);
 093                _position += buffer.Length;
 094                return buffer.Length;
 95            }
 96        }
 97
 98        public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
 99        {
 126100            ValidateReadArrayArguments(buffer, offset, count);
 118101            return cancellationToken.IsCancellationRequested ?
 118102                Task.FromCanceled<int>(cancellationToken) :
 118103                Task.FromResult(Read(new Span<byte>(buffer, offset, count)));
 104        }
 105
 0106        public override void Flush() { }
 107
 0108        public override Task FlushAsync(CancellationToken cancellationToken) => Task.CompletedTask;
 109
 0110        public override void SetLength(long value) => throw new NotSupportedException();
 111
 4112        public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
 113
 114        private static void ValidateReadArrayArguments(byte[] buffer, int offset, int count)
 115        {
 236116            if (buffer == null)
 117            {
 2118                throw new ArgumentNullException(nameof(buffer));
 119            }
 234120            if (offset < 0)
 121            {
 2122                throw new ArgumentOutOfRangeException(nameof(offset));
 123            }
 232124            if (count < 0 || buffer.Length - offset < count)
 125            {
 4126                throw new ArgumentOutOfRangeException(nameof(count));
 127            }
 228128        }
 129    }
 130}