refactor test runner
This commit is contained in:
		
							parent
							
								
									db4d853a3f
								
							
						
					
					
						commit
						1654776f4a
					
				| @ -347,21 +347,21 @@ getCurrentLocalTime = do | ||||
| -- testing | ||||
| 
 | ||||
| -- | Get a Test's label, or the empty string. | ||||
| tname :: Test -> String | ||||
| tname (TestLabel n _) = n | ||||
| tname _ = "" | ||||
| testName :: Test -> String | ||||
| testName (TestLabel n _) = n | ||||
| testName _ = "" | ||||
| 
 | ||||
| -- | Flatten a Test containing TestLists into a list of single tests. | ||||
| tflatten :: Test -> [Test] | ||||
| tflatten (TestLabel _ t@(TestList _)) = tflatten t | ||||
| tflatten (TestList ts) = concatMap tflatten ts | ||||
| tflatten t = [t] | ||||
| flattenTests :: Test -> [Test] | ||||
| flattenTests (TestLabel _ t@(TestList _)) = flattenTests t | ||||
| flattenTests (TestList ts) = concatMap flattenTests ts | ||||
| flattenTests t = [t] | ||||
| 
 | ||||
| -- | Filter TestLists in a Test, recursively, preserving the structure. | ||||
| tfilter :: (Test -> Bool) -> Test -> Test | ||||
| tfilter p (TestLabel l ts) = TestLabel l (tfilter p ts) | ||||
| tfilter p (TestList ts) = TestList $ filter (any p . tflatten) $ map (tfilter p) ts | ||||
| tfilter _ t = t | ||||
| filterTests :: (Test -> Bool) -> Test -> Test | ||||
| filterTests p (TestLabel l ts) = TestLabel l (filterTests p ts) | ||||
| filterTests p (TestList ts) = TestList $ filter (any p . flattenTests) $ map (filterTests p) ts | ||||
| filterTests _ t = t | ||||
| 
 | ||||
| -- | Simple way to assert something is some expected value, with no label. | ||||
| is :: (Eq a, Show a) => a -> a -> Assertion | ||||
|  | ||||
| @ -75,7 +75,7 @@ main = do | ||||
|        | (null matchedaddon) && "binary-filename" `in_` (rawopts_ opts) = putStrLn $ binaryfilename progname | ||||
|        | null cmd                                        = putStr $ showModeHelp mainmode' | ||||
|        | cmd `isPrefixOf` "add"                          = showModeHelpOr addmode      $ journalFilePathFromOpts opts >>= ensureJournalFileExists >> withJournalDo opts add | ||||
|        | cmd `isPrefixOf` "test"                         = showModeHelpOr testmode     $ runtests opts | ||||
|        | cmd `isPrefixOf` "test"                         = showModeHelpOr testmode     $ test' opts | ||||
|        | any (cmd `isPrefixOf`) ["accounts","balance"]   = showModeHelpOr accountsmode $ withJournalDo opts balance | ||||
|        | any (cmd `isPrefixOf`) ["entries","print"]      = showModeHelpOr entriesmode  $ withJournalDo opts print' | ||||
|        | any (cmd `isPrefixOf`) ["postings","register"]  = showModeHelpOr postingsmode $ withJournalDo opts register | ||||
|  | ||||
| @ -37,22 +37,29 @@ import Hledger.Cli | ||||
| 
 | ||||
| 
 | ||||
| -- | Run unit tests and exit with success or failure. | ||||
| runtests :: CliOpts -> IO () | ||||
| runtests opts = do | ||||
|   (hunitcounts,_) <- runtests' opts | ||||
|   if errors hunitcounts > 0 || (failures hunitcounts > 0) | ||||
| test' :: CliOpts -> IO () | ||||
| test' opts = do | ||||
|   results <- runTests opts | ||||
|   if errors results > 0 || failures results > 0 | ||||
|    then exitFailure | ||||
|    else exitWith ExitSuccess | ||||
| 
 | ||||
| -- | Run unit tests and exit on failure. | ||||
| runTestsOrExit :: CliOpts -> IO () | ||||
| runTestsOrExit opts = do | ||||
|   (hunitcounts,_) <- runtests' opts | ||||
|   when (errors hunitcounts > 0 || (failures hunitcounts > 0)) $ exitFailure | ||||
| -- | Run all or just the matched unit tests and return their HUnit result counts. | ||||
| runTests :: CliOpts -> IO Counts | ||||
| runTests = liftM (fst . flip (,) 0) . runTestTT . flatTests | ||||
| 
 | ||||
| runtests' :: Num b => CliOpts -> IO (Counts, b) | ||||
| runtests' opts = liftM (flip (,) 0) $ runTestTT ts | ||||
|     where | ||||
|       ts = TestList $ filter matchname $ tflatten tests_Hledger_Cli  -- show flat test names | ||||
|       -- ts = tfilter matchname $ TestList tests -- show hierarchical test names | ||||
|       matchname = matchpats (patterns_ $ reportopts_ opts) . tname | ||||
| -- | Run all or just the matched unit tests until the first failure or | ||||
| -- error, returning the name of the problem test if any. | ||||
| runTestsTillFailure :: CliOpts -> IO (Maybe String) | ||||
| runTestsTillFailure opts = undefined -- do | ||||
|   -- let ts = flatTests opts | ||||
|   --     results = liftM (fst . flip (,) 0) $ runTestTT $ | ||||
|   --     firstproblem = find (\counts -> ) | ||||
| 
 | ||||
| -- | All or pattern-matched tests, as a flat list to show simple names. | ||||
| flatTests opts = TestList $ filter (matcherFromOpts opts) $ flattenTests tests_Hledger_Cli | ||||
| 
 | ||||
| -- | All or pattern-matched tests, in the original suites to show hierarchical names. | ||||
| hierarchicalTests opts = filterTests (matcherFromOpts opts) tests_Hledger_Cli | ||||
| 
 | ||||
| matcherFromOpts opts = matchpats (patterns_ $ reportopts_ opts) . testName | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user