module Unit ( unitTests ) where import Control.Lens import Data.List.NonEmpty (NonEmpty (..)) import Parser (parseUnitTests) import Reduce (reduceUnitTests) import Test.Tasty import Test.Tasty.HUnit import Verismith unitTests :: TestTree unitTests = testGroup "Unit tests" [ testCase "Transformation of AST" $ assertEqual "Successful transformation" transformExpectedResult (transform trans transformTestData) , parseUnitTests , reduceUnitTests ] transformTestData :: Expr transformTestData = BinOp (BinOp (BinOp (Id "id1") BinAnd (Id "id2")) BinAnd (BinOp (Id "id1") BinAnd (Id "id2")) ) BinAnd (BinOp (BinOp (BinOp (Id "id1") BinAnd (Id "id2")) BinAnd (BinOp (Id "id1") BinAnd (BinOp (BinOp (Id "id1") BinAnd (Id "id2")) BinAnd (BinOp (Id "id1") BinAnd (Id "id2")) ) ) ) BinOr ( Concat $ ( Concat $ (Concat $ (Id "id1") :| [Id "id2", Id "id2"]) :| [ Id "id2" , Id "id2" , ( Concat $ (Id "id2") :| [Id "id2", (Concat $ Id "id1" :| [Id "id2"])] ) , Id "id2" ] ) :| [Id "id1", Id "id2"] ) ) transformExpectedResult :: Expr transformExpectedResult = BinOp (BinOp (BinOp (Id "id1") BinAnd (Id "Replaced")) BinAnd (BinOp (Id "id1") BinAnd (Id "Replaced")) ) BinAnd (BinOp (BinOp (BinOp (Id "id1") BinAnd (Id "Replaced")) BinAnd (BinOp (Id "id1") BinAnd (BinOp (BinOp (Id "id1") BinAnd (Id "Replaced")) BinAnd (BinOp (Id "id1") BinAnd (Id "Replaced")) ) ) ) BinOr ( Concat $ ( Concat $ (Concat $ (Id "id1") :| [Id "Replaced", Id "Replaced"]) :| [ Id "Replaced" , Id "Replaced" , Concat $ Id "Replaced" :| [Id "Replaced", Concat $ Id "id1" :| [Id "Replaced"]] , Id "Replaced" ] ) :| [Id "id1", Id "Replaced"] ) ) trans :: Expr -> Expr trans e = case e of Id i -> if i == Identifier "id2" then Id $ Identifier "Replaced" else Id i _ -> e