úÎ5’1*A      !"#$%&'()*+,-./0123456789:;<=>?@Safe $;=>?V*Tests are values of type Test a, and  forms a monad with access to:repeatable randomness (the  and F functions for random and bounded random values, or handy specialized , , , , etc) I/O (via A or  , which is an alias for A) failure (via !, which yields a stack trace, or B, which does not) logging (via  ,  , or  ),hierarchically-named subcomputations (under  ') which can be switched on and off via parallelism (via )conjunction of tests via C (the Dd operation runs both tests, even if the first test fails, and the tests function used above is just E).5Using any or all of these capabilities, you assemble * values into a "test suite" (just another s value) using ordinary Haskell code, not framework magic. Notice that to generate a list of random values, we just F and G as usual. Status of a test%Record a failure at the current scopeHLabel a test. Can be nested. A "." is placed between nested scopes, so scope "foo" . scope "bar" is equivalent to scope "foo.bar"H.Prepend the current scope to a logging message Log a messageIThe current scopeJ3Catch all exceptions that could occur in the given      SafeQV%<Generate a random value9Generate a bounded random value. Inclusive on both sides."Generate a random K#Generate a random L$Generate a random M%Generate a random N&Generate a random L in the given range Note: int' 0 5 includes both 0 and 5'Generate a random K in the given range Note: char' a z includes both a and z.(Generate a random M in the given range Note:  double' 0 1 includes both 0 and 1.)Generate a random M in the given range Note:  word' 0 10 includes both 0 and 10.*Generate a random M in the given range Note:  word8' 0 10 includes both 0 and 10.+5Sample uniformly from the given list of possibilities, Alias for F-;Generate a list of lists of the given sizes, an alias for sizes `forM` \n -> listOf n gen. Alias for  liftA2 (,)./ Generate a  Data.Map k v of the given size.0 Generate a [Data.Map k v] of the given sizes. !"#$%&'()*+,-./0Safe.ƒ 1Convenient alias for A6Run a list of testsThis specializes E, , and O.7 A test with a setup and teardown86Run all tests whose scope starts with the given prefix9PRerun all tests with the given seed and whose scope starts with the given prefix: Run all tests;#Rerun all tests with the given seed<Log a showable value=-Record a successful test at the current scope>Explicitly skip this test?=Run a test in a separate thread, not blocking for its result.@[Run a test in a separate thread, return a future which can be used to block on its result.123456789:;<=>?@(c) Joel Burget, 2018MITjoelburget@gmail.com provisionalSafe/ì' !"#$%&'()*+,-./0123456789:;<=>?@'23456789:;<=>?@1 !"#$%&'()*+,-./0P !  "#$%&'()*+,-./0123456789: ;<=>?@ABC DEFGHIGJKGJLGJMGNGOPGQR STUVWUVXUVYUVZG[\#easytest-0.1-9dL3dmNN5pHH8BJgxX8UQOEasyTest.InternalEasyTestrandomrandom'intint'doubledouble'ionote noteScopednote'scoperunOnlyforkEasyTest.GeneratorsEasyTest.Porcelain Data.FoldableasumTestEnvenvRng envMessages envResultsenvNoteenvAllowStatusFailedPassedSkipped combineStatuscrash putResultrunWrap actionAllowed$fMonoidStatus$fSemigroupStatus$fIsString(->)$fMonadPlusTest$fAlternativeTest $fMonadIOTest$fApplicativeTest $fFunctorTest $fMonadTest$fMonadReaderEnvTestboolword8charwordchar'word'word8'picklistOflistsOfpairmapOfmapsOfexpect expectJust expectRightexpectEqtestsusing rerunOnlyrunrerunokskipfork'baseControl.Monad.IO.ClassliftIOGHC.Basefail MonadPlus<|>msum Control.Monad replicateMData.TraversableforM currentScopewrapghc-prim GHC.TypesCharIntDoubleWord sequence_