summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core.UnitTests/ImageTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests/ImageTests.cs')
-rw-r--r--Xamarin.Forms.Core.UnitTests/ImageTests.cs261
1 files changed, 261 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/ImageTests.cs b/Xamarin.Forms.Core.UnitTests/ImageTests.cs
new file mode 100644
index 00000000..1e2546db
--- /dev/null
+++ b/Xamarin.Forms.Core.UnitTests/ImageTests.cs
@@ -0,0 +1,261 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using NUnit.Framework;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+
+namespace Xamarin.Forms.Core.UnitTests
+{
+ [TestFixture]
+ public class ImageTests : BaseTestFixture
+ {
+ [SetUp]
+ public override void Setup ()
+ {
+ base.Setup ();
+ Device.PlatformServices = new MockPlatformServices (getStreamAsync: GetStreamAsync);
+ }
+
+ [TearDown]
+ public override void TearDown()
+ {
+ base.TearDown ();
+ Device.PlatformServices = null;
+ }
+
+ [Test]
+ public void TestSizing ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png"), Platform = new UnitPlatform (), IsPlatformEnabled = true};
+
+ var result = image.GetSizeRequest (double.PositiveInfinity, double.PositiveInfinity);
+
+ Assert.AreEqual (100, result.Request.Width);
+ Assert.AreEqual (20, result.Request.Height);
+ }
+
+ [Test]
+ public void TestAspectSizingWithConstrainedHeight ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png"), Platform = new UnitPlatform (), IsPlatformEnabled = true};
+
+ var result = image.GetSizeRequest (double.PositiveInfinity, 10);
+
+ Assert.AreEqual (50, result.Request.Width);
+ Assert.AreEqual (10, result.Request.Height);
+ }
+
+ [Test]
+ public void TestAspectSizingWithConstrainedWidth ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png"), Platform = new UnitPlatform (), IsPlatformEnabled = true};
+
+ var result = image.GetSizeRequest (25, double.PositiveInfinity);
+
+ Assert.AreEqual (25, result.Request.Width);
+ Assert.AreEqual (5, result.Request.Height);
+ }
+
+ [Test]
+ public void TestAspectFillSizingWithConstrainedHeight ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png"), Platform = new UnitPlatform (), IsPlatformEnabled = true};
+
+ image.Aspect = Aspect.AspectFill;
+ var result = image.GetSizeRequest (double.PositiveInfinity, 10);
+
+ Assert.AreEqual (50, result.Request.Width);
+ Assert.AreEqual (10, result.Request.Height);
+ }
+
+ [Test]
+ public void TestAspectFillSizingWithConstrainedWidth ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png"), Platform = new UnitPlatform (), IsPlatformEnabled = true};
+
+ image.Aspect = Aspect.AspectFill;
+ var result = image.GetSizeRequest (25, double.PositiveInfinity);
+
+ Assert.AreEqual (25, result.Request.Width);
+ Assert.AreEqual (5, result.Request.Height);
+ }
+
+ [Test]
+ public void TestFillSizingWithConstrainedHeight ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png"), Platform = new UnitPlatform (), IsPlatformEnabled = true};
+
+ image.Aspect = Aspect.AspectFill;
+ var result = image.GetSizeRequest (double.PositiveInfinity, 10);
+
+ Assert.AreEqual (50, result.Request.Width);
+ Assert.AreEqual (10, result.Request.Height);
+ }
+
+ [Test]
+ public void TestFillSizingWithConstrainedWidth ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png"), Platform = new UnitPlatform (), IsPlatformEnabled = true};
+
+ image.Aspect = Aspect.AspectFill;
+ var result = image.GetSizeRequest (25, double.PositiveInfinity);
+
+ Assert.AreEqual (25, result.Request.Width);
+ Assert.AreEqual (5, result.Request.Height);
+ }
+
+ [Test]
+ public void TestSizeChanged ()
+ {
+ var image = new Image { Source = "File0.png" };
+ Assert.AreEqual ("File0.png", ((FileImageSource)image.Source).File);
+
+ var preferredSizeChanged = false;
+ image.MeasureInvalidated += (sender, args) => preferredSizeChanged = true;
+
+ image.Source = "File1.png";
+ Assert.AreEqual ("File1.png", ((FileImageSource)image.Source).File);
+ Assert.True (preferredSizeChanged);
+ }
+
+ [Test]
+ public void TestSource ()
+ {
+ var image = new Image ();
+
+ Assert.IsNull (image.Source);
+
+ bool signaled = false;
+ image.PropertyChanged += (sender, e) => {
+ if (e.PropertyName == "Source")
+ signaled = true;
+ };
+
+ var source = ImageSource.FromFile ("File.png");
+ image.Source = source;
+
+ Assert.AreEqual (source, image.Source);
+ Assert.True (signaled);
+ }
+
+ [Test]
+ public void TestSourceDoubleSet ()
+ {
+ var image = new Image {Source = ImageSource.FromFile ("File.png")};
+
+ bool signaled = false;
+ image.PropertyChanged += (sender, e) => {
+ if (e.PropertyName == "Source")
+ signaled = true;
+ };
+
+ image.Source = image.Source;
+
+ Assert.False (signaled);
+ }
+
+ [Test]
+ public void TestFileImageSourceChanged ()
+ {
+ var source = (FileImageSource)ImageSource.FromFile ("File.png");
+
+ bool signaled = false;
+ source.SourceChanged += (sender, e) => {
+ signaled = true;
+ };
+
+ source.File = "Other.png";
+ Assert.AreEqual ("Other.png", source.File);
+
+ Assert.True (signaled);
+ }
+
+ [Test]
+ public void TestFileImageSourcePropertiesChangedTriggerResize ()
+ {
+ var source = new FileImageSource ();
+ var image = new Image { Source = source };
+ bool fired = false;
+ image.MeasureInvalidated += (sender, e) => fired = true;
+ Assert.Null (source.File);
+ source.File = "foo.png";
+ Assert.NotNull (source.File);
+ Assert.True (fired);
+ }
+
+ [Test]
+ public void TestStreamImageSourcePropertiesChangedTriggerResize ()
+ {
+ var source = new StreamImageSource ();
+ var image = new Image { Source = source };
+ bool fired = false;
+ image.MeasureInvalidated += (sender, e) => fired = true;
+ Assert.Null (source.Stream);
+ source.Stream = token => Task.FromResult<Stream> (null);
+ Assert.NotNull (source.Stream);
+ Assert.True (fired);
+ }
+
+ [Test]
+ public void TestImageSourceToNullCancelsLoading ()
+ {
+ var image = new Image ();
+ var mockImageRenderer = new MockImageRenderer (image);
+ var loader = new UriImageSource { Uri = new Uri ("http://www.public-domain-image.com/free-images/miscellaneous/big-high-border-fence.jpg") };
+ image.Source = loader;
+ Assert.IsTrue (image.IsLoading);
+ image.Source = null;
+ Assert.IsFalse (image.IsLoading);
+ Assert.IsTrue (cancelled);
+ }
+
+ static bool cancelled;
+
+ static async Task<Stream> GetStreamAsync (Uri uri, CancellationToken cancellationToken)
+ {
+ try {
+ await Task.Delay (5000, cancellationToken);
+ } catch (TaskCanceledException ex) {
+ cancelled = true;
+ throw ex;
+ }
+
+ if (cancellationToken.IsCancellationRequested) {
+ cancelled = true;
+ throw new TaskCanceledException ();
+ }
+
+ var stream = typeof(ImageTests).Assembly.GetManifestResourceStream (uri.LocalPath.Substring (1));
+ return stream;
+ }
+
+ class MockImageRenderer
+ {
+ public MockImageRenderer (Image element)
+ {
+ Element = element;
+ Element.PropertyChanged += ( sender, e) => {
+ if (e.PropertyName == nameof (Image.Source))
+ Load ();
+ };
+ }
+
+ public Image Element { get; set; }
+
+ public async void Load ()
+ {
+ if (initialLoad && Element.Source != null) {
+ initialLoad = false;
+ ((IElementController)Element).SetValueFromRenderer (Image.IsLoadingPropertyKey, true);
+ await (Element.Source as UriImageSource).GetStreamAsync ();
+ ((IElementController)Element).SetValueFromRenderer (Image.IsLoadingPropertyKey, false);
+ }
+ }
+
+ bool initialLoad = true;
+ }
+ }
+}