packages feed

twitch-0.1.7.0: tests/Tests/Twitch/Rule.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE BangPatterns  #-}
module Tests.Twitch.Rule where
import Test.Hspec
import Twitch.Rule  
import Data.IORef
import Data.Default

testSetter sel setter = do
  ref <- newIORef ""
  let rule = def `setter` writeIORef ref
      expected = "yo"
  sel rule expected
  actual <- readIORef ref
  actual `shouldBe` expected
  
testAddModify f = do
  ref <- newIORef ""
  
  let rule = def `f` writeIORef ref
      expected = "yo"
  
  add rule expected
  actual <- readIORef ref  
  actual `shouldBe` expected

  modify rule expected
  actual <- readIORef ref  
  actual `shouldBe` expected

testName :: (Rule -> String -> Rule) -> Expectation
testName f = name (f def "name") `shouldBe` "name"


tests :: Spec
tests = do
  describe "|+" $ it " sets the add member"    $ testSetter add (|+)
  describe "|-" $ it " sets the delete member" $ testSetter delete (|-)
  describe "|%" $ it " sets the modify member" $ testSetter modify (|%)
  
  describe "|>" $ it " sets the add and modify member" $ testAddModify (|>)
  describe "|#" $ it " sets the name member" $ testName (|#)

  describe "addF"       $ it " sets the add member"    $ testSetter add $ flip addF
  describe "modifyF"    $ it " sets the modify member" $ testSetter modify $ flip modifyF
  describe "deleteF"    $ it " sets the delete member" $ testSetter delete $ flip deleteF
  describe "addModifyF" $ it " sets the add and modify member" $ 
    testAddModify (flip addModifyF)
  describe "nameF" $ it " sets the name member" $ testName $ flip nameF
  
  describe "makeAbsolutePath" $ do
    it "doesn't change an absolute path" $ 
      makeAbsolutePath "/usr" "/home" `shouldBe` "/home"
    it "adds the current directory if it is relative" $ do
      makeAbsolutePath "/usr" "./home" `shouldBe` "/usr/./home"
      makeAbsolutePath "/usr"   "home" `shouldBe` "/usr/home"
  
  describe "compilePattern" $ do
    it "'s happy path works" $ do
      let Right test = compilePattern "/home/*.js" 
      test "/home/help.js" `shouldBe` True
      test "/usr/help.js"  `shouldBe` False

    it "with an invalid pattern fails" $ do
      let Left (PatternCompliationFailed !_ !_) = compilePattern "/home/****.js" 
      return () :: IO ()