/
PlatformTestFixture.cs
238 lines (207 loc) · 6.31 KB
/
PlatformTestFixture.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using NUnit.Framework;
using UIKit;
namespace Xamarin.Forms.Platform.iOS.UnitTests
{
[Internals.Preserve(AllMembers = true)]
public class PlatformTestFixture
{
protected static UIColor EmptyBackground = new UIColor(0f,0f,0f,0f);
// Sequence for generating test cases
protected static IEnumerable<View> BasicViews
{
get
{
yield return new BoxView { };
yield return new Button { };
yield return new CheckBox { };
yield return new DatePicker { };
yield return new Editor { };
yield return new Entry { };
yield return new Frame { };
yield return new Image { };
yield return new ImageButton { };
yield return new Label { };
yield return new Picker { };
yield return new ProgressBar { };
yield return new SearchBar { };
yield return new Slider { };
yield return new Stepper { };
yield return new Switch { };
yield return new TimePicker { };
}
}
[SetUp]
public virtual void Setup()
{
}
[TearDown]
public virtual void TearDown()
{
}
protected static TestCaseData CreateTestCase(VisualElement element)
{
// We set the element type as a category on the test so that if you
// filter by category, say, "Button", you'll get any Button test
// generated from here.
return new TestCaseData(element).SetCategory(element.GetType().Name);
}
protected IVisualElementRenderer GetRenderer(VisualElement element)
{
return Platform.CreateRenderer(element);
}
protected async Task<IVisualElementRenderer> GetRendererAsync(VisualElement element)
{
return await Device.InvokeOnMainThreadAsync<IVisualElementRenderer>(() => Platform.CreateRenderer(element));
}
protected UIView GetNativeControl(VisualElement visualElement)
{
var renderer = GetRenderer(visualElement);
var viewRenderer = renderer as IVisualNativeElementRenderer;
return viewRenderer?.Control;
}
protected UILabel GetNativeControl(Label label)
{
var renderer = GetRenderer(label);
var viewRenderer = renderer.NativeView as LabelRenderer;
return viewRenderer.Control;
}
protected async Task<TProperty> GetControlProperty<TProperty>(Label label, Func<UILabel, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiLabel = GetNativeControl(label))
{
return getProperty(uiLabel);
}
});
}
protected async Task<TProperty> GetControlProperty<TProperty>(VisualElement view, Func<UIView, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var renderer = GetNativeControl(view))
{
return getProperty(renderer);
}
});
}
protected UITextField GetNativeControl(Entry entry)
{
var renderer = GetRenderer(entry);
var viewRenderer = renderer.NativeView as EntryRenderer;
return viewRenderer.Control;
}
protected async Task<TProperty> GetControlProperty<TProperty>(Entry entry, Func<UITextField, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiTextField = GetNativeControl(entry))
{
return getProperty(uiTextField);
}
});
}
protected UITextView GetNativeControl(Editor editor)
{
var renderer = GetRenderer(editor);
var viewRenderer = renderer.NativeView as EditorRenderer;
return viewRenderer.Control;
}
protected async Task<TProperty> GetControlProperty<TProperty>(Editor editor, Func<UITextView, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiTextView = GetNativeControl(editor))
{
return getProperty(uiTextView);
}
});
}
protected UIButton GetNativeControl(Button button)
{
var renderer = GetRenderer(button);
var viewRenderer = renderer.NativeView as ButtonRenderer;
return viewRenderer.Control;
}
protected async Task<TProperty> GetControlProperty<TProperty>(Button button, Func<UIButton, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiButton = GetNativeControl(button))
{
return getProperty(uiButton);
}
});
}
protected UIButton GetNativeControl(ImageButton button)
{
var renderer = GetRenderer(button);
var viewRenderer = renderer.NativeView as ImageButtonRenderer;
return viewRenderer.Control;
}
protected async Task<TProperty> GetControlProperty<TProperty>(ImageButton button, Func<UIButton, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var uiButton = GetNativeControl(button))
{
return getProperty(uiButton);
}
});
}
protected async Task<TProperty> GetRendererProperty<TProperty>(View view,
Func<IVisualElementRenderer, TProperty> getProperty, bool requiresLayout = false)
{
if (requiresLayout)
{
return await GetRendererPropertyWithLayout(view, getProperty);
}
else
{
return await GetRendererProperty(view, getProperty);
}
}
async Task<TProperty> GetRendererProperty<TProperty>(View view,
Func<IVisualElementRenderer, TProperty> getProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
using (var renderer = GetRenderer(view))
{
return getProperty(renderer);
}
});
}
async Task<TProperty> GetRendererPropertyWithLayout<TProperty>(View view,
Func<IVisualElementRenderer, TProperty> getRendererProperty)
{
return await Device.InvokeOnMainThreadAsync(() => {
var page = new ContentPage() { Content = view };
using (var pageRenderer = GetRenderer(page))
{
using (var renderer = GetRenderer(view))
{
page.Layout(new Rectangle(0, 0, 200, 200));
return getRendererProperty(renderer);
}
}
});
}
protected bool AreColorsSimilar(UIColor c1, UIColor c2, int tolerance)
{
c1.GetRGBA(out nfloat c1R, out nfloat c1G, out nfloat c1B, out nfloat c1A);
c1R *= 255;
c1G *= 255;
c1B *= 255;
c2.GetRGBA(out nfloat c2R, out nfloat c2G, out nfloat c2B, out nfloat c2A);
c2R *= 255;
c2G *= 255;
c2B *= 255;
var t =
Math.Abs(c1R - c2R) < tolerance &&
Math.Abs(c1G - c2G) < tolerance &&
Math.Abs(c1B - c2B) < tolerance;
System.Diagnostics.Debug.WriteLine($"TEST {t}");
return
Math.Abs(c1R - c2R) < tolerance &&
Math.Abs(c1G - c2G) < tolerance &&
Math.Abs(c1B - c2B) < tolerance;
}
}
}