packages feed

purescript-0.9.1: tests/Language/PureScript/Ide/MatcherSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Language.PureScript.Ide.MatcherSpec where

import           Control.Monad                       (void)
import           Data.Text                           (Text)
import qualified Language.PureScript                 as P
import           Language.PureScript.Ide.Integration
import           Language.PureScript.Ide.Matcher
import           Language.PureScript.Ide.Types
import           Test.Hspec

value :: Text -> ExternDecl
value s = ValueDeclaration s $ P.TypeWildcard $ P.SourceSpan "" (P.SourcePos 0 0) (P.SourcePos 0 0)

completions :: [Match]
completions =
  [ Match "" (value "firstResult")
  , Match "" (value "secondResult")
  , Match "" (value "fiult")
  ]

mkResult :: [Int] -> [Match]
mkResult = map (completions !!)

runFlex :: Text -> [Match]
runFlex s = runMatcher (flexMatcher s) completions

setup :: IO ()
setup = reset *> void (loadModuleWithDeps "Main")

spec :: Spec
spec = do
  describe "Flex Matcher" $ do
    it "doesn't match on an empty string" $
       runFlex "" `shouldBe` []
    it "matches on equality" $
      runFlex "firstResult" `shouldBe` mkResult [0]
    it "scores short matches higher and sorts accordingly" $
      runFlex "filt" `shouldBe` mkResult [2, 0]

  beforeAll_ setup . describe "Integration Tests: Flex Matcher" $ do
      it "doesn't match on an empty string" $ do
        cs <- getFlexCompletions ""
        cs `shouldBe` []
      it "matches on equality" $ do
        cs <- getFlexCompletions "const"
        cs `shouldBe` [("Main", "const", "forall a b. a -> b -> a")]