1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Globalization ;
4
+ using System . Windows ;
5
+ using System . Windows . Controls ;
6
+ using System . Windows . Markup ;
7
+ using Xunit ;
8
+
9
+ namespace MaterialDesignThemes . Wpf . Tests
10
+ {
11
+ public class TimePickerUnitTests
12
+ {
13
+ private readonly TimePicker _timePicker ;
14
+
15
+ public TimePickerUnitTests ( )
16
+ {
17
+ _timePicker = new TimePicker ( ) ;
18
+ _timePicker . ApplyDefaultStyle ( ) ;
19
+ }
20
+
21
+ [ StaTheory ]
22
+ [ MemberData ( nameof ( GetDisplaysExpectedTextData ) ) ]
23
+ public void DisplaysExpectedText ( CultureInfo culture , DatePickerFormat format , bool is24Hour , bool withSeconds ,
24
+ DateTime ? selectedTime , string expectedText )
25
+ {
26
+ _timePicker . Language = XmlLanguage . GetLanguage ( culture . IetfLanguageTag ) ;
27
+ _timePicker . SelectedTimeFormat = format ;
28
+ _timePicker . Is24Hours = is24Hour ;
29
+ _timePicker . WithSeconds = withSeconds ;
30
+ _timePicker . SelectedTime = selectedTime ;
31
+
32
+
33
+ string currentTestString = $ "{ culture . ThreeLetterISOLanguageName } { ( is24Hour ? "24 Hour" : "12 Hour" ) } { format } format { ( withSeconds ? "with seconds" : "" ) } ";
34
+ Assert . True ( expectedText == _timePicker . Text , $ "Expected '{ expectedText } ' but was '{ _timePicker . Text } ' - { currentTestString } ") ;
35
+ }
36
+
37
+ [ StaTheory ]
38
+ [ MemberData ( nameof ( GetParseLocalizedTimeStringData ) ) ]
39
+ public void CanParseLocalizedTimeString ( CultureInfo culture , DatePickerFormat format , bool is24Hour , bool withSeconds ,
40
+ string timeString , DateTime ? expectedTime )
41
+ {
42
+ _timePicker . Language = XmlLanguage . GetLanguage ( culture . IetfLanguageTag ) ;
43
+ _timePicker . SelectedTimeFormat = format ;
44
+ _timePicker . Is24Hours = is24Hour ;
45
+ _timePicker . WithSeconds = withSeconds ;
46
+
47
+ var textBox = _timePicker . FindVisualChild < TextBox > ( TimePicker . TextBoxPartName ) ;
48
+ textBox . Text = timeString ;
49
+ textBox . RaiseEvent ( new RoutedEventArgs ( UIElement . LostFocusEvent ) ) ;
50
+
51
+ string currentTestString = $ "{ culture . ThreeLetterISOLanguageName } { ( is24Hour ? "24 Hour" : "12 Hour" ) } { format } format { ( withSeconds ? "with seconds" : "" ) } ";
52
+ Assert . True ( expectedTime == _timePicker . SelectedTime , $ "Expected '{ expectedTime } ' but was '{ _timePicker . SelectedTime } ' - { currentTestString } ") ;
53
+ }
54
+
55
+ public static IEnumerable < object [ ] > GetParseLocalizedTimeStringData ( )
56
+ {
57
+ //for now just using the same set of data to make sure we can go both directions.
58
+ foreach ( object [ ] data in GetDisplaysExpectedTextData ( ) )
59
+ {
60
+ var culture = ( CultureInfo ) data [ 0 ] ;
61
+ bool is24Hour = ( bool ) data [ 2 ] ;
62
+ var withSeconds = ( bool ) data [ 3 ] ;
63
+ var date = ( DateTime ) data [ 4 ] ;
64
+ var timeString = ( string ) data [ 5 ] ;
65
+
66
+ //Convert the date to Today
67
+ date = DateTime . Today . AddHours ( date . Hour ) . AddMinutes ( date . Minute ) . AddSeconds ( withSeconds ? date . Second : 0 ) ;
68
+
69
+ if ( ! is24Hour && date . Hour > 12 &&
70
+ ( string . IsNullOrEmpty ( culture . DateTimeFormat . AMDesignator ) ||
71
+ string . IsNullOrEmpty ( culture . DateTimeFormat . PMDesignator ) ) )
72
+ {
73
+ //Because there is no AM/PM designator, 12 hour times will be treated as AM
74
+ date = date . AddHours ( - 12 ) ;
75
+ }
76
+
77
+ //Invert the order of the parameters.
78
+ data [ 5 ] = date ;
79
+ data [ 4 ] = timeString ;
80
+
81
+
82
+ yield return data ;
83
+ }
84
+ }
85
+
86
+ public static IEnumerable < object [ ] > GetDisplaysExpectedTextData ( )
87
+ {
88
+ //AM intentionally picks values with only a single digit to verify the DatePickerFormat is applied
89
+ var am = new DateTime ( 2000 , 1 , 1 , 3 , 5 , 9 ) ;
90
+ //PM intentionally picks two digit values greater than 12 to ensure the 24 hour format is applied
91
+ var pm = new DateTime ( 2000 , 1 , 1 , 16 , 30 , 25 ) ;
92
+
93
+ //Invariant culture
94
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( CultureInfo . InvariantCulture , am ,
95
+ "3:05 AM" , "3:05:09 AM" , //12 hour short
96
+ "03:05 AM" , "03:05:09 AM" , //12 hour long
97
+ "3:05" , "3:05:09" , //24 hour short
98
+ "03:05" , "03:05:09" ) ) //24 hour long
99
+ {
100
+ yield return data ;
101
+ }
102
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( CultureInfo . InvariantCulture , pm ,
103
+ "4:30 PM" , "4:30:25 PM" , //12 hour short
104
+ "04:30 PM" , "04:30:25 PM" , //12 hour long
105
+ "16:30" , "16:30:25" , //24 hour short
106
+ "16:30" , "16:30:25" ) ) //24 hour long
107
+ {
108
+ yield return data ;
109
+ }
110
+
111
+ //US English
112
+ var usEnglish = CultureInfo . GetCultureInfo ( "en-US" ) ;
113
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( usEnglish , am ,
114
+ "3:05 AM" , "3:05:09 AM" , //12 hour short
115
+ "03:05 AM" , "03:05:09 AM" , //12 hour long
116
+ "3:05" , "3:05:09" , //24 hour short
117
+ "03:05" , "03:05:09" ) ) //24 hour long
118
+ {
119
+ yield return data ;
120
+ }
121
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( usEnglish , pm ,
122
+ "4:30 PM" , "4:30:25 PM" , //12 hour short
123
+ "04:30 PM" , "04:30:25 PM" , //12 hour long
124
+ "16:30" , "16:30:25" , //24 hour short
125
+ "16:30" , "16:30:25" ) ) //24 hour long
126
+ {
127
+ yield return data ;
128
+ }
129
+
130
+ //Spain Spanish
131
+ var spainSpanish = CultureInfo . GetCultureInfo ( "es-ES" ) ;
132
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( spainSpanish , am ,
133
+ "3:05" , "3:05:09" , //12 hour short
134
+ "03:05" , "03:05:09" , //12 hour long
135
+ "3:05" , "3:05:09" , //24 hour short
136
+ "03:05" , "03:05:09" ) ) //24 hour long
137
+ {
138
+ yield return data ;
139
+ }
140
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( spainSpanish , pm ,
141
+ "4:30" , "4:30:25" , //12 hour short
142
+ "04:30" , "04:30:25" , //12 hour long
143
+ "16:30" , "16:30:25" , //24 hour short
144
+ "16:30" , "16:30:25" ) ) //24 hour long
145
+ {
146
+ yield return data ;
147
+ }
148
+
149
+ //Iran Farsi fa-IR
150
+ var iranFarsi = CultureInfo . GetCultureInfo ( "fa-IR" ) ;
151
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( iranFarsi , am ,
152
+ "3:05 ق.ظ" , "3:05:09 ق.ظ" , //12 hour short
153
+ "03:05 ق.ظ" , "03:05:09 ق.ظ" , //12 hour long
154
+ "3:05" , "3:05:09" , //24 hour short
155
+ "03:05" , "03:05:09" ) ) //24 hour long
156
+ {
157
+ yield return data ;
158
+ }
159
+ foreach ( var data in GetDisplaysExpectedTextDataForCulture ( iranFarsi , pm ,
160
+ "4:30 ب.ظ" , "4:30:25 ب.ظ" , //12 hour short
161
+ "04:30 ب.ظ" , "04:30:25 ب.ظ" , //12 hour long
162
+ "16:30" , "16:30:25" , //24 hour short
163
+ "16:30" , "16:30:25" ) ) //24 hour long
164
+ {
165
+ yield return data ;
166
+ }
167
+ }
168
+
169
+ private static IEnumerable < object [ ] > GetDisplaysExpectedTextDataForCulture ( CultureInfo culture ,
170
+ DateTime dateTime ,
171
+ string short12Hour , string short12HourWithSeconds ,
172
+ string long12Hour , string long12HourWithSeconds ,
173
+ string short24Hour , string short24HourWithSeconds ,
174
+ string long24Hour , string long24HourWithSeconds )
175
+ {
176
+ yield return new object [ ]
177
+ {
178
+ culture ,
179
+ DatePickerFormat . Short ,
180
+ false ,
181
+ false ,
182
+ dateTime ,
183
+ short12Hour
184
+ } ;
185
+ yield return new object [ ]
186
+ {
187
+ culture ,
188
+ DatePickerFormat . Short ,
189
+ false ,
190
+ true ,
191
+ dateTime ,
192
+ short12HourWithSeconds
193
+ } ;
194
+ yield return new object [ ]
195
+ {
196
+ culture ,
197
+ DatePickerFormat . Long ,
198
+ false ,
199
+ false ,
200
+ dateTime ,
201
+ long12Hour
202
+ } ;
203
+ yield return new object [ ]
204
+ {
205
+ culture ,
206
+ DatePickerFormat . Long ,
207
+ false ,
208
+ true ,
209
+ dateTime ,
210
+ long12HourWithSeconds
211
+ } ;
212
+ yield return new object [ ]
213
+ {
214
+ culture ,
215
+ DatePickerFormat . Short ,
216
+ true ,
217
+ false ,
218
+ dateTime ,
219
+ short24Hour
220
+ } ;
221
+ yield return new object [ ]
222
+ {
223
+ culture ,
224
+ DatePickerFormat . Short ,
225
+ true ,
226
+ true ,
227
+ dateTime ,
228
+ short24HourWithSeconds
229
+ } ;
230
+ yield return new object [ ]
231
+ {
232
+ culture ,
233
+ DatePickerFormat . Long ,
234
+ true ,
235
+ false ,
236
+ dateTime ,
237
+ long24Hour
238
+ } ;
239
+ yield return new object [ ]
240
+ {
241
+ culture ,
242
+ DatePickerFormat . Long ,
243
+ true ,
244
+ true ,
245
+ dateTime ,
246
+ long24HourWithSeconds
247
+ } ;
248
+ }
249
+ }
250
+ }
0 commit comments