packages feed

deltaq-1.1.0.0: test/DeltaQ/DiagramSpec.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wno-orphans #-}

{-|
Copyright   : PLWORKZ R&D, 2025
License     : BSD-3-Clause
-}
module DeltaQ.DiagramSpec
    ( spec
    ) where

import Prelude

import Data.List
    ( sort
    )
import DeltaQ.Diagram.Internal
    ( Tile (..)
    , Token (..)
    , layout
    )
import DeltaQ.Expr
    ( O
    , Term (..)
    , everything
    , outcomeFromTerm
    )
import DeltaQ.Gen.Term
    ( genTerm
    )
import Test.Hspec
    ( Spec
    , describe
    , it
    )
import Test.QuickCheck
    ( Gen
    , Arbitrary
    , (===)
    , arbitrary
    , property
    , scale
    , vector
    )

{-----------------------------------------------------------------------------
    Tests
------------------------------------------------------------------------------}
spec :: Spec
spec = do
    describe "layout" $ do
        it "all 'Var' are rendered" $ property $
            \(o :: Term String) ->
                let fromVarTile (Tile _ _ (VarT name)) = [name]
                    fromVarTile _ = []

                    fromVarTerm (Var name) = [name]
                    fromVarTerm _ = []
                in
                    sort (everything (<>) fromVarTerm o)
                        === sort (concatMap fromVarTile $ layout o)

        it "all 'Loc' are rendered" $ property $
            \(o :: Term String) ->
                let fromLocTile (Tile _ _ (Close (Just s) _)) = [s]
                    fromLocTile (Tile _ _ (Location s)) = [s]
                    fromLocTile _ = []

                    fromLocTerm (Loc name) = [name]
                    fromLocTerm _ = []
                in
                    sort (everything (<>) fromLocTerm o)
                        === sort (concatMap fromLocTile $ layout o)

{-----------------------------------------------------------------------------
    Random generators
------------------------------------------------------------------------------}
instance Arbitrary (Term String) where
    arbitrary = scale (`div` 11) (genTerm genName)
      where genName = vector 2 :: Gen String

instance Arbitrary O where
    arbitrary = outcomeFromTerm <$> arbitrary