tests cleanup
This commit is contained in:
		
							parent
							
								
									255e061e6f
								
							
						
					
					
						commit
						0445086286
					
				
							
								
								
									
										41
									
								
								NOTES
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								NOTES
									
									
									
									
									
								
							| @ -2,10 +2,14 @@ hledger project notes | |||||||
| 
 | 
 | ||||||
| * TO DO | * TO DO | ||||||
| ** bugs | ** bugs | ||||||
|  | ** compatibility | ||||||
|  | *** , in thousands | ||||||
|  | *** use greatest precision in register | ||||||
|  | *** abbreviate 0 | ||||||
|  | *** don't combine entries so much in register | ||||||
| ** basic features | ** basic features | ||||||
| *** print | *** print | ||||||
| *** !include | *** !include | ||||||
| *** , in thousands |  | ||||||
| *** -j and -J graph data output | *** -j and -J graph data output | ||||||
| 
 | 
 | ||||||
| ** advanced features | ** advanced features | ||||||
| @ -67,38 +71,3 @@ what does my balance future look like ? | |||||||
| are there any cashflow, tax, budgetary problems looming ? | are there any cashflow, tax, budgetary problems looming ? | ||||||
| 
 | 
 | ||||||
| * misc | * misc | ||||||
| ** testing support |  | ||||||
| 
 |  | ||||||
| -- {- | looks in Tests.hs for functions like prop_foo and returns |  | ||||||
| --   the list.  Requires that Tests.hs be valid Haskell98. -} |  | ||||||
| -- tests :: [String] |  | ||||||
| -- tests = unsafePerformIO $ |  | ||||||
| --   do h <- openFile "src/Tests.hs" ReadMode |  | ||||||
| --      s <- hGetContents h |  | ||||||
| --      case parseModule s of |  | ||||||
| --        (ParseOk (HsModule _ _ _ _ ds)) -> return (map declName (filter isProp ds)) |  | ||||||
| --        (ParseFailed loc s’)            -> error (s’ ++ ” ” ++ show loc) |  | ||||||
| 
 |  | ||||||
| -- {- | checks if function binding name starts with @prop_@ indicating |  | ||||||
| --  that it is a quickcheck property -} |  | ||||||
| -- isProp :: HsDecl -> Bool |  | ||||||
| -- isProp d@(HsFunBind _) = “prop_” `isPrefixOf` (declName d) |  | ||||||
| -- isProp _ = False |  | ||||||
| 
 |  | ||||||
| -- {- | takes an HsDecl and returns the name of the declaration -} |  | ||||||
| -- declName :: HsDecl -> String |  | ||||||
| -- declName (HsFunBind (HsMatch _ (HsIdent name) _ _ _:_)) = name |  | ||||||
| -- declName _                                              = undefined |  | ||||||
| 
 |  | ||||||
| -- mkCheck name = [| putStr (name ++ ": ") |  | ||||||
| --                >> quickCheck $(varE (mkName name)) |] |  | ||||||
| 
 |  | ||||||
| -- mkChecks []        = undefined -- if we don't have any tests, then the test suite is undefined right? |  | ||||||
| -- mkChecks [name]    = mkCheck name |  | ||||||
| -- mkChecks (name:ns) = [| $(mkCheck name) >> $(mkChecks ns) |] |  | ||||||
| 
 |  | ||||||
