{-# 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);" ]