mirror of https://github.com/SixLabors/ImageSharp
11 changed files with 392 additions and 55 deletions
@ -0,0 +1,105 @@ |
|||||
|
// Copyright (c) Six Labors and contributors.
|
||||
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
|
||||
|
using System; |
||||
|
using SixLabors.ImageSharp.Memory; |
||||
|
using SixLabors.ImageSharp.PixelFormats; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace SixLabors.ImageSharp.Tests.Memory.DiscontiguousBuffers |
||||
|
{ |
||||
|
public partial class MemoryGroupTests |
||||
|
{ |
||||
|
public class SwapOrCopyContent : MemoryGroupTestsBase |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void WhenBothAreMemoryOwners_ShouldSwap() |
||||
|
{ |
||||
|
this.MemoryAllocator.BufferCapacityInBytes = sizeof(int) * 50; |
||||
|
using MemoryGroup<int> a = this.MemoryAllocator.AllocateGroup<int>(100, 50); |
||||
|
using MemoryGroup<int> b = this.MemoryAllocator.AllocateGroup<int>(120, 50); |
||||
|
|
||||
|
Memory<int> a0 = a[0]; |
||||
|
Memory<int> a1 = a[1]; |
||||
|
Memory<int> b0 = b[0]; |
||||
|
Memory<int> b1 = b[1]; |
||||
|
|
||||
|
MemoryGroup<int>.SwapOrCopyContent(a, b); |
||||
|
|
||||
|
Assert.Equal(b0, a[0]); |
||||
|
Assert.Equal(b1, a[1]); |
||||
|
Assert.Equal(a0, b[0]); |
||||
|
Assert.Equal(a1, b[1]); |
||||
|
Assert.NotEqual(a[0], b[0]); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void WhenBothAreMemoryOwners_ShouldReplaceViews() |
||||
|
{ |
||||
|
using MemoryGroup<int> a = this.MemoryAllocator.AllocateGroup<int>(100, 100); |
||||
|
using MemoryGroup<int> b = this.MemoryAllocator.AllocateGroup<int>(120, 100); |
||||
|
|
||||
|
a[0].Span[42] = 1; |
||||
|
b[0].Span[33] = 2; |
||||
|
MemoryGroupView<int> aView0 = a.View; |
||||
|
MemoryGroupView<int> bView0 = b.View; |
||||
|
|
||||
|
MemoryGroup<int>.SwapOrCopyContent(a, b); |
||||
|
Assert.False(aView0.IsValid); |
||||
|
Assert.False(bView0.IsValid); |
||||
|
Assert.ThrowsAny<InvalidOperationException>(() => _ = aView0[0].Span); |
||||
|
Assert.ThrowsAny<InvalidOperationException>(() => _ = bView0[0].Span); |
||||
|
|
||||
|
Assert.True(a.View.IsValid); |
||||
|
Assert.True(b.View.IsValid); |
||||
|
Assert.Equal(2, a.View[0].Span[33]); |
||||
|
Assert.Equal(1, b.View[0].Span[42]); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[InlineData(false)] |
||||
|
[InlineData(true)] |
||||
|
public void WhenDestIsNotAllocated_SameSize_ShouldCopy(bool sourceIsAllocated) |
||||
|
{ |
||||
|
var data = new Rgba32[21]; |
||||
|
var color = new Rgba32(1, 2, 3, 4); |
||||
|
|
||||
|
using var destOwner = new TestMemoryManager<Rgba32>(data); |
||||
|
using var dest = MemoryGroup<Rgba32>.Wrap(destOwner.Memory); |
||||
|
|
||||
|
using MemoryGroup<Rgba32> source = this.MemoryAllocator.AllocateGroup<Rgba32>(21, 30); |
||||
|
|
||||
|
source[0].Span[10] = color; |
||||
|
|
||||
|
// Act:
|
||||
|
MemoryGroup<Rgba32>.SwapOrCopyContent(dest, source); |
||||
|
|
||||
|
// Assert:
|
||||
|
Assert.Equal(color, dest[0].Span[10]); |
||||
|
Assert.NotEqual(source[0], dest[0]); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[InlineData(false)] |
||||
|
[InlineData(true)] |
||||
|
public void WhenDestIsNotMemoryOwner_DifferentSize_Throws(bool sourceIsOwner) |
||||
|
{ |
||||
|
var data = new Rgba32[21]; |
||||
|
var color = new Rgba32(1, 2, 3, 4); |
||||
|
|
||||
|
using var destOwner = new TestMemoryManager<Rgba32>(data); |
||||
|
var dest = MemoryGroup<Rgba32>.Wrap(destOwner.Memory); |
||||
|
|
||||
|
using MemoryGroup<Rgba32> source = this.MemoryAllocator.AllocateGroup<Rgba32>(22, 30); |
||||
|
|
||||
|
source[0].Span[10] = color; |
||||
|
|
||||
|
// Act:
|
||||
|
Assert.ThrowsAny<InvalidOperationException>(() => MemoryGroup<Rgba32>.SwapOrCopyContent(dest, source)); |
||||
|
|
||||
|
Assert.Equal(color, source[0].Span[10]); |
||||
|
Assert.NotEqual(color, dest[0].Span[10]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,84 @@ |
|||||
|
// Copyright (c) Six Labors and contributors.
|
||||
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
|
||||
|
using System; |
||||
|
using SixLabors.ImageSharp.Memory; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace SixLabors.ImageSharp.Tests.Memory.DiscontiguousBuffers |
||||
|
{ |
||||
|
public partial class MemoryGroupTests |
||||
|
{ |
||||
|
public class View : MemoryGroupTestsBase |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void RefersToOwnerGroupContent() |
||||
|
{ |
||||
|
using MemoryGroup<int> group = this.CreateTestGroup(240, 80, true); |
||||
|
|
||||
|
MemoryGroupView<int> view = group.View; |
||||
|
Assert.True(view.IsValid); |
||||
|
Assert.Equal(group.Count, view.Count); |
||||
|
Assert.Equal(group.BufferLength, view.BufferLength); |
||||
|
Assert.Equal(group.TotalLength, view.TotalLength); |
||||
|
int cnt = 1; |
||||
|
foreach (Memory<int> memory in view) |
||||
|
{ |
||||
|
Span<int> span = memory.Span; |
||||
|
foreach (int t in span) |
||||
|
{ |
||||
|
Assert.Equal(cnt, t); |
||||
|
cnt++; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void IsInvalidatedOnOwnerGroupDispose() |
||||
|
{ |
||||
|
MemoryGroupView<int> view; |
||||
|
using (MemoryGroup<int> group = this.CreateTestGroup(240, 80, true)) |
||||
|
{ |
||||
|
view = group.View; |
||||
|
} |
||||
|
|
||||
|
Assert.False(view.IsValid); |
||||
|
|
||||
|
Assert.ThrowsAny<InvalidMemoryOperationException>(() => |
||||
|
{ |
||||
|
_ = view.Count; |
||||
|
}); |
||||
|
|
||||
|
Assert.ThrowsAny<InvalidMemoryOperationException>(() => |
||||
|
{ |
||||
|
_ = view.BufferLength; |
||||
|
}); |
||||
|
|
||||
|
Assert.ThrowsAny<InvalidMemoryOperationException>(() => |
||||
|
{ |
||||
|
_ = view.TotalLength; |
||||
|
}); |
||||
|
|
||||
|
Assert.ThrowsAny<InvalidMemoryOperationException>(() => |
||||
|
{ |
||||
|
_ = view[0]; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void WhenInvalid_CanNotUseMemberMemory() |
||||
|
{ |
||||
|
Memory<int> memory; |
||||
|
using (MemoryGroup<int> group = this.CreateTestGroup(240, 80, true)) |
||||
|
{ |
||||
|
memory = group.View[0]; |
||||
|
} |
||||
|
|
||||
|
Assert.ThrowsAny<InvalidMemoryOperationException>(() => |
||||
|
{ |
||||
|
_ = memory.Span; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue