packages feed

lentil-1.0.0.0: test/Lentil/Parse/RunSpec.hs

module Lentil.Parse.RunSpec where

import Test.Hspec
import Pipes
import Text.Parsec ( runParser )

import Lentil.Types
import Lentil.Parse.Run
import Lentil.Parse.Source

import qualified Pipes.Prelude as PP

import Prelude -- 7.8 hack

-- Parsing tests

-- simple parser (choosable if we are at begin of line or else)
sp :: ParSource a -> String -> Maybe a
sp p cs = either (const Nothing) Just
                    (runParser p () fp cs)
    where fp = "<f>"

fileParser :: [Alias] -> FilePath -> IO [Issue]
fileParser as fp = fmap concat (PP.toListM $ yield (fp, 0, 0) >-> issLoop)
    where issLoop = issueFinder as >> issLoop

main :: IO ()
main = hspec spec



spec :: Spec
spec = do

  let spt fp = [Issue fp 1 (Just "single comment") [],
                Issue fp 3 (Just "single2") [],
                Issue fp 8 (Just "block1")  [],
                Issue fp 9 (Just "block2") [Tag "tog"]]

  describe "issueFinder - specific" $ do
    it "doesn't parse contiguous line/block as a single issue" $
        fileParser [] "test/test-files/specific/contiguous.c"
            `shouldReturn` [Issue "test/test-files/specific/contiguous.c" 1
                                  (Just "issue1") []]
    it "does parse files with uppercase extension" $
        fileParser [] "test/test-files/specific/uppercase.C"
            `shouldReturn` spt "test/test-files/specific/uppercase.C"

  describe "commentParser - languages" $ do
    it "parses a plain text source" $
        fileParser [] "test/test-files/lang-comm/text.txt"
            `shouldReturn` spt "test/test-files/lang-comm/text.txt"
    it "parses a haskell source" $
        fileParser [] "test/test-files/lang-comm/haskell.hs"
            `shouldReturn` spt "test/test-files/lang-comm/haskell.hs"
    it "parses a C source" $
        fileParser [] "test/test-files/lang-comm/clang.c"
            `shouldReturn` spt "test/test-files/lang-comm/clang.c"
    it "parses a Pascal source" $
        fileParser [] "test/test-files/lang-comm/pascal.pas"
            `shouldReturn` spt "test/test-files/lang-comm/pascal.pas"
    it "parses a javascript source" $
        fileParser [] "test/test-files/lang-comm/javascript.js"
            `shouldReturn` spt "test/test-files/lang-comm/javascript.js"
    it "parses a python source" $
        fileParser [] "test/test-files/lang-comm/python.py"
            `shouldReturn` spt "test/test-files/lang-comm/python.py"
    it "parses a ruby source" $
        fileParser [] "test/test-files/lang-comm/ruby.rb"
            `shouldReturn` spt "test/test-files/lang-comm/ruby.rb"
    it "parses a perl source" $
        fileParser [] "test/test-files/lang-comm/perl.pl"
            `shouldReturn` spt "test/test-files/lang-comm/perl.pl"
    it "parses a shell script source" $
        fileParser [] "test/test-files/lang-comm/shell.sh"
            `shouldReturn` spt "test/test-files/lang-comm/shell.sh"
    it "parses a Nix source" $
        fileParser [] "test/test-files/lang-comm/nix.nix"
            `shouldReturn` spt "test/test-files/lang-comm/nix.nix"
    it "parses an Xml source" $
        fileParser [] "test/test-files/lang-comm/xml.xml"
            `shouldReturn` spt "test/test-files/lang-comm/xml.xml"
    it "parses a .xyz file as if it were a .c file" $
        fileParser [(".xyz", ".c")] "test/test-files/lang-comm/xyz.xyz"
            `shouldReturn` spt "test/test-files/lang-comm/xyz.xyz"