| -- {-# OPTIONS_GHC -fno-warn-unused-imports -no-recomp -fth #-} |  | ||||||
| -- runTests :: IO () |  | ||||||
| -- runTests = $(mkChecks tests) |  | ||||||
| 
 |  | ||||||
| -- ghc --make Unit.hs -main-is Unit.runTests -o unit |  | ||||||
|  | |||||||
							
								
								
									
										139
									
								
								Tests.hs
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								Tests.hs
									
									
									
									
									
								
							| @ -1,4 +1,3 @@ | |||||||
| 
 |  | ||||||
| module Tests | module Tests | ||||||
| where | where | ||||||
| import qualified Data.Map as Map | import qualified Data.Map as Map | ||||||
| @ -9,7 +8,60 @@ import Models | |||||||
| import Parse | import Parse | ||||||
| import Utils | import Utils | ||||||
| 
 | 
 | ||||||
| -- sample data | -- utils | ||||||
|  | 
 | ||||||
|  | assertEqual' e a = assertEqual "" e a | ||||||
|  | 
 | ||||||
|  | parse' p ts = parse p "" ts | ||||||
|  | 
 | ||||||
|  | assertParseEqual :: (Show a, Eq a) => a -> (Either ParseError a) -> Assertion | ||||||
|  | assertParseEqual expected parsed = | ||||||
|  |     case parsed of | ||||||
|  |       Left e -> parseError e | ||||||
|  |       Right v -> assertEqual " " expected v | ||||||
|  | 
 | ||||||
|  | parseEqual :: Eq a => (Either ParseError a) -> a -> Bool | ||||||
|  | parseEqual parsed other = | ||||||
|  |     case parsed of | ||||||
|  |       Left e -> False | ||||||
|  |       Right v -> v == other | ||||||
|  | 
 | ||||||
|  | -- find tests with template haskell | ||||||
|  | -- | ||||||
|  | -- {-# OPTIONS_GHC -fno-warn-unused-imports -no-recomp -fth #-} | ||||||
|  | -- {- ghc --make Unit.hs -main-is Unit.runTests -o unit -} | ||||||
|  | -- runTests :: IO () | ||||||
|  | -- runTests = $(mkChecks props) | ||||||
|  | 
 | ||||||
|  | -- mkChecks []        = undefined | ||||||
|  | -- mkChecks [name]    = mkCheck name | ||||||
|  | -- mkChecks (name:ns) = [| $(mkCheck name) >> $(mkChecks ns) |] | ||||||
|  | 
 | ||||||
|  | -- mkCheck name = [| putStr (name ++ ": ") >> quickCheck $(varE (mkName name)) |] | ||||||
|  | 
 | ||||||
|  | -- {- | looks in Tests.hs for functions like prop_foo and returns | ||||||
|  | --   the list.  Requires that Tests.hs be valid Haskell98. -} | ||||||
|  | -- props :: [String] | ||||||
|  | -- props = unsafePerformIO $ | ||||||
|  | --   do h <- openFile "Tests.hs" ReadMode | ||||||
|  | --      s <- hGetContents h | ||||||
|  | --      case parseModule s of | ||||||
|  | --        (ParseOk (HsModule _ _ _ _ ds)) -> return (map declName (filter isProp ds)) | ||||||
|  | --        (ParseFailed loc s')            -> error (s' ++ " " ++ show loc) | ||||||
|  | 
 | ||||||
|  | -- {- | checks if function binding name starts with @prop_@ indicating | ||||||
|  | --  that it is a quickcheck property -} | ||||||
|  | -- isProp :: HsDecl -> Bool | ||||||
|  | -- isProp d@(HsFunBind _) = "prop_" `isPrefixOf` (declName d) | ||||||
|  | -- isProp _ = False | ||||||
|  | 
 | ||||||
|  | -- {- | takes an HsDecl and returns the name of the declaration -} | ||||||
|  | -- declName :: HsDecl -> String | ||||||
|  | -- declName (HsFunBind (HsMatch _ (HsIdent name) _ _ _:_)) = name | ||||||
|  | -- declName _                                              = undefined | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | -- test data | ||||||
| 
 | 
 | ||||||
| transaction1_str  = "  expenses:food:dining  $10.00\n" | transaction1_str  = "  expenses:food:dining  $10.00\n" | ||||||
| 
 | 
 | ||||||
| @ -236,37 +288,29 @@ timelog1 = TimeLog [ | |||||||
|             timelogentry2 |             timelogentry2 | ||||||
|            ] |            ] | ||||||
| 
 | 
 | ||||||
|  | -- tests | ||||||
| 
 | 
 | ||||||
| -- utils | quickcheck = mapM quickCheck ([ | ||||||
|  |         ] :: [Bool]) | ||||||
| 
 | 
 | ||||||
| assertEqual' e a = assertEqual "" e a | hunit = runTestTT $ "hunit" ~: test ([ | ||||||
| 
 |          "" ~: parseLedgerPatternArgs []                     @=? ([],[]) | ||||||
| parse' p ts = parse p "" ts |         ,"" ~: parseLedgerPatternArgs ["a"]                  @=? (["a"],[]) | ||||||
| 
 |         ,"" ~: parseLedgerPatternArgs ["a","b"]              @=? (["a","b"],[]) | ||||||
| assertParseEqual :: (Show a, Eq a) => a -> (Either ParseError a) -> Assertion |         ,"" ~: parseLedgerPatternArgs ["a","b","--"]         @=? (["a","b"],[]) | ||||||
| assertParseEqual expected parsed = |         ,"" ~: parseLedgerPatternArgs ["a","b","--","c","b"] @=? (["a","b"],["c","b"]) | ||||||
|     case parsed of |         ,"" ~: parseLedgerPatternArgs ["--","c"]             @=? ([],["c"]) | ||||||
|       Left e -> parseError e |         ,"" ~: parseLedgerPatternArgs ["--"]                 @=? ([],[]) | ||||||
|       Right v -> assertEqual " " expected v |         ,"" ~: test_ledgertransaction | ||||||
| 
 |         ,"" ~: test_ledgerentry | ||||||
| parseEquals :: Eq a => (Either ParseError a) -> a -> Bool |         ,"" ~: test_autofillEntry | ||||||
| parseEquals parsed other = |         ,"" ~: test_timelogentry | ||||||
|     case parsed of |         ,"" ~: test_timelog | ||||||
|       Left e -> False |         ,"" ~: test_expandAccountNames | ||||||
|       Right v -> v == other |         ,"" ~: test_ledgerAccountNames | ||||||
| 
 |         ,"" ~: test_cacheLedger | ||||||
| -- hunit tests |         ,"" ~: test_showLedgerAccounts | ||||||
| 
 |         ] :: [Test]) | ||||||
