1 {-# LANGUAGE TupleSections #-}
2 {-# LANGUAGE OverloadedStrings #-}
6 import Test.Framework.Providers.HUnit (hUnitTestToTests)
7 import Test.Framework.Runners.Console (defaultMain)
9 import Control.Applicative ((<*))
10 import Control.Arrow ((***))
11 import Control.Monad.IO.Class (liftIO)
12 import Data.Decimal (DecimalRaw(..))
13 import qualified Data.Either
14 import qualified Data.List
15 import Data.List.NonEmpty (NonEmpty(..))
16 import qualified Data.Map.Strict as Data.Map
17 import Data.Text (Text)
18 import qualified Data.Time.Calendar as Time
19 import qualified Data.Time.LocalTime as Time
20 import qualified Text.Parsec as P hiding (char, string)
21 import qualified Text.Parsec.Pos as P
22 -- import qualified Text.PrettyPrint.Leijen.Text as PP
24 import qualified Hcompta.Model.Account as Account
25 import qualified Hcompta.Model.Amount as Amount
26 import Hcompta.Model.Amount (Amount)
27 import qualified Hcompta.Model.Amount.Style as Amount.Style
28 import qualified Hcompta.Model.Date as Date
29 import qualified Hcompta.Calc.Balance as Calc.Balance
30 import qualified Hcompta.Format.Ledger as Format.Ledger
31 import qualified Hcompta.Format.Ledger.Read as Format.Ledger.Read
32 import qualified Hcompta.Format.Ledger.Write as Format.Ledger.Write
33 import qualified Hcompta.Lib.TreeMap as Lib.TreeMap
34 import qualified Hcompta.Lib.Parsec as P
35 import qualified Hcompta.Lib.Foldable as Lib.Foldable
37 --instance Eq Text.Parsec.ParseError where
38 -- (==) = const (const False)
41 main = defaultMain $ hUnitTestToTests test_Hcompta
47 [ "TreeMap" ~: TestList
48 [ "insert" ~: TestList
50 (Lib.TreeMap.insert const ((0::Int):|[]) () Lib.TreeMap.empty)
52 (Lib.TreeMap.TreeMap $
54 [ ((0::Int), Lib.TreeMap.leaf ())
57 (Lib.TreeMap.insert const ((0::Int):|1:[]) () Lib.TreeMap.empty)
59 (Lib.TreeMap.TreeMap $
61 [ ((0::Int), Lib.TreeMap.Node
62 { Lib.TreeMap.node_value = Nothing
63 , Lib.TreeMap.node_size = 1
64 , Lib.TreeMap.node_descendants =
65 Lib.TreeMap.singleton ((1::Int):|[]) ()
72 , "map_by_depth_first" ~: TestList
75 , "flatten" ~: TestList
76 [ "[0, 0/1, 0/1/2]" ~:
77 (Lib.TreeMap.flatten id $
78 Lib.TreeMap.from_List const
79 [ (((0::Integer):|[]), ())
90 , "[1, 1/2, 1/22, 1/2/3, 1/2/33, 11, 11/2, 11/2/3, 11/2/33]" ~:
91 (Lib.TreeMap.flatten id $
92 Lib.TreeMap.from_List const
101 , ((11:|2:33:[]), ())
106 [ (((1::Integer):|[]), ())
114 , ((11:|2:33:[]), ())
118 , "Foldable" ~: TestList
119 [ "accumLeftsAndFoldrRights" ~: TestList
121 (Lib.Foldable.accumLeftsAndFoldrRights (++) [""] $
124 (([(0::Integer)], [(""::String)]))
126 ((take 1 *** take 0) $
127 Lib.Foldable.accumLeftsAndFoldrRights (++) [""] $
128 ( repeat (Left [0]) ))
130 ([(0::Integer)], ([]::[String]))
131 , "Right:Left:Right:Left" ~:
132 (Lib.Foldable.accumLeftsAndFoldrRights (++) ["0"] $
133 ( Right ["2"]:Left [1]:Right ["1"]:Left [0]:[] ))
135 (([1, 0]::[Integer]), (["2", "1", "0"]::[String]))
136 , "Right:Left:Right:repeat Left" ~:
137 ((take 1 *** take 2) $
138 Lib.Foldable.accumLeftsAndFoldrRights (++) ["0"] $
139 ( Right ["2"]:Left [1]:Right ["1"]:repeat (Left [0]) ))
141 (([1]::[Integer]), (["2", "1"]::[String]))
145 , "Model" ~: TestList
146 [ "Account" ~: TestList
147 [ "foldr" ~: TestList
149 (reverse $ Account.foldr ("A":|[]) (:) []) ~?= ["A":|[]]
151 (reverse $ Account.foldr ("A":|["B"]) (:) []) ~?= ["A":|[], "A":|["B"]]
153 (reverse $ Account.foldr ("A":|["B", "C"]) (:) []) ~?= ["A":|[], "A":|["B"], "A":|["B", "C"]]
155 , "ascending" ~: TestList
157 Account.ascending ("A":|[]) ~?= Nothing
159 Account.ascending ("A":|["B"]) ~?= Just ("A":|[])
161 Account.ascending ("A":|["B", "C"]) ~?= Just ("A":|["B"])
164 , "Amount" ~: TestList
169 { Amount.quantity = Decimal 0 1
170 , Amount.style = Amount.Style.nil
171 { Amount.Style.unit_side = Just $ Amount.Style.Side_Left
176 { Amount.quantity = Decimal 0 1
177 , Amount.style = Amount.Style.nil
178 { Amount.Style.unit_side = Just $ Amount.Style.Side_Right
184 { Amount.quantity = Decimal 0 2
185 , Amount.style = Amount.Style.nil
186 { Amount.Style.unit_side = Just $ Amount.Style.Side_Left
191 , "from_List" ~: TestList
192 [ "from_List [$1, 1$] = $2" ~:
195 { Amount.quantity = Decimal 0 1
196 , Amount.style = Amount.Style.nil
197 { Amount.Style.unit_side = Just $ Amount.Style.Side_Left
202 { Amount.quantity = Decimal 0 1
203 , Amount.style = Amount.Style.nil
204 { Amount.Style.unit_side = Just $ Amount.Style.Side_Right
212 { Amount.quantity = Decimal 0 2
213 , Amount.style = Amount.Style.nil
214 { Amount.Style.unit_side = Just $ Amount.Style.Side_Left
223 [ "Balance" ~: TestList
224 [ "posting" ~: TestList
225 [ "[A+$1] = A+$1 & $+1" ~:
226 (Calc.Balance.balance
227 (Format.Ledger.posting ("A":|[]))
228 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ]
233 { Calc.Balance.balance_by_account =
234 Lib.TreeMap.from_List const
235 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
236 , Calc.Balance.balance_by_unit =
238 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
239 [ Calc.Balance.Unit_Sum
240 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
241 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
246 , "[A+$1, A-$1] = {A+$0, $+0}" ~:
248 (flip Calc.Balance.balance)
250 [ (Format.Ledger.posting ("A":|[]))
251 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ]
253 , (Format.Ledger.posting ("A":|[]))
254 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1 ]
259 { Calc.Balance.balance_by_account =
260 Lib.TreeMap.from_List const
261 [ ("A":|[], Amount.from_List [ Amount.usd $ 0 ]) ]
262 , Calc.Balance.balance_by_unit =
264 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
265 [ Calc.Balance.Unit_Sum
266 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
267 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
268 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
269 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
271 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
276 , "[A+$1, A-€1] = {A+$1-€1, $+1 €-1}" ~:
278 (flip Calc.Balance.balance)
280 [ (Format.Ledger.posting ("A":|[]))
281 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ]
283 , (Format.Ledger.posting ("A":|[]))
284 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.eur $ -1 ]
289 { Calc.Balance.balance_by_account =
290 Lib.TreeMap.from_List const
291 [ ("A":|[], Amount.from_List [ Amount.usd $ 1, Amount.eur $ -1 ]) ]
292 , Calc.Balance.balance_by_unit =
294 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
295 [ Calc.Balance.Unit_Sum
296 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
297 { Calc.Balance.amount_sum_negative = Data.Map.empty
298 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
299 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 1
301 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
304 , Calc.Balance.Unit_Sum
305 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
306 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.eur $ -1
307 , Calc.Balance.amount_sum_positive = Data.Map.empty
308 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.eur $ -1
310 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
315 , "[A+$1, B-$1] = {A+$1 B-$1, $+0}" ~:
317 (flip Calc.Balance.balance)
319 [ (Format.Ledger.posting ("A":|[]))
320 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ]
322 , (Format.Ledger.posting ("B":|[]))
323 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1 ]
328 { Calc.Balance.balance_by_account =
329 Lib.TreeMap.from_List const
330 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
331 , ("B":|[], Amount.from_List [ Amount.usd $ -1 ])
333 , Calc.Balance.balance_by_unit =
335 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
336 [ Calc.Balance.Unit_Sum
337 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
338 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
339 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
340 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
342 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
349 (flip Calc.Balance.balance)
351 [ (Format.Ledger.posting ("A":|[]))
352 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ]
354 , (Format.Ledger.posting ("B":|[]))
355 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ]
360 { Calc.Balance.balance_by_account =
361 Lib.TreeMap.from_List const
362 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
363 , ("B":|[], Amount.from_List [ Amount.usd $ 1 ])
365 , Calc.Balance.balance_by_unit =
367 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
368 [ Calc.Balance.Unit_Sum
369 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
370 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
375 , "[A+$1+€2, A-$1-€2] = {A+$0+€0, $+0 €+0}" ~:
377 (flip Calc.Balance.balance)
379 [ (Format.Ledger.posting ("A":|[]))
380 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1, Amount.eur $ 2 ]
382 , (Format.Ledger.posting ("A":|[]))
383 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1, Amount.eur $ -2 ]
388 { Calc.Balance.balance_by_account =
389 Lib.TreeMap.from_List const
390 [ ("A":|[], Amount.from_List [ Amount.usd $ 0, Amount.eur $ 0 ])
392 , Calc.Balance.balance_by_unit =
394 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
395 [ Calc.Balance.Unit_Sum
396 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
397 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
398 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
399 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
401 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
404 , Calc.Balance.Unit_Sum
405 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
406 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.eur $ -2
407 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.eur $ 2
408 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.eur $ 0
410 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
415 , "[A+$1+€2+£3, B-$1-2€-£3] = {A+$1+€2+£3 B-$1-€2-£3, $+0 €+0 £+0}" ~:
417 (flip Calc.Balance.balance)
419 [ (Format.Ledger.posting ("A":|[]))
420 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1, Amount.eur $ 2, Amount.gbp $ 3 ]
422 , (Format.Ledger.posting ("B":|[]))
423 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1, Amount.eur $ -2, Amount.gbp $ -3 ]
428 { Calc.Balance.balance_by_account =
429 Lib.TreeMap.from_List const
430 [ ("A":|[], Amount.from_List [ Amount.usd $ 1, Amount.eur $ 2, Amount.gbp $ 3 ])
431 , ("B":|[], Amount.from_List [ Amount.usd $ -1, Amount.eur $ -2, Amount.gbp $ -3 ])
433 , Calc.Balance.balance_by_unit =
435 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
436 [ Calc.Balance.Unit_Sum
437 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
438 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
439 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
440 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
442 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
445 , Calc.Balance.Unit_Sum
446 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
447 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.eur $ -2
448 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.eur $ 2
449 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.eur $ 0
451 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
454 , Calc.Balance.Unit_Sum
455 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
456 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.gbp $ -3
457 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.gbp $ 3
458 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.gbp $ 0
460 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
466 , "union" ~: TestList
468 Calc.Balance.union Calc.Balance.nil Calc.Balance.nil
470 (Calc.Balance.nil::Calc.Balance.Balance Amount)
471 , "{A+$1, $+1} {A+$1, $+1} = {A+$2, $+2}" ~:
473 (Calc.Balance.Balance
474 { Calc.Balance.balance_by_account =
475 Lib.TreeMap.from_List const
476 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
477 , Calc.Balance.balance_by_unit =
479 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
480 [ Calc.Balance.Unit_Sum
481 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
482 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
487 (Calc.Balance.Balance
488 { Calc.Balance.balance_by_account =
489 Lib.TreeMap.from_List const
490 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
491 , Calc.Balance.balance_by_unit =
493 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
494 [ Calc.Balance.Unit_Sum
495 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
496 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
503 { Calc.Balance.balance_by_account =
504 Lib.TreeMap.from_List const
505 [ ("A":|[], Amount.from_List [ Amount.usd $ 2 ]) ]
506 , Calc.Balance.balance_by_unit =
508 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
509 [ Calc.Balance.Unit_Sum
510 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
511 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
516 , "{A+$1, $+1} {B+$1, $+1} = {A+$1 B+$1, $+2}" ~:
518 (Calc.Balance.Balance
519 { Calc.Balance.balance_by_account =
520 Lib.TreeMap.from_List const
521 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
522 , Calc.Balance.balance_by_unit =
524 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
525 [ Calc.Balance.Unit_Sum
526 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
527 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
532 (Calc.Balance.Balance
533 { Calc.Balance.balance_by_account =
534 Lib.TreeMap.from_List const
535 [ ("B":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
536 , Calc.Balance.balance_by_unit =
538 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
539 [ Calc.Balance.Unit_Sum
540 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
541 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
548 { Calc.Balance.balance_by_account =
549 Lib.TreeMap.from_List const
550 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
551 , ("B":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
552 , Calc.Balance.balance_by_unit =
554 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
555 [ Calc.Balance.Unit_Sum
556 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
557 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
562 , "{A+$1, $+1} {B+€1, €+1} = {A+$1 B+€1, $+1 €+1}" ~:
564 (Calc.Balance.Balance
565 { Calc.Balance.balance_by_account =
566 Lib.TreeMap.from_List const
567 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ]
568 , Calc.Balance.balance_by_unit =
570 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
571 [ Calc.Balance.Unit_Sum
572 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
573 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
578 (Calc.Balance.Balance
579 { Calc.Balance.balance_by_account =
580 Lib.TreeMap.from_List const
581 [ ("B":|[], Amount.from_List [ Amount.eur $ 1 ]) ]
582 , Calc.Balance.balance_by_unit =
584 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
585 [ Calc.Balance.Unit_Sum
586 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
587 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
594 { Calc.Balance.balance_by_account =
595 Lib.TreeMap.from_List const
596 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
597 , ("B":|[], Amount.from_List [ Amount.eur $ 1 ]) ]
598 , Calc.Balance.balance_by_unit =
600 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
601 [ Calc.Balance.Unit_Sum
602 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
603 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
606 , Calc.Balance.Unit_Sum
607 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
608 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
614 , "expanded" ~: TestList
615 [ "nil_By_Account" ~:
616 Calc.Balance.expanded
619 (Lib.TreeMap.empty::Calc.Balance.Expanded Amount)
621 Calc.Balance.expanded
622 (Lib.TreeMap.from_List const
623 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ]) ])
625 (Lib.TreeMap.from_List const
626 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
627 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
628 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
631 , "A/A+$1 = A+$1 A/A+$1" ~:
632 Calc.Balance.expanded
633 (Lib.TreeMap.from_List const
634 [ ("A":|["A"], Amount.from_List [ Amount.usd $ 1 ]) ])
636 (Lib.TreeMap.from_List const
637 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
638 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
639 , Calc.Balance.exclusive = Amount.from_List []
641 , ("A":|["A"], Calc.Balance.Account_Sum_Expanded
642 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
643 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
646 , "A/B+$1 = A+$1 A/B+$1" ~:
647 Calc.Balance.expanded
648 (Lib.TreeMap.from_List const
649 [ ("A":|["B"], Amount.from_List [ Amount.usd $ 1 ]) ])
651 (Lib.TreeMap.from_List const
652 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
653 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
654 , Calc.Balance.exclusive = Amount.from_List []
656 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
657 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
658 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
661 , "A/B/C+$1 = A+$1 A/B+$1 A/B/C+$1" ~:
662 Calc.Balance.expanded
663 (Lib.TreeMap.from_List const
664 [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ]) ])
666 (Lib.TreeMap.from_List const
667 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
668 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
669 , Calc.Balance.exclusive = Amount.from_List []
671 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
672 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
673 , Calc.Balance.exclusive = Amount.from_List []
675 , ("A":|["B", "C"], Calc.Balance.Account_Sum_Expanded
676 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
677 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
680 , "A+$1 A/B+$1 = A+$2 A/B+$1" ~:
681 Calc.Balance.expanded
682 (Lib.TreeMap.from_List const
683 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
684 , ("A":|["B"], Amount.from_List [ Amount.usd $ 1 ])
687 (Lib.TreeMap.from_List const
688 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
689 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 2 ]
690 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
692 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
693 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
694 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
697 , "A+$1 A/B+$1 A/B/C+$1 = A+$3 A/B+$2 A/B/C+$1" ~:
698 Calc.Balance.expanded
699 (Lib.TreeMap.from_List const
700 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
701 , ("A":|["B"], Amount.from_List [ Amount.usd $ 1 ])
702 , ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
705 (Lib.TreeMap.from_List const
706 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
707 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 3 ]
708 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
710 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
711 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 2 ]
712 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
714 , ("A":|["B", "C"], Calc.Balance.Account_Sum_Expanded
715 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
716 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
719 , "A+$1 A/B+$1 A/B/C+$1 A/B/C/D+$1 = A+$4 A/B+$3 A/B/C+$2 A/B/C/D+$1" ~:
720 Calc.Balance.expanded
721 (Lib.TreeMap.from_List const
722 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
723 , ("A":|["B"], Amount.from_List [ Amount.usd $ 1 ])
724 , ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
725 , ("A":|["B", "C", "D"], Amount.from_List [ Amount.usd $ 1 ])
728 (Lib.TreeMap.from_List const
729 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
730 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 4 ]
731 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
733 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
734 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 3 ]
735 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
737 , ("A":|["B", "C"], Calc.Balance.Account_Sum_Expanded
738 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 2 ]
739 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
741 , ("A":|["B", "C", "D"], Calc.Balance.Account_Sum_Expanded
742 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
743 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
746 , "A+$1 A/B+$1 A/BB+$1 AA/B+$1 = A+$3 A/B+$1 A/BB+$1 AA+$1 AA/B+$1" ~:
747 Calc.Balance.expanded
748 (Lib.TreeMap.from_List const
749 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
750 , ("A":|["B"], Amount.from_List [ Amount.usd $ 1 ])
751 , ("A":|["BB"], Amount.from_List [ Amount.usd $ 1 ])
752 , ("AA":|["B"], Amount.from_List [ Amount.usd $ 1 ])
755 (Lib.TreeMap.from_List const
756 [ ("A":|[], Calc.Balance.Account_Sum_Expanded
757 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 3 ]
758 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
760 , ("A":|["B"], Calc.Balance.Account_Sum_Expanded
761 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
762 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
764 , ("A":|["BB"], Calc.Balance.Account_Sum_Expanded
765 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
766 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
768 , ("AA":|[], Calc.Balance.Account_Sum_Expanded
769 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
770 , Calc.Balance.exclusive = Amount.from_List []
772 , ("AA":|["B"], Calc.Balance.Account_Sum_Expanded
773 { Calc.Balance.inclusive = Calc.Balance.amount_sum $ Amount.from_List [ Amount.usd $ 1 ]
774 , Calc.Balance.exclusive = Amount.from_List [ Amount.usd $ 1 ]
778 , "deviation" ~: TestList
780 (Calc.Balance.deviation $
782 { Calc.Balance.balance_by_account =
783 Lib.TreeMap.from_List const
784 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
785 , ("B":|[], Amount.from_List [])
787 , Calc.Balance.balance_by_unit =
789 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
790 [ Calc.Balance.Unit_Sum
791 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
792 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
798 (Calc.Balance.Deviation $
800 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
801 [ Calc.Balance.Unit_Sum
802 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
803 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
807 , "{A+$1 B+$1, $2}" ~:
808 (Calc.Balance.deviation $
810 { Calc.Balance.balance_by_account =
811 Lib.TreeMap.from_List const
812 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
813 , ("B":|[], Amount.from_List [ Amount.usd $ 1 ])
815 , Calc.Balance.balance_by_unit =
817 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
818 [ Calc.Balance.Unit_Sum
819 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
820 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
828 (Calc.Balance.Deviation $
830 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
831 [ Calc.Balance.Unit_Sum
832 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
833 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
839 , "is_equilibrium_inferrable" ~: TestList
840 [ "nil" ~: TestCase $
842 Calc.Balance.is_equilibrium_inferrable $
843 Calc.Balance.deviation $
844 (Calc.Balance.nil::Calc.Balance.Balance Amount.Amount)
845 , "{A+$0, $+0}" ~: TestCase $
847 Calc.Balance.is_equilibrium_inferrable $
848 Calc.Balance.deviation $
850 { Calc.Balance.balance_by_account =
851 Lib.TreeMap.from_List const
852 [ ("A":|[], Amount.from_List [ Amount.usd $ 0 ])
854 , Calc.Balance.balance_by_unit =
856 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
857 [ Calc.Balance.Unit_Sum
858 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
859 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
864 , "{A+$1, $+1}" ~: TestCase $
866 Calc.Balance.is_equilibrium_inferrable $
867 Calc.Balance.deviation $
869 { Calc.Balance.balance_by_account =
870 Lib.TreeMap.from_List const
871 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
873 , Calc.Balance.balance_by_unit =
875 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
876 [ Calc.Balance.Unit_Sum
877 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
878 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
883 , "{A+$0+€0, $0 €+0}" ~: TestCase $
885 Calc.Balance.is_equilibrium_inferrable $
886 Calc.Balance.deviation $
888 { Calc.Balance.balance_by_account =
889 Lib.TreeMap.from_List const
890 [ ("A":|[], Amount.from_List [ Amount.usd $ 0, Amount.eur $ 0 ])
892 , Calc.Balance.balance_by_unit =
894 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
895 [ Calc.Balance.Unit_Sum
896 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
897 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
900 , Calc.Balance.Unit_Sum
901 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 0
902 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
907 , "{A+$1, B-$1, $+0}" ~: TestCase $
909 Calc.Balance.is_equilibrium_inferrable $
910 Calc.Balance.deviation $
912 { Calc.Balance.balance_by_account =
913 Lib.TreeMap.from_List const
914 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
915 , ("B":|[], Amount.from_List [ Amount.usd $ -1 ])
917 , Calc.Balance.balance_by_unit =
919 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
920 [ Calc.Balance.Unit_Sum
921 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
922 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
927 , "{A+$1 B, $+1}" ~: TestCase $
929 Calc.Balance.is_equilibrium_inferrable $
930 Calc.Balance.deviation $
932 { Calc.Balance.balance_by_account =
933 Lib.TreeMap.from_List const
934 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
935 , ("B":|[], Amount.from_List [])
937 , Calc.Balance.balance_by_unit =
939 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
940 [ Calc.Balance.Unit_Sum
941 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
942 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
947 , "{A+$1 B+€1, $+1 €+1}" ~: TestCase $
949 Calc.Balance.is_equilibrium_inferrable $
950 Calc.Balance.deviation $
952 { Calc.Balance.balance_by_account =
953 Lib.TreeMap.from_List const
954 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
955 , ("B":|[], Amount.from_List [ Amount.eur $ 1 ])
957 , Calc.Balance.balance_by_unit =
959 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
960 [ Calc.Balance.Unit_Sum
961 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 1
962 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
965 , Calc.Balance.Unit_Sum
966 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
967 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
972 , "{A+$1 B-$1+€1, $+0 €+1}" ~: TestCase $
974 Calc.Balance.is_equilibrium_inferrable $
975 Calc.Balance.deviation $
977 { Calc.Balance.balance_by_account =
978 Lib.TreeMap.from_List const
979 [ ("A":|[], Amount.from_List [ Amount.usd $ 1 ])
980 , ("B":|[], Amount.from_List [ Amount.usd $ -1, Amount.eur $ 1 ])
982 , Calc.Balance.balance_by_unit =
984 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
985 [ Calc.Balance.Unit_Sum
986 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
987 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
990 , Calc.Balance.Unit_Sum
991 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 1
992 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
997 , "{A+$1+€2+£3 B-$1-€2-£3, $+0 €+0 £+0}" ~: TestCase $
999 Calc.Balance.is_equilibrium_inferrable $
1000 Calc.Balance.deviation $
1001 Calc.Balance.Balance
1002 { Calc.Balance.balance_by_account =
1003 Lib.TreeMap.from_List const
1004 [ ("A":|[], Amount.from_List [ Amount.usd $ 1, Amount.eur $ 2, Amount.gbp $ 3 ])
1005 , ("B":|[], Amount.from_List [ Amount.usd $ -1, Amount.eur $ -2, Amount.gbp $ -3 ])
1007 , Calc.Balance.balance_by_unit =
1009 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
1010 [ Calc.Balance.Unit_Sum
1011 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 0
1012 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
1015 , Calc.Balance.Unit_Sum
1016 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.eur $ 0
1017 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
1020 , Calc.Balance.Unit_Sum
1021 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.gbp $ 0
1022 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
1028 , "infer_equilibrium" ~: TestList
1030 (snd $ Calc.Balance.infer_equilibrium $
1031 Format.Ledger.posting_by_Account
1032 [ (Format.Ledger.posting ("A":|[]))
1033 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ] }
1034 , (Format.Ledger.posting ("B":|[]))
1035 { Format.Ledger.posting_amounts=Amount.from_List [] }
1039 Format.Ledger.posting_by_Account
1040 [ (Format.Ledger.posting ("A":|[]))
1041 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ] }
1042 , (Format.Ledger.posting ("B":|[]))
1043 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1 ] }
1046 (snd $ Calc.Balance.infer_equilibrium $
1047 Format.Ledger.posting_by_Account
1048 [ (Format.Ledger.posting ("A":|[]))
1049 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ] }
1050 , (Format.Ledger.posting ("B":|[]))
1051 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.eur $ -1 ] }
1055 Format.Ledger.posting_by_Account
1056 [ (Format.Ledger.posting ("A":|[]))
1057 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1, Amount.eur $ 1] }
1058 , (Format.Ledger.posting ("B":|[]))
1059 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.eur $ -1, Amount.usd $ -1 ] }
1062 (snd $ Calc.Balance.infer_equilibrium $
1063 Format.Ledger.posting_by_Account
1064 [ (Format.Ledger.posting ("A":|[]))
1065 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ] }
1066 , (Format.Ledger.posting ("B":|[]))
1067 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ] }
1071 [ Calc.Balance.Unit_Sum
1072 { Calc.Balance.unit_sum_amount = Calc.Balance.amount_sum $ Data.Map.singleton () $ Amount.usd $ 2
1073 , Calc.Balance.unit_sum_accounts = Data.Map.fromList []}
1075 , "{A+$1 B-$1 B-1€}" ~:
1076 (snd $ Calc.Balance.infer_equilibrium $
1077 Format.Ledger.posting_by_Account
1078 [ (Format.Ledger.posting ("A":|[]))
1079 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1 ] }
1080 , (Format.Ledger.posting ("B":|[]))
1081 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1, Amount.eur $ -1 ] }
1085 Format.Ledger.posting_by_Account
1086 [ (Format.Ledger.posting ("A":|[]))
1087 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ 1, Amount.eur $ 1 ] }
1088 , (Format.Ledger.posting ("B":|[]))
1089 { Format.Ledger.posting_amounts=Amount.from_List [ Amount.usd $ -1, Amount.eur $ -1 ] }
1094 , "Format" ~: TestList
1095 [ "Ledger" ~: TestList
1096 [ "Read" ~: TestList
1097 [ "account_name" ~: TestList
1099 (Data.Either.rights $
1101 (Format.Ledger.Read.account_name <* P.eof)
1106 (Data.Either.rights $
1108 (Format.Ledger.Read.account_name <* P.eof)
1113 (Data.Either.rights $
1115 (Format.Ledger.Read.account_name <* P.eof)
1116 () "" ("AA"::Text)])
1120 (Data.Either.rights $
1122 (Format.Ledger.Read.account_name <* P.eof)
1127 (Data.Either.rights $
1129 (Format.Ledger.Read.account_name <* P.eof)
1134 (Data.Either.rights $
1136 (Format.Ledger.Read.account_name <* P.eof)
1137 () "" ("A:"::Text)])
1141 (Data.Either.rights $
1143 (Format.Ledger.Read.account_name <* P.eof)
1144 () "" (":A"::Text)])
1148 (Data.Either.rights $
1150 (Format.Ledger.Read.account_name <* P.eof)
1151 () "" ("A "::Text)])
1155 (Data.Either.rights $
1157 (Format.Ledger.Read.account_name)
1158 () "" ("A "::Text)])
1162 (Data.Either.rights $
1164 (Format.Ledger.Read.account_name <* P.eof)
1165 () "" ("A A"::Text)])
1169 (Data.Either.rights $
1171 (Format.Ledger.Read.account_name <* P.eof)
1172 () "" ("A "::Text)])
1176 (Data.Either.rights $
1178 (Format.Ledger.Read.account_name <* P.eof)
1179 () "" ("A \n"::Text)])
1183 (Data.Either.rights $
1185 (Format.Ledger.Read.account_name <* P.eof)
1186 () "" ("(A)A"::Text)])
1190 (Data.Either.rights $
1192 (Format.Ledger.Read.account_name <* P.eof)
1193 () "" ("( )A"::Text)])
1197 (Data.Either.rights $
1199 (Format.Ledger.Read.account_name <* P.eof)
1200 () "" ("(A) A"::Text)])
1204 (Data.Either.rights $
1206 (Format.Ledger.Read.account_name <* P.eof)
1207 () "" ("[ ]A"::Text)])
1211 (Data.Either.rights $
1213 (Format.Ledger.Read.account_name <* P.eof)
1214 () "" ("(A) "::Text)])
1218 (Data.Either.rights $
1220 (Format.Ledger.Read.account_name <* P.eof)
1221 () "" ("(A)"::Text)])
1225 (Data.Either.rights $
1227 (Format.Ledger.Read.account_name <* P.eof)
1228 () "" ("A(A)"::Text)])
1232 (Data.Either.rights $
1234 (Format.Ledger.Read.account_name <* P.eof)
1235 () "" ("[A]A"::Text)])
1239 (Data.Either.rights $
1241 (Format.Ledger.Read.account_name <* P.eof)
1242 () "" ("[A] A"::Text)])
1246 (Data.Either.rights $
1248 (Format.Ledger.Read.account_name <* P.eof)
1249 () "" ("[A] "::Text)])
1253 (Data.Either.rights $
1255 (Format.Ledger.Read.account_name <* P.eof)
1256 () "" ("[A]"::Text)])
1260 , "account" ~: TestList
1262 (Data.Either.rights $
1264 (Format.Ledger.Read.account <* P.eof)
1269 (Data.Either.rights $
1271 (Format.Ledger.Read.account <* P.eof)
1276 (Data.Either.rights $
1278 (Format.Ledger.Read.account <* P.eof)
1279 () "" ("A:"::Text)])
1283 (Data.Either.rights $
1285 (Format.Ledger.Read.account <* P.eof)
1286 () "" (":A"::Text)])
1290 (Data.Either.rights $
1292 (Format.Ledger.Read.account <* P.eof)
1293 () "" ("A "::Text)])
1297 (Data.Either.rights $
1299 (Format.Ledger.Read.account <* P.eof)
1300 () "" (" A"::Text)])
1304 (Data.Either.rights $
1306 (Format.Ledger.Read.account <* P.eof)
1307 () "" ("A:B"::Text)])
1311 (Data.Either.rights $
1313 (Format.Ledger.Read.account <* P.eof)
1314 () "" ("A:B:C"::Text)])
1317 , "\"Aa:Bbb:Cccc\"" ~:
1318 (Data.Either.rights $
1320 (Format.Ledger.Read.account <* P.eof)
1321 () "" ("Aa:Bbb:Cccc"::Text)])
1323 ["Aa":|["Bbb", "Cccc"]]
1324 , "\"A a : B b b : C c c c\"" ~:
1325 (Data.Either.rights $
1327 (Format.Ledger.Read.account <* P.eof)
1328 () "" ("A a : B b b : C c c c"::Text)])
1330 ["A a ":|[" B b b ", " C c c c"]]
1332 (Data.Either.rights $
1334 (Format.Ledger.Read.account <* P.eof)
1335 () "" ("A: :C"::Text)])
1339 (Data.Either.rights $
1341 (Format.Ledger.Read.account <* P.eof)
1342 () "" ("A::C"::Text)])
1346 (Data.Either.rights $
1348 (Format.Ledger.Read.account <* P.eof)
1349 () "" ("A:B:(C)"::Text)])
1353 , "posting_type" ~: TestList
1355 Format.Ledger.Read.posting_type
1358 (Format.Ledger.Posting_Type_Regular, "A":|[])
1360 Format.Ledger.Read.posting_type
1363 (Format.Ledger.Posting_Type_Regular, "(":|[])
1365 Format.Ledger.Read.posting_type
1368 (Format.Ledger.Posting_Type_Regular, ")":|[])
1370 Format.Ledger.Read.posting_type
1373 (Format.Ledger.Posting_Type_Regular, "()":|[])
1375 Format.Ledger.Read.posting_type
1378 (Format.Ledger.Posting_Type_Regular, "( )":|[])
1380 Format.Ledger.Read.posting_type
1383 (Format.Ledger.Posting_Type_Virtual, "A":|[])
1385 Format.Ledger.Read.posting_type
1388 (Format.Ledger.Posting_Type_Virtual, "A":|["B", "C"])
1390 Format.Ledger.Read.posting_type
1393 (Format.Ledger.Posting_Type_Regular, "A":|["B", "C"])
1395 Format.Ledger.Read.posting_type
1398 (Format.Ledger.Posting_Type_Regular, "(A)":|["B", "C"])
1400 Format.Ledger.Read.posting_type
1403 (Format.Ledger.Posting_Type_Regular, "A":|["(B)", "C"])
1405 Format.Ledger.Read.posting_type
1408 (Format.Ledger.Posting_Type_Regular, "A":|["B", "(C)"])
1410 Format.Ledger.Read.posting_type
1413 (Format.Ledger.Posting_Type_Regular, "[":|[])
1415 Format.Ledger.Read.posting_type
1418 (Format.Ledger.Posting_Type_Regular, "]":|[])
1420 Format.Ledger.Read.posting_type
1423 (Format.Ledger.Posting_Type_Regular, "[]":|[])
1425 Format.Ledger.Read.posting_type
1428 (Format.Ledger.Posting_Type_Regular, "[ ]":|[])
1430 Format.Ledger.Read.posting_type
1433 (Format.Ledger.Posting_Type_Virtual_Balanced, "A":|[])
1435 Format.Ledger.Read.posting_type
1438 (Format.Ledger.Posting_Type_Virtual_Balanced, "A":|["B", "C"])
1440 Format.Ledger.Read.posting_type
1443 (Format.Ledger.Posting_Type_Regular, "A":|["B", "C"])
1445 Format.Ledger.Read.posting_type
1448 (Format.Ledger.Posting_Type_Regular, "[A]":|["B", "C"])
1450 Format.Ledger.Read.posting_type
1453 (Format.Ledger.Posting_Type_Regular, "A":|["[B]", "C"])
1455 Format.Ledger.Read.posting_type
1458 (Format.Ledger.Posting_Type_Regular, "A":|["B", "[C]"])
1460 , "amount" ~: TestList
1462 (Data.Either.rights $
1464 (Format.Ledger.Read.amount <* P.eof)
1468 , "\"0\" = Right 0" ~:
1469 (Data.Either.rights $
1471 (Format.Ledger.Read.amount <* P.eof)
1475 { Amount.quantity = Decimal 0 0
1477 , "\"00\" = Right 0" ~:
1478 (Data.Either.rights $
1480 (Format.Ledger.Read.amount <* P.eof)
1481 () "" ("00"::Text)])
1484 { Amount.quantity = Decimal 0 0
1486 , "\"0.\" = Right 0." ~:
1487 (Data.Either.rights $
1489 (Format.Ledger.Read.amount <* P.eof)
1490 () "" ("0."::Text)])
1493 { Amount.quantity = Decimal 0 0
1496 { Amount.Style.fractioning = Just '.'
1499 , "\".0\" = Right 0.0" ~:
1500 (Data.Either.rights $
1502 (Format.Ledger.Read.amount <* P.eof)
1503 () "" (".0"::Text)])
1506 { Amount.quantity = Decimal 0 0
1509 { Amount.Style.fractioning = Just '.'
1510 , Amount.Style.precision = 1
1513 , "\"0,\" = Right 0," ~:
1514 (Data.Either.rights $
1516 (Format.Ledger.Read.amount <* P.eof)
1517 () "" ("0,"::Text)])
1520 { Amount.quantity = Decimal 0 0
1523 { Amount.Style.fractioning = Just ','
1526 , "\",0\" = Right 0,0" ~:
1527 (Data.Either.rights $
1529 (Format.Ledger.Read.amount <* P.eof)
1530 () "" (",0"::Text)])
1533 { Amount.quantity = Decimal 0 0
1536 { Amount.Style.fractioning = Just ','
1537 , Amount.Style.precision = 1
1540 , "\"0_\" = Left" ~:
1541 (Data.Either.rights $
1543 (Format.Ledger.Read.amount <* P.eof)
1544 () "" ("0_"::Text)])
1547 , "\"_0\" = Left" ~:
1548 (Data.Either.rights $
1550 (Format.Ledger.Read.amount <* P.eof)
1551 () "" ("_0"::Text)])
1554 , "\"0.0\" = Right 0.0" ~:
1555 (Data.Either.rights $
1557 (Format.Ledger.Read.amount <* P.eof)
1558 () "" ("0.0"::Text)])
1561 { Amount.quantity = Decimal 0 0
1564 { Amount.Style.fractioning = Just '.'
1565 , Amount.Style.precision = 1
1568 , "\"00.00\" = Right 0.00" ~:
1569 (Data.Either.rights $
1571 (Format.Ledger.Read.amount <* P.eof)
1572 () "" ("00.00"::Text)])
1575 { Amount.quantity = Decimal 0 0
1578 { Amount.Style.fractioning = Just '.'
1579 , Amount.Style.precision = 2
1582 , "\"0,0\" = Right 0,0" ~:
1583 (Data.Either.rights $
1585 (Format.Ledger.Read.amount <* P.eof)
1586 () "" ("0,0"::Text)])
1589 { Amount.quantity = Decimal 0 0
1592 { Amount.Style.fractioning = Just ','
1593 , Amount.Style.precision = 1
1596 , "\"00,00\" = Right 0,00" ~:
1597 (Data.Either.rights $
1599 (Format.Ledger.Read.amount <* P.eof)
1600 () "" ("00,00"::Text)])
1603 { Amount.quantity = Decimal 0 0
1606 { Amount.Style.fractioning = Just ','
1607 , Amount.Style.precision = 2
1610 , "\"0_0\" = Right 0" ~:
1611 (Data.Either.rights $
1613 (Format.Ledger.Read.amount <* P.eof)
1614 () "" ("0_0"::Text)])
1617 { Amount.quantity = Decimal 0 0
1620 { Amount.Style.fractioning = Nothing
1621 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '_' [1]
1622 , Amount.Style.precision = 0
1625 , "\"00_00\" = Right 0" ~:
1626 (Data.Either.rights $
1628 (Format.Ledger.Read.amount <* P.eof)
1629 () "" ("00_00"::Text)])
1632 { Amount.quantity = Decimal 0 0
1635 { Amount.Style.fractioning = Nothing
1636 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '_' [2]
1637 , Amount.Style.precision = 0
1640 , "\"0,000.00\" = Right 0,000.00" ~:
1641 (Data.Either.rights $
1643 (Format.Ledger.Read.amount <* P.eof)
1644 () "" ("0,000.00"::Text)])
1647 { Amount.quantity = Decimal 0 0
1650 { Amount.Style.fractioning = Just '.'
1651 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [3]
1652 , Amount.Style.precision = 2
1655 , "\"0.000,00\" = Right 0.000,00" ~:
1656 (Data.Either.rights $
1658 (Format.Ledger.Read.amount)
1659 () "" ("0.000,00"::Text)])
1662 { Amount.quantity = Decimal 0 0
1665 { Amount.Style.fractioning = Just ','
1666 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '.' [3]
1667 , Amount.Style.precision = 2
1670 , "\"1,000.00\" = Right 1,000.00" ~:
1671 (Data.Either.rights $
1673 (Format.Ledger.Read.amount <* P.eof)
1674 () "" ("1,000.00"::Text)])
1677 { Amount.quantity = Decimal 0 1000
1680 { Amount.Style.fractioning = Just '.'
1681 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [3]
1682 , Amount.Style.precision = 2
1685 , "\"1.000,00\" = Right 1.000,00" ~:
1686 (Data.Either.rights $
1688 (Format.Ledger.Read.amount)
1689 () "" ("1.000,00"::Text)])
1692 { Amount.quantity = Decimal 0 1000
1695 { Amount.Style.fractioning = Just ','
1696 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '.' [3]
1697 , Amount.Style.precision = 2
1700 , "\"1,000.00.\" = Left" ~:
1701 (Data.Either.rights $
1703 (Format.Ledger.Read.amount)
1704 () "" ("1,000.00."::Text)])
1707 , "\"1.000,00,\" = Left" ~:
1708 (Data.Either.rights $
1710 (Format.Ledger.Read.amount)
1711 () "" ("1.000,00,"::Text)])
1714 , "\"1,000.00_\" = Left" ~:
1715 (Data.Either.rights $
1717 (Format.Ledger.Read.amount)
1718 () "" ("1,000.00_"::Text)])
1721 , "\"12\" = Right 12" ~:
1722 (Data.Either.rights $
1724 (Format.Ledger.Read.amount <* P.eof)
1725 () "" ("123"::Text)])
1728 { Amount.quantity = Decimal 0 123
1730 , "\"1.2\" = Right 1.2" ~:
1731 (Data.Either.rights $
1733 (Format.Ledger.Read.amount <* P.eof)
1734 () "" ("1.2"::Text)])
1737 { Amount.quantity = Decimal 1 12
1740 { Amount.Style.fractioning = Just '.'
1741 , Amount.Style.precision = 1
1744 , "\"1,2\" = Right 1,2" ~:
1745 (Data.Either.rights $
1747 (Format.Ledger.Read.amount <* P.eof)
1748 () "" ("1,2"::Text)])
1751 { Amount.quantity = Decimal 1 12
1754 { Amount.Style.fractioning = Just ','
1755 , Amount.Style.precision = 1
1758 , "\"12.23\" = Right 12.23" ~:
1759 (Data.Either.rights $
1761 (Format.Ledger.Read.amount <* P.eof)
1762 () "" ("12.34"::Text)])
1765 { Amount.quantity = Decimal 2 1234
1768 { Amount.Style.fractioning = Just '.'
1769 , Amount.Style.precision = 2
1772 , "\"12,23\" = Right 12,23" ~:
1773 (Data.Either.rights $
1775 (Format.Ledger.Read.amount <* P.eof)
1776 () "" ("12,34"::Text)])
1779 { Amount.quantity = Decimal 2 1234
1782 { Amount.Style.fractioning = Just ','
1783 , Amount.Style.precision = 2
1786 , "\"1_2\" = Right 1_2" ~:
1787 (Data.Either.rights $
1789 (Format.Ledger.Read.amount <* P.eof)
1790 () "" ("1_2"::Text)])
1793 { Amount.quantity = Decimal 0 12
1796 { Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '_' [1]
1797 , Amount.Style.precision = 0
1800 , "\"1_23\" = Right 1_23" ~:
1801 (Data.Either.rights $
1803 (Format.Ledger.Read.amount <* P.eof)
1804 () "" ("1_23"::Text)])
1807 { Amount.quantity = Decimal 0 123
1810 { Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '_' [2]
1811 , Amount.Style.precision = 0
1814 , "\"1_23_456\" = Right 1_23_456" ~:
1815 (Data.Either.rights $
1817 (Format.Ledger.Read.amount <* P.eof)
1818 () "" ("1_23_456"::Text)])
1821 { Amount.quantity = Decimal 0 123456
1824 { Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '_' [3, 2]
1825 , Amount.Style.precision = 0
1828 , "\"1_23_456.7890_12345_678901\" = Right 1_23_456.7890_12345_678901" ~:
1829 (Data.Either.rights $
1831 (Format.Ledger.Read.amount <* P.eof)
1832 () "" ("1_23_456.7890_12345_678901"::Text)])
1835 { Amount.quantity = Decimal 15 123456789012345678901
1838 { Amount.Style.fractioning = Just '.'
1839 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '_' [3, 2]
1840 , Amount.Style.grouping_fractional = Just $ Amount.Style.Grouping '_' [4, 5, 6]
1841 , Amount.Style.precision = 15
1844 , "\"123456_78901_2345.678_90_1\" = Right 123456_78901_2345.678_90_1" ~:
1845 (Data.Either.rights $
1847 (Format.Ledger.Read.amount <* P.eof)
1848 () "" ("123456_78901_2345.678_90_1"::Text)])
1851 { Amount.quantity = Decimal 6 123456789012345678901
1854 { Amount.Style.fractioning = Just '.'
1855 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '_' [4, 5, 6]
1856 , Amount.Style.grouping_fractional = Just $ Amount.Style.Grouping '_' [3, 2]
1857 , Amount.Style.precision = 6
1860 , "\"$1\" = Right $1" ~:
1861 (Data.Either.rights $
1863 (Format.Ledger.Read.amount <* P.eof)
1864 () "" ("$1"::Text)])
1867 { Amount.quantity = Decimal 0 1
1870 { Amount.Style.fractioning = Nothing
1871 , Amount.Style.grouping_integral = Nothing
1872 , Amount.Style.grouping_fractional = Nothing
1873 , Amount.Style.precision = 0
1874 , Amount.Style.unit_side = Just Amount.Style.Side_Left
1875 , Amount.Style.unit_spaced = Just False
1879 , "\"1$\" = Right 1$" ~:
1880 (Data.Either.rights $
1882 (Format.Ledger.Read.amount <* P.eof)
1883 () "" ("1$"::Text)])
1886 { Amount.quantity = Decimal 0 1
1889 { Amount.Style.fractioning = Nothing
1890 , Amount.Style.grouping_integral = Nothing
1891 , Amount.Style.grouping_fractional = Nothing
1892 , Amount.Style.precision = 0
1893 , Amount.Style.unit_side = Just Amount.Style.Side_Right
1894 , Amount.Style.unit_spaced = Just False
1898 , "\"$ 1\" = Right $ 1" ~:
1899 (Data.Either.rights $
1901 (Format.Ledger.Read.amount <* P.eof)
1902 () "" ("$ 1"::Text)])
1905 { Amount.quantity = Decimal 0 1
1908 { Amount.Style.fractioning = Nothing
1909 , Amount.Style.grouping_integral = Nothing
1910 , Amount.Style.grouping_fractional = Nothing
1911 , Amount.Style.precision = 0
1912 , Amount.Style.unit_side = Just Amount.Style.Side_Left
1913 , Amount.Style.unit_spaced = Just True
1917 , "\"1 $\" = Right 1 $" ~:
1918 (Data.Either.rights $
1920 (Format.Ledger.Read.amount <* P.eof)
1921 () "" ("1 $"::Text)])
1924 { Amount.quantity = Decimal 0 1
1927 { Amount.Style.fractioning = Nothing
1928 , Amount.Style.grouping_integral = Nothing
1929 , Amount.Style.grouping_fractional = Nothing
1930 , Amount.Style.precision = 0
1931 , Amount.Style.unit_side = Just Amount.Style.Side_Right
1932 , Amount.Style.unit_spaced = Just True
1936 , "\"-$1\" = Right $-1" ~:
1937 (Data.Either.rights $
1939 (Format.Ledger.Read.amount <* P.eof)
1940 () "" ("-$1"::Text)])
1943 { Amount.quantity = Decimal 0 (-1)
1946 { Amount.Style.fractioning = Nothing
1947 , Amount.Style.grouping_integral = Nothing
1948 , Amount.Style.grouping_fractional = Nothing
1949 , Amount.Style.precision = 0
1950 , Amount.Style.unit_side = Just Amount.Style.Side_Left
1951 , Amount.Style.unit_spaced = Just False
1955 , "\"\\\"4 2\\\"1\" = Right \\\"4 2\\\"1" ~:
1956 (Data.Either.rights $
1958 (Format.Ledger.Read.amount <* P.eof)
1959 () "" ("\"4 2\"1"::Text)])
1962 { Amount.quantity = Decimal 0 1
1965 { Amount.Style.fractioning = Nothing
1966 , Amount.Style.grouping_integral = Nothing
1967 , Amount.Style.grouping_fractional = Nothing
1968 , Amount.Style.precision = 0
1969 , Amount.Style.unit_side = Just Amount.Style.Side_Left
1970 , Amount.Style.unit_spaced = Just False
1972 , Amount.unit = "4 2"
1974 , "\"1\\\"4 2\\\"\" = Right 1\\\"4 2\\\"" ~:
1975 (Data.Either.rights $
1977 (Format.Ledger.Read.amount <* P.eof)
1978 () "" ("1\"4 2\""::Text)])
1981 { Amount.quantity = Decimal 0 1
1984 { Amount.Style.fractioning = Nothing
1985 , Amount.Style.grouping_integral = Nothing
1986 , Amount.Style.grouping_fractional = Nothing
1987 , Amount.Style.precision = 0
1988 , Amount.Style.unit_side = Just Amount.Style.Side_Right
1989 , Amount.Style.unit_spaced = Just False
1991 , Amount.unit = "4 2"
1993 , "\"$1.000,00\" = Right $1.000,00" ~:
1994 (Data.Either.rights $
1996 (Format.Ledger.Read.amount <* P.eof)
1997 () "" ("$1.000,00"::Text)])
2000 { Amount.quantity = Decimal 0 1000
2003 { Amount.Style.fractioning = Just ','
2004 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '.' [3]
2005 , Amount.Style.grouping_fractional = Nothing
2006 , Amount.Style.precision = 2
2007 , Amount.Style.unit_side = Just Amount.Style.Side_Left
2008 , Amount.Style.unit_spaced = Just False
2012 , "\"1.000,00$\" = Right 1.000,00$" ~:
2013 (Data.Either.rights $
2015 (Format.Ledger.Read.amount <* P.eof)
2016 () "" ("1.000,00$"::Text)])
2019 { Amount.quantity = Decimal 0 1000
2022 { Amount.Style.fractioning = Just ','
2023 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping '.' [3]
2024 , Amount.Style.grouping_fractional = Nothing
2025 , Amount.Style.precision = 2
2026 , Amount.Style.unit_side = Just Amount.Style.Side_Right
2027 , Amount.Style.unit_spaced = Just False
2032 , "comment" ~: TestList
2033 [ "; some comment = Right \" some comment\"" ~:
2034 (Data.Either.rights $
2036 (Format.Ledger.Read.comment <* P.eof)
2037 () "" ("; some comment"::Text)])
2040 , "; some comment \\n = Right \" some comment \"" ~:
2041 (Data.Either.rights $
2043 (Format.Ledger.Read.comment <* P.newline <* P.eof)
2044 () "" ("; some comment \n"::Text)])
2046 [ " some comment " ]
2047 , "; some comment \\r\\n = Right \" some comment \"" ~:
2048 (Data.Either.rights $
2050 (Format.Ledger.Read.comment <* P.string "\r\n" <* P.eof)
2051 () "" ("; some comment \r\n"::Text)])
2053 [ " some comment " ]
2055 , "comments" ~: TestList
2056 [ "; some comment\\n ; some other comment = Right [\" some comment\", \" some other comment\"]" ~:
2057 (Data.Either.rights $
2059 (Format.Ledger.Read.comments <* P.eof)
2060 () "" ("; some comment\n ; some other comment"::Text)])
2062 [ [" some comment", " some other comment"] ]
2063 , "; some comment \\n = Right \" some comment \"" ~:
2064 (Data.Either.rights $
2066 (Format.Ledger.Read.comments <* P.string "\n" <* P.eof)
2067 () "" ("; some comment \n"::Text)])
2069 [ [" some comment "] ]
2071 , "date" ~: TestList
2073 (Data.Either.rights $
2074 [P.runParser_with_Error
2075 (Format.Ledger.Read.date Nothing <* P.eof)
2076 () "" ("2000/01/01"::Text)])
2080 (Time.fromGregorian 2000 01 01)
2081 (Time.TimeOfDay 0 0 0))
2083 , "2000/01/01 some text" ~:
2084 (Data.Either.rights $
2085 [P.runParser_with_Error
2086 (Format.Ledger.Read.date Nothing)
2087 () "" ("2000/01/01 some text"::Text)])
2091 (Time.fromGregorian 2000 01 01)
2092 (Time.TimeOfDay 0 0 0))
2094 , "2000/01/01 12:34" ~:
2095 (Data.Either.rights $
2096 [P.runParser_with_Error
2097 (Format.Ledger.Read.date Nothing <* P.eof)
2098 () "" ("2000/01/01 12:34"::Text)])
2102 (Time.fromGregorian 2000 01 01)
2103 (Time.TimeOfDay 12 34 0))
2105 , "2000/01/01 12:34:56" ~:
2106 (Data.Either.rights $
2107 [P.runParser_with_Error
2108 (Format.Ledger.Read.date Nothing <* P.eof)
2109 () "" ("2000/01/01 12:34:56"::Text)])
2113 (Time.fromGregorian 2000 01 01)
2114 (Time.TimeOfDay 12 34 56))
2116 , "2000/01/01 12:34 CET" ~:
2117 (Data.Either.rights $
2118 [P.runParser_with_Error
2119 (Format.Ledger.Read.date Nothing <* P.eof)
2120 () "" ("2000/01/01 12:34 CET"::Text)])
2124 (Time.fromGregorian 2000 01 01)
2125 (Time.TimeOfDay 12 34 0))
2126 (Time.TimeZone 60 True "CET")]
2127 , "2000/01/01 12:34 +0130" ~:
2128 (Data.Either.rights $
2129 [P.runParser_with_Error
2130 (Format.Ledger.Read.date Nothing <* P.eof)
2131 () "" ("2000/01/01 12:34 +0130"::Text)])
2135 (Time.fromGregorian 2000 01 01)
2136 (Time.TimeOfDay 12 34 0))
2137 (Time.TimeZone 90 False "+0130")]
2138 , "2000/01/01 12:34:56 CET" ~:
2139 (Data.Either.rights $
2140 [P.runParser_with_Error
2141 (Format.Ledger.Read.date Nothing <* P.eof)
2142 () "" ("2000/01/01 12:34:56 CET"::Text)])
2146 (Time.fromGregorian 2000 01 01)
2147 (Time.TimeOfDay 12 34 56))
2148 (Time.TimeZone 60 True "CET")]
2150 (Data.Either.rights $
2151 [P.runParser_with_Error
2152 (Format.Ledger.Read.date Nothing <* P.eof)
2153 () "" ("2001/02/29"::Text)])
2157 (Data.Either.rights $
2158 [P.runParser_with_Error
2159 (Format.Ledger.Read.date (Just 2000) <* P.eof)
2160 () "" ("01/01"::Text)])
2164 (Time.fromGregorian 2000 01 01)
2165 (Time.TimeOfDay 0 0 0))
2168 , "tag_value" ~: TestList
2170 (Data.Either.rights $
2172 (Format.Ledger.Read.tag_value <* P.eof)
2177 (Data.Either.rights $
2179 (Format.Ledger.Read.tag_value <* P.char '\n' <* P.eof)
2180 () "" (",\n"::Text)])
2184 (Data.Either.rights $
2186 (Format.Ledger.Read.tag_value <* P.eof)
2187 () "" (",x"::Text)])
2191 (Data.Either.rights $
2193 (Format.Ledger.Read.tag_value <* P.string ",x:" <* P.eof)
2194 () "" (",x:"::Text)])
2198 (Data.Either.rights $
2200 (Format.Ledger.Read.tag_value <* P.string ", n:" <* P.eof)
2201 () "" ("v, v, n:"::Text)])
2207 (Data.Either.rights $
2209 (Format.Ledger.Read.tag <* P.eof)
2210 () "" ("Name:"::Text)])
2214 (Data.Either.rights $
2216 (Format.Ledger.Read.tag <* P.eof)
2217 () "" ("Name:Value"::Text)])
2220 , "Name:Value\\n" ~:
2221 (Data.Either.rights $
2223 (Format.Ledger.Read.tag <* P.string "\n" <* P.eof)
2224 () "" ("Name:Value\n"::Text)])
2228 (Data.Either.rights $
2230 (Format.Ledger.Read.tag <* P.eof)
2231 () "" ("Name:Val ue"::Text)])
2233 [("Name", "Val ue")]
2235 (Data.Either.rights $
2237 (Format.Ledger.Read.tag <* P.eof)
2238 () "" ("Name:,"::Text)])
2242 (Data.Either.rights $
2244 (Format.Ledger.Read.tag <* P.eof)
2245 () "" ("Name:Val,ue"::Text)])
2247 [("Name", "Val,ue")]
2249 (Data.Either.rights $
2251 (Format.Ledger.Read.tag <* P.string ",ue:" <* P.eof)
2252 () "" ("Name:Val,ue:"::Text)])
2256 , "tags" ~: TestList
2258 (Data.Either.rights $
2260 (Format.Ledger.Read.tags <* P.eof)
2261 () "" ("Name:"::Text)])
2268 (Data.Either.rights $
2270 (Format.Ledger.Read.tags <* P.eof)
2271 () "" ("Name:,"::Text)])
2278 (Data.Either.rights $
2280 (Format.Ledger.Read.tags <* P.eof)
2281 () "" ("Name:,Name:"::Text)])
2284 [ ("Name", ["", ""])
2288 (Data.Either.rights $
2290 (Format.Ledger.Read.tags <* P.eof)
2291 () "" ("Name:,Name2:"::Text)])
2298 , "Name: , Name2:" ~:
2299 (Data.Either.rights $
2301 (Format.Ledger.Read.tags <* P.eof)
2302 () "" ("Name: , Name2:"::Text)])
2309 , "Name:,Name2:,Name3:" ~:
2310 (Data.Either.rights $
2312 (Format.Ledger.Read.tags <* P.eof)
2313 () "" ("Name:,Name2:,Name3:"::Text)])
2321 , "Name:Val ue,Name2:V a l u e,Name3:V al ue" ~:
2322 (Data.Either.rights $
2324 (Format.Ledger.Read.tags <* P.eof)
2325 () "" ("Name:Val ue,Name2:V a l u e,Name3:V al ue"::Text)])
2328 [ ("Name", ["Val ue"])
2329 , ("Name2", ["V a l u e"])
2330 , ("Name3", ["V al ue"])
2334 , "posting" ~: TestList
2335 [ " A:B:C = Right A:B:C" ~:
2336 (Data.Either.rights $
2337 [P.runParser_with_Error
2338 (Format.Ledger.Read.posting <* P.eof)
2339 Format.Ledger.Read.nil_Context "" (" A:B:C"::Text)])
2341 [ ( (Format.Ledger.posting ("A":|["B", "C"]))
2342 { Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2344 , Format.Ledger.Posting_Type_Regular
2347 , " !A:B:C = Right !A:B:C" ~:
2348 (Data.List.map fst $
2349 Data.Either.rights $
2350 [P.runParser_with_Error
2351 (Format.Ledger.Read.posting <* P.eof)
2352 Format.Ledger.Read.nil_Context "" (" !A:B:C"::Text)])
2354 [ (Format.Ledger.posting ("A":|["B", "C"]))
2355 { Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2356 , Format.Ledger.posting_status = True
2359 , " *A:B:C = Right *A:B:C" ~:
2360 (Data.List.map fst $
2361 Data.Either.rights $
2362 [P.runParser_with_Error
2363 (Format.Ledger.Read.posting <* P.eof)
2364 Format.Ledger.Read.nil_Context "" (" *A:B:C"::Text)])
2366 [ (Format.Ledger.posting ("A":|["B", "C"]))
2367 { Format.Ledger.posting_amounts = Data.Map.fromList []
2368 , Format.Ledger.posting_comments = []
2369 , Format.Ledger.posting_dates = []
2370 , Format.Ledger.posting_status = True
2371 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2372 , Format.Ledger.posting_tags = Data.Map.fromList []
2375 , " A:B:C $1 = Right A:B:C $1" ~:
2376 (Data.List.map fst $
2377 Data.Either.rights $
2378 [P.runParser_with_Error
2379 (Format.Ledger.Read.posting <* P.eof)
2380 Format.Ledger.Read.nil_Context "" (" A:B:C $1"::Text)])
2382 [ (Format.Ledger.posting ("A":|["B","C $1"]))
2383 { Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2386 , " A:B:C $1 = Right A:B:C $1" ~:
2387 (Data.List.map fst $
2388 Data.Either.rights $
2389 [P.runParser_with_Error
2390 (Format.Ledger.Read.posting <* P.eof)
2391 Format.Ledger.Read.nil_Context "" (" A:B:C $1"::Text)])
2393 [ (Format.Ledger.posting ("A":|["B", "C"]))
2394 { Format.Ledger.posting_amounts = Data.Map.fromList
2396 { Amount.quantity = 1
2397 , Amount.style = Amount.Style.nil
2398 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2399 , Amount.Style.unit_spaced = Just False
2404 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2407 , " A:B:C $1 + 1€ = Right A:B:C $1 + 1€" ~:
2408 (Data.List.map fst $
2409 Data.Either.rights $
2410 [P.runParser_with_Error
2411 (Format.Ledger.Read.posting <* P.eof)
2412 Format.Ledger.Read.nil_Context "" (" A:B:C $1 + 1€"::Text)])
2414 [ (Format.Ledger.posting ("A":|["B", "C"]))
2415 { Format.Ledger.posting_amounts = Data.Map.fromList
2417 { Amount.quantity = 1
2418 , Amount.style = Amount.Style.nil
2419 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2420 , Amount.Style.unit_spaced = Just False
2425 { Amount.quantity = 1
2426 , Amount.style = Amount.Style.nil
2427 { Amount.Style.unit_side = Just Amount.Style.Side_Right
2428 , Amount.Style.unit_spaced = Just False
2433 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2436 , " A:B:C $1 + 1$ = Right A:B:C $2" ~:
2437 (Data.List.map fst $
2438 Data.Either.rights $
2439 [P.runParser_with_Error
2440 (Format.Ledger.Read.posting <* P.eof)
2441 Format.Ledger.Read.nil_Context "" (" A:B:C $1 + 1$"::Text)])
2443 [ (Format.Ledger.posting ("A":|["B", "C"]))
2444 { Format.Ledger.posting_amounts = Data.Map.fromList
2446 { Amount.quantity = 2
2447 , Amount.style = Amount.Style.nil
2448 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2449 , Amount.Style.unit_spaced = Just False
2454 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2457 , " A:B:C $1 + 1$ + 1$ = Right A:B:C $3" ~:
2458 (Data.List.map fst $
2459 Data.Either.rights $
2460 [P.runParser_with_Error
2461 (Format.Ledger.Read.posting <* P.eof)
2462 Format.Ledger.Read.nil_Context "" (" A:B:C $1 + 1$ + 1$"::Text)])
2464 [ (Format.Ledger.posting ("A":|["B", "C"]))
2465 { Format.Ledger.posting_amounts = Data.Map.fromList
2467 { Amount.quantity = 3
2468 , Amount.style = Amount.Style.nil
2469 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2470 , Amount.Style.unit_spaced = Just False
2475 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2478 , " A:B:C ; some comment = Right A:B:C ; some comment" ~:
2479 (Data.List.map fst $
2480 Data.Either.rights $
2481 [P.runParser_with_Error
2482 (Format.Ledger.Read.posting <* P.eof)
2483 Format.Ledger.Read.nil_Context "" (" A:B:C ; some comment"::Text)])
2485 [ (Format.Ledger.posting ("A":|["B", "C"]))
2486 { Format.Ledger.posting_amounts = Data.Map.fromList []
2487 , Format.Ledger.posting_comments = [" some comment"]
2488 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2491 , " A:B:C ; some comment\\n ; some other comment = Right A:B:C ; some comment\\n ; some other comment" ~:
2492 (Data.List.map fst $
2493 Data.Either.rights $
2494 [P.runParser_with_Error
2495 (Format.Ledger.Read.posting <* P.eof)
2496 Format.Ledger.Read.nil_Context "" (" A:B:C ; some comment\n ; some other comment"::Text)])
2498 [ (Format.Ledger.posting ("A":|["B", "C"]))
2499 { Format.Ledger.posting_amounts = Data.Map.fromList []
2500 , Format.Ledger.posting_comments = [" some comment", " some other comment"]
2501 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2504 , " A:B:C $1 ; some comment = Right A:B:C $1 ; some comment" ~:
2505 (Data.List.map fst $
2506 Data.Either.rights $
2507 [P.runParser_with_Error
2508 (Format.Ledger.Read.posting)
2509 Format.Ledger.Read.nil_Context "" (" A:B:C $1 ; some comment"::Text)])
2511 [ (Format.Ledger.posting ("A":|["B", "C"]))
2512 { Format.Ledger.posting_amounts = Data.Map.fromList
2514 { Amount.quantity = 1
2515 , Amount.style = Amount.Style.nil
2516 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2517 , Amount.Style.unit_spaced = Just False
2522 , Format.Ledger.posting_comments = [" some comment"]
2523 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2526 , " A:B:C ; N:V = Right A:B:C ; N:V" ~:
2527 (Data.List.map fst $
2528 Data.Either.rights $
2529 [P.runParser_with_Error
2530 (Format.Ledger.Read.posting <* P.eof)
2531 Format.Ledger.Read.nil_Context "" (" A:B:C ; N:V"::Text)])
2533 [ (Format.Ledger.posting ("A":|["B", "C"]))
2534 { Format.Ledger.posting_comments = [" N:V"]
2535 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2536 , Format.Ledger.posting_tags = Data.Map.fromList
2541 , " A:B:C ; some comment N:V = Right A:B:C ; some comment N:V" ~:
2542 (Data.List.map fst $
2543 Data.Either.rights $
2544 [P.runParser_with_Error
2545 (Format.Ledger.Read.posting <* P.eof)
2546 Format.Ledger.Read.nil_Context "" (" A:B:C ; some comment N:V"::Text)])
2548 [ (Format.Ledger.posting ("A":|["B", "C"]))
2549 { Format.Ledger.posting_comments = [" some comment N:V"]
2550 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2551 , Format.Ledger.posting_tags = Data.Map.fromList
2556 , " A:B:C ; some comment N:V v, N2:V2 v2 = Right A:B:C ; some comment N:V v, N2:V2 v2" ~:
2557 (Data.List.map fst $
2558 Data.Either.rights $
2559 [P.runParser_with_Error
2560 (Format.Ledger.Read.posting )
2561 Format.Ledger.Read.nil_Context "" (" A:B:C ; some comment N:V v, N2:V2 v2"::Text)])
2563 [ (Format.Ledger.posting ("A":|["B", "C"]))
2564 { Format.Ledger.posting_comments = [" some comment N:V v, N2:V2 v2"]
2565 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2566 , Format.Ledger.posting_tags = Data.Map.fromList
2572 , " A:B:C ; N:V\\n ; N:V2 = Right A:B:C ; N:V\\n ; N:V2" ~:
2573 (Data.List.map fst $
2574 Data.Either.rights $
2575 [P.runParser_with_Error
2576 (Format.Ledger.Read.posting <* P.eof)
2577 Format.Ledger.Read.nil_Context "" (" A:B:C ; N:V\n ; N:V2"::Text)])
2579 [ (Format.Ledger.posting ("A":|["B", "C"]))
2580 { Format.Ledger.posting_comments = [" N:V", " N:V2"]
2581 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2582 , Format.Ledger.posting_tags = Data.Map.fromList
2583 [ ("N", ["V", "V2"])
2587 , " A:B:C ; N:V\\n ; N2:V = Right A:B:C ; N:V\\n ; N2:V" ~:
2588 (Data.List.map fst $
2589 Data.Either.rights $
2590 [P.runParser_with_Error
2591 (Format.Ledger.Read.posting <* P.eof)
2592 Format.Ledger.Read.nil_Context "" (" A:B:C ; N:V\n ; N2:V"::Text)])
2594 [ (Format.Ledger.posting ("A":|["B", "C"]))
2595 { Format.Ledger.posting_comments = [" N:V", " N2:V"]
2596 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2597 , Format.Ledger.posting_tags = Data.Map.fromList
2603 , " A:B:C ; date:2001/01/01 = Right A:B:C ; date:2001/01/01" ~:
2604 (Data.List.map fst $
2605 Data.Either.rights $
2606 [P.runParser_with_Error
2607 (Format.Ledger.Read.posting <* P.eof)
2608 Format.Ledger.Read.nil_Context "" (" A:B:C ; date:2001/01/01"::Text)])
2610 [ (Format.Ledger.posting ("A":|["B", "C"]))
2611 { Format.Ledger.posting_comments = [" date:2001/01/01"]
2612 , Format.Ledger.posting_dates =
2615 (Time.fromGregorian 2001 01 01)
2616 (Time.TimeOfDay 0 0 0))
2619 , Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2620 , Format.Ledger.posting_tags = Data.Map.fromList
2621 [ ("date", ["2001/01/01"])
2625 , " (A:B:C) = Right (A:B:C)" ~:
2626 (Data.Either.rights $
2627 [P.runParser_with_Error
2628 (Format.Ledger.Read.posting <* P.eof)
2629 Format.Ledger.Read.nil_Context "" (" (A:B:C)"::Text)])
2631 [ ( (Format.Ledger.posting ("A":|["B", "C"]))
2632 { Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2634 , Format.Ledger.Posting_Type_Virtual
2637 , " [A:B:C] = Right [A:B:C]" ~:
2638 (Data.Either.rights $
2639 [P.runParser_with_Error
2640 (Format.Ledger.Read.posting <* P.eof)
2641 Format.Ledger.Read.nil_Context "" (" [A:B:C]"::Text)])
2643 [ ( (Format.Ledger.posting ("A":|["B", "C"]))
2644 { Format.Ledger.posting_sourcepos = P.newPos "" 1 1
2646 , Format.Ledger.Posting_Type_Virtual_Balanced
2650 , "transaction" ~: TestList
2651 [ "2000/01/01 some description\\n A:B:C $1\\n a:b:c" ~:
2652 (Data.Either.rights $
2653 [P.runParser_with_Error
2654 (Format.Ledger.Read.transaction <* P.eof)
2655 Format.Ledger.Read.nil_Context "" ("2000/01/01 some description\n A:B:C $1\n a:b:c"::Text)])
2657 [ Format.Ledger.transaction
2658 { Format.Ledger.transaction_dates=
2661 (Time.fromGregorian 2000 01 01)
2662 (Time.TimeOfDay 0 0 0))
2665 , Format.Ledger.transaction_description="some description"
2666 , Format.Ledger.transaction_postings = Format.Ledger.posting_by_Account
2667 [ (Format.Ledger.posting ("A":|["B", "C"]))
2668 { Format.Ledger.posting_amounts = Data.Map.fromList
2670 { Amount.quantity = 1
2671 , Amount.style = Amount.Style.nil
2672 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2673 , Amount.Style.unit_spaced = Just False
2678 , Format.Ledger.posting_sourcepos = P.newPos "" 2 1
2680 , (Format.Ledger.posting ("a":|["b", "c"]))
2681 { Format.Ledger.posting_amounts = Data.Map.fromList
2683 { Amount.quantity = -1
2684 , Amount.style = Amount.Style.nil
2685 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2686 , Amount.Style.unit_spaced = Just False
2691 , Format.Ledger.posting_sourcepos = P.newPos "" 3 1
2694 , Format.Ledger.transaction_postings_balance =
2695 Calc.Balance.Balance
2696 { Calc.Balance.balance_by_account =
2697 Lib.TreeMap.from_List const
2698 [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
2699 , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
2701 , Calc.Balance.balance_by_unit =
2703 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
2704 [ Calc.Balance.Unit_Sum
2705 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
2706 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
2707 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
2708 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
2710 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
2717 , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
2720 , "2000/01/01 some description\\n A:B:C $1\\n a:b:c\\n" ~:
2721 (Data.Either.rights $
2722 [P.runParser_with_Error
2723 (Format.Ledger.Read.transaction <* P.newline <* P.eof)
2724 Format.Ledger.Read.nil_Context "" ("2000/01/01 some description\n A:B:C $1\n a:b:c\n"::Text)])
2726 [ Format.Ledger.transaction
2727 { Format.Ledger.transaction_dates=
2730 (Time.fromGregorian 2000 01 01)
2731 (Time.TimeOfDay 0 0 0))
2734 , Format.Ledger.transaction_description="some description"
2735 , Format.Ledger.transaction_postings = Format.Ledger.posting_by_Account
2736 [ (Format.Ledger.posting ("A":|["B", "C"]))
2737 { Format.Ledger.posting_amounts = Data.Map.fromList
2739 { Amount.quantity = 1
2740 , Amount.style = Amount.Style.nil
2741 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2742 , Amount.Style.unit_spaced = Just False
2747 , Format.Ledger.posting_sourcepos = P.newPos "" 2 1
2749 , (Format.Ledger.posting ("a":|["b", "c"]))
2750 { Format.Ledger.posting_amounts = Data.Map.fromList
2752 { Amount.quantity = -1
2753 , Amount.style = Amount.Style.nil
2754 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2755 , Amount.Style.unit_spaced = Just False
2760 , Format.Ledger.posting_sourcepos = P.newPos "" 3 1
2763 , Format.Ledger.transaction_postings_balance =
2764 Calc.Balance.Balance
2765 { Calc.Balance.balance_by_account =
2766 Lib.TreeMap.from_List const
2767 [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
2768 , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
2770 , Calc.Balance.balance_by_unit =
2772 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
2773 [ Calc.Balance.Unit_Sum
2774 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
2775 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
2776 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
2777 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
2779 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
2786 , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
2789 , "2000/01/01 some description ; some comment\\n ; some other;comment\\n ; some Tag:\\n ; some last comment\\n A:B:C $1\\n a:b:c" ~:
2790 (Data.Either.rights $
2791 [P.runParser_with_Error
2792 (Format.Ledger.Read.transaction <* P.eof)
2793 Format.Ledger.Read.nil_Context "" ("2000/01/01 some description ; some comment\n ; some other;comment\n ; some Tag:\n ; some last comment\n A:B:C $1\n a:b:c"::Text)])
2795 [ Format.Ledger.transaction
2796 { Format.Ledger.transaction_comments_after =
2798 , " some other;comment"
2800 , " some last comment"
2802 , Format.Ledger.transaction_dates=
2805 (Time.fromGregorian 2000 01 01)
2806 (Time.TimeOfDay 0 0 0))
2809 , Format.Ledger.transaction_description="some description"
2810 , Format.Ledger.transaction_postings = Format.Ledger.posting_by_Account
2811 [ (Format.Ledger.posting ("A":|["B", "C"]))
2812 { Format.Ledger.posting_amounts = Data.Map.fromList
2814 { Amount.quantity = 1
2815 , Amount.style = Amount.Style.nil
2816 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2817 , Amount.Style.unit_spaced = Just False
2822 , Format.Ledger.posting_sourcepos = P.newPos "" 5 1
2824 , (Format.Ledger.posting ("a":|["b", "c"]))
2825 { Format.Ledger.posting_amounts = Data.Map.fromList
2827 { Amount.quantity = -1
2828 , Amount.style = Amount.Style.nil
2829 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2830 , Amount.Style.unit_spaced = Just False
2835 , Format.Ledger.posting_sourcepos = P.newPos "" 6 1
2838 , Format.Ledger.transaction_tags = Data.Map.fromList
2841 , Format.Ledger.transaction_postings_balance =
2842 Calc.Balance.Balance
2843 { Calc.Balance.balance_by_account =
2844 Lib.TreeMap.from_List const
2845 [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
2846 , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
2848 , Calc.Balance.balance_by_unit =
2850 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
2851 [ Calc.Balance.Unit_Sum
2852 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
2853 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
2854 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
2855 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
2857 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
2864 , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
2868 , "journal" ~: TestList
2869 [ "2000/01/01 1° description\\n A:B:C $1\\n a:b:c\\n2000/01/02 2° description\\n A:B:C $1\\n x:y:z" ~: TestCase $ do
2871 P.runParserT_with_Error
2872 (Format.Ledger.Read.journal "" {-<* P.eof-})
2873 Format.Ledger.Read.nil_Context "" ("2000/01/01 1° description\n A:B:C $1\n a:b:c\n2000/01/02 2° description\n A:B:C $1\n x:y:z"::Text)
2875 (\j -> j{Format.Ledger.journal_last_read_time=
2876 Format.Ledger.journal_last_read_time Format.Ledger.journal}) $
2877 Data.Either.rights [jnl])
2879 [ Format.Ledger.journal
2880 { Format.Ledger.journal_transactions =
2881 Format.Ledger.transaction_by_Date
2882 [ Format.Ledger.transaction
2883 { Format.Ledger.transaction_dates=
2886 (Time.fromGregorian 2000 01 01)
2887 (Time.TimeOfDay 0 0 0))
2890 , Format.Ledger.transaction_description="1° description"
2891 , Format.Ledger.transaction_postings = Format.Ledger.posting_by_Account
2892 [ (Format.Ledger.posting ("A":|["B", "C"]))
2893 { Format.Ledger.posting_amounts = Data.Map.fromList
2895 { Amount.quantity = 1
2896 , Amount.style = Amount.Style.nil
2897 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2898 , Amount.Style.unit_spaced = Just False
2903 , Format.Ledger.posting_sourcepos = P.newPos "" 2 1
2905 , (Format.Ledger.posting ("a":|["b", "c"]))
2906 { Format.Ledger.posting_amounts = Data.Map.fromList
2908 { Amount.quantity = -1
2909 , Amount.style = Amount.Style.nil
2910 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2911 , Amount.Style.unit_spaced = Just False
2916 , Format.Ledger.posting_sourcepos = P.newPos "" 3 1
2919 , Format.Ledger.transaction_postings_balance =
2920 Calc.Balance.Balance
2921 { Calc.Balance.balance_by_account =
2922 Lib.TreeMap.from_List const
2923 [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
2924 , ("a":|["b", "c"], Amount.from_List [ Amount.usd $ -1 ])
2926 , Calc.Balance.balance_by_unit =
2928 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
2929 [ Calc.Balance.Unit_Sum
2930 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
2931 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
2932 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
2933 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
2935 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
2942 , Format.Ledger.transaction_sourcepos = P.newPos "" 1 1
2944 , Format.Ledger.transaction
2945 { Format.Ledger.transaction_dates=
2948 (Time.fromGregorian 2000 01 02)
2949 (Time.TimeOfDay 0 0 0))
2952 , Format.Ledger.transaction_description="2° description"
2953 , Format.Ledger.transaction_postings = Format.Ledger.posting_by_Account
2954 [ (Format.Ledger.posting ("A":|["B", "C"]))
2955 { Format.Ledger.posting_amounts = Data.Map.fromList
2957 { Amount.quantity = 1
2958 , Amount.style = Amount.Style.nil
2959 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2960 , Amount.Style.unit_spaced = Just False
2965 , Format.Ledger.posting_sourcepos = P.newPos "" 5 1
2967 , (Format.Ledger.posting ("x":|["y", "z"]))
2968 { Format.Ledger.posting_amounts = Data.Map.fromList
2970 { Amount.quantity = -1
2971 , Amount.style = Amount.Style.nil
2972 { Amount.Style.unit_side = Just Amount.Style.Side_Left
2973 , Amount.Style.unit_spaced = Just False
2978 , Format.Ledger.posting_sourcepos = P.newPos "" 6 1
2981 , Format.Ledger.transaction_postings_balance =
2982 Calc.Balance.Balance
2983 { Calc.Balance.balance_by_account =
2984 Lib.TreeMap.from_List const
2985 [ ("A":|["B", "C"], Amount.from_List [ Amount.usd $ 1 ])
2986 , ("x":|["y", "z"], Amount.from_List [ Amount.usd $ -1 ])
2988 , Calc.Balance.balance_by_unit =
2990 Data.List.map (\s -> (Amount.unit $ (Calc.Balance.amount_sum_balance $ Calc.Balance.unit_sum_amount s) Data.Map.! (), s))
2991 [ Calc.Balance.Unit_Sum
2992 { Calc.Balance.unit_sum_amount = Calc.Balance.Amount_Sum
2993 { Calc.Balance.amount_sum_negative = Data.Map.singleton () $ Amount.usd $ -1
2994 , Calc.Balance.amount_sum_positive = Data.Map.singleton () $ Amount.usd $ 1
2995 , Calc.Balance.amount_sum_balance = Data.Map.singleton () $ Amount.usd $ 0
2997 , Calc.Balance.unit_sum_accounts = Data.Map.fromList $ Data.List.map (,())
3004 , Format.Ledger.transaction_sourcepos = P.newPos "" 4 1
3011 , "Write" ~: TestList
3012 [ "account" ~: TestList
3014 ((Format.Ledger.Write.show
3015 Format.Ledger.Write.Style
3016 { Format.Ledger.Write.style_color=False
3017 , Format.Ledger.Write.style_align=True
3019 Format.Ledger.Write.account Format.Ledger.Posting_Type_Regular $
3024 ((Format.Ledger.Write.show
3025 Format.Ledger.Write.Style
3026 { Format.Ledger.Write.style_color=False
3027 , Format.Ledger.Write.style_align=True
3029 Format.Ledger.Write.account Format.Ledger.Posting_Type_Regular $
3034 ((Format.Ledger.Write.show
3035 Format.Ledger.Write.Style
3036 { Format.Ledger.Write.style_color=False
3037 , Format.Ledger.Write.style_align=True
3039 Format.Ledger.Write.account Format.Ledger.Posting_Type_Virtual $
3044 ((Format.Ledger.Write.show
3045 Format.Ledger.Write.Style
3046 { Format.Ledger.Write.style_color=False
3047 , Format.Ledger.Write.style_align=True
3049 Format.Ledger.Write.account Format.Ledger.Posting_Type_Virtual_Balanced $
3054 , "amount" ~: TestList
3056 ((Format.Ledger.Write.show
3057 Format.Ledger.Write.Style
3058 { Format.Ledger.Write.style_color=False
3059 , Format.Ledger.Write.style_align=True
3061 Format.Ledger.Write.amount
3066 ((Format.Ledger.Write.show
3067 Format.Ledger.Write.Style
3068 { Format.Ledger.Write.style_color=False
3069 , Format.Ledger.Write.style_align=True
3071 Format.Ledger.Write.amount
3073 { Amount.style = Amount.Style.nil
3074 { Amount.Style.precision = 2 }
3079 ((Format.Ledger.Write.show
3080 Format.Ledger.Write.Style
3081 { Format.Ledger.Write.style_color=False
3082 , Format.Ledger.Write.style_align=True
3084 Format.Ledger.Write.amount
3086 { Amount.quantity = Decimal 0 123
3091 ((Format.Ledger.Write.show
3092 Format.Ledger.Write.Style
3093 { Format.Ledger.Write.style_color=False
3094 , Format.Ledger.Write.style_align=True
3096 Format.Ledger.Write.amount
3098 { Amount.quantity = Decimal 0 (- 123)
3102 , "12.3 @ prec=0" ~:
3103 ((Format.Ledger.Write.show
3104 Format.Ledger.Write.Style
3105 { Format.Ledger.Write.style_color=False
3106 , Format.Ledger.Write.style_align=True
3108 Format.Ledger.Write.amount
3110 { Amount.quantity = Decimal 1 123
3111 , Amount.style = Amount.Style.nil
3112 { Amount.Style.fractioning = Just '.'
3117 , "12.5 @ prec=0" ~:
3118 ((Format.Ledger.Write.show
3119 Format.Ledger.Write.Style
3120 { Format.Ledger.Write.style_color=False
3121 , Format.Ledger.Write.style_align=True
3123 Format.Ledger.Write.amount
3125 { Amount.quantity = Decimal 1 125
3126 , Amount.style = Amount.Style.nil
3127 { Amount.Style.fractioning = Just '.'
3132 , "12.3 @ prec=1" ~:
3133 ((Format.Ledger.Write.show
3134 Format.Ledger.Write.Style
3135 { Format.Ledger.Write.style_color=False
3136 , Format.Ledger.Write.style_align=True
3138 Format.Ledger.Write.amount
3140 { Amount.quantity = Decimal 1 123
3141 , Amount.style = Amount.Style.nil
3142 { Amount.Style.fractioning = Just '.'
3143 , Amount.Style.precision = 1
3148 , "1,234.56 @ prec=2" ~:
3149 ((Format.Ledger.Write.show
3150 Format.Ledger.Write.Style
3151 { Format.Ledger.Write.style_color=False
3152 , Format.Ledger.Write.style_align=True
3154 Format.Ledger.Write.amount
3156 { Amount.quantity = Decimal 2 123456
3157 , Amount.style = Amount.Style.nil
3158 { Amount.Style.fractioning = Just '.'
3159 , Amount.Style.precision = 2
3160 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [3]
3165 , "123,456,789,01,2.3456789 @ prec=7" ~:
3166 ((Format.Ledger.Write.show
3167 Format.Ledger.Write.Style
3168 { Format.Ledger.Write.style_color=False
3169 , Format.Ledger.Write.style_align=True
3171 Format.Ledger.Write.amount
3173 { Amount.quantity = Decimal 7 1234567890123456789
3174 , Amount.style = Amount.Style.nil
3175 { Amount.Style.fractioning = Just '.'
3176 , Amount.Style.precision = 7
3177 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [1, 2, 3]
3181 "123,456,789,01,2.3456789")
3182 , "1234567.8,90,123,456,789 @ prec=12" ~:
3183 ((Format.Ledger.Write.show
3184 Format.Ledger.Write.Style
3185 { Format.Ledger.Write.style_color=False
3186 , Format.Ledger.Write.style_align=True
3188 Format.Ledger.Write.amount
3190 { Amount.quantity = Decimal 12 1234567890123456789
3191 , Amount.style = Amount.Style.nil
3192 { Amount.Style.fractioning = Just '.'
3193 , Amount.Style.precision = 12
3194 , Amount.Style.grouping_fractional = Just $ Amount.Style.Grouping ',' [1, 2, 3]
3198 "1234567.8,90,123,456,789")
3199 , "1,2,3,4,5,6,7,89,012.3456789 @ prec=7" ~:
3200 ((Format.Ledger.Write.show
3201 Format.Ledger.Write.Style
3202 { Format.Ledger.Write.style_color=False
3203 , Format.Ledger.Write.style_align=True
3205 Format.Ledger.Write.amount
3207 { Amount.quantity = Decimal 7 1234567890123456789
3208 , Amount.style = Amount.Style.nil
3209 { Amount.Style.fractioning = Just '.'
3210 , Amount.Style.precision = 7
3211 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [3, 2, 1]
3215 "1,2,3,4,5,6,7,89,012.3456789")
3216 , "1234567.890,12,3,4,5,6,7,8,9 @ prec=12" ~:
3217 ((Format.Ledger.Write.show
3218 Format.Ledger.Write.Style
3219 { Format.Ledger.Write.style_color=False
3220 , Format.Ledger.Write.style_align=True
3222 Format.Ledger.Write.amount
3224 { Amount.quantity = Decimal 12 1234567890123456789
3225 , Amount.style = Amount.Style.nil
3226 { Amount.Style.fractioning = Just '.'
3227 , Amount.Style.precision = 12
3228 , Amount.Style.grouping_fractional = Just $ Amount.Style.Grouping ',' [3, 2, 1]
3232 "1234567.890,12,3,4,5,6,7,8,9")
3234 , "amount_length" ~: TestList
3236 ((Format.Ledger.Write.amount_length
3241 ((Format.Ledger.Write.amount_length
3243 { Amount.style = Amount.Style.nil
3244 { Amount.Style.precision = 2 }
3249 ((Format.Ledger.Write.amount_length
3251 { Amount.quantity = Decimal 0 123
3256 ((Format.Ledger.Write.amount_length
3258 { Amount.quantity = Decimal 0 (- 123)
3262 , "12.3 @ prec=0" ~:
3263 ((Format.Ledger.Write.amount_length
3265 { Amount.quantity = Decimal 1 123
3266 , Amount.style = Amount.Style.nil
3267 { Amount.Style.fractioning = Just '.'
3272 , "12.5 @ prec=0" ~:
3273 ((Format.Ledger.Write.amount_length
3275 { Amount.quantity = Decimal 1 125
3276 , Amount.style = Amount.Style.nil
3277 { Amount.Style.fractioning = Just '.'
3282 , "12.3 @ prec=1" ~:
3283 ((Format.Ledger.Write.amount_length
3285 { Amount.quantity = Decimal 1 123
3286 , Amount.style = Amount.Style.nil
3287 { Amount.Style.fractioning = Just '.'
3288 , Amount.Style.precision = 1
3293 , "1,234.56 @ prec=2" ~:
3294 ((Format.Ledger.Write.amount_length
3296 { Amount.quantity = Decimal 2 123456
3297 , Amount.style = Amount.Style.nil
3298 { Amount.Style.fractioning = Just '.'
3299 , Amount.Style.precision = 2
3300 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [3]
3305 , "123,456,789,01,2.3456789 @ prec=7" ~:
3306 ((Format.Ledger.Write.amount_length
3308 { Amount.quantity = Decimal 7 1234567890123456789
3309 , Amount.style = Amount.Style.nil
3310 { Amount.Style.fractioning = Just '.'
3311 , Amount.Style.precision = 7
3312 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [1, 2, 3]
3317 , "1234567.8,90,123,456,789 @ prec=12" ~:
3318 ((Format.Ledger.Write.amount_length
3320 { Amount.quantity = Decimal 12 1234567890123456789
3321 , Amount.style = Amount.Style.nil
3322 { Amount.Style.fractioning = Just '.'
3323 , Amount.Style.precision = 12
3324 , Amount.Style.grouping_fractional = Just $ Amount.Style.Grouping ',' [1, 2, 3]
3329 , "1,2,3,4,5,6,7,89,012.3456789 @ prec=7" ~:
3330 ((Format.Ledger.Write.amount_length
3332 { Amount.quantity = Decimal 7 1234567890123456789
3333 , Amount.style = Amount.Style.nil
3334 { Amount.Style.fractioning = Just '.'
3335 , Amount.Style.precision = 7
3336 , Amount.Style.grouping_integral = Just $ Amount.Style.Grouping ',' [3, 2, 1]
3341 , "1234567.890,12,3,4,5,6,7,8,9 @ prec=12" ~:
3342 ((Format.Ledger.Write.amount_length
3344 { Amount.quantity = Decimal 12 1234567890123456789
3345 , Amount.style = Amount.Style.nil
3346 { Amount.Style.fractioning = Just '.'
3347 , Amount.Style.precision = 12
3348 , Amount.Style.grouping_fractional = Just $ Amount.Style.Grouping ',' [3, 2, 1]
3353 , "1000000.000,00,0,0,0,0,0,0,0 @ prec=12" ~:
3354 ((Format.Ledger.Write.amount_length
3356 { Amount.quantity = Decimal 12 1000000000000000000
3357 , Amount.style = Amount.Style.nil
3358 { Amount.Style.fractioning = Just '.'
3359 , Amount.Style.precision = 12
3360 , Amount.Style.grouping_fractional = Just $ Amount.Style.Grouping ',' [3, 2, 1]
3366 ((Format.Ledger.Write.amount_length $
3368 { Amount.quantity = Decimal 0 999
3369 , Amount.style = Amount.Style.nil
3370 { Amount.Style.precision = 0
3375 , "1000 @ prec=0" ~:
3376 ((Format.Ledger.Write.amount_length $
3378 { Amount.quantity = Decimal 0 1000
3379 , Amount.style = Amount.Style.nil
3380 { Amount.Style.precision = 0
3385 , "10,00€ @ prec=2" ~:
3386 ((Format.Ledger.Write.amount_length $ Amount.eur 10)
3390 , "date" ~: TestList
3392 ((Format.Ledger.Write.show
3393 Format.Ledger.Write.Style
3394 { Format.Ledger.Write.style_color=False
3395 , Format.Ledger.Write.style_align=True
3397 Format.Ledger.Write.date
3401 , "2000/01/01 12:34:51 CET" ~:
3402 (Format.Ledger.Write.show
3403 Format.Ledger.Write.Style
3404 { Format.Ledger.Write.style_color=False
3405 , Format.Ledger.Write.style_align=True
3407 Format.Ledger.Write.date $
3410 (Time.fromGregorian 2000 01 01)
3411 (Time.TimeOfDay 12 34 51))
3412 (Time.TimeZone 60 False "CET"))
3414 "2000/01/01 12:34:51 CET"
3415 , "2000/01/01 12:34:51 +0100" ~:
3416 (Format.Ledger.Write.show
3417 Format.Ledger.Write.Style
3418 { Format.Ledger.Write.style_color=False
3419 , Format.Ledger.Write.style_align=True
3421 Format.Ledger.Write.date $
3424 (Time.fromGregorian 2000 01 01)
3425 (Time.TimeOfDay 12 34 51))
3426 (Time.TimeZone 60 False ""))
3428 "2000/01/01 12:34:51 +0100"
3429 , "2000/01/01 01:02:03" ~:
3430 (Format.Ledger.Write.show
3431 Format.Ledger.Write.Style
3432 { Format.Ledger.Write.style_color=False
3433 , Format.Ledger.Write.style_align=True
3435 Format.Ledger.Write.date $
3438 (Time.fromGregorian 2000 01 01)
3439 (Time.TimeOfDay 1 2 3))
3442 "2000/01/01 01:02:03"
3444 (Format.Ledger.Write.show
3445 Format.Ledger.Write.Style
3446 { Format.Ledger.Write.style_color=False
3447 , Format.Ledger.Write.style_align=True
3449 Format.Ledger.Write.date $
3452 (Time.fromGregorian 0 01 01)
3453 (Time.TimeOfDay 1 2 0))
3458 (Format.Ledger.Write.show
3459 Format.Ledger.Write.Style
3460 { Format.Ledger.Write.style_color=False
3461 , Format.Ledger.Write.style_align=True
3463 Format.Ledger.Write.date $
3466 (Time.fromGregorian 0 01 01)
3467 (Time.TimeOfDay 1 0 0))
3472 (Format.Ledger.Write.show
3473 Format.Ledger.Write.Style
3474 { Format.Ledger.Write.style_color=False
3475 , Format.Ledger.Write.style_align=True
3477 Format.Ledger.Write.date $
3480 (Time.fromGregorian 0 01 01)
3481 (Time.TimeOfDay 0 1 0))
3486 (Format.Ledger.Write.show
3487 Format.Ledger.Write.Style
3488 { Format.Ledger.Write.style_color=False
3489 , Format.Ledger.Write.style_align=True
3491 Format.Ledger.Write.date $
3494 (Time.fromGregorian 0 01 01)
3495 (Time.TimeOfDay 0 0 0))
3500 , "transaction" ~: TestList
3502 ((Format.Ledger.Write.show
3503 Format.Ledger.Write.Style
3504 { Format.Ledger.Write.style_color=False
3505 , Format.Ledger.Write.style_align=True
3507 Format.Ledger.Write.transaction
3508 Format.Ledger.transaction)
3511 , "2000/01/01 some description\\n\\ta:b:c\\n\\t ; first comment\\n\\t ; second comment\\n\\t ; third comment\\n\\tA:B:C $1" ~:
3512 ((Format.Ledger.Write.show
3513 Format.Ledger.Write.Style
3514 { Format.Ledger.Write.style_color=False
3515 , Format.Ledger.Write.style_align=True
3517 Format.Ledger.Write.transaction $
3518 Format.Ledger.transaction
3519 { Format.Ledger.transaction_dates=
3522 (Time.fromGregorian 2000 01 01)
3523 (Time.TimeOfDay 0 0 0))
3526 , Format.Ledger.transaction_description="some description"
3527 , Format.Ledger.transaction_postings = Format.Ledger.posting_by_Account
3528 [ (Format.Ledger.posting ("A":|["B", "C"]))
3529 { Format.Ledger.posting_amounts = Data.Map.fromList
3531 { Amount.quantity = 1
3532 , Amount.style = Amount.Style.nil
3533 { Amount.Style.unit_side = Just Amount.Style.Side_Left
3534 , Amount.Style.unit_spaced = Just False
3540 , (Format.Ledger.posting ("a":|["b", "c"]))
3541 { Format.Ledger.posting_comments = ["first comment","second comment","third comment"]
3546 "2000/01/01 some description\n\ta:b:c\n\t ; first comment\n\t ; second comment\n\t ; third comment\n\tA:B:C $1")
3547 , "2000/01/01 some description\\n\\tA:B:C $1\\n\\tAA:BB:CC $123" ~:
3548 ((Format.Ledger.Write.show
3549 Format.Ledger.Write.Style
3550 { Format.Ledger.Write.style_color=False
3551 , Format.Ledger.Write.style_align=True
3553 Format.Ledger.Write.transaction $
3554 Format.Ledger.transaction
3555 { Format.Ledger.transaction_dates=
3558 (Time.fromGregorian 2000 01 01)
3559 (Time.TimeOfDay 0 0 0))
3562 , Format.Ledger.transaction_description="some description"
3563 , Format.Ledger.transaction_postings = Format.Ledger.posting_by_Account
3564 [ (Format.Ledger.posting ("A":|["B", "C"]))
3565 { Format.Ledger.posting_amounts = Data.Map.fromList
3567 { Amount.quantity = 1
3568 , Amount.style = Amount.Style.nil
3569 { Amount.Style.unit_side = Just Amount.Style.Side_Left
3570 , Amount.Style.unit_spaced = Just False
3576 , (Format.Ledger.posting ("AA":|["BB", "CC"]))
3577 { Format.Ledger.posting_amounts = Data.Map.fromList
3579 { Amount.quantity = 123
3580 , Amount.style = Amount.Style.nil
3581 { Amount.Style.unit_side = Just Amount.Style.Side_Left
3582 , Amount.Style.unit_spaced = Just False
3591 "2000/01/01 some description\n\tA:B:C $1\n\tAA:BB:CC $123")