1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859(** Returns a test case with a name *)lettestnamef=(name,f)(** Run all tests and terminate the program with exit code 0 if all tests were successful or 1 if they weren't *)letrun?(title="")tests=Printer.print_head~title();letrecinner=function|[]->[]|(name,func)::rest->letres=func()in(name,res)::innerrestinletresults=innertestsinPrinter.print_test_resultsresults;matchList.find_opt(function|_,TestResult.Failure_->true|_,_->false)resultswith|Some_->exit1|None->exit0(** Expect TestResult to Fail *)letexpect_failure=function|TestResult.Success->TestResult.Failure"expected failure got success"|TestResult.Failure_->TestResult.Success(** Expect input to be true *)letexpect_trueinput=ifinputthenTestResult.SuccesselseTestResult.Failure"expected true, but got false"(** Expect input to be false *)letexpect_falseinput=ifinputthenTestResult.Failure"expected false, but got true"elseTestResult.Success(** Expect option input to have some value *)letexpect_someinput=ifOption.is_someinputthenTestResult.SuccesselseTestResult.Failure"expected Some(...), but got: None"(** Expect option input to have no value *)letexpect_noneinput=ifOption.is_noneinputthenTestResult.SuccesselseTestResult.Failure"expected None, but got: Some(...)"(** Expect result input to be OK *)letexpect_okinput=ifResult.is_okinputthenTestResult.SuccesselseTestResult.Failure"expected Ok(...), but got: Error(...)"(** Expect result input to be an error *)letexpect_errorinput=ifResult.is_errorinputthenTestResult.SuccesselseTestResult.Failure"expected Error(...), but got: Ok(...)"(** Chain multiple test results *)let(>>)ab=matchawith|TestResult.Success->b|TestResult.Failure_->a(** Evaluate a list of results *)letexpect_every=List.fold_left(funaccres->acc>>res)TestResult.Success