packages feed

toodles-1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import           Parse
import           Types

import           Data.Either
import qualified Data.Text       as T
import           Test.Hspec
import           Text.Megaparsec

bodyText (TodoBodyLine a _ _) = a
bodyText t                    = T.unlines (body t)

hasClosing (TodoBodyLine _ _ a) = a
hasClosing t                    = entryHeadClosed t

hasOpening (TodoBodyLine _ t _) = t
hasOpening t                    = entryHeadOpened t

defaultBodyLine = TodoBodyLine "default bad" False False

main :: IO ()
main = hspec $
  describe "Toodles" $ do
    let unknownStateParser = parse (parseTodo ParseStateUnknown [] "hello.hs" 10 ) ""
        multiLineStateParser = parse (parseTodo ParseStateMultiLineComment [] "hello.hs" 10 ) ""
        singleHaskellParser  = parse (parseComment ParseStateSingleComment ".hs") ""
        multiHaskellParser   = parse (parseComment ParseStateMultiLineComment ".hs") ""

    it "parses single line comments" $ do
      let haskellSingleComment = " -- a plain comment"
          singleParsed = singleHaskellParser haskellSingleComment
      singleParsed `shouldSatisfy` isRight
      bodyText (fromRight defaultBodyLine singleParsed) `shouldSatisfy` (`T.isInfixOf` "a plain comment")

    it "parses lines of multiline comments" $ do
      let haskellMultiComment  = "a plain comment"
          multiParsed = multiHaskellParser haskellMultiComment
      multiParsed `shouldSatisfy` isRight
      let result = fromRight defaultBodyLine multiParsed
      hasClosing result `shouldBe` False

      let multiParsedWithClosing = multiHaskellParser (haskellMultiComment <> " -} ")
      multiParsedWithClosing `shouldSatisfy` isRight
      let result2 = fromRight defaultBodyLine multiParsedWithClosing
      bodyText result2 `shouldSatisfy` ((`T.isInfixOf` "a plain comment"))
      hasClosing result2 `shouldBe` True

    it "parses multiline comment closings" $ do
      let haskellMultiClose = "-}"
      let multiCloseParsed = multiHaskellParser haskellMultiClose
      multiCloseParsed `shouldSatisfy` isRight
      let result3 = fromRight defaultBodyLine multiCloseParsed
      hasClosing result3 `shouldBe` True
      hasOpening result3 `shouldBe` False

    it "parses multiline comment opens" $ do
      let emptyMultiOpen = " {- "
          emptyOpen = unknownStateParser emptyMultiOpen
      emptyOpen `shouldSatisfy` isRight
      let result5 = fromRight defaultBodyLine emptyOpen
      hasOpening result5 `shouldBe` True
      hasClosing result5 `shouldBe` False

    it "parses empty lines as multiline comments " $ do
      let emptyMulti = ""
          emptyMultiParsed = multiLineStateParser emptyMulti
      emptyMultiParsed `shouldSatisfy` isRight
      let result6 = fromRight defaultBodyLine emptyMultiParsed
      hasOpening result6 `shouldBe` False
      hasClosing result6 `shouldBe` False

    it "parses single TODOs" $ do
      let haskellSingleTodo = " -- TODO(avi|p=1|#tag|key=val) some stuff we need to fix"
          singleParsed = unknownStateParser haskellSingleTodo
      singleParsed `shouldSatisfy` isRight
      bodyText (fromRight defaultBodyLine singleParsed) `shouldBe` "some stuff we need to fix\n"

    it "parses a multiline TODO fully enclosed on one line" $ do
      let haskellEnclosedTodo = " {- TODO(avi|p=1|#tag|key=val) some stuff we need to fix -} "
          multiParsed = unknownStateParser haskellEnclosedTodo
      multiParsed `shouldSatisfy` isRight
      let result2 = fromRight defaultBodyLine multiParsed
      bodyText result2 `shouldBe` "some stuff we need to fix \n"
      hasClosing result2 `shouldBe` True
      hasOpening result2 `shouldBe` True

    it "parses mutline TODO's on an opening line" $ do
      let haskellMultiOpenTodo = " {- TODO(avi|p=1|#tag|key=val) some stuff we need to fix"
          multiOpenParsed = unknownStateParser haskellMultiOpenTodo
      multiOpenParsed `shouldSatisfy` isRight
      let result3 = fromRight defaultBodyLine multiOpenParsed
      bodyText result3 `shouldBe` "some stuff we need to fix\n"
      hasClosing result3 `shouldBe` False
      hasOpening result3 `shouldBe` True

    it "parses mutline TODO's on a closing line" $ do
      let haskellMultiCloseTodo = " TODO(avi|p=1|#tag|key=val) some stuff we need to fix -}"
      unknownStateParser haskellMultiCloseTodo `shouldSatisfy` isLeft

      let mutliCloseParsed = multiLineStateParser haskellMultiCloseTodo
      mutliCloseParsed `shouldSatisfy` isRight
      let result4 = fromRight defaultBodyLine mutliCloseParsed
      bodyText result4 `shouldBe` "some stuff we need to fix \n"
      hasClosing result4 `shouldBe` True
      hasOpening result4 `shouldBe` False

    it "parses bare TODO's in the middle of an opening line" $ do
      let haskellBareMultiTodo = "      TODO(avi|p=1|#tag|key=val) some stuff we need to fix"
          bareMultiParsed = multiLineStateParser haskellBareMultiTodo
      bareMultiParsed `shouldSatisfy` isRight
      let result7 = fromRight defaultBodyLine bareMultiParsed
      hasOpening result7 `shouldBe` False
      hasClosing result7 `shouldBe` False
      bodyText result7 `shouldBe` "some stuff we need to fix\n"