module Lentil.Parse.RunSpec where import Test.Hspec import Text.Parsec ( runParser ) import Lentil.Types import Lentil.Parse.Run import Lentil.Parse.Source 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 = "" 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 "commentParser - 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" describe "issueFinder" $ do it "reads a file (code or txt) for issues" $ let fp = "test/test-files/lang-comm/test.txt" in issueFinder [] [fp] >>= \i -> i `shouldBe` [Issue fp 1 (Just "palla") [], Issue fp 3 (Just "beta") [Tag "fixme"], Issue fp 4 (Just "gamma") [Tag "xxx"], Issue fp 6 (Just "qqq") [Tag "fixme", Tag "bug"]]