packages feed

hasmin-0.3.2: tests/Hasmin/Types/TransformFunctionSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Hasmin.Types.TransformFunctionSpec where

import Control.Applicative ((<|>))
import Control.Monad.Reader (runReader)
import Data.Text (Text)

import Hasmin.Config
import Hasmin.Parser.Value
import Hasmin.TestUtils
import Hasmin.Types.Class
import Hasmin.Types.TransformFunction
import Hasmin.Types.Value

transformTests :: Spec
transformTests =
    describe "transform function conversion" $
      mapM_ (matchSpec (minify <$> textualvalue)) transformTestsInfo

combinationTests :: Spec
combinationTests =
    describe "transform function combination" $
      mapM_ (matchSpecWithDesc (g <$> (values "transform" <|> valuesFallback))) functionCombinationTestsInfo
  where g = mkValues . fmap TransformV . f . fmap (\(TransformV t) -> t) . valuesToList
        f x = runReader (combine x) defaultConfig

transformTestsInfo :: [(Text, Text)]
transformTestsInfo =
  [("translate(0)",             "skew(0)")
  ,("translateX(0)",            "skew(0)")
  ,("translateY(0)",            "skew(0)")
  ,("translate3d(0,0,0)",       "skew(0)")
  ,("translate3d(0%,0,0)",      "skew(0)")
  ,("translate3d(-100%,0,0)",   "translate(-100%)")
  ,("translate3d(0,-100%,0)",   "translatey(-100%)")
  ,("translate3d(0%,0%,5px)",   "translatez(5px)")
  ,("translate3d(2em,0,0)",     "translate(2em)")
  ,("translate3d(0,3em,0)",     "translatey(3em)")
  ,("translate3d(0,0,4em)",     "translatez(4em)")
  ,("scale3d(4, 1, 1)",         "scale(4)")
  ,("scale3d(1, 5, 1)",         "scaley(5)")
  ,("scale3d(1, 1, 6)",         "scalez(6)")
  ,("matrix(1,0,0,0,0,/**/ 0)", "scaley(0)")
  ,("matrix(7,0,0,8,0, 0)",     "scale(7,8)")
  ]

functionCombinationTestsInfo :: [(String, Text, Text)]
functionCombinationTestsInfo =
  [("Combines consecutive absolute value translate() functions into one",
    "translate(10px) translate(0) translate(10px)", "translate(20px)")
  ,("Don't combine an skew(90deg), since tan(90deg) = ∞",
    "skew(90deg) translate(1px)", "skew(90deg) translate(1px)")
  ,("Remove identity matrices from lists (e.g. translate(0))",
    "skew(90deg) translate(0px)", "skew(90deg)")
  -- ,("Remove identity matrices at the end of a list"
    -- "skew(90deg) translate(100%) skew(0)", "skew(90deg) translate(100%)")
  -- ,("Remove identity matrices at the beginning of a list"
    -- "skew(0) translate(100%) skew(90deg)", "translate(100%) skew(90deg)")
  ]


spec :: Spec
spec = do transformTests
          combinationTests

main :: IO ()
main = hspec spec