| tests = runTestTT $ test [ |  | ||||||
|          2 @=? 2 |  | ||||||
|         , test_ledgertransaction |  | ||||||
|         , test_ledgerentry |  | ||||||
|         , test_autofillEntry |  | ||||||
|         , test_expandAccountNames |  | ||||||
|         , test_ledgerAccountNames |  | ||||||
|         , test_cacheLedger |  | ||||||
|         , test_showLedgerAccounts |  | ||||||
|         ] |  | ||||||
| 
 | 
 | ||||||
| test_ledgertransaction :: Assertion | test_ledgertransaction :: Assertion | ||||||
| test_ledgertransaction = | test_ledgertransaction = | ||||||
| @ -280,6 +324,13 @@ test_autofillEntry = | |||||||
|     (Amount (getcurrency "$") (-47.18)) |     (Amount (getcurrency "$") (-47.18)) | ||||||
|     (tamount $ last $ etransactions $ autofillEntry entry1) |     (tamount $ last $ etransactions $ autofillEntry entry1) | ||||||
| 
 | 
 | ||||||
|  | test_timelogentry = do | ||||||
|  |     assertParseEqual timelogentry1 (parse' timelogentry timelogentry1_str) | ||||||
|  |     assertParseEqual timelogentry2 (parse' timelogentry timelogentry2_str) | ||||||
|  | 
 | ||||||
|  | test_timelog = | ||||||
|  |     assertParseEqual timelog1 (parse' timelog timelog1_str) | ||||||
|  | 
 | ||||||
| test_expandAccountNames = | test_expandAccountNames = | ||||||
|     assertEqual' |     assertEqual' | ||||||
|     ["assets","assets:cash","assets:checking","expenses","expenses:vacation"] |     ["assets","assets:cash","assets:checking","expenses","expenses:vacation"] | ||||||
| @ -298,29 +349,3 @@ test_cacheLedger = | |||||||
| test_showLedgerAccounts =  | test_showLedgerAccounts =  | ||||||
|     assertEqual' 4 (length $ lines $ showLedgerAccounts l7 [] False 1) |     assertEqual' 4 (length $ lines $ showLedgerAccounts l7 [] False 1) | ||||||
| 
 | 
 | ||||||
| -- quickcheck properties |  | ||||||
| 
 |  | ||||||
| props = mapM quickCheck |  | ||||||
|     [ |  | ||||||
|      parse' ledgertransaction transaction1_str `parseEquals` |  | ||||||
|      (Transaction "expenses:food:dining" (Amount (getcurrency "$") 10)) |  | ||||||
|     , |  | ||||||
|      rawLedgerAccountNames ledger7 ==  |  | ||||||
|      ["assets","assets:cash","assets:checking","assets:saving","equity", |  | ||||||
|       "equity:opening balances","expenses","expenses:food","expenses:food:dining", |  | ||||||
|       "expenses:phone","expenses:vacation","liabilities","liabilities:credit cards", |  | ||||||
|       "liabilities:credit cards:discover"] |  | ||||||
|     , |  | ||||||
|      parseLedgerPatternArgs [] == ([],[]) |  | ||||||
|     ,parseLedgerPatternArgs ["a"] == (["a"],[]) |  | ||||||
|     ,parseLedgerPatternArgs ["a","b"] == (["a","b"],[]) |  | ||||||
|     ,parseLedgerPatternArgs ["a","b","--"] == (["a","b"],[]) |  | ||||||
|     ,parseLedgerPatternArgs ["a","b","--","c","b"] == (["a","b"],["c","b"]) |  | ||||||
|     ,parseLedgerPatternArgs ["--","c"] == ([],["c"]) |  | ||||||
|     ,parseLedgerPatternArgs ["--"] == ([],[]) |  | ||||||
|     ,parse' timelogentry timelogentry1_str `parseEquals` timelogentry1 |  | ||||||
|     ,parse' timelogentry timelogentry2_str `parseEquals` timelogentry2 |  | ||||||
|     ,parse' timelog timelog1_str `parseEquals` timelog1 |  | ||||||
|     ] |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								hledger.hs
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								hledger.hs
									
									
									
									
									
								
							| @ -33,6 +33,12 @@ main = do | |||||||
| 
 | 
 | ||||||
| -- commands | -- commands | ||||||
| 
 | 
 | ||||||
|  | selftest :: IO () -- "hledger test" | ||||||
|  | selftest = do | ||||||
|  |   Tests.hunit | ||||||
|  |   Tests.quickcheck | ||||||
|  |   return () | ||||||
|  | 
 | ||||||
| register :: [Flag] -> [String] -> [String] -> IO () | register :: [Flag] -> [String] -> [String] -> IO () | ||||||
| register opts acctpats descpats = do  | register opts acctpats descpats = do  | ||||||
|   doWithLedger opts printRegister |   doWithLedger opts printRegister | ||||||
| @ -54,13 +60,6 @@ balance opts acctpats _ = do | |||||||
|                              ([],False) -> 1 |                              ([],False) -> 1 | ||||||
|                              otherwise  -> 9999 |                              otherwise  -> 9999 | ||||||
| 
 | 
 | ||||||
| selftest :: IO () |  | ||||||
| selftest = do |  | ||||||
|   Tests.tests |  | ||||||
|   Tests.props |  | ||||||
|   -- Amount.tests |  | ||||||
|   return () |  | ||||||
| 
 |  | ||||||
| -- utils | -- utils | ||||||
| 
 | 
 | ||||||
| doWithLedger :: [Flag] -> (Ledger -> IO ()) -> IO () | doWithLedger :: [Flag] -> (Ledger -> IO ()) -> IO () | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user