@@ -318,6 +318,270 @@ procedure Test_Try is
318318 " Try_Option_With_Param returns None when action raises" );
319319 end Test_Try_Option_With_Param_Exception ;
320320
321+ -- ==========================================================================
322+ -- Test: Try_To_Result (base generic) - success path
323+ -- ==========================================================================
324+
325+ procedure Test_Try_To_Result_Success is
326+ function Get_Value return Integer is (42 );
327+
328+ function To_Error (Exc : Exception_Occurrence) return Error is
329+ Msg : constant String := Exception_Message (Exc);
330+ begin
331+ return
332+ (Exception_Error, Msg & [Msg'Length + 1 .. 100 => ' ' ], Msg'Length);
333+ end To_Error ;
334+
335+ function Try_Get is new Functional.Try.Try_To_Result
336+ (T => Integer,
337+ E => Error,
338+ Result_Type => Int_Result.Result,
339+ Ok => Int_Result.Ok,
340+ New_Error => Int_Result.New_Error,
341+ Map_Exception => To_Error,
342+ Action => Get_Value);
343+
344+ Result : constant Int_Result.Result := Try_Get;
345+ begin
346+ Put_Line (" Testing Try_To_Result (success)..." );
347+ Assert
348+ (Int_Result.Is_Ok (Result), " Try_To_Result returns Ok for success" );
349+ Assert
350+ (Int_Result.Value (Result) = 42 , " Try_To_Result returns correct value" );
351+ end Test_Try_To_Result_Success ;
352+
353+ -- ==========================================================================
354+ -- Test: Try_To_Result (base generic) - exception path
355+ -- ==========================================================================
356+
357+ procedure Test_Try_To_Result_Exception is
358+ function Raise_Error return Integer is
359+ begin
360+ raise Program_Error with " deliberate error" ;
361+ return 0 ; -- Unreachable, satisfies compiler
362+ end Raise_Error ;
363+
364+ function To_Error (Exc : Exception_Occurrence) return Error is
365+ Msg : constant String := Exception_Message (Exc);
366+ begin
367+ return
368+ (Exception_Error, Msg & [Msg'Length + 1 .. 100 => ' ' ], Msg'Length);
369+ end To_Error ;
370+
371+ function Try_Raise is new Functional.Try.Try_To_Result
372+ (T => Integer,
373+ E => Error,
374+ Result_Type => Int_Result.Result,
375+ Ok => Int_Result.Ok,
376+ New_Error => Int_Result.New_Error,
377+ Map_Exception => To_Error,
378+ Action => Raise_Error);
379+
380+ Result : constant Int_Result.Result := Try_Raise;
381+ Err : Error;
382+ begin
383+ Put_Line (" Testing Try_To_Result (exception)..." );
384+ Assert
385+ (Int_Result.Is_Error (Result),
386+ " Try_To_Result returns Error when action raises" );
387+
388+ Err := Int_Result.Error (Result);
389+ Assert
390+ (Err.Message (1 .. 16 ) = " deliberate error" ,
391+ " Try_To_Result preserves exception message" );
392+ end Test_Try_To_Result_Exception ;
393+
394+ -- ==========================================================================
395+ -- Test: Try_To_Any_Result_With_Param - success path
396+ -- ==========================================================================
397+
398+ procedure Test_Try_To_Any_Result_With_Param_Success is
399+ function Parse_String (S : String) return Integer is
400+ begin
401+ return Integer'Value (S);
402+ end Parse_String ;
403+
404+ function To_Error (Exc : Exception_Occurrence) return Error is
405+ Msg : constant String := Exception_Message (Exc);
406+ begin
407+ return
408+ (Exception_Error, Msg & [Msg'Length + 1 .. 100 => ' ' ], Msg'Length);
409+ end To_Error ;
410+
411+ function Try_Parse is new Functional.Try.Try_To_Any_Result_With_Param
412+ (T => Integer,
413+ E => Error,
414+ Param => String,
415+ Result_Type => Int_Result.Result,
416+ Ok => Int_Result.Ok,
417+ New_Error => Int_Result.New_Error,
418+ Map_Exception => To_Error,
419+ Action => Parse_String);
420+
421+ Result : constant Int_Result.Result := Try_Parse (" 123" );
422+ begin
423+ Put_Line (" Testing Try_To_Any_Result_With_Param (success)..." );
424+ Assert
425+ (Int_Result.Is_Ok (Result),
426+ " Try_To_Any_Result_With_Param returns Ok for success" );
427+ Assert
428+ (Int_Result.Value (Result) = 123 ,
429+ " Try_To_Any_Result_With_Param returns correct value" );
430+ end Test_Try_To_Any_Result_With_Param_Success ;
431+
432+ -- ==========================================================================
433+ -- Test: Try_To_Any_Result_With_Param - exception path
434+ -- ==========================================================================
435+
436+ procedure Test_Try_To_Any_Result_With_Param_Exception is
437+ function Parse_String (S : String) return Integer is
438+ begin
439+ return Integer'Value (S);
440+ end Parse_String ;
441+
442+ function To_Error (Exc : Exception_Occurrence) return Error is
443+ Msg : constant String := Exception_Message (Exc);
444+ begin
445+ return
446+ (Exception_Error, Msg & [Msg'Length + 1 .. 100 => ' ' ], Msg'Length);
447+ end To_Error ;
448+
449+ function Try_Parse is new Functional.Try.Try_To_Any_Result_With_Param
450+ (T => Integer,
451+ E => Error,
452+ Param => String,
453+ Result_Type => Int_Result.Result,
454+ Ok => Int_Result.Ok,
455+ New_Error => Int_Result.New_Error,
456+ Map_Exception => To_Error,
457+ Action => Parse_String);
458+
459+ Result : constant Int_Result.Result := Try_Parse (" invalid" );
460+ begin
461+ Put_Line (" Testing Try_To_Any_Result_With_Param (exception)..." );
462+ Assert
463+ (Int_Result.Is_Error (Result),
464+ " Try_To_Any_Result_With_Param returns Error when action raises" );
465+ end Test_Try_To_Any_Result_With_Param_Exception ;
466+
467+ -- ==========================================================================
468+ -- Test: Try_To_Functional_Result - success path
469+ -- ==========================================================================
470+
471+ procedure Test_Try_To_Functional_Result_Success is
472+ function Get_Value return Integer is (99 );
473+
474+ function To_Error (Exc : Exception_Occurrence) return Error is
475+ Msg : constant String := Exception_Message (Exc);
476+ begin
477+ return
478+ (Exception_Error, Msg & [Msg'Length + 1 .. 100 => ' ' ], Msg'Length);
479+ end To_Error ;
480+
481+ function Try_Get is new Functional.Try.Try_To_Functional_Result
482+ (T => Integer,
483+ E => Error,
484+ Result_Pkg => Int_Result,
485+ Map_Exception => To_Error,
486+ Action => Get_Value);
487+
488+ Result : constant Int_Result.Result := Try_Get;
489+ begin
490+ Put_Line (" Testing Try_To_Functional_Result (success)..." );
491+ Assert
492+ (Int_Result.Is_Ok (Result),
493+ " Try_To_Functional_Result returns Ok for success" );
494+ Assert
495+ (Int_Result.Value (Result) = 99 ,
496+ " Try_To_Functional_Result returns correct value" );
497+ end Test_Try_To_Functional_Result_Success ;
498+
499+ -- ==========================================================================
500+ -- Test: Try_To_Functional_Result - exception path
501+ -- ==========================================================================
502+
503+ procedure Test_Try_To_Functional_Result_Exception is
504+ function Raise_Error return Integer is
505+ begin
506+ raise Storage_Error with " out of memory" ;
507+ return 0 ; -- Unreachable, satisfies compiler
508+ end Raise_Error ;
509+
510+ function To_Error (Exc : Exception_Occurrence) return Error is
511+ Msg : constant String := Exception_Message (Exc);
512+ begin
513+ return
514+ (Exception_Error, Msg & [Msg'Length + 1 .. 100 => ' ' ], Msg'Length);
515+ end To_Error ;
516+
517+ function Try_Raise is new Functional.Try.Try_To_Functional_Result
518+ (T => Integer,
519+ E => Error,
520+ Result_Pkg => Int_Result,
521+ Map_Exception => To_Error,
522+ Action => Raise_Error);
523+
524+ Result : constant Int_Result.Result := Try_Raise;
525+ Err : Error;
526+ begin
527+ Put_Line (" Testing Try_To_Functional_Result (exception)..." );
528+ Assert
529+ (Int_Result.Is_Error (Result),
530+ " Try_To_Functional_Result returns Error when action raises" );
531+
532+ Err := Int_Result.Error (Result);
533+ Assert
534+ (Err.Message (1 .. 13 ) = " out of memory" ,
535+ " Try_To_Functional_Result preserves exception message" );
536+ end Test_Try_To_Functional_Result_Exception ;
537+
538+ -- ==========================================================================
539+ -- Test: Try_To_Functional_Option - success path
540+ -- ==========================================================================
541+
542+ procedure Test_Try_To_Functional_Option_Success is
543+ function Get_Value return Integer is (77 );
544+
545+ function Try_Get is new Functional.Try.Try_To_Functional_Option
546+ (T => Integer,
547+ Option_Pkg => Int_Option,
548+ Action => Get_Value);
549+
550+ Result : constant Int_Option.Option := Try_Get;
551+ begin
552+ Put_Line (" Testing Try_To_Functional_Option (success)..." );
553+ Assert
554+ (Int_Option.Is_Some (Result),
555+ " Try_To_Functional_Option returns Some for success" );
556+ Assert
557+ (Int_Option.Value (Result) = 77 ,
558+ " Try_To_Functional_Option returns correct value" );
559+ end Test_Try_To_Functional_Option_Success ;
560+
561+ -- ==========================================================================
562+ -- Test: Try_To_Functional_Option - exception path
563+ -- ==========================================================================
564+
565+ procedure Test_Try_To_Functional_Option_Exception is
566+ function Raise_Error return Integer is
567+ begin
568+ raise Tasking_Error with " task failed" ;
569+ return 0 ; -- Unreachable, satisfies compiler
570+ end Raise_Error ;
571+
572+ function Try_Raise is new Functional.Try.Try_To_Functional_Option
573+ (T => Integer,
574+ Option_Pkg => Int_Option,
575+ Action => Raise_Error);
576+
577+ Result : constant Int_Option.Option := Try_Raise;
578+ begin
579+ Put_Line (" Testing Try_To_Functional_Option (exception)..." );
580+ Assert
581+ (Int_Option.Is_None (Result),
582+ " Try_To_Functional_Option returns None when action raises" );
583+ end Test_Try_To_Functional_Option_Exception ;
584+
321585begin
322586 Put_Line (" ======================================" );
323587 Put_Line (" Functional.Try.To_Result Tests" );
@@ -334,6 +598,16 @@ begin
334598 Test_Try_Option_With_Param_Success;
335599 Test_Try_Option_With_Param_Exception;
336600
601+ -- Tests for previously uncovered functions in Functional.Try
602+ Test_Try_To_Result_Success;
603+ Test_Try_To_Result_Exception;
604+ Test_Try_To_Any_Result_With_Param_Success;
605+ Test_Try_To_Any_Result_With_Param_Exception;
606+ Test_Try_To_Functional_Result_Success;
607+ Test_Try_To_Functional_Result_Exception;
608+ Test_Try_To_Functional_Option_Success;
609+ Test_Try_To_Functional_Option_Exception;
610+
337611 New_Line;
338612 Put_Line (" ======================================" );
339613 Put_Line
0 commit comments