content: module Unused.ResponseFilterSpec
      ( main
      , spec
      ) where
  
  import Data.List (find)
  import Test.Hspec
  import Unused.ResponseFilter
  import Unused.ResultsClassifier
  import Unused.Types
         (TermMatch(..), TermResults, resultsFromMatches)
  
  main :: IO ()
  main = hspec spec
  
  spec :: Spec
  spec =
      parallel $ do
          describe "railsAutoLowLikelihood" $ do
              it "allows controllers" $ do
                  let match =
                          TermMatch
                              "ApplicationController"
                              "app/controllers/application_controller.rb"
                              Nothing
                              1
                  let result = resultsFromMatches [match]
                  railsAutoLowLikelihood result `shouldBe` True
              it "allows helpers" $ do
                  let match =
                          TermMatch "ApplicationHelper" "app/helpers/application_helper.rb" Nothing 1
                  let result = resultsFromMatches [match]
                  railsAutoLowLikelihood result `shouldBe` True
              it "allows migrations" $ do
                  let match =
                          TermMatch
                              "CreateUsers"
                              "db/migrate/20160101120000_create_users.rb"
                              Nothing
                              1
                  let result = resultsFromMatches [match]
                  railsAutoLowLikelihood result `shouldBe` True
              it "disallows service objects" $ do
                  let match =
                          TermMatch
                              "CreatePostWithNotifications"
                              "app/services/create_post_with_notifications.rb"
                              Nothing
                              1
                  let result = resultsFromMatches [match]
                  railsAutoLowLikelihood result `shouldBe` False
              it "disallows methods" $ do
                  let match =
                          TermMatch
                              "my_method"
                              "app/services/create_post_with_notifications.rb"
                              Nothing
                              1
                  let result = resultsFromMatches [match]
                  railsAutoLowLikelihood result `shouldBe` False
              it "disallows models that occur in migrations" $ do
                  let model = TermMatch "User" "app/models/user.rb" Nothing 1
                  let migration =
                          TermMatch "User" "db/migrate/20160101120000_create_users.rb" Nothing 1
                  let result = resultsFromMatches [model, migration]
                  railsAutoLowLikelihood result `shouldBe` False
              it "allows matches intermixed with other results" $ do
                  let appToken =
                          TermMatch "ApplicationHelper" "app/helpers/application_helper.rb" Nothing 1
                  let testToken =
                          TermMatch
                              "ApplicationHelper"
                              "spec/helpers/application_helper_spec.rb"
                              Nothing
                              10
                  let result = resultsFromMatches [appToken, testToken]
                  railsAutoLowLikelihood result `shouldBe` True
          describe "elixirAutoLowLikelihood" $ do
              it "disallows controllers" $ do
                  let match =
                          TermMatch "PageController" "web/controllers/page_controller.rb" Nothing 1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` False
              it "allows views" $ do
                  let match = TermMatch "PageView" "web/views/page_view.rb" Nothing 1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` True
              it "allows migrations" $ do
                  let match =
                          TermMatch
                              "CreateUsers"
                              "priv/repo/migrations/20160101120000_create_users.exs"
                              Nothing
                              1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` True
              it "allows tests" $ do
                  let match = TermMatch "UserTest" "test/models/user_test.exs" Nothing 1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` True
              it "allows Mixfile" $ do
                  let match = TermMatch "Mixfile" "mix.exs" Nothing 1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` True
              it "allows __using__" $ do
                  let match = TermMatch "__using__" "web/web.ex" Nothing 1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` True
              it "disallows service modules" $ do
                  let match =
                          TermMatch
                              "CreatePostWithNotifications"
                              "web/services/create_post_with_notifications.ex"
                              Nothing
                              1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` False
              it "disallows functions" $ do
                  let match =
                          TermMatch
                              "my_function"
                              "web/services/create_post_with_notifications.ex"
                              Nothing
                              1
                  let result = resultsFromMatches [match]
                  elixirAutoLowLikelihood result `shouldBe` False
              it "allows matches intermixed with other results" $ do
                  let appToken = TermMatch "UserView" "web/views/user_view.ex" Nothing 1
                  let testToken = TermMatch "UserView" "test/views/user_view_test.exs" Nothing 10
                  let result = resultsFromMatches [appToken, testToken]
                  elixirAutoLowLikelihood result `shouldBe` True
          describe "haskellAutoLowLikelihood" $ do
              it "allows instance" $ do
                  let match = TermMatch "instance" "src/Lib/Types.hs" Nothing 1
                  let result = resultsFromMatches [match]
                  haskellAutoLowLikelihood result `shouldBe` True
              it "allows items in the *.cabal file" $ do
                  let match = TermMatch "Lib.SomethingSpec" "lib.cabal" Nothing 1
                  let result = resultsFromMatches [match]
                  haskellAutoLowLikelihood result `shouldBe` True
          describe "autoLowLikelihood" $
              it "doesn't qualify as low when no matchers are present in a language config" $ do
                  let match = TermMatch "AwesomeThing" "app/foo/awesome_thing.rb" Nothing 1
                  let result = resultsFromMatches [match]
                  let languageConfig =
                          LanguageConfiguration
                              "Bad"
                              []
                              [LowLikelihoodMatch "Match with empty matchers" [] False]
                              []
                  autoLowLikelihood languageConfig result `shouldBe` False
  
  configByName :: String -> LanguageConfiguration
  configByName s = config'
    where
      (Right config) = loadConfig
      (Just config') = find ((==) s . lcName) config
  
  railsAutoLowLikelihood :: TermResults -> Bool
  railsAutoLowLikelihood = autoLowLikelihood (configByName "Rails")
  
  elixirAutoLowLikelihood :: TermResults -> Bool
  elixirAutoLowLikelihood = autoLowLikelihood (configByName "Phoenix")
  
  haskellAutoLowLikelihood :: TermResults -> Bool
  haskellAutoLowLikelihood = autoLowLikelihood (configByName "Haskell")
  