{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TupleSections #-} module Chart.Test where import Test.Tasty import Test.Tasty.HUnit import Control.Applicative (Applicative(..)) import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad (join, (>=>)) import Data.Function (($), (.), const, id) import Data.Functor ((<$>)) import Data.Bool import Data.Functor.Identity (Identity(..)) import Data.Text (Text) import qualified Data.List as List import Data.List.NonEmpty (NonEmpty) import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Text as Text import qualified Data.Text.IO as Text.IO import qualified Data.NonNull as NonNull import Data.Maybe (isJust) import qualified Data.Strict.Maybe as Strict import qualified Data.Map.Strict as Map import qualified Data.TreeMap.Strict as TreeMap import Data.TreeMap.Strict.Zipper import Data.Tuple (fst, snd) import qualified Hcompta.LCC.Lib.Parsec as R import qualified Text.Parsec as R (eof) import qualified Text.Parsec.Combinator.CorrectSourcePosWithTab as R import qualified Text.Parsec.Error.Custom as R import qualified Text.Parsec.Pos as R import System.IO (IO, FilePath) import qualified System.Directory as IO import qualified System.IO.Memoize as IO import Prelude (error) import Text.Show (show) import Data.Either (either) import System.FilePath.Posix (()) import qualified Hcompta as H import qualified Hcompta.LCC as LCC chart_from_text :: Text -> LCC.Chart chart_from_text txt = let context_read :: LCC.Context_Read () () = LCC.context_read (const ()) LCC.journal in runIdentity $ (either (error . show) id <$>) <$> ((LCC.journal_chart . LCC.context_read_journal . snd <$>) <$>) $ R.runParserTWithError (R.and_state (LCC.read_chart <* R.eof)) context_read "" txt chart_from_file :: FilePath -> IO LCC.Chart chart_from_file file = do cwd <- IO.getCurrentDirectory chart_from_text <$> Text.IO.readFile (cwd file) chart_00 :: (FilePath, IO LCC.Chart) chart_00 = (file,) $ join $ IO.once $ chart_from_file file where file = "Hcompta/LCC/Chart/chart.00.lcc" chart_01 :: (FilePath, IO LCC.Chart) chart_01 = (file,) $ join $ IO.once $ chart_from_file file where file = "Hcompta/LCC/Chart/chart.01.lcc" tag_path :: [Text] -> LCC.Tag_Path tag_path p = LCC.Tag_Path $ NonEmpty.fromList (LCC.Name <$> p) nonempty :: [Text] -> NonEmpty LCC.Name nonempty p = NonEmpty.fromList (LCC.Name <$> p) tests :: TestTree tests = testGroup "Chart" [ testGroup "chart_axis_child" $ let (==>) (file, input) expected = testCase file $ do chart <- input let sel = zipper_child let res = sel $ LCC.zipper_chart chart let path = (LCC.unName <$>) . path_of_zipper <$> res path @?= expected in [ chart_00 ==> [ ["1.Capital"] , ["2.Immobilisation"] , ["3.Stock"] , ["4.Tiers"] , ["5.Finance"] , ["6.Charge"] , ["7.Produit"] ] ] , testGroup "chart_axis_descendant" $ let (==>) (file, input) expected = testCase file $ do chart <- input let sel = zipper_descendant let res = sel $ LCC.zipper_chart chart let path = (LCC.unName <$>) . path_of_zipper <$> res path @?= expected in [ chart_00 ==> [ ["1.Capital"] , ["2.Immobilisation"] , ["3.Stock"] , ["4.Tiers"] , ["4.Tiers", "0.Fournisseur"] , ["4.Tiers", "0.Fournisseur", "9.Débiteur"] , ["4.Tiers", "1.Client"] , ["4.Tiers", "2.Personnel"] , ["4.Tiers", "3.Sécu"] , ["4.Tiers", "4.État"] , ["5.Finance"] , ["5.Finance", "1.Établissement"] , ["5.Finance", "1.Établissement", "2.Banque"] , ["5.Finance", "3.Caisse"] , ["6.Charge"] , ["7.Produit"] ] ] , testGroup "zipper_account_tags" $ let (==>) (file, input) expected = testCase file $ do chart <- input let sel = -- //*[...[#Bilan][0][#Bilan:Actif]] zipper_descendant `zipper_filter` not . zipper_null (zipper_ancestor_or_self `zipper_filter` not . zipper_null (zipper_child_lookup $ LCC.Name "Bilan") . LCC.zipper_accounts_tags `zipper_at` 0 `zipper_filter` not . zipper_null (zipper_descendant_lookup $ nonempty ["Bilan", "Actif"]) . LCC.zipper_accounts_tags) let res = sel $ zipper $ LCC.chart_accounts chart let path = (LCC.unName <$>) . path_of_zipper <$> res path @?= expected in [ chart_00 ==> [ ["2.Immobilisation"] , ["4.Tiers","0.Fournisseur","9.Débiteur"] , ["4.Tiers","1.Client"] , ["4.Tiers","3.Sécu"] ] ] ]