1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Reactive ;
3
4
using System . Runtime . CompilerServices ;
5
+ using Avalonia . Controls . Primitives ;
4
6
using Avalonia . Data ;
5
7
using Avalonia . Input ;
6
8
using Avalonia . Input . Raw ;
9
+ using Avalonia . Platform ;
7
10
using Avalonia . Rendering ;
8
11
using Avalonia . Threading ;
9
12
using Avalonia . UnitTests ;
@@ -15,18 +18,65 @@ namespace Avalonia.Controls.UnitTests
15
18
public class ToolTipTests_Popup : ToolTipTests
16
19
{
17
20
protected override TestServices ConfigureServices ( TestServices baseServices ) => baseServices ;
21
+
22
+ protected override void SetupWindowMock ( Mock < IWindowImpl > windowImpl ) { }
23
+
24
+ protected override void VerifyToolTipType ( Control control )
25
+ {
26
+ var toolTip = control . GetValue ( ToolTip . ToolTipProperty ) ;
27
+ Assert . IsType < PopupRoot > ( toolTip . PopupHost ) ;
28
+ Assert . Same ( toolTip . VisualRoot , toolTip . PopupHost ) ;
29
+ }
18
30
}
19
31
20
- public class ToolTipTests_Overlay : ToolTipTests
32
+ public class ToolTipTests_Overlay : ToolTipTests , IDisposable
21
33
{
34
+ private readonly IDisposable _toolTipOpenSubscription ;
35
+
36
+ public ToolTipTests_Overlay ( )
37
+ {
38
+ _toolTipOpenSubscription = ToolTip . IsOpenProperty . Changed . Subscribe ( new AnonymousObserver < AvaloniaPropertyChangedEventArgs < bool > > ( e =>
39
+ {
40
+ if ( e . Sender is Visual { VisualRoot : { } root } visual )
41
+ OverlayLayer . GetOverlayLayer ( visual ) . Measure ( root . ClientSize ) ;
42
+ } ) ) ;
43
+ }
44
+
45
+ public void Dispose ( )
46
+ {
47
+ _toolTipOpenSubscription . Dispose ( ) ;
48
+ }
49
+
22
50
protected override TestServices ConfigureServices ( TestServices baseServices ) =>
23
51
baseServices . With ( windowingPlatform : new MockWindowingPlatform ( popupImpl : window => null ) ) ;
52
+
53
+ protected override void SetupWindowMock ( Mock < IWindowImpl > windowImpl )
54
+ {
55
+ windowImpl . Setup ( x => x . CreatePopup ( ) ) . Returns ( default ( IPopupImpl ) ) ;
56
+ }
57
+
58
+ protected override void VerifyToolTipType ( Control control )
59
+ {
60
+ var toolTip = control . GetValue ( ToolTip . ToolTipProperty ) ;
61
+ Assert . IsType < OverlayPopupHost > ( toolTip . PopupHost ) ;
62
+ Assert . Same ( toolTip . VisualRoot , control . VisualRoot ) ;
63
+ }
24
64
}
25
65
26
66
public abstract class ToolTipTests
27
67
{
28
68
protected abstract TestServices ConfigureServices ( TestServices baseServices ) ;
29
69
70
+ protected abstract void SetupWindowMock ( Mock < IWindowImpl > windowImpl ) ;
71
+
72
+ protected abstract void VerifyToolTipType ( Control control ) ;
73
+
74
+ private void AssertToolTipOpen ( Control control )
75
+ {
76
+ Assert . True ( ToolTip . GetIsOpen ( control ) ) ;
77
+ VerifyToolTipType ( control ) ;
78
+ }
79
+
30
80
private static readonly MouseDevice s_mouseDevice = new ( new Pointer ( 0 , PointerType . Mouse , true ) ) ;
31
81
32
82
[ Fact ]
@@ -46,7 +96,7 @@ public void Should_Close_When_Control_Detaches()
46
96
47
97
SetupWindowAndActivateToolTip ( panel , target ) ;
48
98
49
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
99
+ AssertToolTipOpen ( target ) ;
50
100
51
101
panel . Children . Remove ( target ) ;
52
102
@@ -74,7 +124,7 @@ public void Should_Close_When_Tip_Is_Opened_And_Detached_From_Visual_Tree()
74
124
75
125
mouseEnter ( target ) ;
76
126
77
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
127
+ AssertToolTipOpen ( target ) ;
78
128
79
129
panel . Children . Remove ( target ) ;
80
130
@@ -95,7 +145,7 @@ public void Should_Open_On_Pointer_Enter()
95
145
96
146
SetupWindowAndActivateToolTip ( target ) ;
97
147
98
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
148
+ AssertToolTipOpen ( target ) ;
99
149
}
100
150
}
101
151
@@ -112,7 +162,7 @@ public void Content_Should_Update_When_Tip_Property_Changes_And_Already_Open()
112
162
113
163
SetupWindowAndActivateToolTip ( target ) ;
114
164
115
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
165
+ AssertToolTipOpen ( target ) ;
116
166
Assert . Equal ( "Tip" , target . GetValue ( ToolTip . ToolTipProperty ) . Content ) ;
117
167
118
168
ToolTip . SetTip ( target , "Tip1" ) ;
@@ -139,7 +189,7 @@ public void Should_Open_On_Pointer_Enter_With_Delay()
139
189
140
190
timer . ForceFire ( ) ;
141
191
142
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
192
+ AssertToolTipOpen ( target ) ;
143
193
}
144
194
}
145
195
@@ -188,6 +238,7 @@ public void Setting_IsOpen_Should_Add_Open_Class()
188
238
ToolTip . SetIsOpen ( decorator , true ) ;
189
239
190
240
Assert . Equal ( new [ ] { ":open" } , toolTip . Classes ) ;
241
+ VerifyToolTipType ( decorator ) ;
191
242
}
192
243
}
193
244
@@ -197,8 +248,11 @@ public void Clearing_IsOpen_Should_Remove_Open_Class()
197
248
using ( UnitTestApplication . Start ( ConfigureServices ( TestServices . StyledWindow ) ) )
198
249
{
199
250
var toolTip = new ToolTip ( ) ;
200
- var window = new Window ( ) ;
201
251
252
+ var windowImpl = MockWindowingPlatform . CreateWindowMock ( ) ;
253
+ SetupWindowMock ( windowImpl ) ;
254
+ var window = new Window ( windowImpl . Object ) ;
255
+
202
256
var decorator = new Decorator ( )
203
257
{
204
258
[ ToolTip . TipProperty ] = toolTip
@@ -211,6 +265,7 @@ public void Clearing_IsOpen_Should_Remove_Open_Class()
211
265
window . Presenter . ApplyTemplate ( ) ;
212
266
213
267
ToolTip . SetIsOpen ( decorator , true ) ;
268
+ AssertToolTipOpen ( decorator ) ;
214
269
ToolTip . SetIsOpen ( decorator , false ) ;
215
270
216
271
Assert . Empty ( toolTip . Classes ) ;
@@ -230,7 +285,7 @@ public void Should_Close_On_Null_Tip()
230
285
231
286
SetupWindowAndActivateToolTip ( target ) ;
232
287
233
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
288
+ AssertToolTipOpen ( target ) ;
234
289
235
290
target [ ToolTip . TipProperty ] = null ;
236
291
@@ -253,13 +308,13 @@ public void Should_Not_Close_When_Pointer_Is_Moved_Over_ToolTip()
253
308
254
309
mouseEnter ( target ) ;
255
310
256
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
311
+ AssertToolTipOpen ( target ) ;
257
312
258
313
var tooltip = Assert . IsType < ToolTip > ( target . GetValue ( ToolTip . ToolTipProperty ) ) ;
259
314
260
315
mouseEnter ( tooltip ) ;
261
316
262
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
317
+ AssertToolTipOpen ( target ) ;
263
318
}
264
319
}
265
320
@@ -277,16 +332,16 @@ public void Should_Not_Close_When_Pointer_Is_Moved_From_ToolTip_To_Original_Cont
277
332
var mouseEnter = SetupWindowAndGetMouseEnterAction ( target ) ;
278
333
279
334
mouseEnter ( target ) ;
280
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
335
+ AssertToolTipOpen ( target ) ;
281
336
282
337
var tooltip = Assert . IsType < ToolTip > ( target . GetValue ( ToolTip . ToolTipProperty ) ) ;
283
338
mouseEnter ( tooltip ) ;
284
339
285
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
340
+ AssertToolTipOpen ( target ) ;
286
341
287
342
mouseEnter ( target ) ;
288
343
289
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
344
+ AssertToolTipOpen ( target ) ;
290
345
}
291
346
}
292
347
@@ -311,12 +366,12 @@ public void Should_Close_When_Pointer_Is_Moved_From_ToolTip_To_Another_Control()
311
366
var mouseEnter = SetupWindowAndGetMouseEnterAction ( panel ) ;
312
367
313
368
mouseEnter ( target ) ;
314
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
369
+ AssertToolTipOpen ( target ) ;
315
370
316
371
var tooltip = Assert . IsType < ToolTip > ( target . GetValue ( ToolTip . ToolTipProperty ) ) ;
317
372
mouseEnter ( tooltip ) ;
318
373
319
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
374
+ AssertToolTipOpen ( target ) ;
320
375
321
376
mouseEnter ( other ) ;
322
377
@@ -352,15 +407,15 @@ public void New_ToolTip_Replaces_Other_ToolTip_Immediately()
352
407
Assert . False ( ToolTip . GetIsOpen ( other ) ) ; // long delay
353
408
354
409
mouseEnter ( target ) ;
355
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ; // no delay
410
+ AssertToolTipOpen ( target ) ; // no delay
356
411
357
412
mouseEnter ( other ) ;
358
413
Assert . True ( ToolTip . GetIsOpen ( other ) ) ; // delay skipped, a tooltip was already open
359
414
360
415
// Now disable the between-show system
361
416
362
417
mouseEnter ( target ) ;
363
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
418
+ AssertToolTipOpen ( target ) ;
364
419
365
420
ToolTip . SetBetweenShowDelay ( other , - 1 ) ;
366
421
@@ -389,7 +444,7 @@ public void ToolTip_Events_Order_Is_Defined()
389
444
390
445
SetupWindowAndActivateToolTip ( target ) ;
391
446
392
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
447
+ AssertToolTipOpen ( target ) ;
393
448
394
449
target [ ToolTip . TipProperty ] = null ;
395
450
@@ -442,7 +497,7 @@ public void ToolTip_Can_Be_Replaced_On_The_Fly_Via_Opening_Event()
442
497
443
498
SetupWindowAndActivateToolTip ( target ) ;
444
499
445
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
500
+ AssertToolTipOpen ( target ) ;
446
501
447
502
target [ ToolTip . TipProperty ] = null ;
448
503
@@ -463,7 +518,7 @@ public void Should_Close_When_Pointer_Leaves_Window()
463
518
var mouseEnter = SetupWindowAndGetMouseEnterAction ( target ) ;
464
519
465
520
mouseEnter ( target ) ;
466
- Assert . True ( ToolTip . GetIsOpen ( target ) ) ;
521
+ AssertToolTipOpen ( target ) ;
467
522
468
523
var topLevel = TopLevel . GetTopLevel ( target ) ;
469
524
topLevel . PlatformImpl . Input ( new RawPointerEventArgs ( s_mouseDevice , ( ulong ) DateTime . Now . Ticks , topLevel ,
@@ -476,6 +531,8 @@ public void Should_Close_When_Pointer_Leaves_Window()
476
531
private Action < Control > SetupWindowAndGetMouseEnterAction ( Control windowContent , [ CallerMemberName ] string testName = null )
477
532
{
478
533
var windowImpl = MockWindowingPlatform . CreateWindowMock ( ) ;
534
+ SetupWindowMock ( windowImpl ) ;
535
+
479
536
var hitTesterMock = new Mock < IHitTester > ( ) ;
480
537
481
538
var window = new Window ( windowImpl . Object )
0 commit comments