Skip to content

Commit 7b9ec2b

Browse files
antonfirsovJimBobSquarePants
authored andcommitted
Throw ObjectDisposedException when trying to operate on a disposed image (SixLabors#968)
* disable multitargeting + TreatWarningsAsErrors to for fast development * Check if image is disposed in significant Image and Image<T> methods * Mutate / Clone: ensure image is not disposed * Revert "disable multitargeting + TreatWarningsAsErrors to for fast development" This reverts commit 9ad74f7.
1 parent 636b27e commit 7b9ec2b

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

tests/ImageSharp.Tests/ImageOperationTests.cs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,22 @@ public class ImageOperationTests : IDisposable
2323
private readonly FakeImageOperationsProvider provider;
2424
private readonly IImageProcessor processorDefinition;
2525

26+
private static readonly string ExpectedExceptionMessage = GetExpectedExceptionText();
27+
2628
public ImageOperationTests()
2729
{
2830
this.provider = new FakeImageOperationsProvider();
2931

3032
Mock<IImageProcessor> processorMock = new Mock<IImageProcessor>();
3133
this.processorDefinition = processorMock.Object;
32-
34+
3335
this.image = new Image<Rgba32>(new Configuration
3436
{
3537
ImageOperationsProvider = this.provider
3638
}, 1, 1);
3739
}
3840

41+
3942
[Fact]
4043
public void MutateCallsImageOperationsProvider_Func_OriginalImage()
4144
{
@@ -109,5 +112,65 @@ public void ApplyProcessors_ListOfProcessors_AppliesAllProcessorsToOperation()
109112
}
110113

111114
public void Dispose() => this.image.Dispose();
115+
116+
[Fact]
117+
public void GenericMutate_WhenDisposed_Throws()
118+
{
119+
this.image.Dispose();
120+
121+
CheckThrowsCorrectObjectDisposedException(
122+
() => this.image.Mutate(x => x.ApplyProcessor(this.processorDefinition)));
123+
}
124+
125+
[Fact]
126+
public void GenericClone_WhenDisposed_Throws()
127+
{
128+
this.image.Dispose();
129+
130+
CheckThrowsCorrectObjectDisposedException(
131+
() => this.image.Clone(x => x.ApplyProcessor(this.processorDefinition)));
132+
}
133+
134+
[Fact]
135+
public void AgnosticMutate_WhenDisposed_Throws()
136+
{
137+
this.image.Dispose();
138+
Image img = this.image;
139+
140+
CheckThrowsCorrectObjectDisposedException(
141+
() => img.Mutate(x => x.ApplyProcessor(this.processorDefinition)));
142+
}
143+
144+
[Fact]
145+
public void AgnosticClone_WhenDisposed_Throws()
146+
{
147+
this.image.Dispose();
148+
Image img = this.image;
149+
150+
CheckThrowsCorrectObjectDisposedException(
151+
() => img.Clone(x => x.ApplyProcessor(this.processorDefinition)));
152+
}
153+
154+
private static string GetExpectedExceptionText()
155+
{
156+
try
157+
{
158+
Image<Rgba32> img = new Image<Rgba32>(1, 1);
159+
img.Dispose();
160+
img.EnsureNotDisposed();
161+
}
162+
catch (ObjectDisposedException ex)
163+
{
164+
return ex.Message;
165+
}
166+
167+
return "?";
168+
}
169+
170+
private static void CheckThrowsCorrectObjectDisposedException(Action action)
171+
{
172+
var ex = Assert.Throws<ObjectDisposedException>(action);
173+
Assert.Equal(ExpectedExceptionMessage, ex.Message);
174+
}
112175
}
113176
}

0 commit comments

Comments
 (0)