summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Core.UnitTests/MockPlatformServices.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Core.UnitTests/MockPlatformServices.cs')
-rw-r--r--Xamarin.Forms.Core.UnitTests/MockPlatformServices.cs270
1 files changed, 270 insertions, 0 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/MockPlatformServices.cs b/Xamarin.Forms.Core.UnitTests/MockPlatformServices.cs
new file mode 100644
index 00000000..7d2317b3
--- /dev/null
+++ b/Xamarin.Forms.Core.UnitTests/MockPlatformServices.cs
@@ -0,0 +1,270 @@
+using System;
+using System.Threading.Tasks;
+using System.IO;
+using System.Threading;
+using System.Reflection;
+using System.IO.IsolatedStorage;
+using System.Collections.Generic;
+using Xamarin.Forms;
+using Xamarin.Forms.Core.UnitTests;
+using System.Security.Cryptography;
+using System.Text;
+#if WINDOWS_PHONE
+using Xamarin.Forms.Platform.WinPhone;
+#endif
+
+[assembly:Dependency (typeof(MockDeserializer))]
+[assembly:Dependency (typeof(MockResourcesProvider))]
+
+namespace Xamarin.Forms.Core.UnitTests
+{
+ internal class MockPlatformServices : IPlatformServices
+ {
+ Action<Action> invokeOnMainThread;
+ Action<Uri> openUriAction;
+ Func<Uri, CancellationToken, Task<Stream>> getStreamAsync;
+ public MockPlatformServices (Action<Action> invokeOnMainThread = null, Action<Uri> openUriAction = null, Func<Uri, CancellationToken, Task<Stream>> getStreamAsync = null)
+ {
+ this.invokeOnMainThread = invokeOnMainThread;
+ this.openUriAction = openUriAction;
+ this.getStreamAsync = getStreamAsync;
+ }
+
+ static MD5CryptoServiceProvider checksum = new MD5CryptoServiceProvider ();
+
+ public string GetMD5Hash (string input)
+ {
+ var bytes = checksum.ComputeHash (Encoding.UTF8.GetBytes (input));
+ var ret = new char [32];
+ for (int i = 0; i < 16; i++){
+ ret [i*2] = (char)hex (bytes [i] >> 4);
+ ret [i*2+1] = (char)hex (bytes [i] & 0xf);
+ }
+ return new string (ret);
+ }
+ static int hex (int v)
+ {
+ if (v < 10)
+ return '0' + v;
+ return 'a' + v-10;
+ }
+
+ public double GetNamedSize (NamedSize size, Type targetElement, bool useOldSizes)
+ {
+ switch (size) {
+ case NamedSize.Default:
+ return 10;
+ case NamedSize.Micro:
+ return 4;
+ case NamedSize.Small:
+ return 8;
+ case NamedSize.Medium:
+ return 12;
+ case NamedSize.Large:
+ return 16;
+ default:
+ throw new ArgumentOutOfRangeException ("size");
+ }
+ }
+
+ public void OpenUriAction (Uri uri)
+ {
+ if (openUriAction != null)
+ openUriAction (uri);
+ else
+ throw new NotImplementedException ();
+ }
+
+ public bool IsInvokeRequired
+ {
+ get { return false; }
+ }
+
+ public void BeginInvokeOnMainThread (Action action)
+ {
+ if (invokeOnMainThread == null)
+ action ();
+ else
+ invokeOnMainThread (action);
+ }
+
+ public void StartTimer (TimeSpan interval, Func<bool> callback)
+ {
+ Timer timer = null;
+ TimerCallback onTimeout = o => BeginInvokeOnMainThread (() => {
+ if (callback ())
+ return;
+
+ timer.Dispose ();
+ });
+ timer = new Timer (onTimeout, null, interval, interval);
+ }
+
+ public Task<Stream> GetStreamAsync (Uri uri, CancellationToken cancellationToken)
+ {
+ if (getStreamAsync == null)
+ throw new NotImplementedException ();
+ return getStreamAsync (uri, cancellationToken);
+ }
+
+ public Assembly[] GetAssemblies ()
+ {
+ return AppDomain.CurrentDomain.GetAssemblies ();
+ }
+
+ public ITimer CreateTimer (Action<object> callback)
+ {
+ return new MockTimer (new Timer (o => callback(o)));
+ }
+
+ public ITimer CreateTimer (Action<object> callback, object state, int dueTime, int period)
+ {
+ return new MockTimer (new Timer (o => callback(o), state, dueTime, period));
+ }
+
+ public ITimer CreateTimer (Action<object> callback, object state, long dueTime, long period)
+ {
+ return new MockTimer (new Timer (o => callback(o), state, dueTime, period));
+ }
+
+ public ITimer CreateTimer (Action<object> callback, object state, TimeSpan dueTime, TimeSpan period)
+ {
+ return new MockTimer (new Timer (o => callback(o), state, dueTime, period));
+ }
+
+ public ITimer CreateTimer (Action<object> callback, object state, uint dueTime, uint period)
+ {
+ return new MockTimer (new Timer (o => callback(o), state, dueTime, period));
+ }
+
+ public class MockTimer : ITimer
+ {
+ readonly Timer timer;
+ public MockTimer (Timer timer)
+ {
+ this.timer = timer;
+ }
+
+ public void Change (int dueTime, int period)
+ {
+ timer.Change (dueTime, period);
+ }
+ public void Change (long dueTime, long period)
+ {
+ timer.Change (dueTime, period);
+ }
+ public void Change (TimeSpan dueTime, TimeSpan period)
+ {
+ timer.Change (dueTime, period);
+ }
+ public void Change (uint dueTime, uint period)
+ {
+ timer.Change (dueTime, period);
+ }
+ }
+
+ public IIsolatedStorageFile GetUserStoreForApplication ()
+ {
+#if WINDOWS_PHONE
+ return new MockIsolatedStorageFile (IsolatedStorageFile.GetUserStoreForApplication ());
+#else
+ return new MockIsolatedStorageFile (IsolatedStorageFile.GetUserStoreForAssembly ());
+#endif
+ }
+
+ public class MockIsolatedStorageFile : IIsolatedStorageFile
+ {
+ readonly IsolatedStorageFile isolatedStorageFile;
+ public MockIsolatedStorageFile (IsolatedStorageFile isolatedStorageFile)
+ {
+ this.isolatedStorageFile = isolatedStorageFile;
+ }
+
+ public Task<bool> GetDirectoryExistsAsync (string path)
+ {
+ return Task.FromResult (isolatedStorageFile.DirectoryExists (path));
+ }
+
+ public Task CreateDirectoryAsync (string path)
+ {
+ isolatedStorageFile.CreateDirectory (path);
+ return Task.FromResult (true);
+ }
+
+ public Task<Stream> OpenFileAsync (string path, FileMode mode, FileAccess access)
+ {
+ Stream stream = isolatedStorageFile.OpenFile (path, (System.IO.FileMode)mode, (System.IO.FileAccess)access);
+ return Task.FromResult (stream);
+ }
+
+ public Task<Stream> OpenFileAsync (string path, FileMode mode, FileAccess access, FileShare share)
+ {
+ Stream stream = isolatedStorageFile.OpenFile (path, (System.IO.FileMode)mode, (System.IO.FileAccess)access, (System.IO.FileShare)share);
+ return Task.FromResult (stream);
+ }
+
+ public Task<bool> GetFileExistsAsync (string path)
+ {
+ return Task.FromResult (isolatedStorageFile.FileExists (path));
+ }
+
+ public Task<DateTimeOffset> GetLastWriteTimeAsync (string path)
+ {
+ return Task.FromResult (isolatedStorageFile.GetLastWriteTime (path));
+ }
+ }
+ }
+
+ internal class MockDeserializer : IDeserializer
+ {
+ public Task<IDictionary<string, object>> DeserializePropertiesAsync ()
+ {
+ return Task.FromResult<IDictionary<string, object>> (new Dictionary<string,object> ());
+ }
+
+ public Task SerializePropertiesAsync (IDictionary<string, object> properties)
+ {
+ return Task.FromResult (false);
+ }
+ }
+
+ internal class MockResourcesProvider : ISystemResourcesProvider
+ {
+ public IResourceDictionary GetSystemResources ()
+ {
+ var dictionary = new ResourceDictionary ();
+ Style style;
+ style = new Style (typeof(Label));
+ dictionary [Device.Styles.BodyStyleKey] = style;
+
+ style = new Style (typeof(Label));
+ style.Setters.Add (Label.FontSizeProperty, 50);
+ dictionary [Device.Styles.TitleStyleKey] = style;
+
+ style = new Style (typeof(Label));
+ style.Setters.Add (Label.FontSizeProperty, 40);
+ dictionary [Device.Styles.SubtitleStyleKey] = style;
+
+ style = new Style (typeof(Label));
+ style.Setters.Add (Label.FontSizeProperty, 30);
+ dictionary [Device.Styles.CaptionStyleKey] = style;
+
+ style = new Style (typeof(Label));
+ style.Setters.Add (Label.FontSizeProperty, 20);
+ dictionary [Device.Styles.ListItemTextStyleKey] = style;
+
+ style = new Style (typeof(Label));
+ style.Setters.Add (Label.FontSizeProperty, 10);
+ dictionary [Device.Styles.ListItemDetailTextStyleKey] = style;
+
+ return dictionary;
+ }
+ }
+
+ public class MockApplication : Application
+ {
+ public MockApplication ()
+ {
+ }
+ }
+} \ No newline at end of file