Skip to content

Commit 6c934ce

Browse files
Add missing tests.
1 parent 08f2985 commit 6c934ce

5 files changed

Lines changed: 571 additions & 0 deletions

File tree

tests/ImageSharp.Drawing.Tests/Processing/DrawingCanvasTests.Process.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,35 @@ namespace SixLabors.ImageSharp.Drawing.Tests.Processing;
1212

1313
public partial class DrawingCanvasTests
1414
{
15+
[Theory]
16+
[WithBlankImage(220, 160, PixelTypes.Rgba32)]
17+
public void Process_PathBuilder_MatchesReference<TPixel>(TestImageProvider<TPixel> provider)
18+
where TPixel : unmanaged, IPixel<TPixel>
19+
{
20+
using Image<TPixel> target = provider.GetImage();
21+
22+
PathBuilder blurBuilder = new();
23+
blurBuilder.AddArc(new PointF(55, 40), 55, 40, 0, 0, 360);
24+
blurBuilder.CloseAllFigures();
25+
26+
PathBuilder pixelateBuilder = new();
27+
pixelateBuilder.AddLine(110, 80, 220, 80);
28+
pixelateBuilder.AddLine(220, 80, 165, 160);
29+
pixelateBuilder.AddLine(165, 160, 110, 80);
30+
pixelateBuilder.CloseAllFigures();
31+
32+
using (DrawingCanvas<TPixel> canvas = CreateCanvas(provider, target, new DrawingOptions()))
33+
{
34+
DrawProcessScenario(canvas);
35+
canvas.Process(blurBuilder, ctx => ctx.GaussianBlur(6F));
36+
canvas.Process(pixelateBuilder, ctx => ctx.Pixelate(10));
37+
canvas.Flush();
38+
}
39+
40+
target.DebugSave(provider, appendSourceFileOrDescription: false);
41+
target.CompareToReferenceOutput(provider, appendSourceFileOrDescription: false);
42+
}
43+
1544
[Theory]
1645
[WithBlankImage(220, 160, PixelTypes.Rgba32)]
1746
public void Process_Path_MatchesReference<TPixel>(TestImageProvider<TPixel> provider)
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
// Copyright (c) Six Labors.
2+
// Licensed under the Six Labors Split License.
3+
4+
using SixLabors.ImageSharp.Drawing.Processing;
5+
using SixLabors.ImageSharp.PixelFormats;
6+
7+
namespace SixLabors.ImageSharp.Drawing.Tests.Processing;
8+
9+
public partial class DrawingCanvasTests
10+
{
11+
[Fact]
12+
public void SaveCount_InitialValue_IsOne()
13+
{
14+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
15+
using Image<Rgba32> target = new(64, 64);
16+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
17+
18+
Assert.Equal(1, canvas.SaveCount);
19+
}
20+
21+
[Fact]
22+
public void Save_IncrementsSaveCount()
23+
{
24+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
25+
using Image<Rgba32> target = new(64, 64);
26+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
27+
28+
Assert.Equal(1, canvas.SaveCount);
29+
30+
int count1 = canvas.Save();
31+
Assert.Equal(2, count1);
32+
Assert.Equal(2, canvas.SaveCount);
33+
34+
int count2 = canvas.Save();
35+
Assert.Equal(3, count2);
36+
Assert.Equal(3, canvas.SaveCount);
37+
}
38+
39+
[Fact]
40+
public void SaveWithOptions_IncrementsSaveCount()
41+
{
42+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
43+
using Image<Rgba32> target = new(64, 64);
44+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
45+
46+
int count = canvas.Save(new DrawingOptions(), new RectangularPolygon(0, 0, 32, 32));
47+
Assert.Equal(2, count);
48+
Assert.Equal(2, canvas.SaveCount);
49+
}
50+
51+
[Fact]
52+
public void Restore_DecrementsSaveCount()
53+
{
54+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
55+
using Image<Rgba32> target = new(64, 64);
56+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
57+
58+
_ = canvas.Save();
59+
_ = canvas.Save();
60+
Assert.Equal(3, canvas.SaveCount);
61+
62+
canvas.Restore();
63+
Assert.Equal(2, canvas.SaveCount);
64+
65+
canvas.Restore();
66+
Assert.Equal(1, canvas.SaveCount);
67+
}
68+
69+
[Fact]
70+
public void Restore_AtRootState_DoesNotDecrementBelowOne()
71+
{
72+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
73+
using Image<Rgba32> target = new(64, 64);
74+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
75+
76+
Assert.Equal(1, canvas.SaveCount);
77+
78+
canvas.Restore();
79+
Assert.Equal(1, canvas.SaveCount);
80+
81+
canvas.Restore();
82+
Assert.Equal(1, canvas.SaveCount);
83+
}
84+
85+
[Fact]
86+
public void RestoreTo_SetsSaveCountToSpecifiedLevel()
87+
{
88+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
89+
using Image<Rgba32> target = new(64, 64);
90+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
91+
92+
_ = canvas.Save();
93+
int mid = canvas.Save();
94+
_ = canvas.Save();
95+
_ = canvas.Save();
96+
Assert.Equal(5, canvas.SaveCount);
97+
98+
canvas.RestoreTo(mid);
99+
Assert.Equal(mid, canvas.SaveCount);
100+
}
101+
102+
[Fact]
103+
public void RestoreTo_One_RestoresToRoot()
104+
{
105+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
106+
using Image<Rgba32> target = new(64, 64);
107+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
108+
109+
_ = canvas.Save();
110+
_ = canvas.Save();
111+
_ = canvas.Save();
112+
113+
canvas.RestoreTo(1);
114+
Assert.Equal(1, canvas.SaveCount);
115+
}
116+
117+
[Fact]
118+
public void Save_ReturnValue_MatchesSaveCount()
119+
{
120+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
121+
using Image<Rgba32> target = new(64, 64);
122+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
123+
124+
for (int i = 0; i < 5; i++)
125+
{
126+
int returned = canvas.Save();
127+
Assert.Equal(canvas.SaveCount, returned);
128+
}
129+
}
130+
}

tests/ImageSharp.Drawing.Tests/Processing/DrawingCanvasTests.TextMeasuring.cs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,89 @@ public void TextMeasuring_RenderedMetrics_MatchesReference<TPixel>(TestImageProv
197197
target.DebugSave(provider, appendSourceFileOrDescription: false);
198198
target.CompareToReferenceOutput(provider, appendSourceFileOrDescription: false);
199199
}
200+
201+
[Fact]
202+
public void MeasureTextSize_ReturnsNonEmptyRectangle()
203+
{
204+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
205+
using Image<Rgba32> target = new(64, 64);
206+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
207+
208+
Font font = TestFontUtilities.GetFont(TestFonts.OpenSans, 24);
209+
RichTextOptions textOptions = new(font) { Origin = new PointF(0, 0) };
210+
211+
RectangleF size = canvas.MeasureTextSize(textOptions, "Hello");
212+
213+
Assert.True(size.Width > 0, "Width should be positive.");
214+
Assert.True(size.Height > 0, "Height should be positive.");
215+
}
216+
217+
[Fact]
218+
public void MeasureTextSize_EmptyText_ReturnsEmpty()
219+
{
220+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
221+
using Image<Rgba32> target = new(64, 64);
222+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
223+
224+
Font font = TestFontUtilities.GetFont(TestFonts.OpenSans, 24);
225+
RichTextOptions textOptions = new(font) { Origin = new PointF(0, 0) };
226+
227+
RectangleF size = canvas.MeasureTextSize(textOptions, ReadOnlySpan<char>.Empty);
228+
229+
Assert.Equal(RectangleF.Empty, size);
230+
}
231+
232+
[Fact]
233+
public void MeasureTextSize_LongerText_IsWider()
234+
{
235+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
236+
using Image<Rgba32> target = new(64, 64);
237+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
238+
239+
Font font = TestFontUtilities.GetFont(TestFonts.OpenSans, 24);
240+
RichTextOptions textOptions = new(font) { Origin = new PointF(0, 0) };
241+
242+
RectangleF shortSize = canvas.MeasureTextSize(textOptions, "Hi");
243+
RectangleF longSize = canvas.MeasureTextSize(textOptions, "Hello World");
244+
245+
Assert.True(longSize.Width > shortSize.Width, "Longer text should produce a wider measurement.");
246+
}
247+
248+
[Fact]
249+
public void TryMeasureCharacterAdvances_ReturnsAdvancesForEachCharacter()
250+
{
251+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
252+
using Image<Rgba32> target = new(64, 64);
253+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
254+
255+
Font font = TestFontUtilities.GetFont(TestFonts.OpenSans, 24);
256+
RichTextOptions textOptions = new(font) { Origin = new PointF(0, 0) };
257+
258+
const string text = "ABC";
259+
bool result = canvas.TryMeasureCharacterAdvances(textOptions, text, out ReadOnlySpan<GlyphBounds> advances);
260+
261+
Assert.True(result);
262+
Assert.Equal(text.Length, advances.Length);
263+
264+
for (int i = 0; i < advances.Length; i++)
265+
{
266+
Assert.True(advances[i].Bounds.Width > 0, $"Advance width for character {i} should be positive.");
267+
}
268+
}
269+
270+
[Fact]
271+
public void TryMeasureCharacterAdvances_EmptyText_ReturnsFalse()
272+
{
273+
TestImageProvider<Rgba32> provider = TestImageProvider<Rgba32>.Blank(1, 1);
274+
using Image<Rgba32> target = new(64, 64);
275+
using DrawingCanvas<Rgba32> canvas = CreateCanvas(provider, target, new DrawingOptions());
276+
277+
Font font = TestFontUtilities.GetFont(TestFonts.OpenSans, 24);
278+
RichTextOptions textOptions = new(font) { Origin = new PointF(0, 0) };
279+
280+
bool result = canvas.TryMeasureCharacterAdvances(textOptions, ReadOnlySpan<char>.Empty, out ReadOnlySpan<GlyphBounds> advances);
281+
282+
Assert.False(result);
283+
Assert.True(advances.IsEmpty);
284+
}
200285
}

0 commit comments

Comments
 (0)