packages feed

hdiff-0.0.0: tests/Data/Digems/Change/TreeEditDistanceSpec.hs

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

import Generics.MRSOP.Base
import Generics.MRSOP.Util
import qualified Generics.MRSOP.GDiff    as GDiff

import Data.Digems.Patch
import Data.Digems.Patch.Show
import Data.Digems.MetaVar
import Data.Digems.Change
import qualified Data.Digems.Change.TreeEditDistance as TED

import Languages.RTree
import Languages.RTree.Diff

import Test.QuickCheck
import Test.Hspec

a1 , b1 :: RTree
a1 = "m" :>: ["m" :>: [],"b" :>: [],"d" :>: [],"a" :>: []]
b1 = "j" :>: ["m" :>: [],"l" :>: ["k" :>: [],"k" :>: [],"k" :>: [],"b" :>: []],"k" :>: [],"d" :>: ["f" :>: [],"i" :>: []]]

a2 , b2 :: RTree
a2 = "i" :>: []
b2 = "h" :>: [ "i" :>: []]

is_the_same_as_gdiff :: Property
is_the_same_as_gdiff = forAll genSimilarTrees' $ \(t1 , t2)
  -> let patch = digemRTree t1 t2
         es0   = GDiff.diff @FamRTree @_ @CodesRTree t1 t2
      in case TED.toES (distrCChange patch) (NA_I $ deep t1) of
           Left err  -> counterexample err False
           Right es1 -> GDiff.cost es1 === GDiff.cost es0

is_better_than_gdiff :: Property
is_better_than_gdiff = forAll genSimilarTrees' $ \(t1 , t2)
  -> let patch = digemRTree t1 t2
         es0   = GDiff.diff @FamRTree @_ @CodesRTree t1 t2
      in patchCost patch <= GDiff.cost es0


spec :: Spec
spec = do
  describe "Change.toES" $ do
    xit "computes the same distance as generics-mrsop-gdiff" $
      property is_better_than_gdiff