123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220moduleFfi=Hegel_ffi.Ffitypehealth_check=|Filter_too_much|Too_slow|Test_cases_too_large|Large_initial_test_caselethealth_check_to_string=function|Filter_too_much->"filter_too_much"|Too_slow->"too_slow"|Test_cases_too_large->"test_cases_too_large"|Large_initial_test_case->"large_initial_test_case";;typeverbosity=|Quiet|Normal|Verbose|Debugtypedatabase=|Unset|Disabled|Pathofstringtypebackend=|Default|UrandommoduleNondeterminism_strictness=structtypet=|Quiet|Warn|Errorendtypephase=|Explicit|Reuse|Generate|Target|Shrinkletphase_to_string=function|Explicit->"explicit"|Reuse->"reuse"|Generate->"generate"|Target->"target"|Shrink->"shrink";;typet={test_cases:int;verbosity:verbosity;seed:intoption;derandomize:bool;database:database;suppress_health_check:health_checklist;phases:phaselist;print_blob:bool;report_multiple_failures:bool;show_statistics:bool;backend:backend;nondeterminism_strictness:Nondeterminism_strictness.t}(* ------------------------------------------------------------------ *)(* Translation to and from an engine settings handle *)(* ------------------------------------------------------------------ *)letffi_verbosity=function|Quiet->Ffi.Quiet|Normal->Ffi.Normal|Verbose->Ffi.Verbose|Debug->Ffi.Debug;;letffi_backend=function|Default->Ffi.Default|Urandom->Ffi.Urandom;;letbackend_of_ffi=function|Ffi.Default->Default|Ffi.Urandom->Urandom;;letffi_nondeterminism_strictness:Nondeterminism_strictness.t->_=function|Quiet->Ffi.Nondeterminism_quiet|Warn->Ffi.Nondeterminism_warn|Error->Ffi.Nondeterminism_error;;letnondeterminism_strictness_of_ffi:_->Nondeterminism_strictness.t=function|Ffi.Nondeterminism_quiet->Quiet|Ffi.Nondeterminism_warn->Warn|Ffi.Nondeterminism_error->Error;;letverbosity_of_ffi=function|Ffi.Quiet->Quiet|Ffi.Normal->Normal|Ffi.Verbose->Verbose|Ffi.Debug->Debug;;letall_phases=[Explicit;Reuse;Generate;Target;Shrink]letphase_bit=function|Explicit->Ffi.phase_explicit|Reuse->Ffi.phase_reuse|Generate->Ffi.phase_generate|Target->Ffi.phase_target|Shrink->Ffi.phase_shrink;;letall_health_checks=[Filter_too_much;Too_slow;Test_cases_too_large;Large_initial_test_case];;lethealth_check_bit=function|Filter_too_much->Ffi.hc_filter_too_much|Too_slow->Ffi.hc_too_slow|Test_cases_too_large->Ffi.hc_test_cases_too_large|Large_initial_test_case->Ffi.hc_large_initial_test_case;;letbitmaskbit_ofitems=List.fold_left(funaccx->acclorbit_ofx)0itemsletof_bitmaskbit_ofallmask=List.filter(funx->masklandbit_ofx<>0)allletof_ffictxs={test_cases=Ffi.settings_get_test_casesctxs;verbosity=verbosity_of_ffi(Ffi.settings_get_verbosityctxs);seed=Ffi.settings_get_seedctxs;derandomize=Ffi.settings_get_derandomizectxs;database=(matchFfi.settings_get_databasectxswith|None->Unset|Some""->Disabled|Somedir->Pathdir);suppress_health_check=of_bitmaskhealth_check_bitall_health_checks(Ffi.settings_get_suppress_health_checkctxs);phases=of_bitmaskphase_bitall_phases(Ffi.settings_get_phasesctxs);print_blob=Ffi.settings_get_print_blobctxs;report_multiple_failures=Ffi.settings_get_report_multiple_failuresctxs;show_statistics=Ffi.settings_get_show_statisticsctxs;backend=backend_of_ffi(Ffi.settings_get_backendctxs);nondeterminism_strictness=nondeterminism_strictness_of_ffi(Ffi.settings_get_nondeterminism_strictnessctxs)};;letto_ffictxt~database_key=lets=Ffi.settings_newctxinFfi.settings_test_casesctxst.test_cases;Ffi.settings_verbosityctxs(ffi_verbosityt.verbosity);Ffi.settings_seedctxst.seed;Ffi.settings_derandomizectxst.derandomize;Ffi.settings_report_multiple_failuresctxst.report_multiple_failures;Ffi.settings_show_statisticsctxst.show_statistics;Ffi.settings_backendctxs(ffi_backendt.backend);Ffi.settings_nondeterminism_strictnessctxs(ffi_nondeterminism_strictnesst.nondeterminism_strictness);Ffi.settings_print_blobctxst.print_blob;Ffi.settings_databasectxs(matcht.databasewith|Unset->None|Disabled->Some""|Pathp->Somep);Option.iter(funk->Ffi.settings_database_keyctxs(Somek))database_key;Ffi.settings_phasesctxs(bitmaskphase_bitt.phases);Ffi.settings_suppress_health_checkctxs(bitmaskhealth_check_bitt.suppress_health_check);s;;(* ------------------------------------------------------------------ *)(* Profiles *)(* ------------------------------------------------------------------ *)letwith_contextf=letctx=Ffi.context_new()inFun.protect~finally:(fun()->Ffi.context_freectx)(fun()->fctx);;letfrom_profilename=with_context(functx->lets=Ffi.settings_new_for_profilectxnameinFun.protect~finally:(fun()->Ffi.settings_freectxs)(fun()->of_ffictxs));;letdefault()=from_profile"default"letcreate?test_cases?seed()=lets=default()inlets=Option.fold~none:s~some:(funtest_cases->{swithtest_cases})test_casesinOption.fold~none:s~some:(funv->{swithseed=Somev})seed;;letregister_profilenamet=with_context(functx->lets=to_ffictxt~database_key:NoneinFun.protect~finally:(fun()->Ffi.settings_freectxs)(fun()->Ffi.settings_register_profilectxnames));;letset_default_profilename=with_context(functx->Ffi.set_default_profilectxname)