journal: restore/port more old unit tests
This commit is contained in:
parent
776d575610
commit
9733e0378e
@ -706,16 +706,44 @@ tests_Hledger_Read_JournalReader = TestList [
|
|||||||
|
|
||||||
easytests = tests "JournalReader" [
|
easytests = tests "JournalReader" [
|
||||||
|
|
||||||
tests "transactionmodifierp" [
|
let p = lift accountnamep :: JournalParser IO AccountName in
|
||||||
|
tests "accountnamep" [
|
||||||
test "basic" $ expectParseEq transactionmodifierp
|
test "basic" $ expectParse p "a:b:c"
|
||||||
"= (some value expr)\n some:postings 1.\n"
|
,_test "empty inner component" $ expectParseError p "a::c" "" -- TODO
|
||||||
nulltransactionmodifier {
|
,_test "empty leading component" $ expectParseError p ":b:c" "x"
|
||||||
tmquerytxt = "(some value expr)"
|
,_test "empty trailing component" $ expectParseError p "a:b:" "x"
|
||||||
,tmpostings = [nullposting{paccount="some:postings", pamount=Mixed[num 1]}]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
-- "Parse a date in YYYY/MM/DD format.
|
||||||
|
-- Hyphen (-) and period (.) are also allowed as separators.
|
||||||
|
-- The year may be omitted if a default year has been set.
|
||||||
|
-- Leading zeroes may be omitted."
|
||||||
|
,test "datep" $ do
|
||||||
|
test "YYYY/MM/DD" $ expectParseEq datep "2018/01/01" (fromGregorian 2018 1 1)
|
||||||
|
test "YYYY-MM-DD" $ expectParse datep "2018-01-01"
|
||||||
|
test "YYYY.MM.DD" $ expectParse datep "2018.01.01"
|
||||||
|
test "yearless date with no default year" $ expectParseError datep "1/1" "current year is unknown"
|
||||||
|
test "yearless date with default year" $ do
|
||||||
|
ep <- parseWithState mempty{jparsedefaultyear=Just 2018} datep "1/1"
|
||||||
|
either (fail.("parse error at "++).parseErrorPretty) (const ok) ep
|
||||||
|
test "no leading zero" $ expectParse datep "2018/1/1"
|
||||||
|
|
||||||
|
,test "datetimep" $ do
|
||||||
|
let
|
||||||
|
good = expectParse datetimep
|
||||||
|
bad = (\t -> expectParseError datetimep t "")
|
||||||
|
good "2011/1/1 00:00"
|
||||||
|
good "2011/1/1 23:59:59"
|
||||||
|
bad "2011/1/1"
|
||||||
|
bad "2011/1/1 24:00:00"
|
||||||
|
bad "2011/1/1 00:60:00"
|
||||||
|
bad "2011/1/1 00:00:60"
|
||||||
|
bad "2011/1/1 3:5:7"
|
||||||
|
test "timezone is parsed but ignored" $ do
|
||||||
|
let t = LocalTime (fromGregorian 2018 1 1) (TimeOfDay 0 0 (fromIntegral 0))
|
||||||
|
expectParseEq datetimep "2018/1/1 00:00-0800" t
|
||||||
|
expectParseEq datetimep "2018/1/1 00:00+1234" t
|
||||||
|
|
||||||
,tests "periodictransactionp" [
|
,tests "periodictransactionp" [
|
||||||
|
|
||||||
test "more-period-text-in-comment-after-one-space" $ expectParseEq periodictransactionp
|
test "more-period-text-in-comment-after-one-space" $ expectParseEq periodictransactionp
|
||||||
@ -760,92 +788,64 @@ easytests = tests "JournalReader" [
|
|||||||
,ptdescription = "Next year blah blah\n"
|
,ptdescription = "Next year blah blah\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
,transactionp_tests
|
|
||||||
|
|
||||||
,test "showParsedMarketPrice" $ expectParseEq marketpricedirectivep
|
|
||||||
"P 2017/01/30 BTC $922.83\n"
|
|
||||||
MarketPrice{
|
|
||||||
mpdate = parsedate "2017/01/30",
|
|
||||||
mpcommodity = "BTC",
|
|
||||||
mpamount = usd 922.83
|
|
||||||
}
|
|
||||||
|
|
||||||
{- old hunit tests TODO
|
|
||||||
,"periodictransactionp" ~: do
|
|
||||||
assertParse (parseWithState mempty periodictransactionp "~ (some period expr)\n some:postings 1\n")
|
|
||||||
|
|
||||||
,"directivep" ~: do
|
|
||||||
assertParse (parseWithState mempty directivep "!include /some/file.x\n")
|
|
||||||
assertParse (parseWithState mempty directivep "account some:account\n")
|
|
||||||
assertParse (parseWithState mempty (directivep >> directivep) "!account a\nend\n")
|
|
||||||
|
|
||||||
,"comment" ~: do
|
|
||||||
assertParse (parseWithState mempty comment "; some comment \n")
|
|
||||||
assertParse (parseWithState mempty comment " \t; x\n")
|
|
||||||
assertParse (parseWithState mempty comment "#x")
|
|
||||||
|
|
||||||
,"datep" ~: do
|
|
||||||
assertParse (parseWithState mempty datep "2011/1/1")
|
|
||||||
assertParseFailure (parseWithState mempty datep "1/1")
|
|
||||||
assertParse (parseWithState mempty{jpsYear=Just 2011} datep "1/1")
|
|
||||||
|
|
||||||
,"datetimep" ~: do
|
|
||||||
let p = do {t <- datetimep; eof; return t}
|
|
||||||
bad = assertParseFailure . parseWithState mempty p
|
|
||||||
good = assertParse . parseWithState mempty p
|
|
||||||
bad "2011/1/1"
|
|
||||||
bad "2011/1/1 24:00:00"
|
|
||||||
bad "2011/1/1 00:60:00"
|
|
||||||
bad "2011/1/1 00:00:60"
|
|
||||||
good "2011/1/1 00:00"
|
|
||||||
good "2011/1/1 23:59:59"
|
|
||||||
good "2011/1/1 3:5:7"
|
|
||||||
-- timezone is parsed but ignored
|
|
||||||
let startofday = LocalTime (fromGregorian 2011 1 1) (TimeOfDay 0 0 (fromIntegral 0))
|
|
||||||
assertParseEqual (parseWithState mempty p "2011/1/1 00:00-0800") startofday
|
|
||||||
assertParseEqual (parseWithState mempty p "2011/1/1 00:00+1234") startofday
|
|
||||||
|
|
||||||
,"defaultyeardirectivep" ~: do
|
|
||||||
assertParse (parseWithState mempty defaultyeardirectivep "Y 2010\n")
|
|
||||||
assertParse (parseWithState mempty defaultyeardirectivep "Y 10001\n")
|
|
||||||
|
|
||||||
,"marketpricedirectivep" ~:
|
|
||||||
assertParseEqual (parseWithState mempty marketpricedirectivep "P 2004/05/01 XYZ $55.00\n") (MarketPrice (parsedate "2004/05/01") "XYZ" $ usd 55)
|
|
||||||
|
|
||||||
,"ignoredpricecommoditydirectivep" ~: do
|
|
||||||
assertParse (parseWithState mempty ignoredpricecommoditydirectivep "N $\n")
|
|
||||||
|
|
||||||
,"defaultcommoditydirectivep" ~: do
|
|
||||||
assertParse (parseWithState mempty defaultcommoditydirectivep "D $1,000.0\n")
|
|
||||||
|
|
||||||
,"commodityconversiondirectivep" ~: do
|
|
||||||
assertParse (parseWithState mempty commodityconversiondirectivep "C 1h = $50.00\n")
|
|
||||||
|
|
||||||
,"tagdirectivep" ~: do
|
|
||||||
assertParse (parseWithState mempty tagdirectivep "tag foo \n")
|
|
||||||
|
|
||||||
,"endtagdirectivep" ~: do
|
|
||||||
assertParse (parseWithState mempty endtagdirectivep "end tag \n")
|
|
||||||
assertParse (parseWithState mempty endtagdirectivep "pop \n")
|
|
||||||
|
|
||||||
,"accountnamep" ~: do
|
|
||||||
assertBool "accountnamep parses a normal account name" (isRight $ parsewith accountnamep "a:b:c")
|
|
||||||
assertBool "accountnamep rejects an empty inner component" (isLeft $ parsewith accountnamep "a::c")
|
|
||||||
assertBool "accountnamep rejects an empty leading component" (isLeft $ parsewith accountnamep ":b:c")
|
|
||||||
assertBool "accountnamep rejects an empty trailing component" (isLeft $ parsewith accountnamep "a:b:")
|
|
||||||
|
|
||||||
,"leftsymbolamountp" ~: do
|
|
||||||
assertParseEqual (parseWithState mempty leftsymbolamountp "$1") (usd 1 `withPrecision` 0)
|
|
||||||
assertParseEqual (parseWithState mempty leftsymbolamountp "$-1") (usd (-1) `withPrecision` 0)
|
|
||||||
assertParseEqual (parseWithState mempty leftsymbolamountp "-$1") (usd (-1) `withPrecision` 0)
|
|
||||||
|
|
||||||
,"amount" ~: do
|
|
||||||
let -- | compare a parse result with an expected amount, showing the debug representation for clarity
|
|
||||||
assertAmountParse parseresult amount =
|
|
||||||
(either (const "parse error") showAmountDebug parseresult) ~?= (showAmountDebug amount)
|
|
||||||
assertAmountParse (parseWithState mempty amountp "1 @ $2")
|
|
||||||
(num 1 `withPrecision` 0 `at` (usd 2 `withPrecision` 0))
|
|
||||||
-}
|
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
,tests "transactionmodifierp" [
|
||||||
|
|
||||||
|
test "basic" $ expectParseEq transactionmodifierp
|
||||||
|
"= (some value expr)\n some:postings 1.\n"
|
||||||
|
nulltransactionmodifier {
|
||||||
|
tmquerytxt = "(some value expr)"
|
||||||
|
,tmpostings = [nullposting{paccount="some:postings", pamount=Mixed[num 1]}]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
,transactionp_tests
|
||||||
|
|
||||||
|
-- directives
|
||||||
|
|
||||||
|
,tests "directivep" [
|
||||||
|
test "supports !" $ do
|
||||||
|
expectParse directivep "!account a\n"
|
||||||
|
expectParse directivep "!D 1.0\n"
|
||||||
|
]
|
||||||
|
|
||||||
|
,test "accountdirectivep" $ do
|
||||||
|
test "account" $ expectParse accountdirectivep "account a:b\n"
|
||||||
|
test "does not support !" $ expectParseError accountdirectivep "!account a:b\n" ""
|
||||||
|
|
||||||
|
,test "commodityconversiondirectivep" $ do
|
||||||
|
expectParse commodityconversiondirectivep "C 1h = $50.00\n"
|
||||||
|
|
||||||
|
,test "defaultcommoditydirectivep" $ do
|
||||||
|
expectParse defaultcommoditydirectivep "D $1,000.0\n"
|
||||||
|
expectParseError defaultcommoditydirectivep "D $1000\n" "please include a decimal separator"
|
||||||
|
|
||||||
|
,test "defaultyeardirectivep" $ do
|
||||||
|
test "1000" $ expectParse defaultyeardirectivep "Y 1000" -- XXX no \n like the others
|
||||||
|
test "999" $ expectParseError defaultyeardirectivep "Y 999" "bad year number"
|
||||||
|
test "12345" $ expectParse defaultyeardirectivep "Y 12345"
|
||||||
|
|
||||||
|
,test "ignoredpricecommoditydirectivep" $ do
|
||||||
|
expectParse ignoredpricecommoditydirectivep "N $\n"
|
||||||
|
|
||||||
|
,test "includedirectivep" $ do
|
||||||
|
test "include" $ expectParseError includedirectivep "include nosuchfile\n" "No existing files match pattern: nosuchfile"
|
||||||
|
test "glob" $ expectParseError includedirectivep "include nosuchfile*\n" "No existing files match pattern: nosuchfile*"
|
||||||
|
|
||||||
|
,test "marketpricedirectivep" $ expectParseEq marketpricedirectivep
|
||||||
|
"P 2017/01/30 BTC $922.83\n"
|
||||||
|
MarketPrice{
|
||||||
|
mpdate = parsedate "2017/01/30",
|
||||||
|
mpcommodity = "BTC",
|
||||||
|
mpamount = usd 922.83
|
||||||
|
}
|
||||||
|
|
||||||
|
,test "tagdirectivep" $ do
|
||||||
|
expectParse tagdirectivep "tag foo \n"
|
||||||
|
|
||||||
|
,test "endtagdirectivep" $ do
|
||||||
|
expectParse endtagdirectivep "end tag \n"
|
||||||
|
expectParse endtagdirectivep "pop \n"
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user