úÎ!ÖÆñÑ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š› œ Ÿ  ¡¢£¤¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê ËÌÍÎÏĞSafe &'2=?EUVX*£tastyaThe purpose of this data type is to capture the dictionary corresponding to a particular option.tasty;A set of options. Only one option of each type can be kept.FIf some option has not been explicitly set, the default value is used.tasty+An option is a data type that inhabits the  type class.tasty:The value to use if the option was not supplied explicitlytasty<Try to parse an option value from a string. Consider using  for boolean options and  for numeric options.tastyËThe option name. It is used to form the command line option name, for instance. Therefore, it had better not contain spaces or other fancy characters. It is recommended to use dashes instead of spaces.tastyHThe option description or help string. This can be an arbitrary string.tastyA command-line option parser.‡It has a default implementation in terms of the other methods. You may want to override it in some cases (e.g. add a short flag) and  ,  and  might come in handy.nEven if you override this, you still should implement all the methods above, to allow alternative interfaces.ÿ!Do not supply a default value here for this parser! This is because if no value was provided on the command line we may lookup the option e.g. in the environment. But if the parser always succeeds, we have no way to tell whether the user really provided the option on the command line. tastySet the option value tastyQuery the option value tastyChange the option value tastyCreate a singleton  tasty%Command-line parser to use with flagstasty@Command-line flag parser that takes additional option modifiers.tastyBCommand-line option parser that takes additional option modifiers.tasty=Safe read function. Defined here for convenience to use for .tastyParse a Ñ case-insensitivelytasty#Later options override earlier ones tastyoptional short flagtasty-non-default value (when the flag is supplied)tastyoption modifiertasty-non-default value (when the flag is supplied)    Safe27ÇÒtastyWhat to do about an Ó?Ôtasty"the action is ready to be executedÕtastythe action should be skippedÖtastynot sure what to do yet; wait×tastyBTake a list of actions and execute them in parallel, no more than n at the same time.˜The action itself is asynchronous, ie. it returns immediately and does the work in new threads. It returns an action which aborts tests and cleans up.ØtastyPFind a ready-to-run item. Filter out the items that will never be ready to run.-Return the ready item and the remaining ones.<This action may block if no items are ready to run just yet.Return Ù% if there are no runnable items left.×tasty"maximum number of parallel threadstastyelist of actions to execute. The first action in the pair tells if the second action is ready to run. ÓÚÛÜİÒÔÕÖ× p© 2015 2018 Megaparsec contributors © 2007 Paolo Martini © 1999 2001 Daan LeijenSafel°Ştasty?This data type specifies operators that work on values of type az. An operator is either binary infix or unary prefix or postfix. A binary operator has also an associated associativity.ßtastyNon-associative infixàtastyLeft-associative infixátastyRight-associative infixâtastyPrefixãtastyPostfixätasty9Right-associative ternary. Right-associative means that a ? b : d ? e : f parsed as a ? b : (d ? e : f) and not as (a ? b : d) ? e : f.åtastyå term table( builds an expression parser for terms term with operators from table<, taking the associativity and precedence specified in the table into account.table is a list of [Operator m a]’ lists. The list is ordered in descending precedence. All operators in one list have the same precedence (but may have different associativity).TPrefix and postfix operators of the same precedence associate to the left (i.e. if ++ is postfix increment, than -2++ equals -1, not -3).AUnary operators of the same precedence can only occur once (i.e. --2 is not allowed if -i is prefix negate). If you need to parse several prefix or postfix operators in a row, (like C pointers **i) you can use this approach: /manyUnaryOp = foldr1 (.) <$> some singleUnaryOpsThis is not done by default because in some cases allowing repeating prefix or postfix operators is not desirable.If you want to have an operator that is a prefix of another operator in the table, use the following (or similar) wrapper instead of plain  : Aop n = (lexeme . try) (string n <* notFollowedBy punctuationChar)å¼ takes care of all the complexity involved in building an expression parser. Here is an example of an expression parser that handles prefix signs, postfix increment and basic arithmetic: ÿ¼expr = makeExprParser term table <?> "expression" term = parens expr <|> integer <?> "term" table = [ [ prefix "-" negate , prefix "+" id ] , [ postfix "++" (+1) ] , [ binary "*" (*) , binary "/" div ] , [ binary "+" (+) , binary "-" (-) ] ] binary name f = InfixL (f <$ symbol name) prefix name f = Prefix (f <$ symbol name) postfix name f = Postfix (f <$ symbol name)ætastyaddPrecLevel p ops. adds the ability to parse operators in table ops to parser p.çtastypTerm prefix term postfix parses a termE surrounded by optional prefix and postfix unary operators. Parsers prefix and postfix$ are allowed to fail, in this case è is used.étastypInfixN op p x' parses non-associative infix operator op, then term with parser p5, then returns result of the operator application on x and the term.êtastypInfixL op p x( parses left-associative infix operator op, then term with parser p5, then returns result of the operator application on x and the term.ëtastypInfixR op p x) parses right-associative infix operator op, then term with parser p6, then returns result of the operator application on x and the term.ìtasty/Parse the first separator of a ternary operatorítastysA helper to separate various operators (binary, unary, and according to associativity) and return them in a tuple.åtasty Term parsertastyOperator table, see ŞtastyResulting expression parserŞâàáßãäåSafepltastynumber of fields&tasty_nth field of the path, where 1 is the outermost group name and 0 is the whole test name, using . (dot) as a separator)tastyan ERE token by itself, like foo but not like $1 ~ foo.-,+*)'&%#"!( $.-,+*)'&%#"!( $NoneM‚Ù îtasty'Whether a parser is unary or non-unary. This roughly corresponds to the  unary_expr and non_unary_expr7 non-terminals in the awk grammar. (Why roughly? See ï.)5tasty A separate 58 data type ensures that we don't forget to skip spaces.6tasty Run a parserğtastyAn awk ERE token such as foo>. No special characters are recognized at the moment, except @ as an escape character for /@ and itself.ñtastyBuilt-in functionsòtastyAtomic expressionsótastyGArguments to unary operators: atomic expressions and field expressionsïtastyArithmetic expressions.ˆUnlike awk, non-unary expressions disallow unary operators everywhere, not just in the leading position, to avoid extra complexity in å.For example, the expression 1 3 + -4is valid in awk because 3 + -40 is non-unary, but we disallow it here because å) does not allow us to distinguish it from 1 -4 + 3which is ambiguous.ôtasty1Expressions that may include string concatenationõtasty3Everything with lower precedence than concatenation7tastyThe awk-like expression parser8tastyParse an awk expression6tasty text to parse1234567856123478Safe%SX‡€ötastyThe Ñ is ÷5 if the source of the string allows it to be numericAtastyEvaluate an awk expressionBtastyRun the ø" monad with a given list of fields"The field list should not include $0 ; it's calculated automatically.ùtastypatterntastystring?@AB?AB@None2‡æ?DEFGHIJNone2M•Ktasty)Timeout to be applied to individual testsLtastyú9 is the original representation of the timeout (such as "0.5m"!), so that we can print it back. û is the number of microseconds.Ntasty4Number of parallel threads to use for running tests.Note that this is not included in R@. Instead, it's automatically included in the options for any  TestReporter ingredient by ingredientOptions†, because the way test reporters are handled already involves parallelism. Other ingredients may also choose to include this option.ütasty<Filtering function to prevent non-positive number of threadsQtastyA shortcut for creating K valuesRtasty…The list of all core options, i.e. the options not specific to any provider or ingredient, but to tasty itself. Currently contains D and K.Qtasty microsecondsKLMNOPQRNone27>EMSX *StastyAn algebra for folding a Y.2Instead of constructing fresh records, build upon €P instead. This way your code won't break when new nodes/fields are indroduced.Ytasty.The main data structure defining a test suite.qIt consists of individual test cases and properties, organized in named groups which form a tree-like hierarchy.¢There is no generic way to create a test case. Instead, every test provider (tasty-hunit, tasty-smallcheck etc.) provides a function to turn a test case into a Y.Groups can be created using }.Ztasty%A single test of some particular type[tasty0Assemble a number of tests into a cohesive group\tastyAdd some options to child tests]tastyrAcquire the resource before the tests in the inner tree start and release it after they finish. The tree gets an ıZ action which yields the resource, although the resource is shared across all the tests.^tasty9Ask for the options and customize the tests based on them_tastySOnly run after all tests that match a given pattern finish (and, depending on the ` , succeed)`tastyBThese are the two ways in which one test may depend on the others.%This is the same distinction as the  ?http://testng.org/doc/documentation-main.html#dependent-methods#hard vs soft dependencies in TestNG.atastysThe current test tree will be executed after its dependencies finish, and only if all of the dependencies succeed.btastyqThe current test tree will be executed after its dependencies finish, regardless of whether they succeed or not.ştastyA resources-related exceptionctastyca describes how to acquire a resource (the first field) and how to release it (the second field).etasty&The name of a test or a group of testsftasty3The interface to be implemented by a test provider. The type tK is the concrete representation of the test which is used by the provider.gtasty Run the testeThis method should cleanly catch any exceptions in the code to test, and return them as part of the m, see w# for an explanation. It is ok for g© to raise an exception if there is a problem with the test suite code itself (for example, if a file that should contain example data or expected output is not found).htasty?The list of options that affect execution of tests of this typeitastyTest progress information.jThis may be used by a runner to provide some feedback to the user while a long-running test is executing.ktasty-textual information about the test's progressltastylW should be a value between 0 and 1. If it's impossible to compute the estimate, use 0.mtasty A test resultotastyDid the test fail? If so, why?ptastypÅ may contain some details about the test. For a passed test it's ok to leave it empty. Providers like SmallCheck and QuickCheck use it to provide information about how many tests were generated.For a failed test, p> should typically provide more information about the failure.qtasty?The short description printed in the test run summary, usually OK or FAIL.rtasty-How long it took to run the test, in seconds.stasty@Time in seconds. Used to measure how long the tests took to run.ttastyOutcome of a test runNote: this is isomorphic to ÿ w. You can use the  generic-maybe package to exploit that.utastytest succeededvtastytest failed because of the wwtastyIf a test failed, w describes whyxtastyƒtest provider indicated failure of the code to test, either because the tested code returned wrong results, or raised an exceptionytastygthe test code itself raised an exception. Typical cases include missing example input or output files.;Usually, providers do not have to implement this, as their g' method may simply raise an exception.ztasty%test didn't complete in allotted time{tasty;a dependency of this test failed, so this test was skipped.|tasty÷ for a passed test,  for a failed one.tastyShortcut for creating a m that indicates exception}tasty2Create a named group of test cases or other groups~tastyLike t, but accepts the pattern as a syntax tree instead of a string. Useful for generating a test tree programmatically.Examples<Only match on the test's own name, ignoring the group names: ~ b (  (& ) (' "Bar")) $ testCase( "A test that depends on Foo.Bar" $ ... tastyThe 0 combinator declares dependencies between tests.If a Y is wrapped in Ä, the tests in this tree will not run until certain other tests («dependencies») have finished. These dependencies are specified using an AWK pattern (see the «Patterns» section in the README).Moreover, if the ` argument is set to aM and at least one dependency has failed, this test tree will not run at all.‹Tasty does not check that the pattern matches any tests (let alone the correct set of tests), so it is on you to supply the right pattern.ExamplesGThe following test will be executed only after all tests that contain Foo anywhere in their path finish.  b "Foo" $ testCase( "A test that depends on Foo.Bar" $ ... 5Note, however, that our test also happens to contain Fooq as part of its name, so it also matches the pattern and becomes a dependency of itself. This will result in a DependencyLoopS exception. To avoid this, either change the test name so that it doesn't mention Foo$ or make the pattern more specific.SYou can use AWK patterns, for instance, to specify the full path to the dependency.  b "$0 == \"Tests.Foo.Bar\"" $ testCase( "A test that depends on Foo.Bar" $ ... DOr only specify the dependency's own name, ignoring the group names:  b "$NF == \"Bar\"" $ testCase( "A test that depends on Foo.Bar" $ ... €tasty€M can serve as the basis for custom folds. Just override the fields you need.Here's what it does:single tests are mapped to ( (you probably do want to override that)#test groups are returned unmodified‡for a resource, an IO action that throws an exception is passed (you want to override this for runners/ingredients that execute tests)tasty%Fold a test tree into a single value.The fold result type should be a monoid. This is used to fold multiple results in a test group. In particular, empty groups get folded into .RApart from pure convenience, this function also does the following useful things: ?Keeping track of the current options (which may change due to \ nodes)7Filtering out the tests which do not match the patternsEThus, it is preferred to an explicit recursive traversal of the tree.ÄNote: right now, the patterns are looked up only once, and won't be affected by the subsequent option changes. This shouldn't be a problem in practice; OTOH, this behaviour may be changed later.tasty?Get the list of options that are relevant for a given test treegtastyoptionstastythe test to runtastyša callback to report progress. Note: the callback is a no-op at the moment and there are no plans to use it; feel free to ignore this argument for now.~tasty>whether to run the tests even if some of the dependencies failtasty the patterntasty'the subtree that depends on other teststasty1the subtree annotated with dependency informationtasty>whether to run the tests even if some of the dependencies failtasty the patterntasty'the subtree that depends on other teststasty1the subtree annotated with dependency informationtasty%the algebra (i.e. how to fold a tree)tastyinitial optionstastythe tree to fold5STXWVUY_^]\[Z`başcdefhgijlkmnrqpostvuw{zyx|}~€None ƒ‚tasty Convert a test to a leaf of the Yƒtastym of a passed test„tastym of a failed testƒtastydescription (may be empty)„tasty description Yefghijklm‚ƒ„ fghƒ„mijkleY‚NoneM…tastyMonoid generated by  ()8Starting from GHC 8.6, a similar type is available from  Data.Monoid4. This type is nevertheless kept for compatibility.ˆtastyMonoid generated by  …†‡ˆ‰ŠNone2>ESX=Ê‹tasty1Exceptions related to dependencies between tests.ŒtastyŠTest dependencies form a loop. In other words, test A cannot start until test B finishes, and test B cannot start until test A finishes. tastyTraversal type used in   tastyDependencies of a testtastyFMapping from test numbers (starting from 0) to their status variables.bThis is what an ingredient uses to analyse and display progress, and to detect when tests finish.tastyCurrent status of a testtasty test has not started running yettastytest is being run‘tasty!test finished with a given result tasty'Execute a test taking care of resources tasty[Turn a test tree into a list of actions to run tests coupled with variables to watch them.tastyTake care of the dependencies.Return Ù if there is a dependency cycle.tastyCUsed to create the IO action which is passed in a WithResource nodetastyRun a resource finalizer.2This function is called from two different places: 9A test thread, which is the last one to use the resource.;The main thread, if an exception (e.g. Ctrl-C) is received.jTherefore, it is possible that this function is called multiple times concurrently on the same finalizer.tThis function should be run with async exceptions masked, and the restore function should be passed as an argument.’tastyWStart running the tests (in background, in parallel) and pass control to the callback.2Once the callback returns, stop running the tests.8The number of test running threads is determined by the N option.tastyLike R (which also masks its finalizers), but pass the restore action to the finalizer.tastyMeasure the time taken by an ı action to runtastyGet monotonic time…Warning: This is not the system time, but a monotonically increasing time that facilitates reliable measurement of time differences. tastyOthe action to execute the test, which takes a progress callback as a parametertastyvariable to write status totastyoptional timeout to applytasty+initializers (to be executed in this order)tasty)finalizers (to be executed in this order)’tasty#A callback. First, it receives the  through which it can observe the execution of tests in real time. Typically (but not necessarily), it waits until all the tests are finished.€After this callback returns, the test-running threads (if any) are terminated and all resources acquired by tests are released.3The callback must return another callback (of type s -> ı aÿ) which additionally can report and/or record the total time taken by the test suite. This time includes the time taken to run all resource initializers and finalizers, which is why it is more accurate than what could be measured from inside the first callback.tastycomputation to run firsttasty>computation to run afterward (even if an exception was raised)tasty,returns the value from the first computation‹Œ‘’NoneoŞ“tasty“s make your test suite tasty.¿Ingredients represent different actions that you can perform on your test suite. One obvious ingredient that you want to include is one that runs tests and reports the progress and results.NAnother standard ingredient is one that simply prints the names of all tests.Similar to test providers (see f ), every ingredient may specify which options it cares about, so that those options are presented to the user if the ingredient is included in the test suite.1An ingredient can choose, typically based on the #, whether to run. That's what the ÿ­ is for. The first ingredient that agreed to run does its work, and the remaining ingredients are ignored. Thus, the order in which you arrange the ingredients may matter.àUsually, the ingredient which runs the tests is unconditional and thus should be placed last in the list. Other ingredients usually run only if explicitly requested via an option. Their relative order thus doesn't matter.qThat's all you need to know from an (advanced) user perspective. Read on if you want to create a new ingredient.#There are two kinds of ingredients.The first kind is ”-. If the ingredient that agrees to run is a ”=, then tasty will automatically launch the tests and pass a › to the ingredient. All the ingredient needs to do then is to process the test results and probably report them to the user in some way (hence the name).•µ is the second kind of ingredient. It is typically used for test management purposes (such as listing the test names), although it can also be used for running tests (but, unlike ”h, it has to launch the tests manually if it wants them to be run). It is therefore more general than ”. ”# is provided just for convenience.CThe function's result should indicate whether all the tests passed.In the •„ case, it's up to the ingredient author to decide what the result should be. When no tests are run, the result should probably be ÷N. Sometimes, even if some tests run and fail, it still makes sense to return ÷.”tastyJFor the explanation on how the callback works, see the documentation for ’.tastyTry to run an “.7If the ingredient refuses to run (usually based on the ), the function returns Ù.For a ”J, this function automatically starts running the tests in the background.–tastyRun the first “ that agrees to be run.#If no one accepts the task, return Ù.. This is usually a sign of misconfiguration.—tasty?Return the options which are relevant for the given ingredient.=Note that this isn't the same as simply pattern-matching on “. E.g. options for a ” automatically include N.˜tastyLike ingredientOption&, but folds over multiple ingredients.™tastyAll the options relevant for this test suite. This includes the options for the test tree and ingredients, and the core options.štasty Compose two ”Ù ingredients which are then executed in parallel. This can be useful if you want to have two reporters active at the same time, e.g., one which prints to the console and one which writes the test results to a file.(Be aware that it is not possible to use š with a •, it only works for ” ingredients.“”•–—˜™š“”•–—˜™šNone2Ms£›tastyThis option, when set to ÷8, specifies that we should run in the «list tests» modetasty)Obtain the list of all tests in the suitetasty;The ingredient that provides the test listing functionality›œNonevŸtastyOThis ingredient doesn't do anything apart from registering additional options.(The option values can be accessed using  askOption.ŸNone2XxNtasty(Search the environment for given optionstasty>Search the environment for all options relevant for this suiteNone2X~O tastyAGenerate a command line parser from a list of option descriptions¡tasty*The command line parser for the test suite¢tastyWParse the command line arguments and run the tests using the provided ingredient list.+When the tests finish, this function calls G with the exit code that indicates whether any tests have failed. See  defaultMain for details.™ ¡¢Safeƒ £tastypCatch possible exceptions that may arise when evaluating a string. For normal (total) strings, this is a no-op.qThis function should be used to display messages generated by the test suite (such as test result descriptions). See e.g. ,https://github.com/feuerbach/tasty/issues/25£¤ None2>@A­Ê¥ tastyWhen to use color on the output¨tasty3Only if stdout is an ANSI color supporting terminal©tastyReport only failed tests«tasty2Do not print test results (see README for details)­ tasty:Track the number of tests that were run and failures of a Y or sub-tree.¯tastyuNumber of active tests (e.g., that match the pattern specified on the commandline), inactive tests are not counted.°tasty#Number of active tests that failed.± tasty±› is an intermediary between output formatting and output printing. It lets us have several different printing modes (normal; print failures only; quiet).²tastyjName of a test, an action that prints the test name, and an action that renders the result of the action.³tastyQName of a test group, an action that prints the heading of a test group and the ± for that test group.´tasty5Inactive test (e.g. not matching the current pattern)µtasty Two sets of  TestOuput on the same level¶ tasty Build the ± for a Y and . The colors7 ImplicitParam controls whether the output is colored.· tastyFold function for the ± tree into a .¸ tastyprintStatisticsG reports test success/failure statistics and time it took to run. The s, results is intended to be filled in by the ” callback. The colors9 ImplicitParam controls whether coloured output is used.¹ tastyprintStatisticsNoTime. reports test success/failure statistics The colors8 ImplicitParam controls whether coloured output is used.tasty Wait until1all tests have finished successfully, and return ÷, or)at least one test has failed, and return ºtastyA simple console UI» tastyuseColor when isTerm, decides if colors should be used, where isTerm indicates whether stdout is a terminal device.tasty=Compute the amount of space needed to align "OK"s and "FAIL"stastyÿCompute the length/width of the string as it would appear in a monospace terminal. This takes into account that even in a mono space font, not all characters actually have the same width, in particular, most CJK characters have twice the same as Western characters.t(This only works properly on Unix at the moment; on Windows, the function treats every character as width-1 like  does.)ÂtastyControl color output·tastyEliminator for test cases. The IO () prints the testname. The  IO Result3 blocks until the test is finished, returning it's m. The Result -> IO ()& function prints the formatted output.tasty Eliminator for test groups. The IO ()$ prints the test group's name. The b) is the result of folding the test group.tastyThe  TestOutput being rendered.tastyThe  StatusMap received by the ”tasty lookahead¥¦§¨©ª«¬­®¯°±µ´²³¶·¸¹º»º«¬©ª¥¦§¨»­®¯°¸¹±µ´²³¶· None®À ›œŸ©ª«¬º º«¬©ª›œŸNone¯NP?DEFGHIJNOPRSTUVWXYZ[\]^_cdijklmnopqrstuvwxyz{|€…†‡ˆ‰Š‹Œ‘’“”•–—˜™›œ ¡¢£¤ºPYZ[\]^_STUVWX€cdˆ‰Š…†‡“”•s–—˜º›œ ¡¢‘mnopqrtuvwxyz{|ijkl’NOP‹Œ™RDEGHF?IJ£¤NoneÆMËtasty.List of the default ingredients. This is what Ì uses.At the moment it consists of  and º.Ìtasty3Parse the command line arguments and run the tests.+When the tests finish, this function calls exitWithã with the exit code that indicates whether any tests have failed. Most external systems (stack, cabal, travis-ci, jenkins etc.) rely on the exit code to detect whether the tests pass. If you want to do something else after ÌI returns, you need to catch the exception and then re-throw it. Example: ÿimport Test.Tasty import Test.Tasty.HUnit import System.Exit import Control.Exception test = testCase "Test 1" (2 @?= 3) main = defaultMain test `catch` (\e -> do if e == ExitSuccess then putStrLn "Yea" else putStrLn "Nay" throwIO e)Ítasty:Locally adjust the option value for the given test subtreeÎtasty7Locally set the option value for the given test subtreeÏtasty5Customize the test tree based on the run-time optionsĞtastyJAcquire the resource to run this test (sub)tree and release it afterwardsĞtastyinitialize the resourcetastyfree the resourcetastyı aH is an action which returns the acquired resource. Despite it being an ıi action, the resource it returns will be acquired only once and shared across all the tests in the tree.KLMQY`abe}~Ÿ¢ËÌÍÎÏĞeY}̢˟ÍÎÏKLMQĞ`ab~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^__`abcdeefgghijkklmnopqrstuvwxyzz{|}~€‚‚ƒ„…†‡ˆM‰Š‹Œ‘’“”•–—˜˜™šš›œŸ ¡¢£¤¥¦§¨©ª«¬¬­®¯°±²³´ µ ¶ · ¸ ¹ ¹ º º » » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ğ Ñ Ò Ó Ô Õ Ö ×ØÙÚÛÜİŞßà á â ã ä å æ çèéê â ë ì í î ï ğ ñ ò ó ô õ ö ÷èøù ú û ü ı şÿŞß  èø   ŞßèéŞßèøèøèøèø !"#$è%&'()*+è,-èø. / 0 12 tasty-1.2-IEfw8PgQELqCKt0T2eCLSNTest.Tasty.OptionsTest.Tasty.Patterns.TypesTest.Tasty.Patterns.ParserTest.Tasty.Patterns.EvalTest.Tasty.Runners Test.TastyTest.Tasty.ProvidersTest.Tasty.IngredientsTest.Tasty.Ingredients.Basic&Test.Tasty.Ingredients.ConsoleReporterTest.Tasty.ParallelTest.Tasty.Patterns.ExprText.Megaparsec.Char.LexersymbolTest.Tasty.PatternsTest.Tasty.Options.CoreTest.Tasty.CoreTest.Tasty.Runners.ReducersTest.Tasty.Run Test.Tasty.Ingredients.ListTests'Test.Tasty.Ingredients.IncludingOptionsTest.Tasty.Options.EnvTest.Tasty.CmdLineTest.Tasty.Runners.Utils Data.ListlengthOptionDescriptionOption OptionSetIsOption defaultValue parseValue optionName optionHelpoptionCLParser setOption lookupOption changeOption singleOption flagCLParsermkFlagCLParsermkOptionCLParsersafeRead safeReadBool$fSemigroupOptionSet$fMonoidOptionSetExprIntLitNFAddSubNegNotAndLTGTLEGEEQNEOrConcatMatchNoMatchField StringLitIfERE ToUpperFn ToLowerFnLengthFnMatchFnSubstrFn $fShowExpr$fEqExpr ParseResultSuccessInvalid AmbiguousParser runParserexpr parseAwkExpr$fFunctorParser$fApplicativeParser$fAlternativeParser $fMonadParser$fMonadPlusParser$fShowParseResultPathasBeval withFields $fShowValue TestPattern noPattern parseExprparseTestPattern exprMatchestestPatternMatchesTimeout NoTimeout NumThreads getNumThreads mkTimeout coreOptionsTreeFold foldSingle foldGroup foldResource foldAfterTestTree SingleTest TestGroupPlusTestOptions WithResource AskOptionsAfterDependencyType AllSucceed AllFinish ResourceSpecTestNameIsTestrun testOptionsProgress progressTextprogressPercentResult resultOutcomeresultDescriptionresultShortDescription resultTimeTimeOutcomeFailure FailureReason TestFailedTestThrewException TestTimedOut TestDepFailedresultSuccessful testGroupafter_after trivialFold foldTestTree singleTest testPassed testFailedApgetApp Traversal getTraversalDependencyExceptionDependencyLoop StatusMapStatus NotStarted ExecutingDonelaunchTestTree Ingredient TestReporter TestManagertryIngredientsingredientOptionsingredientsOptions suiteOptionscomposeReporters ListTests testsNames listingTestsincludingOptions optionParsersuiteOptionParserdefaultMainWithIngredients formatMessage forceElementsUseColorNeverAlwaysAuto HideSuccessesQuiet Statistics statTotal statFailures TestOutput PrintTest PrintHeadingSkipSeqbuildTestOutputfoldTestOutputprintStatisticsprintStatisticsNoTimeconsoleTestReporteruseColor$fSemigroupTestOutput$fMonoidTestOutput$fSemigroupStatistics$fMonoidStatistics$fIsOptionQuiet$fIsOptionHideSuccesses$fIsOptionUseColor$fSemigroupMaximum$fMonoidMaximum $fEqQuiet $fOrdQuiet$fEqHideSuccesses$fOrdHideSuccesses $fEqUseColor $fOrdUseColordefaultIngredients defaultMain adjustOption localOption askOption withResourceghc-prim GHC.TypesBool ActionStatusAction ActionReady ActionSkip ActionWait runInParallelfindBoolbase GHC.MaybeNothing actionStatus actionRun actionSkipOperatorInfixNInfixLInfixRPrefixPostfixTernRmakeExprParser addPrecLevelpTermGHC.BaseidpInfixNpInfixLpInfixRpTernRsplitOpUnaryexpr2patPbuiltinexpr0expr1expr3expr4VSTrueMmatchString integer-gmpGHC.Integer.TypeInteger onlyPositiveIO ResourceErrorMaybeFalseexceptionResultmempty treeOptionsUseOutsideOfTestUnexpectedStateNotRunningTestsliftA2<>*>TrcreateTestActionsDeps executeTest resolveDeps getResourcedestroyResourcefinallyRestoreControl.Exception.BasefinallytimedgetTime tryIngredient getEnvOptionssuiteEnvOptions System.ExitexitWithMonoidstatusMapResultcomputeAlignment stringWidth