packages feed

hsass-0.4.0: test/Text/Sass/TutorialSpec.hs

module Text.Sass.TutorialSpec where

import           Control.Concurrent.MVar
import           Test.Hspec
import           Text.Sass

max3 :: SassValue -> IO SassValue
max3 (SassList (SassNumber a _:SassNumber b _:SassNumber c _:_) _) =
    return $ SassNumber (max a $ max b c) "px"
max3 _ = return $ SassError "invalid arguments"

max3sig :: SassFunction
max3sig = SassFunction "max3($a, $b, $c)" max3

warn :: MVar String -> SassValue -> IO SassValue
warn m (SassList (SassString s:_) _) = do
    putMVar m s
    return $ SassString "warn!"
warn _ _ = return $ SassString "invalid arguments"

warnSig :: MVar String -> SassFunction
warnSig = SassFunction "@warn" . warn

header :: String -> IO [SassImport]
header src = return [makeSourceImport $ "$file: " ++ src ++ ";"]

headerSig :: SassImporter
headerSig = SassImporter 1 header

importer1 :: String -> IO [SassImport]
importer1 src = return [makeSourceImport $ "$file: " ++ src ++ "1;"]

importer2 :: String -> IO [SassImport]
importer2 src = return [makeSourceImport $ "$file: " ++ src ++ "2;"]

importerSigs :: [SassImporter]
importerSigs = [SassImporter 0.5 importer1, SassImporter 1 importer2]

main :: IO ()
main = hspec spec

spec :: Spec
spec = do
    describe "max3" $ do
        it "should return max value" $ do
            let vals = SassList [SassNumber 1 "", SassNumber 2 "",
                                 SassNumber 3 ""] SassSeparatorSpace
            SassNumber v _ <- max3 vals
            v `shouldBe` 3

        it "should return error on invalid aruments" $ do
            let vals = SassList [SassString "", SassString "",
                                 SassNumber 3 ""] SassSeparatorSpace
            SassError e <- max3 vals
            e `shouldBe` "invalid arguments"

        it "should be usable by compile" $ do
            let opts = def { sassFunctions = Just [max3sig] }
            compileString "foo { margin: max3(1px, 2px, 3px); }" opts
                `shouldReturn` Right "foo {\n  margin: 3px; }\n"

    describe "warn" $
        it "should call warn on @warn statement" $ do
            msg <- newEmptyMVar
            let opts = def { sassFunctions = Just [warnSig msg] }
            _ <- compileString "@warn \"message\";" opts :: StringResult
            tryTakeMVar msg `shouldReturn` Just "message"

    describe "Headers" $
        it "should inject header into file" $ do
            let opts = def {
                sassHeaders = Just [headerSig]
              , sassInputPath = Just "path"
            }
            compileString "foo { prop: $file; }" opts `shouldReturn`
                Right "foo {\n  prop: path; }\n"

    describe "Importers" $
        it "should inject import with higher priority" $ do
            let opts = def { sassImporters = Just importerSigs }
            compileString "@import \"file\";\nfoo { prop: $file; }" opts
                `shouldReturn` Right "foo {\n  prop: file2; }\n"