|
| 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.Reflection; |
| 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 stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(@"UnitTests.UWP.Assets.StoreLogo.embeded.png"); |
| 33 | + using var memStream = new MemoryStream(); |
| 34 | + await stream.CopyToAsync(memStream); |
| 35 | + memStream.Seek(0, SeekOrigin.Begin); |
| 36 | + await bitmapImage.SetSourceAsync(memStream.AsRandomAccessStream()); |
| 37 | + |
| 38 | + var imageLoader = new ImageEx(); |
| 39 | + |
| 40 | + await SetTestContentAsync(imageLoader); |
| 41 | + |
| 42 | + Assert.AreEqual("Unloaded", GetCurrentState(imageLoader)); |
| 43 | + |
| 44 | + var imageOpendedCallCount = 0; |
| 45 | + |
| 46 | + imageLoader.ImageExOpened += (s, e) => |
| 47 | + { |
| 48 | + imageOpendedCallCount++; |
| 49 | + Assert.AreEqual("Loaded", GetCurrentState(imageLoader)); |
| 50 | + }; |
| 51 | + |
| 52 | + imageLoader.Source = bitmapImage; |
| 53 | + |
| 54 | + Assert.AreEqual(1, imageOpendedCallCount, "{0} should only be called once", nameof(ImageEx.ImageExOpened)); |
| 55 | + }); |
| 56 | + } |
| 57 | + |
| 58 | + [TestMethod] |
| 59 | + [DataRow(ImageString)] |
| 60 | + [DataRow(@"ms-appx:///Assets/StoreLogo.png")] |
| 61 | + public async Task SetSourceToUri(string uri) |
| 62 | + { |
| 63 | + await App.DispatcherQueue.EnqueueAsync(async () => |
| 64 | + { |
| 65 | + var imageLoader = new ImageEx(); |
| 66 | + |
| 67 | + await SetTestContentAsync(imageLoader); |
| 68 | + |
| 69 | + Assert.AreEqual("Unloaded", GetCurrentState(imageLoader)); |
| 70 | + |
| 71 | + var imageOpendedCallCount = 0; |
| 72 | + imageLoader.ImageExOpened += (s, e) => |
| 73 | + { |
| 74 | + imageOpendedCallCount++; |
| 75 | + Assert.AreEqual("Loaded", GetCurrentState(imageLoader)); |
| 76 | + }; |
| 77 | + |
| 78 | + imageLoader.Source = new Uri(uri); |
| 79 | + |
| 80 | + // TODO (2021.05.11): Test in a more deterministic way. |
| 81 | + // Setting source causes some async code to trigger and |
| 82 | + // we have no way to await or handle its complementation regardless of the result. |
| 83 | + await Task.Delay(1000); |
| 84 | + Assert.AreEqual(1, imageOpendedCallCount, "{0} should only be called once", nameof(ImageEx.ImageExOpened)); |
| 85 | + }); |
| 86 | + } |
| 87 | + |
| 88 | + private static string GetCurrentState(ImageEx image) |
| 89 | + => VisualStateManager.GetVisualStateGroups(image.FindDescendant<Grid>()).First(g => g.Name == "CommonStates").CurrentState.Name; |
| 90 | + } |
| 91 | +} |
0 commit comments