tests: Transaction, Data -> easytest
This commit is contained in:
parent
a8175d8b14
commit
3b63c2ff2f
@ -15,8 +15,7 @@ import Hledger.Utils as X
|
||||
|
||||
tests_Hledger = TestList
|
||||
[
|
||||
tests_Hledger_Data
|
||||
,tests_Hledger_Reports
|
||||
tests_Hledger_Reports
|
||||
]
|
||||
|
||||
easytests_Hledger = tests "Hledger" [
|
||||
|
||||
@ -26,8 +26,7 @@ module Hledger.Data (
|
||||
module Hledger.Data.Transaction,
|
||||
module Hledger.Data.TransactionModifier,
|
||||
module Hledger.Data.Types,
|
||||
tests_Hledger_Data,
|
||||
easytests_Data,
|
||||
easytests_Data
|
||||
)
|
||||
where
|
||||
|
||||
@ -50,11 +49,6 @@ import Hledger.Data.TransactionModifier
|
||||
import Hledger.Data.Types
|
||||
import Hledger.Utils.Test
|
||||
|
||||
tests_Hledger_Data = TestList
|
||||
[
|
||||
tests_Hledger_Data_Transaction
|
||||
]
|
||||
|
||||
easytests_Data = tests "Data" [
|
||||
easytests_AccountName
|
||||
,easytests_Amount
|
||||
@ -62,4 +56,5 @@ easytests_Data = tests "Data" [
|
||||
,easytests_Ledger
|
||||
,easytests_Posting
|
||||
,easytests_Timeclock
|
||||
,easytests_Transaction
|
||||
]
|
||||
|
||||
@ -42,8 +42,8 @@ module Hledger.Data.Transaction (
|
||||
sourceFilePath,
|
||||
sourceFirstLine,
|
||||
showGenericSourcePos,
|
||||
-- * misc.
|
||||
tests_Hledger_Data_Transaction
|
||||
-- * tests
|
||||
easytests_Transaction
|
||||
)
|
||||
where
|
||||
import Data.List
|
||||
@ -56,7 +56,7 @@ import Data.Time.Calendar
|
||||
import Text.Printf
|
||||
import qualified Data.Map as Map
|
||||
|
||||
import Hledger.Utils
|
||||
import Hledger.Utils hiding (is)
|
||||
import Hledger.Data.Types
|
||||
import Hledger.Data.Dates
|
||||
import Hledger.Data.Posting
|
||||
@ -117,40 +117,6 @@ showTransaction = showTransactionHelper True False
|
||||
showTransactionUnelided :: Transaction -> String
|
||||
showTransactionUnelided = showTransactionHelper False False
|
||||
|
||||
tests_showTransactionUnelided = [
|
||||
"showTransactionUnelided" ~: do
|
||||
let t `gives` s = assertEqual "" s (showTransactionUnelided t)
|
||||
nulltransaction `gives` "0000/01/01\n\n"
|
||||
nulltransaction{
|
||||
tdate=parsedate "2012/05/14",
|
||||
tdate2=Just $ parsedate "2012/05/15",
|
||||
tstatus=Unmarked,
|
||||
tcode="code",
|
||||
tdescription="desc",
|
||||
tcomment="tcomment1\ntcomment2\n",
|
||||
ttags=[("ttag1","val1")],
|
||||
tpostings=[
|
||||
nullposting{
|
||||
pstatus=Cleared,
|
||||
paccount="a",
|
||||
pamount=Mixed [usd 1, hrs 2],
|
||||
pcomment="\npcomment2\n",
|
||||
ptype=RegularPosting,
|
||||
ptags=[("ptag1","val1"),("ptag2","val2")]
|
||||
}
|
||||
]
|
||||
}
|
||||
`gives` unlines [
|
||||
"2012/05/14=2012/05/15 (code) desc ; tcomment1",
|
||||
" ; tcomment2",
|
||||
" * a $1.00",
|
||||
" ; pcomment2",
|
||||
" * a 2.00h",
|
||||
" ; pcomment2",
|
||||
""
|
||||
]
|
||||
]
|
||||
|
||||
showTransactionUnelidedOneLineAmounts :: Transaction -> String
|
||||
showTransactionUnelidedOneLineAmounts = showTransactionHelper False True
|
||||
|
||||
@ -243,60 +209,6 @@ showPostingLines p = postingAsLines False False ps p where
|
||||
ps | Just t <- ptransaction p = tpostings t
|
||||
| otherwise = [p]
|
||||
|
||||
tests_postingAsLines = [
|
||||
"postingAsLines" ~: do
|
||||
let p `gives` ls = assertEqual (show p) ls (postingAsLines False False [p] p)
|
||||
posting `gives` [""]
|
||||
posting{
|
||||
pstatus=Cleared,
|
||||
paccount="a",
|
||||
pamount=Mixed [usd 1, hrs 2],
|
||||
pcomment="pcomment1\npcomment2\n tag3: val3 \n",
|
||||
ptype=RegularPosting,
|
||||
ptags=[("ptag1","val1"),("ptag2","val2")]
|
||||
}
|
||||
`gives` [
|
||||
" * a $1.00 ; pcomment1",
|
||||
" ; pcomment2",
|
||||
" ; tag3: val3 ",
|
||||
" * a 2.00h ; pcomment1",
|
||||
" ; pcomment2",
|
||||
" ; tag3: val3 "
|
||||
]
|
||||
]
|
||||
|
||||
tests_inference = [
|
||||
"inferBalancingAmount" ~: do
|
||||
let p `gives` p' = assertEqual (show p) (Right p') $ inferTransaction p
|
||||
inferTransaction :: Transaction -> Either String Transaction
|
||||
inferTransaction = runIdentity . runExceptT . inferBalancingAmount (\_ _ -> return ()) Map.empty
|
||||
nulltransaction `gives` nulltransaction
|
||||
nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` missingamt
|
||||
]}
|
||||
`gives`
|
||||
nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` usd 5
|
||||
]}
|
||||
nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` (eur 3 @@ usd 4),
|
||||
"c" `post` missingamt
|
||||
]}
|
||||
`gives`
|
||||
nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` (eur 3 @@ usd 4),
|
||||
"c" `post` usd 1
|
||||
]}
|
||||
]
|
||||
|
||||
indent :: String -> String
|
||||
indent = (" "++)
|
||||
|
||||
@ -528,178 +440,276 @@ txnUntieKnot t@Transaction{tpostings=ps} = t{tpostings=map (\p -> p{ptransaction
|
||||
postingSetTransaction :: Transaction -> Posting -> Posting
|
||||
postingSetTransaction t p = p{ptransaction=Just t}
|
||||
|
||||
tests_Hledger_Data_Transaction = TestList $ concat [
|
||||
tests_postingAsLines,
|
||||
tests_showTransactionUnelided,
|
||||
tests_inference,
|
||||
[
|
||||
"showTransaction" ~: do
|
||||
assertEqual "show a balanced transaction, eliding last amount"
|
||||
(unlines
|
||||
["2007/01/28 coopportunity"
|
||||
," expenses:food:groceries $47.18"
|
||||
," assets:checking"
|
||||
,""
|
||||
])
|
||||
-- tests
|
||||
|
||||
is :: (Eq a, Show a, HasCallStack) => a -> a -> Test ()
|
||||
is = flip expectEq'
|
||||
|
||||
easytests_Transaction = tests "Transaction" [
|
||||
|
||||
tests "showTransactionUnelided" [
|
||||
showTransactionUnelided nulltransaction `is` "0000/01/01\n\n"
|
||||
,showTransactionUnelided nulltransaction{
|
||||
tdate=parsedate "2012/05/14",
|
||||
tdate2=Just $ parsedate "2012/05/15",
|
||||
tstatus=Unmarked,
|
||||
tcode="code",
|
||||
tdescription="desc",
|
||||
tcomment="tcomment1\ntcomment2\n",
|
||||
ttags=[("ttag1","val1")],
|
||||
tpostings=[
|
||||
nullposting{
|
||||
pstatus=Cleared,
|
||||
paccount="a",
|
||||
pamount=Mixed [usd 1, hrs 2],
|
||||
pcomment="\npcomment2\n",
|
||||
ptype=RegularPosting,
|
||||
ptags=[("ptag1","val1"),("ptag2","val2")]
|
||||
}
|
||||
]
|
||||
}
|
||||
`is` unlines [
|
||||
"2012/05/14=2012/05/15 (code) desc ; tcomment1",
|
||||
" ; tcomment2",
|
||||
" * a $1.00",
|
||||
" ; pcomment2",
|
||||
" * a 2.00h",
|
||||
" ; pcomment2",
|
||||
""
|
||||
]
|
||||
]
|
||||
|
||||
,tests "postingAsLines" [
|
||||
postingAsLines False False [posting] posting `is` [""]
|
||||
,let p = posting{
|
||||
pstatus=Cleared,
|
||||
paccount="a",
|
||||
pamount=Mixed [usd 1, hrs 2],
|
||||
pcomment="pcomment1\npcomment2\n tag3: val3 \n",
|
||||
ptype=RegularPosting,
|
||||
ptags=[("ptag1","val1"),("ptag2","val2")]
|
||||
}
|
||||
in postingAsLines False False [p] p `is`
|
||||
[
|
||||
" * a $1.00 ; pcomment1",
|
||||
" ; pcomment2",
|
||||
" ; tag3: val3 ",
|
||||
" * a 2.00h ; pcomment1",
|
||||
" ; pcomment2",
|
||||
" ; tag3: val3 "
|
||||
]
|
||||
]
|
||||
|
||||
,do
|
||||
let inferTransaction :: Transaction -> Either String Transaction
|
||||
inferTransaction = runIdentity . runExceptT . inferBalancingAmount (\_ _ -> return ()) Map.empty
|
||||
tests "inferBalancingAmount" [
|
||||
inferTransaction nulltransaction `is` Right nulltransaction
|
||||
,inferTransaction nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` missingamt
|
||||
]}
|
||||
`is` Right
|
||||
nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` usd 5
|
||||
]}
|
||||
,inferTransaction nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` (eur 3 @@ usd 4),
|
||||
"c" `post` missingamt
|
||||
]}
|
||||
`is` Right
|
||||
nulltransaction{
|
||||
tpostings=[
|
||||
"a" `post` usd (-5),
|
||||
"b" `post` (eur 3 @@ usd 4),
|
||||
"c" `post` usd 1
|
||||
]}
|
||||
]
|
||||
|
||||
,tests "showTransaction" [
|
||||
test "show a balanced transaction, eliding last amount" $
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "coopportunity" "" []
|
||||
[posting{paccount="expenses:food:groceries", pamount=Mixed [usd 47.18], ptransaction=Just t}
|
||||
,posting{paccount="assets:checking", pamount=Mixed [usd (-47.18)], ptransaction=Just t}
|
||||
] ""
|
||||
in
|
||||
showTransaction t
|
||||
`is`
|
||||
unlines
|
||||
["2007/01/28 coopportunity"
|
||||
," expenses:food:groceries $47.18"
|
||||
," assets:checking"
|
||||
,""
|
||||
]
|
||||
]
|
||||
|
||||
,tests "showTransaction" [
|
||||
test "show a balanced transaction, no eliding" $
|
||||
(let t = Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "coopportunity" "" []
|
||||
[posting{paccount="expenses:food:groceries", pamount=Mixed [usd 47.18], ptransaction=Just t}
|
||||
,posting{paccount="assets:checking", pamount=Mixed [usd (-47.18)], ptransaction=Just t}
|
||||
] ""
|
||||
in showTransaction t)
|
||||
|
||||
,"showTransaction" ~: do
|
||||
assertEqual "show a balanced transaction, no eliding"
|
||||
in showTransactionUnelided t)
|
||||
`is`
|
||||
(unlines
|
||||
["2007/01/28 coopportunity"
|
||||
," expenses:food:groceries $47.18"
|
||||
," assets:checking $-47.18"
|
||||
,""
|
||||
])
|
||||
(let t = Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "coopportunity" "" []
|
||||
[posting{paccount="expenses:food:groceries", pamount=Mixed [usd 47.18], ptransaction=Just t}
|
||||
,posting{paccount="assets:checking", pamount=Mixed [usd (-47.18)], ptransaction=Just t}
|
||||
] ""
|
||||
in showTransactionUnelided t)
|
||||
|
||||
-- document some cases that arise in debug/testing:
|
||||
,"showTransaction" ~: do
|
||||
assertEqual "show an unbalanced transaction, should not elide"
|
||||
,test "show an unbalanced transaction, should not elide" $
|
||||
(showTransaction
|
||||
(txnTieKnot $ Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "coopportunity" "" []
|
||||
[posting{paccount="expenses:food:groceries", pamount=Mixed [usd 47.18]}
|
||||
,posting{paccount="assets:checking", pamount=Mixed [usd (-47.19)]}
|
||||
] ""))
|
||||
`is`
|
||||
(unlines
|
||||
["2007/01/28 coopportunity"
|
||||
," expenses:food:groceries $47.18"
|
||||
," assets:checking $-47.19"
|
||||
,""
|
||||
])
|
||||
|
||||
,test "show an unbalanced transaction with one posting, should not elide" $
|
||||
(showTransaction
|
||||
(txnTieKnot $ Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "coopportunity" "" []
|
||||
[posting{paccount="expenses:food:groceries", pamount=Mixed [usd 47.18]}
|
||||
,posting{paccount="assets:checking", pamount=Mixed [usd (-47.19)]}
|
||||
] ""))
|
||||
|
||||
,"showTransaction" ~: do
|
||||
assertEqual "show an unbalanced transaction with one posting, should not elide"
|
||||
`is`
|
||||
(unlines
|
||||
["2007/01/28 coopportunity"
|
||||
," expenses:food:groceries $47.18"
|
||||
,""
|
||||
])
|
||||
|
||||
,test "show a transaction with one posting and a missing amount" $
|
||||
(showTransaction
|
||||
(txnTieKnot $ Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "coopportunity" "" []
|
||||
[posting{paccount="expenses:food:groceries", pamount=Mixed [usd 47.18]}
|
||||
[posting{paccount="expenses:food:groceries", pamount=missingmixedamt}
|
||||
] ""))
|
||||
|
||||
,"showTransaction" ~: do
|
||||
assertEqual "show a transaction with one posting and a missing amount"
|
||||
`is`
|
||||
(unlines
|
||||
["2007/01/28 coopportunity"
|
||||
," expenses:food:groceries"
|
||||
,""
|
||||
])
|
||||
(showTransaction
|
||||
(txnTieKnot $ Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "coopportunity" "" []
|
||||
[posting{paccount="expenses:food:groceries", pamount=missingmixedamt}
|
||||
] ""))
|
||||
|
||||
,"showTransaction" ~: do
|
||||
assertEqual "show a transaction with a priced commodityless amount"
|
||||
,test "show a transaction with a priced commodityless amount" $
|
||||
(showTransaction
|
||||
(txnTieKnot $ Transaction 0 nullsourcepos (parsedate "2010/01/01") Nothing Unmarked "" "x" "" []
|
||||
[posting{paccount="a", pamount=Mixed [num 1 `at` (usd 2 `withPrecision` 0)]}
|
||||
,posting{paccount="b", pamount= missingmixedamt}
|
||||
] ""))
|
||||
`is`
|
||||
(unlines
|
||||
["2010/01/01 x"
|
||||
," a 1 @ $2"
|
||||
," b"
|
||||
,""
|
||||
])
|
||||
(showTransaction
|
||||
(txnTieKnot $ Transaction 0 nullsourcepos (parsedate "2010/01/01") Nothing Unmarked "" "x" "" []
|
||||
[posting{paccount="a", pamount=Mixed [num 1 `at` (usd 2 `withPrecision` 0)]}
|
||||
,posting{paccount="b", pamount= missingmixedamt}
|
||||
] ""))
|
||||
]
|
||||
|
||||
,"balanceTransaction" ~: do
|
||||
assertBool "detect unbalanced entry, sign error"
|
||||
(isLeft $ balanceTransaction Nothing
|
||||
,tests "balanceTransaction" [
|
||||
test "detect unbalanced entry, sign error" $
|
||||
(expectLeft $ balanceTransaction Nothing
|
||||
(Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "test" "" []
|
||||
[posting{paccount="a", pamount=Mixed [usd 1]}
|
||||
,posting{paccount="b", pamount=Mixed [usd 1]}
|
||||
] ""))
|
||||
|
||||
assertBool "detect unbalanced entry, multiple missing amounts"
|
||||
(isLeft $ balanceTransaction Nothing
|
||||
,test "detect unbalanced entry, multiple missing amounts" $
|
||||
(expectLeft $ balanceTransaction Nothing
|
||||
(Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "test" "" []
|
||||
[posting{paccount="a", pamount=missingmixedamt}
|
||||
,posting{paccount="b", pamount=missingmixedamt}
|
||||
] ""))
|
||||
|
||||
let e = balanceTransaction Nothing (Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "" "" []
|
||||
[posting{paccount="a", pamount=Mixed [usd 1]}
|
||||
,posting{paccount="b", pamount=missingmixedamt}
|
||||
] "")
|
||||
assertBool "balanceTransaction allows one missing amount" (isRight e)
|
||||
assertEqual "balancing amount is inferred"
|
||||
(Mixed [usd (-1)])
|
||||
(case e of
|
||||
Right e' -> (pamount $ last $ tpostings e')
|
||||
Left _ -> error' "should not happen")
|
||||
,test "one missing amount is inferred" $
|
||||
(pamount . last . tpostings <$> balanceTransaction
|
||||
Nothing
|
||||
(Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "" "" []
|
||||
[posting{paccount="a", pamount=Mixed [usd 1]}
|
||||
,posting{paccount="b", pamount=missingmixedamt}
|
||||
] ""))
|
||||
`is` Right (Mixed [usd (-1)])
|
||||
|
||||
let e = balanceTransaction Nothing (Transaction 0 nullsourcepos (parsedate "2011/01/01") Nothing Unmarked "" "" "" []
|
||||
[posting{paccount="a", pamount=Mixed [usd 1.35]}
|
||||
,posting{paccount="b", pamount=Mixed [eur (-1)]}
|
||||
] "")
|
||||
assertBool "balanceTransaction can infer conversion price" (isRight e)
|
||||
assertEqual "balancing conversion price is inferred"
|
||||
(Mixed [usd 1.35 @@ (eur 1 `withPrecision` maxprecision)])
|
||||
(case e of
|
||||
Right e' -> (pamount $ head $ tpostings e')
|
||||
Left _ -> error' "should not happen")
|
||||
,test "conversion price is inferred" $
|
||||
(pamount . head . tpostings <$> balanceTransaction
|
||||
Nothing
|
||||
(Transaction 0 nullsourcepos (parsedate "2007/01/28") Nothing Unmarked "" "" "" []
|
||||
[posting{paccount="a", pamount=Mixed [usd 1.35]}
|
||||
,posting{paccount="b", pamount=Mixed [eur (-1)]}
|
||||
] ""))
|
||||
`is` Right (Mixed [usd 1.35 @@ (eur 1 `withPrecision` maxprecision)])
|
||||
|
||||
assertBool "balanceTransaction balances based on cost if there are unit prices" (isRight $
|
||||
,test "balanceTransaction balances based on cost if there are unit prices" $
|
||||
expectRight $
|
||||
balanceTransaction Nothing (Transaction 0 nullsourcepos (parsedate "2011/01/01") Nothing Unmarked "" "" "" []
|
||||
[posting{paccount="a", pamount=Mixed [usd 1 `at` eur 2]}
|
||||
,posting{paccount="a", pamount=Mixed [usd (-2) `at` eur 1]}
|
||||
] ""))
|
||||
] "")
|
||||
|
||||
assertBool "balanceTransaction balances based on cost if there are total prices" (isRight $
|
||||
,test "balanceTransaction balances based on cost if there are total prices" $
|
||||
expectRight $
|
||||
balanceTransaction Nothing (Transaction 0 nullsourcepos (parsedate "2011/01/01") Nothing Unmarked "" "" "" []
|
||||
[posting{paccount="a", pamount=Mixed [usd 1 @@ eur 1]}
|
||||
,posting{paccount="a", pamount=Mixed [usd (-2) @@ eur 1]}
|
||||
] ""))
|
||||
] "")
|
||||
]
|
||||
|
||||
,"isTransactionBalanced" ~: do
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00], ptransaction=Just t}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)], ptransaction=Just t}
|
||||
,tests "isTransactionBalanced" [
|
||||
test "detect balanced" $ expect $
|
||||
isTransactionBalanced Nothing $ Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00]}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)]}
|
||||
] ""
|
||||
assertBool "detect balanced" (isTransactionBalanced Nothing t)
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00], ptransaction=Just t}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.01)], ptransaction=Just t}
|
||||
] ""
|
||||
assertBool "detect unbalanced" (not $ isTransactionBalanced Nothing t)
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00], ptransaction=Just t}
|
||||
] ""
|
||||
assertBool "detect unbalanced, one posting" (not $ isTransactionBalanced Nothing t)
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 0], ptransaction=Just t}
|
||||
] ""
|
||||
assertBool "one zero posting is considered balanced for now" (isTransactionBalanced Nothing t)
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00], ptransaction=Just t}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)], ptransaction=Just t}
|
||||
,posting{paccount="d", pamount=Mixed [usd 100], ptype=VirtualPosting, ptransaction=Just t}
|
||||
] ""
|
||||
assertBool "virtual postings don't need to balance" (isTransactionBalanced Nothing t)
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00], ptransaction=Just t}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)], ptransaction=Just t}
|
||||
,posting{paccount="d", pamount=Mixed [usd 100], ptype=BalancedVirtualPosting, ptransaction=Just t}
|
||||
] ""
|
||||
assertBool "balanced virtual postings need to balance among themselves" (not $ isTransactionBalanced Nothing t)
|
||||
let t = Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00], ptransaction=Just t}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)], ptransaction=Just t}
|
||||
,posting{paccount="d", pamount=Mixed [usd 100], ptype=BalancedVirtualPosting, ptransaction=Just t}
|
||||
,posting{paccount="3", pamount=Mixed [usd (-100)], ptype=BalancedVirtualPosting, ptransaction=Just t}
|
||||
] ""
|
||||
assertBool "balanced virtual postings need to balance among themselves (2)" (isTransactionBalanced Nothing t)
|
||||
|
||||
]]
|
||||
,test "detect unbalanced" $ expect $
|
||||
not $ isTransactionBalanced Nothing $ Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00]}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.01)]}
|
||||
] ""
|
||||
|
||||
,test "detect unbalanced, one posting" $ expect $
|
||||
not $ isTransactionBalanced Nothing $ Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00]}
|
||||
] ""
|
||||
|
||||
,test "one zero posting is considered balanced for now" $ expect $
|
||||
isTransactionBalanced Nothing $ Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 0]}
|
||||
] ""
|
||||
|
||||
,test "virtual postings don't need to balance" $ expect $
|
||||
isTransactionBalanced Nothing $ Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00]}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)]}
|
||||
,posting{paccount="d", pamount=Mixed [usd 100], ptype=VirtualPosting}
|
||||
] ""
|
||||
|
||||
,test "balanced virtual postings need to balance among themselves" $ expect $
|
||||
not $ isTransactionBalanced Nothing $ Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00]}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)]}
|
||||
,posting{paccount="d", pamount=Mixed [usd 100], ptype=BalancedVirtualPosting}
|
||||
] ""
|
||||
|
||||
,test "balanced virtual postings need to balance among themselves (2)" $ expect $
|
||||
isTransactionBalanced Nothing $ Transaction 0 nullsourcepos (parsedate "2009/01/01") Nothing Unmarked "" "a" "" []
|
||||
[posting{paccount="b", pamount=Mixed [usd 1.00]}
|
||||
,posting{paccount="c", pamount=Mixed [usd (-1.00)]}
|
||||
,posting{paccount="d", pamount=Mixed [usd 100], ptype=BalancedVirtualPosting}
|
||||
,posting{paccount="3", pamount=Mixed [usd (-100)], ptype=BalancedVirtualPosting}
|
||||
] ""
|
||||
|
||||
]
|
||||
|
||||
]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user