packages feed

g2-0.2.0.0: tests/Simplifications.hs

{-# LANGUAGE OverloadedStrings #-}

module Simplifications (simplificationTests) where

import G2.Language.Simplification
import G2.Language.Syntax

import Test.Tasty
import Test.Tasty.HUnit

simplificationTests :: TestTree
simplificationTests =
    testGroup "Simplifications" [
          testCase "AppLamSimplification" (assertBool "Substituting two variables" simplifyAppLambdasTest1)
        , testCase "AppLamSimplification" (assertBool "Substituting two variables" simplifyAppLambdasTest2)
        , testCase "AppLamSimplification" (assertBool "Substituting a tyvar" simplifyTyVar1)
        ]


simplifyAppLambdasTest1 :: Bool
simplifyAppLambdasTest1 =
    let
        le = Lam TermL id1 
                . Lam TermL id2
                $ App (Var id1) (Var id2)
        e = App (App le (Var id3)) (Var id4)
    in
    simplifyAppLambdas e == App (Var id3) (Var id4)


simplifyAppLambdasTest2 :: Bool
simplifyAppLambdasTest2 =
    let
        le = Lam TermL id1 
                $ (App (Lam TermL id2 (Var id2)) (Var id1))
        e = App le (Var id3)
    in
    simplifyAppLambdas e == Var id3

simplifyTyVar1 :: Bool
simplifyTyVar1 =
    let
        tyvar_id1 = Id (Name "tv_1" Nothing 0 Nothing) TYPE
        tyvar_id2 = Id (Name "tv_2" Nothing 0 Nothing) TYPE

        v_n = Name "v" Nothing 0 Nothing
        v_id1 = Id v_n (TyVar tyvar_id1)
        v_id2 = Id v_n (TyVar tyvar_id2)

        le = Lam TypeL tyvar_id1 (Var v_id1)
        e = App le (Var tyvar_id2)
    in
    simplifyAppLambdas e == Var v_id2


id1 :: Id
id1 = Id (Name "a" Nothing 0 Nothing) TyUnknown

id2 :: Id
id2 = Id (Name "b" Nothing 0 Nothing) TyUnknown

id3 :: Id
id3 = Id (Name "c" Nothing 0 Nothing) TyUnknown

id4 :: Id
id4 = Id (Name "d" Nothing 0 Nothing) TyUnknown