packages feed

hdiff-0.0.0: tests/Data/Digems/PatchSpec.hs

{-# LANGUAGE PolyKinds        #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE GADTs            #-}
module Data.Digems.PatchSpec (spec) where

import qualified Data.Set as S
import Data.Functor.Const

import Generics.MRSOP.Base
import Generics.MRSOP.Util
import Generics.MRSOP.Holes

import Data.Exists
import Data.Digems.Patch
import Data.Digems.Diff
import Data.Digems.Patch.Show
import Data.Digems.MetaVar
import Data.Digems.Change
import Languages.RTree
import Languages.RTree.Diff

import Test.QuickCheck
import Test.Hspec

----------------------------------------------

copy_composes :: Property
copy_composes = forAll genSimilarTrees' $ \(t1 , t2)
  -> let patch = digemRTree t1 t2
         cpy   = Hole' (changeCopy (NA_I (Const 0))) :: PatchRTree
      in composes patch cpy .&&. composes cpy patch

composes_correct :: Property
composes_correct = forAll (choose (0 , 4) >>= genSimilarTreesN 3)
  $ \[a , b , c] ->
  let ab = digemRTree a b
      bc = digemRTree b c
   in composes bc ab

{-
  NOT TRUE!!!!

  check: ("f" :>: ["i" :>: [],"j" :>: [],"a" :>: []],"j" :>: [])

composes_non_reflexive :: Property
composes_non_reflexive = forAll (genSimilarTrees' `suchThat` uncurry (/=))
  $ \(t1 , t2)
  -> let patch = digemRTree t1 t2
      in composes patch patch === False
-}

spec :: Spec
spec = do
  describe "composes" $ do
    it "has copy as left and right id" $ property copy_composes
    it "is correct"                    $ property composes_correct