tools: rename tools/doctest -> tools/docshelltest, update
This commit is contained in:
		
							parent
							
								
									c881d916eb
								
							
						
					
					
						commit
						93e76047d7
					
				| @ -1,43 +1,44 @@ | |||||||
| #!/usr/bin/env runhaskell | #!/usr/bin/env stack | ||||||
|  | {- stack script --resolver nightly-2021-07-16 --compile | ||||||
|  | -} | ||||||
|  | -- add this to see packages being installed instead of a long silence: | ||||||
|  | --   --verbosity=info | ||||||
|  |    --package base-prelude | ||||||
|  |    --package directory | ||||||
|  |    --package extra | ||||||
|  |    --package process | ||||||
|  |    --package regex | ||||||
|  |    --package safe | ||||||
|  |    --package shake | ||||||
|  |    --package time | ||||||
|  | 
 | ||||||
| {- | | {- | | ||||||
| Extract (shell) tests from haddock comments in Haskell code, run them and | Extract (shell) tests from haddock comments in Haskell code, run them and | ||||||
| verify expected output, like Python's doctest system. | verify expected output. Like https://hackage.haskell.org/package/doctest,  | ||||||
|  | but tests shell commands instead of GHCI commands. | ||||||
| 
 | 
 | ||||||
| Here, a doctest is a haddock literal block whose first line begins with a | A docshelltest is a haddock literal block whose first line begins with a | ||||||
| $ (leading whitespace ignored). The rest of the line is a shell command | $ (leading whitespace ignored), the rest of the line is a shell command | ||||||
| and the remaining lines are the expected output. | and the remaining lines are the expected output. The exit code is expected | ||||||
|  | to be zero. | ||||||
| 
 | 
 | ||||||
| Usage example: $ doctest.hs doctest.hs | Usage example: $ doctest.hs doctest.hs | ||||||
| 
 | 
 | ||||||
| Doctest examples: |  | ||||||
| 
 |  | ||||||
| @ | @ | ||||||
| $ ls doctest.hs | $ echo This test shall pass | ||||||
| This doctest will fail. | This test shall pass | ||||||
| @ | @ | ||||||
| 
 | 
 | ||||||
| @ | @ | ||||||
| $ ls doctest.hs | $ echo This test shall fail | ||||||
| doctest.hs | 
 | ||||||
| @ | @ | ||||||
| 
 | 
 | ||||||
| Issues: |  | ||||||
| 
 |  | ||||||
| After writing this I found the doctest on hackage; that one runs haskell |  | ||||||
| expressions in comments, converting them to hunit tests. We might add this |  | ||||||
| to that, and/or add this to hledger's built-in test runner. |  | ||||||
| 
 |  | ||||||
| Error output seems to vary depending on whether things are compiled, eg: |  | ||||||
| hledger: parse error at (line 1, column 4) |  | ||||||
| vs: |  | ||||||
| "-" (line 2, column 1) |  | ||||||
| ledger-style functional tests may be more useful for this, see functest.hs. |  | ||||||
| 
 |  | ||||||
| -} | -} | ||||||
| 
 | 
 | ||||||
| module Main where | module Main where | ||||||
| import Data.List (isPrefixOf) | import Data.List (isPrefixOf) | ||||||
| import System (getArgs) | import System.Environment (getArgs) | ||||||
| import System.Exit (exitFailure, exitWith, ExitCode(ExitSuccess)) -- base 3 compatible | import System.Exit (exitFailure, exitWith, ExitCode(ExitSuccess)) -- base 3 compatible | ||||||
| import System.IO (hGetContents, hPutStr, hPutStrLn, stderr) | import System.IO (hGetContents, hPutStr, hPutStrLn, stderr) | ||||||
| import System.Process (runInteractiveCommand, waitForProcess) | import System.Process (runInteractiveCommand, waitForProcess) | ||||||
| @ -49,6 +50,7 @@ main = do | |||||||
|   let tests = doctests s |   let tests = doctests s | ||||||
|   putStrLn $ printf "Running %d doctests from %s" (length tests) f |   putStrLn $ printf "Running %d doctests from %s" (length tests) f | ||||||
|   ok <-  mapM runShellDocTest $ doctests s |   ok <-  mapM runShellDocTest $ doctests s | ||||||
|  |   putStrLn "" | ||||||
|   if any not ok then exitFailure else exitWith ExitSuccess |   if any not ok then exitFailure else exitWith ExitSuccess | ||||||
| 
 | 
 | ||||||
| runShellDocTest :: String -> IO Bool | runShellDocTest :: String -> IO Bool | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user