1 {-# LANGUAGE OverloadedStrings #-}
2 {-# LANGUAGE ScopedTypeVariables #-}
3 {-# LANGUAGE TupleSections #-}
5 module Chart.Test where
8 import Test.Tasty.HUnit
10 import Control.Applicative (Applicative(..))
11 import Control.Monad.IO.Class (MonadIO(..))
12 import Control.Monad (join, (>=>))
13 import Data.Function (($), (.), const, id)
14 import Data.Functor ((<$>))
16 import Data.Functor.Identity (Identity(..))
17 import Data.Text (Text)
18 import qualified Data.List as List
19 import Data.List.NonEmpty (NonEmpty)
20 import qualified Data.List.NonEmpty as NonEmpty
21 import qualified Data.Text as Text
22 import qualified Data.Text.IO as Text.IO
23 import qualified Data.NonNull as NonNull
24 import Data.Maybe (isJust)
25 import qualified Data.Strict.Maybe as Strict
26 import qualified Data.Map.Strict as Map
27 import qualified Data.TreeMap.Strict as TreeMap
28 import Data.TreeMap.Strict.Zipper
29 import Data.Tuple (fst, snd)
30 import qualified Hcompta.LCC.Lib.Parsec as R
31 import qualified Text.Parsec as R (eof)
32 import qualified Text.Parsec.Combinator.CorrectSourcePosWithTab as R
33 import qualified Text.Parsec.Error.Custom as R
34 import qualified Text.Parsec.Pos as R
35 import System.IO (IO, FilePath)
36 import qualified System.Directory as IO
37 import qualified System.IO.Memoize as IO
38 import Prelude (error)
39 import Text.Show (show)
40 import Data.Either (either)
41 import System.FilePath.Posix ((</>))
43 import qualified Hcompta as H
44 import qualified Hcompta.LCC as LCC
46 chart_from_text :: Text -> LCC.Chart
48 let context_read :: LCC.Context_Read () () =
49 LCC.context_read (const ()) LCC.journal in
51 (either (error . show) id <$>) <$>
52 ((LCC.journal_chart . LCC.context_read_journal . snd <$>) <$>) $
54 (R.and_state (LCC.read_chart <* R.eof))
57 chart_from_file :: FilePath -> IO LCC.Chart
58 chart_from_file file = do
59 cwd <- IO.getCurrentDirectory
60 chart_from_text <$> Text.IO.readFile (cwd </> file)
62 chart_00 :: (FilePath, IO LCC.Chart)
63 chart_00 = (file,) $ join $ IO.once $ chart_from_file file
64 where file = "Hcompta/LCC/Chart/chart.00.lcc"
65 chart_01 :: (FilePath, IO LCC.Chart)
66 chart_01 = (file,) $ join $ IO.once $ chart_from_file file
67 where file = "Hcompta/LCC/Chart/chart.01.lcc"
69 tag_path :: [Text] -> LCC.Tag_Path
70 tag_path p = LCC.Tag_Path $ NonEmpty.fromList (LCC.Name <$> p)
72 nonempty :: [Text] -> NonEmpty LCC.Name
73 nonempty p = NonEmpty.fromList (LCC.Name <$> p)
76 tests = testGroup "Chart"
77 [ testGroup "chart_axis_child" $
78 let (==>) (file, input) expected =
81 let sel = zipper_child
82 let res = sel $ LCC.zipper_chart chart
83 let path = (LCC.unName <$>) . path_of_zipper <$> res
88 , ["2.Immobilisation"]
96 , testGroup "chart_axis_descendant" $
97 let (==>) (file, input) expected =
100 let sel = zipper_descendant
101 let res = sel $ LCC.zipper_chart chart
102 let path = (LCC.unName <$>) . path_of_zipper <$> res
107 , ["2.Immobilisation"]
110 , ["4.Tiers", "0.Fournisseur"]
111 , ["4.Tiers", "0.Fournisseur", "9.Débiteur"]
112 , ["4.Tiers", "1.Client"]
113 , ["4.Tiers", "2.Personnel"]
114 , ["4.Tiers", "3.Sécu"]
115 , ["4.Tiers", "4.État"]
117 , ["5.Finance", "1.Établissement"]
118 , ["5.Finance", "1.Établissement", "2.Banque"]
119 , ["5.Finance", "3.Caisse"]
124 , testGroup "zipper_account_tags" $
125 let (==>) (file, input) expected =
129 -- //*[...[#Bilan][0][#Bilan:Actif]]
131 `zipper_filter` not . zipper_null
132 (zipper_ancestor_or_self
133 `zipper_filter` not . zipper_null
134 (zipper_child_lookup $ LCC.Name "Bilan")
135 . LCC.zipper_accounts_tags
137 `zipper_filter` not . zipper_null
138 (zipper_descendant_lookup $ nonempty ["Bilan", "Actif"])
139 . LCC.zipper_accounts_tags)
140 let res = sel $ zipper $ LCC.chart_accounts chart
141 let path = (LCC.unName <$>) . path_of_zipper <$> res
145 [ ["2.Immobilisation"]
146 , ["4.Tiers","0.Fournisseur","9.Débiteur"]
147 , ["4.Tiers","1.Client"]
148 , ["4.Tiers","3.Sécu"]