module Language.Nominal.AbsSpec
    ( spec
    ) where

import Test.Hspec
import Test.QuickCheck

import Language.Nominal.Properties.SpecUtilities () 

import Language.Nominal.Properties.AbsSpec

spec :: Spec
spec = do
    it "fuse a.x a.x' = a.(x,x')" $ property prop_fuse
    it "n # x => [n](x @ n) = x" $ property prop_Abs_Conc
    it "n' # x => [n]x = [n'](n' n).x" $ property prop_Abs_alpha
    it "(n.x) \\@ n = x" $ property prop_Conc_Abs
    it "(n.x) \\@ n = x" $ property prop_Conc_Abs_swap
    it "Atm.(X x Y) iso Atm.X x Atm.Y, left-to-right-to-left" $ property prop_fuse_unfuse_Abs
    it "Atm.(X x Y) iso Atm.X x Atm.Y, right-to-left-to-right" $ property prop_unfuse_fuse_Abs
    it "Iso fails if atoms labelled, since one label lost Atm.X x Atm.Y -> Atm.(X x Y)" $ property prop_unfuse_fuse_Abs'
    it "Atm.X iso Nom (Atm x X)" $ property prop_abs_to_nom
    it "Nom (Atm x X) iso Atm.X" $ property prop_nom_to_abs

