@@ -197,6 +197,194 @@ void main() {
197197 );
198198 });
199199 });
200+
201+ testWidgets ('allowClear properly clears value' , (
202+ WidgetTester tester,
203+ ) async {
204+ const widgetName = 'fdtp_clear' ;
205+ final widgetKey = UniqueKey ();
206+ final initialDate = DateTime (2023 , 1 , 1 );
207+
208+ final testWidget = FormBuilderDateTimePicker (
209+ key: widgetKey,
210+ name: widgetName,
211+ initialValue: initialDate,
212+ allowClear: true ,
213+ );
214+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
215+
216+ expect (formInstantValue (widgetName), initialDate);
217+ expect (find.byIcon (Icons .clear), findsOneWidget);
218+
219+ await tester.tap (find.byIcon (Icons .clear));
220+ await tester.pumpAndSettle ();
221+
222+ expect (formInstantValue (widgetName), isNull);
223+ expect (find.byIcon (Icons .clear), findsNothing);
224+ });
225+
226+ testWidgets ('custom clearIcon is rendered' , (WidgetTester tester) async {
227+ const widgetName = 'fdtp_custom_clear' ;
228+ final initialDate = DateTime (2023 , 1 , 1 );
229+ const customIcon = Icons .delete;
230+
231+ final testWidget = FormBuilderDateTimePicker (
232+ name: widgetName,
233+ initialValue: initialDate,
234+ allowClear: true ,
235+ clearIcon: const Icon (customIcon),
236+ );
237+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
238+
239+ expect (find.byIcon (customIcon), findsOneWidget);
240+ expect (find.byIcon (Icons .clear), findsNothing);
241+ });
242+
243+ testWidgets ('InputType.date returns midnight time' , (
244+ WidgetTester tester,
245+ ) async {
246+ const widgetName = 'fdtp_date_only' ;
247+ final widgetKey = UniqueKey ();
248+ final dateNow = DateTime .now ();
249+ const confirmText = 'OK' ;
250+
251+ final testWidget = FormBuilderDateTimePicker (
252+ key: widgetKey,
253+ name: widgetName,
254+ inputType: InputType .date,
255+ confirmText: confirmText,
256+ );
257+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
258+
259+ await tester.tap (find.byKey (widgetKey));
260+ await tester.pumpAndSettle ();
261+
262+ final testDay = dateNow.day - 1 <= 0 ? dateNow.day + 1 : dateNow.day - 1 ;
263+ await tester.tap (find.text (testDay.toString ()));
264+ await tester.pumpAndSettle ();
265+ await tester.tap (find.text (confirmText));
266+ await tester.pumpAndSettle ();
267+
268+ expect (formSave (), isTrue);
269+ expect (
270+ formValue <DateTime >(widgetName),
271+ DateTime (dateNow.year, dateNow.month, testDay),
272+ );
273+ });
274+
275+ testWidgets ('InputType.time returns DateTime(1, 1, 1) with time' , (
276+ WidgetTester tester,
277+ ) async {
278+ const widgetName = 'fdtp_time_only' ;
279+ final widgetKey = UniqueKey ();
280+ const confirmText = 'OK' ;
281+
282+ final testWidget = FormBuilderDateTimePicker (
283+ key: widgetKey,
284+ name: widgetName,
285+ inputType: InputType .time,
286+ confirmText: confirmText,
287+ );
288+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
289+
290+ await tester.tap (find.byKey (widgetKey));
291+ await tester.pumpAndSettle ();
292+
293+ await tester.tap (find.text (confirmText));
294+ await tester.pumpAndSettle ();
295+
296+ expect (formSave (), isTrue);
297+ final value = formValue <DateTime >(widgetName);
298+ expect (value.year, 1 );
299+ expect (value.month, 1 );
300+ expect (value.day, 1 );
301+ expect (value.hour, 12 ); // Default initialTime is 12:00
302+ expect (value.minute, 0 );
303+ });
304+
305+ testWidgets ('onChanged is called when value changes' , (
306+ WidgetTester tester,
307+ ) async {
308+ const widgetName = 'fdtp_onChanged' ;
309+ int changedCount = 0 ;
310+ DateTime ? valueFromOnChanged;
311+
312+ final testWidget = FormBuilderDateTimePicker (
313+ name: widgetName,
314+ allowClear: true ,
315+ initialValue: DateTime (2023 , 1 , 1 ),
316+ onChanged: (val) {
317+ changedCount++ ;
318+ valueFromOnChanged = val;
319+ },
320+ );
321+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
322+
323+ await tester.tap (find.byIcon (Icons .clear));
324+ await tester.pumpAndSettle ();
325+
326+ expect (changedCount, 1 );
327+ expect (valueFromOnChanged, isNull);
328+ });
329+
330+ testWidgets ('reset() reverts value to initialValue' , (
331+ WidgetTester tester,
332+ ) async {
333+ const widgetName = 'fdtp_reset' ;
334+ final initialDate = DateTime (2023 , 1 , 1 );
335+
336+ final testWidget = FormBuilderDateTimePicker (
337+ name: widgetName,
338+ initialValue: initialDate,
339+ allowClear: true ,
340+ );
341+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
342+
343+ await tester.tap (find.byIcon (Icons .clear));
344+ await tester.pumpAndSettle ();
345+ expect (formInstantValue (widgetName), isNull);
346+
347+ formKey.currentState! .fields[widgetName]! .reset ();
348+ await tester.pumpAndSettle ();
349+
350+ expect (formInstantValue (widgetName), initialDate);
351+ });
352+
353+ testWidgets ('initialTime is respected for InputType.both' , (
354+ WidgetTester tester,
355+ ) async {
356+ const widgetName = 'fdtp_initialTime' ;
357+ final widgetKey = UniqueKey ();
358+ const confirmText = 'OK' ;
359+ final initialTime = const TimeOfDay (hour: 15 , minute: 30 );
360+
361+ final testWidget = FormBuilderDateTimePicker (
362+ key: widgetKey,
363+ name: widgetName,
364+ inputType: InputType .both,
365+ confirmText: confirmText,
366+ initialTime: initialTime,
367+ );
368+ await tester.pumpWidget (buildTestableFieldWidget (testWidget));
369+
370+ await tester.tap (find.byKey (widgetKey));
371+ await tester.pumpAndSettle ();
372+
373+ // Date picker OK
374+ await tester.tap (find.text (DateTime .now ().day.toString ()));
375+ await tester.pumpAndSettle ();
376+ await tester.tap (find.text (confirmText));
377+ await tester.pumpAndSettle ();
378+
379+ // Time picker should show 15:30.
380+ await tester.tap (find.text (confirmText));
381+ await tester.pumpAndSettle ();
382+
383+ expect (formSave (), isTrue);
384+ final value = formValue <DateTime >(widgetName);
385+ expect (value.hour, 15 );
386+ expect (value.minute, 30 );
387+ });
200388 });
201389
202390 testWidgets ('When press tab, field will be focused' , (
0 commit comments