lentil-0.1.1.0: test/Lentil/QuerySpec.hs
module Lentil.QuerySpec where
import Test.Hspec
import Lentil.Types
import Lentil.Query
-- Parsing tests
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
let i1 = Issue "a.hs" 1 "issue 1" [Tag "ta", Tag "fl:va"]
i2 = Issue "a.hs" 2 "issue 12" [Tag "tb"]
i3 = Issue "b.hs" 1 "issue 3" [Tag "tb", Tag "fl:vb"]
ix = Issue "b.hs" 1 "issue n" []
is = [i1, i2, i3]
describe "filter*" $ do
it "filters by Filepath" $
filterFilepath "a.hs" is `shouldBe` [i1, i2]
it "filters by Description" $
filterDescription "3" is `shouldBe` [i3]
it "filters by Tag" $
filterTags "tb" is `shouldBe` [i2, i3]
it "filters by Tag 'label'" $
filterTags "fl:" is `shouldBe` [i1, i3]
it "filters by using regexps" $
filterTags "(ta|tb)" is `shouldBe` [i1, i2, i3]
describe "filterTagless" $ do
it "filters by empty values" $
filterTagless (ix:is) `shouldBe` [ix]
describe "negFilter" $ do
it "negates a filter" $
negFilter (filterTags "fl:") is `shouldBe` [i2]
it "cancels itself on a double negation" $
negFilter (negFilter (filterTags "fl:")) is
`shouldBe` filterTags "fl:" is
describe "filter(And|Or)" $ do
it "chains (boolean and) multiple filters" $
filterAnd [filterFilepath "a.hs", filterTags "b"] is
`shouldBe` [i2]
it "chains (boolean or) multiple filters" $
filterOr [filterFilepath "a.hs", filterTags "b"] is
`shouldBe` [i1, i2, i3]
describe "sortIssues" $ do
it "sorts Issues" $
sortIssues iFile Asc is `shouldBe` [i1, i2, i3]
it "sorts Issues in descending order" $
sortIssues iFile Desc is `shouldBe` [i3, i2, i1]
it "smart sorts strings containing naturals" $
sortIssues iDesc Asc is `shouldBe` [i1, i3, i2]
describe "sortTag" $ do
it "sorts by partial tag, empty fields first" $
sortTag "fl:" Asc is `shouldBe` [i2, i1, i3]
describe "chainSorts" $ do
it "sequences sort functions" $
chainSorts is [sortIssues iFile Desc,
sortIssues iDesc Desc]
`shouldBe` [i3, i2, i1]
describe "groupIssues" $ do
it "group isses" $
groupIssues iFile is `shouldBe` [[i1, i2], [i3]]
describe "tagPop" $ do
it "outputs tag popularity list" $
tagPop is `shouldBe` [(Tag "tb", 2), (Tag "ta", 1),
(Tag "fl:vb", 1), (Tag "fl:va", 1)]