Skip to content

Commit fcd9b26

Browse files
committed
ImageEx: Add Set Loaded Image test
1 parent 9ff59ac commit fcd9b26

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using Microsoft.Toolkit.Uwp;
6+
using Microsoft.Toolkit.Uwp.UI;
7+
using Microsoft.Toolkit.Uwp.UI.Controls;
8+
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
using System;
10+
using System.IO;
11+
using System.Linq;
12+
using System.Net.Http;
13+
using System.Threading.Tasks;
14+
using Windows.UI.Xaml;
15+
using Windows.UI.Xaml.Controls;
16+
using Windows.UI.Xaml.Media.Imaging;
17+
18+
namespace UnitTests.UWP.UI.Controls
19+
{
20+
[TestClass]
21+
public class Test_ImageEx : VisualUITestBase
22+
{
23+
private const string ImageString = "data:image/png;base64,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";
24+
25+
[TestMethod]
26+
public async Task SetSourceToOpenedBitmapImage()
27+
{
28+
await App.DispatcherQueue.EnqueueAsync(async () =>
29+
{
30+
var bitmapImage = new BitmapImage();
31+
32+
using var client = new HttpClient();
33+
var response = await client.GetAsync(new Uri("https://st.depositphotos.com/1428083/2946/i/600/depositphotos_29460297-stock-photo-bird-cage.jpg"));
34+
using var stream = await response.Content.ReadAsStreamAsync();
35+
try
36+
{
37+
using var memStream = new MemoryStream();
38+
await stream.CopyToAsync(memStream);
39+
memStream.Seek(0, SeekOrigin.Begin);
40+
await bitmapImage.SetSourceAsync(memStream.AsRandomAccessStream());
41+
}
42+
catch
43+
{
44+
Assert.Fail();
45+
}
46+
47+
var imageLoader = new ImageEx();
48+
49+
await SetTestContentAsync(imageLoader);
50+
51+
Assert.AreEqual("Unloaded", GetCurrentState(imageLoader));
52+
53+
var imageOpendedCallCount = 0;
54+
55+
imageLoader.ImageExOpened += (s, e) =>
56+
{
57+
imageOpendedCallCount++;
58+
Assert.AreEqual("Loaded", GetCurrentState(imageLoader));
59+
};
60+
61+
imageLoader.Source = bitmapImage;
62+
63+
Assert.AreEqual(1, imageOpendedCallCount, "{0} should only be called once", nameof(ImageEx.ImageExOpened));
64+
});
65+
}
66+
67+
[TestMethod]
68+
public async Task SetSourceToUriOfData()
69+
{
70+
var imageOpendedCallCount = 0;
71+
await App.DispatcherQueue.EnqueueAsync(async () =>
72+
{
73+
var imageLoader = new ImageEx();
74+
75+
await SetTestContentAsync(imageLoader);
76+
77+
Assert.AreEqual("Unloaded", GetCurrentState(imageLoader));
78+
79+
imageLoader.ImageExOpened += (s, e) =>
80+
{
81+
imageOpendedCallCount++;
82+
Assert.AreEqual("Loaded", GetCurrentState(imageLoader));
83+
};
84+
85+
imageLoader.Source = new Uri(ImageString);
86+
87+
// TODO (2021.05.11): Test in a more deterministic way.
88+
// Setting source causes some async code to trigger and
89+
// we have no way to await or handle its complementation regardless of the result.
90+
await Task.Delay(1000);
91+
Assert.AreEqual(1, imageOpendedCallCount, "{0} should only be called once", nameof(ImageEx.ImageExOpened));
92+
});
93+
}
94+
95+
private static string GetCurrentState(ImageEx image)
96+
=> VisualStateManager.GetVisualStateGroups(image.FindDescendant<Grid>()).First(g => g.Name == "CommonStates").CurrentState.Name;
97+
}
98+
}

UnitTests/UnitTests.UWP/UnitTests.UWP.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@
201201
<Compile Include="UI\Collection\Test_IncrementalLoadingCollection.cs" />
202202
<Compile Include="UI\Controls\Test_Carousel.cs" />
203203
<Compile Include="UI\Controls\Test_BladeView.cs" />
204+
<Compile Include="UI\Controls\Test_ImageEx.cs" />
204205
<Compile Include="UI\Controls\Test_RadialGauge.cs" />
205206
<Compile Include="UI\Controls\Test_TextToolbar_Localization.cs" />
206207
<Compile Include="UI\Controls\Test_InfiniteCanvas_Regression.cs" />

0 commit comments

Comments
 (0)