1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
module Unit (unitTests) where
import Control.Lens
import qualified Data.Graph.Inductive as G
import Data.Text (Text)
import qualified Data.Text as T
import Test.Tasty
import Test.Tasty.HUnit
import VeriFuzz
unitTests = testGroup "Unit tests"
[ testCase "Transformation of AST" $
assertEqual "Successful transformation" transformExpectedResult
(transformOf traverseExpr 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 e =
case e of
Id id -> if id == Identifier "id2" then
Id $ Identifier "Replaced"
else Id id
_ -> e
|