module Unit ( unitTests ) where import Control.Lens import Test.Tasty import Test.Tasty.HUnit import VeriFuzz unitTests :: TestTree unitTests = testGroup "Unit tests" [ testCase "Transformation of AST" $ assertEqual "Successful transformation" transformExpectedResult (transform trans transformTestData) ] 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