Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file test.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134open!BaseincludeTest_intfmoduleConfig=structmoduleSeed=structtypet=|Nondeterministic|Deterministicofstring[@@derivingsexp_of]endmodulePotentially_infinite_sequence=structtype'at='aSequence.tletsexp_of_tsexp_of_eltsequence=letprefix,suffix=Sequence.split_nsequence100inletprefix=List.mapprefix~f:sexp_of_eltinletsuffix=matchSequence.is_emptysuffixwith|true->[]|false->[[%message"..."]]inSexp.List(prefix@suffix);;endtypet={seed:Seed.t;test_count:int;shrink_count:int;sizes:intPotentially_infinite_sequence.t}[@@derivingfields,sexp_of]endletdefault_config:Config.t={seed=Deterministic"an arbitrary but deterministic string";test_count=10_000;shrink_count=10_000;sizes=Sequence.cycle_list_exn(List.range0~start:`inclusive30~stop:`inclusive)};;letlazy_nondeterministic_state=lazy(Random.State.make_self_init())letinitial_random_state~config=matchConfig.seedconfigwith|Nondeterministic->Splittable_random.State.create(forcelazy_nondeterministic_state)|Deterministicstring->Splittable_random.State.of_int(String.hashstring);;letone_size_per_test~(config:Config.t)=Sequence.unfold~init:(config.sizes,0)~f:(fun(sizes,number_of_size_values)->matchnumber_of_size_values>=config.test_countwith|true->None|false->(matchSequence.nextsizeswith|Some(size,remaining_sizes)->Some(size,(remaining_sizes,number_of_size_values+1))|None->raise_s[%message"Base_quickcheck.Test.run: insufficient size values for test count"~test_count:(config.test_count:int)(number_of_size_values:int)]));;letshrink_error~shrinker~config~finputerror=letrecloop~shrink_count~alternatesinputerror=matchshrink_countwith|0->input,error|_->letshrink_count=shrink_count-1in(matchSequence.nextalternateswith|None->input,error|Some(alternate,alternates)->(matchOr_error.try_with_join(fun()->falternate)with|Ok()->loop~shrink_count~alternatesinputerror|Errorerror->letalternates=Shrinker.shrinkshrinkeralternateinloop~shrink_count~alternatesalternateerror))inletshrink_count=Config.shrink_countconfiginletalternates=Shrinker.shrinkshrinkerinputinloop~shrink_count~alternatesinputerror;;letinput_sequence~config~examples~generator=letrandom=initial_random_state~configinSequence.append(Sequence.of_listexamples)(one_size_per_test~config|>Sequence.map~f:(funsize->Generator.generategenerator~size~random));;letwith_sample~f?(config=default_config)?(examples=[])generator=letsequence=input_sequence~config~examples~generatorinOr_error.try_with_join(fun()->fsequence);;letrun(typea)~f?(config=default_config)?(examples=[])m=let(moduleM:Swithtypet=a)=minwith_sampleM.quickcheck_generator~config~examples~f:(funsequence->matchSequence.fold_resultsequence~init:()~f:(fun()input->matchOr_error.try_with_join~backtrace:(Backtrace.Exn.am_recording())(fun()->finput)with|Ok()->Ok()|Errorerror->Error(input,error))with|Ok()->Ok()|Error(input,error)->letshrinker=M.quickcheck_shrinkerinletinput,error=shrink_error~shrinker~config~finputerrorinOr_error.error_s[%message"Base_quickcheck.Test.run: test failed"(input:M.t)(error:Error.t)]);;letwith_sample_exn~f?config?examplesgenerator=letfx=Or_error.try_with(fun()->fx)inwith_sample~f?config?examplesgenerator|>Or_error.ok_exn;;letrun_exn~f?config?examplestestable=letfx=Or_error.try_with~backtrace:(Backtrace.Exn.am_recording())(fun()->fx)inrun~f?config?examplestestable|>Or_error.ok_exn;;