diff --git a/src/Avalonia.Base/Platform/Internal/SlicedStream.cs b/src/Avalonia.Base/Platform/Internal/SlicedStream.cs index 124c248aa8..86a8dd5da9 100644 --- a/src/Avalonia.Base/Platform/Internal/SlicedStream.cs +++ b/src/Avalonia.Base/Platform/Internal/SlicedStream.cs @@ -29,7 +29,7 @@ internal class SlicedStream : Stream if (origin == SeekOrigin.Begin) Position = offset; if (origin == SeekOrigin.End) - Position = _from + Length + offset; + Position = Length + offset; if (origin == SeekOrigin.Current) Position = Position + offset; return Position; diff --git a/tests/Avalonia.Base.UnitTests/Platform/SlicedStreamTests.cs b/tests/Avalonia.Base.UnitTests/Platform/SlicedStreamTests.cs new file mode 100644 index 0000000000..dbcabf997c --- /dev/null +++ b/tests/Avalonia.Base.UnitTests/Platform/SlicedStreamTests.cs @@ -0,0 +1,29 @@ +using System.IO; +using Avalonia.Platform.Internal; +using Xunit; + +namespace Avalonia.Base.UnitTests; + +public class SlicedStreamTests +{ + [Theory] + [InlineData(2, SeekOrigin.Begin, 22, 2, 9)] + [InlineData(2, SeekOrigin.Current, 22, 17, 24)] + [InlineData(-2, SeekOrigin.End, 22, 40, 47)] + public void Seek_Works( + long offset, + SeekOrigin origin, + long startingUnderlyingPosition, + long expectedPosition, + long expectedUnderlyingPosition) + { + var memoryStream = new MemoryStream(new byte[1024]); + var slicedStream = new SlicedStream(memoryStream, 7, 42); + memoryStream.Position = startingUnderlyingPosition; + + slicedStream.Seek(offset, origin); + + Assert.Equal(expectedPosition, slicedStream.Position); + Assert.Equal(expectedUnderlyingPosition, memoryStream.Position); + } +}