summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Controls/TestCases.cs
diff options
context:
space:
mode:
authorJason Smith <jason.smith@xamarin.com>2016-03-22 13:02:25 -0700
committerJason Smith <jason.smith@xamarin.com>2016-03-22 16:13:41 -0700
commit17fdde66d94155fc62a034fa6658995bef6fd6e5 (patch)
treeb5e5073a2a7b15cdbe826faa5c763e270a505729 /Xamarin.Forms.Controls/TestCases.cs
downloadxamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.gz
xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.tar.bz2
xamarin-forms-17fdde66d94155fc62a034fa6658995bef6fd6e5.zip
Initial import
Diffstat (limited to 'Xamarin.Forms.Controls/TestCases.cs')
-rw-r--r--Xamarin.Forms.Controls/TestCases.cs213
1 files changed, 213 insertions, 0 deletions
diff --git a/Xamarin.Forms.Controls/TestCases.cs b/Xamarin.Forms.Controls/TestCases.cs
new file mode 100644
index 00000000..fc601024
--- /dev/null
+++ b/Xamarin.Forms.Controls/TestCases.cs
@@ -0,0 +1,213 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading.Tasks;
+using Xamarin.Forms.Controls.TestCasesPages;
+using Xamarin.Forms.CustomAttributes;
+
+namespace Xamarin.Forms.Controls
+{
+ public static class TestCases
+ {
+ public class TestCaseScreen : TableView
+ {
+ public static Dictionary<string, Action> PageToAction = new Dictionary<string, Action> ();
+
+ static TextCell MakeIssueCell (string text, string detail, Action tapped)
+ {
+ PageToAction[text] = tapped;
+ if (detail != null)
+ PageToAction[detail] = tapped;
+
+ var cell = new TextCell { Text = text, Detail = detail };
+ cell.Tapped += (s, e) => tapped();
+ return cell;
+ }
+
+ Action ActivatePageAndNavigate (IssueAttribute issueAttribute, Type type)
+ {
+ Action navigationAction = null;
+
+ if (issueAttribute.NavigationBehavior == NavigationBehavior.PushAsync) {
+ return async () => {
+ var page = ActivatePage (type);
+ TrackOnInsights (page);
+ await Navigation.PushAsync (page);
+ };
+ }
+
+ if (issueAttribute.NavigationBehavior == NavigationBehavior.PushModalAsync) {
+ return async () => {
+ var page = ActivatePage (type);
+ TrackOnInsights (page);
+ await Navigation.PushModalAsync (page);
+ };
+ }
+
+ if (issueAttribute.NavigationBehavior == NavigationBehavior.Default) {
+ return async () => {
+ var page = ActivatePage (type);
+ TrackOnInsights (page);
+ if (page is ContentPage || page is CarouselPage) {
+
+ await Navigation.PushAsync (page);
+
+ } else {
+ await Navigation.PushModalAsync (page);
+ }
+ };
+ }
+
+ if (issueAttribute.NavigationBehavior == NavigationBehavior.SetApplicationRoot) {
+ return () => {
+ var page = ActivatePage (type);
+ TrackOnInsights (page);
+ Application.Current.MainPage = page;
+ };
+ }
+
+ return navigationAction;
+ }
+
+ static void TrackOnInsights (Page page)
+ {
+ if (Insights.IsInitialized) {
+ Insights.Track ("Navigation", new Dictionary<string, string> {
+ {
+ "Pushing",
+ page.GetType ().Name
+ }
+ });
+ }
+ }
+
+ Page ActivatePage (Type type)
+ {
+ var page = Activator.CreateInstance (type) as Page;
+ if (page == null) {
+ throw new InvalidCastException ("Issue must be of type Page");
+ }
+ return page;
+ }
+
+ public TestCaseScreen ()
+ {
+ AutomationId = "TestCasesIssueList";
+
+ Intent = TableIntent.Settings;
+
+ var assembly = typeof (TestCases).GetTypeInfo ().Assembly;
+
+ var issueModels =
+ from typeInfo in assembly.DefinedTypes.Select (o => o.AsType ().GetTypeInfo ())
+ where typeInfo.GetCustomAttribute<IssueAttribute> () != null
+ let attribute = (IssueAttribute)typeInfo.GetCustomAttribute<IssueAttribute> ()
+ select new {
+ IssueTracker = attribute.IssueTracker,
+ IssueNumber = attribute.IssueNumber,
+ Name = attribute.IssueTracker.ToString ().Substring(0, 1) + attribute.IssueNumber.ToString (),
+ Description = attribute.Description,
+ Action = ActivatePageAndNavigate (attribute, typeInfo.AsType ())
+ };
+
+ var root = new TableRoot ();
+ var section = new TableSection ("Bug Repro");
+ root.Add (section);
+
+ var duplicates = new HashSet<string> ();
+ issueModels.ForEach (im => {
+ if (duplicates.Contains (im.Name) && !IsExempt (im.Name)) {
+ throw new NotSupportedException ("Please provide unique tracker + issue number combo: " + im.IssueTracker.ToString () + im.IssueNumber.ToString ());
+ } else {
+ duplicates.Add (im.Name);
+ }
+ });
+
+ var githubIssueCells =
+ from issueModel in issueModels
+ where issueModel.IssueTracker == IssueTracker.Github
+ orderby issueModel.IssueNumber descending
+ select MakeIssueCell (issueModel.Name, issueModel.Description, issueModel.Action);
+
+ var bugzillaIssueCells =
+ from issueModel in issueModels
+ where issueModel.IssueTracker == IssueTracker.Bugzilla
+ orderby issueModel.IssueNumber descending
+ select MakeIssueCell (issueModel.Name, issueModel.Description, issueModel.Action);
+
+ var untrackedIssueCells =
+ from issueModel in issueModels
+ where issueModel.IssueTracker == IssueTracker.None
+ orderby issueModel.Description
+ select MakeIssueCell (issueModel.Name, issueModel.Description, issueModel.Action);
+
+ var issueCells = bugzillaIssueCells.Concat (githubIssueCells).Concat (untrackedIssueCells);
+
+ foreach (var issueCell in issueCells) {
+ section.Add (issueCell);
+ }
+
+ Root = root;
+ }
+
+ // Legacy reasons, do not add to this list
+ // Going forward, make sure only one Issue attribute exist for a Tracker + Issue number pair
+ bool IsExempt (string name)
+ {
+ if (name == "G1461" ||
+ name == "G342" ||
+ name == "G1305" ||
+ name == "G1653" ||
+ name == "N0")
+ return true;
+ else
+ return false;
+ }
+ }
+
+ public static NavigationPage GetTestCases ()
+ {
+ var rootLayout = new StackLayout ();
+
+ var testCasesRoot = new ContentPage {
+ Title = "Bug Repro's",
+ Content = rootLayout
+ };
+
+ var searchBar = new SearchBar() {
+ AutomationId = "SearchBarGo"
+ };
+
+ var searchButton = new Button () {
+ Text = "Search And Go To Issue",
+ AutomationId = "SearchButton",
+ Command = new Command (() => {
+ try {
+ TestCaseScreen.PageToAction[searchBar.Text] ();
+ } catch (Exception e) {
+ System.Diagnostics.Debug.WriteLine (e.Message);
+ }
+
+ })
+ };
+
+ var leaveTestCasesButton = new Button {
+ AutomationId = "GoBackToGalleriesButton",
+ Text = "Go Back to Galleries",
+ Command = new Command (() => testCasesRoot.Navigation.PopModalAsync ())
+ };
+
+ rootLayout.Children.Add (leaveTestCasesButton);
+ rootLayout.Children.Add (searchBar);
+ rootLayout.Children.Add (searchButton);
+ rootLayout.Children.Add (new TestCaseScreen ());
+
+ return new NavigationPage (testCasesRoot) {
+ Title = Device.OnPlatform ("Test Cases", "Test Cases", "Tests")
+ };
+ }
+ }
+
+}