packages feed

sifflet-2.3.0: tests/Testing/Unit/ExprTreeTests.hs

module Testing.Unit.ExprTreeTests (tests, runU)
where

import Test.HUnit

import Data.Number.Sifflet

import Data.Sifflet.Geometry
import Data.Sifflet.Tree as T
import Data.Sifflet.TreeGraph
import Data.Sifflet.TreeLayout
import Data.Sifflet.WGraph

import Language.Sifflet.Examples

import Language.Sifflet.Expr
import Language.Sifflet.ExprTree

import Text.Sifflet.Repr ()

import Testing.Common.ExprTreeTests
import Testing.TestUtil

-- ============================================================
-- UNIT TESTS 

utestGNode :: Test
utestGNode = 
  let tpp = "The Purple Platypus"
      gnode = makeGNode testStyle zeroIoletCounter (Name tpp)
      Size w h = measureText testStyle tpp
      m = 18.0 -- style textMargin
      mm = 2.0 * m
      x = m
      y = 36.5 -- where does this come from????
      w' = w + mm
      h' = h + mm
  in assertAll
          [assertEqual "GNode of The Purple Platypus"
                       CloseEnough
                       (gnodeDiff 
                        (GNode (Name tpp) 
                                   [TextBox tpp
                                    (BBox x y w h)
                                    (BBox 0 0 w' h')]
                                   (BBox 0 0 w' h')
                                   [] 
                                   [])
                        gnode)
          ,
           assertEqual "Translation of GNode by 10, 20"
                       CloseEnough
                       (gnodeDiff
                        (GNode (Name tpp)
                                   [TextBox tpp
                                    (BBox (x + 10.0) (y + 20.0) w h)
                                    (BBox 10.0 20.0 w' h')]
                                   (BBox 10.0 20.0 w' h') [] [])
                        (translate 10 20 gnode))
          ]

utestRepr :: Test
utestRepr = TestCase $
  assertEqual "repr of aDemoExpr"
              ("(if (> ant (+ butterfly 5)) " ++
               "(+ ant (+ butterfly cheetah)) (* (+ ant 7) (- butterfly 12)))")
              (repr aDemoExpr)

utestEval :: Test
utestEval = TestCase $
        assertEqual "value of aDemoExpr"
                    (EvalOk (VNumber (Exact (-24))))
                    (eval aDemoExpr demoEnv)


utestGraphToExprTree :: Test
utestGraphToExprTree = TestCase $ 
  do  
    let expr = ePlus (eTimes (eSymbol "x") (eInt 5))
                     (eMinus (eInt 7) (eSymbol "y"))
        exprTree = exprToTree expr
        layoutTree = treeLayout testStyle zeroIoletCounter exprTree
        graph = treeLayoutToGraph layoutTree
    assertEqual "recover expr from tlo tree" exprTree 
                (graphToExprTree graph 1)

utest1 :: Test
utest1 = TestCase $
         do
           let factFunction = envGetFunction exampleEnv "fact"
               factTree = exprToTree (functionBody factFunction)
               tlo = treeLayout defaultStyle zeroIoletCounter factTree
           let g = orderedTreeToGraph (fmap WSimple tlo)
           assertEqual "graph extract expr tree" factTree
                           (grExtractExprTree g 1)

utest2 :: Test
utest2 = TestCase $ 
    do
      let nSymbol s = ENode (NSymbol (Symbol s)) EvalUntried
          t1 = fmap nSymbol (T.Node "horse" [leaf "saddle", leaf "rider"])
          t2 = fmap nSymbol (T.Node "mule" [leaf "plough", leaf "farmer"])
          y1 :: TreeLayout ExprNode
          y1 = treeLayout wstyle zeroIoletCounter t1
          y2 :: TreeLayout ExprNode
          y2 = treeLayout wstyle zeroIoletCounter t2
          g1 = treeLayoutToGraph y1 :: WGraph
          g2 = grUpdateTreeLayout g1 1 y2 :: WGraph
      assertEqual "grUpdateLayout" y2 (grExtractLayoutTree g2 1)

tests :: Test
tests = TestList [TestLabel "GNode test" utestGNode,
                      TestLabel "repr of Expr" utestRepr,
                      TestLabel "eval of Expr" utestEval,
                      TestLabel "tlo to expr" utestGraphToExprTree,
                      utest1, utest2]

runU :: IO Counts
runU = runTestTT tests