glsl-0.0.1.0: test/Language/GLSL/GLSLSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Language.GLSL.GLSLSpec where
import Test.Hspec (Spec, describe, it)
import Control.Applicative (liftA2)
import Data.Attoparsec.ByteString.Char8 (decimal)
import qualified Language.GLSL.AST as GLSL
import qualified Language.GLSL.PrettyPrint as GLSL
import Test.GLSL (Transform, shouldTransformTo,
with)
newtype TestAnnot = TestAnnot Int
instance GLSL.Annot TestAnnot where
parseAnnot = "// " >> TestAnnot <$> decimal >>= ("\n" >>) . pure
ppAnnot (TestAnnot n) = Just $ GLSL.ppInt n
testAddAnnot :: [Int] -> Transform () TestAnnot
testAddAnnot = zipWith (fmap . setAnnot)
where
setAnnot i () = TestAnnot i
testJoinAnnot :: Transform () (TestAnnot, TestAnnot)
testJoinAnnot ss =
let ss1 = testAddAnnot [0..3] ss
ss2 = testAddAnnot (reverse [0..3]) ss
in (zipWith . liftA2) (,) ss1 ss2
spec :: Spec
spec = do
describe "fmap" $ do
it "should add annotations" $
[ "float t1 = 0;"
, "float t2 = 0.0;"
, "float t3 = (t2+1.1);"
, "float t4 = (t3+vf1);"
] `with` testAddAnnot [0..3]
`shouldTransformTo`
[ "// 0"
, "float t1 = 0;"
, "// 1"
, "float t2 = 0.0;"
, "// 2"
, "float t3 = (t2+1.1);"
, "// 3"
, "float t4 = (t3+vf1);"
]
describe "liftA2" $ do
it "should join annotations" $
[ "float t1 = 0;"
, "float t2 = 0.0;"
, "float t3 = (t2+1.1);"
, "float t4 = (t3+vf1);"
] `with` testJoinAnnot
`shouldTransformTo`
[ "// (0, 3)"
, "float t1 = 0;"
, "// (1, 2)"
, "float t2 = 0.0;"
, "// (2, 1)"
, "float t3 = (t2+1.1);"
, "// (3, 0)"
, "float t4 = (t3+vf1);"
]