{-# LANGUAGE OverloadedStrings #-}
module GHC.SyntaxHighlighterSpec
( spec )
where
import Data.Text (Text)
import GHC.SyntaxHighlighter
import Test.Hspec
import qualified Data.Text.IO as T
spec :: Spec
spec = describe "tokenizeHaskell" $ do
it "parses a basic module" (withFile "data/Main.hs" basicModule)
it "parses a type family" (withFile "data/TypeFamily.hs" typeFamily)
it "parses an explicit forall" (withFile "data/Forall.hs" explicitForall)
it "parses lambda case correctly" (withFile "data/LambdaCase.hs" lambdaCase)
withFile :: FilePath -> [(Token, Text)] -> Expectation
withFile path toks = do
txt <- T.readFile path
tokenizeHaskell txt `shouldBe` Just toks
----------------------------------------------------------------------------
-- Expected token streams
basicModule :: [(Token, Text)]
basicModule =
[ (KeywordTok,"module")
, (SpaceTok," ")
, (ConstructorTok,"Main")
, (SpaceTok," ")
, (SymbolTok,"(")
, (VariableTok,"main")
, (SymbolTok,")")
, (SpaceTok," ")
, (KeywordTok,"where")
, (SpaceTok,"\n\n")
, (KeywordTok,"import")
, (SpaceTok," ")
, (ConstructorTok,"Data.Bits")
, (SpaceTok,"\n\n")
, (CommentTok,"-- | Program's entry point.")
, (SpaceTok,"\n\n")
, (VariableTok,"main")
, (SpaceTok," ")
, (SymbolTok,"::")
, (SpaceTok," ")
, (ConstructorTok,"IO")
, (SpaceTok," ")
, (SymbolTok,"(")
, (SymbolTok,")")
, (SpaceTok,"\n")
, (VariableTok,"main")
, (SpaceTok," ")
, (SymbolTok,"=")
, (SpaceTok," ")
, (VariableTok,"return")
, (SpaceTok," ")
, (SymbolTok,"(")
, (SymbolTok,")")
, (SpaceTok,"\n")
]
typeFamily :: [(Token, Text)]
typeFamily =
[ (KeywordTok,"type")
, (SpaceTok," ")
, (KeywordTok,"family")
, (SpaceTok," ")
, (ConstructorTok,"All")
, (SpaceTok," ")
, (SymbolTok,"(")
, (VariableTok,"c")
, (SpaceTok," ")
, (SymbolTok,"::")
, (SpaceTok," ")
, (VariableTok,"k")
, (SpaceTok," ")
, (SymbolTok,"->")
, (SpaceTok," ")
, (ConstructorTok,"Constraint")
, (SymbolTok,")")
, (SpaceTok," ")
, (SymbolTok,"(")
, (VariableTok,"xs")
, (SpaceTok," ")
, (SymbolTok,"::")
, (SpaceTok," ")
, (SymbolTok,"[")
, (VariableTok,"k")
, (SymbolTok,"]")
, (SymbolTok,")")
, (SpaceTok," ")
, (SymbolTok,"::")
, (SpaceTok," ")
, (ConstructorTok,"Constraint")
, (SpaceTok," ")
, (KeywordTok,"where")
, (SpaceTok,"\n ")
, (ConstructorTok,"All")
, (SpaceTok," ")
, (VariableTok,"c")
, (SpaceTok," ")
, (SymbolTok,"'")
, (SymbolTok,"[")
, (SymbolTok,"]")
, (SpaceTok," ")
, (SymbolTok,"=")
, (SpaceTok," ")
, (SymbolTok,"(")
, (SymbolTok,")")
, (SpaceTok,"\n ")
, (ConstructorTok,"All")
, (SpaceTok," ")
, (VariableTok,"c")
, (SpaceTok," ")
, (SymbolTok,"(")
, (VariableTok,"x")
, (SpaceTok," ")
, (SymbolTok,"'")
, (SymbolTok,":")
, (SpaceTok," ")
, (VariableTok,"xs")
, (SymbolTok,")")
, (SpaceTok," ")
, (SymbolTok,"=")
, (SpaceTok," ")
, (SymbolTok,"(")
, (VariableTok,"c")
, (SpaceTok," ")
, (VariableTok,"x")
, (SymbolTok,",")
, (SpaceTok," ")
, (ConstructorTok,"All")
, (SpaceTok," ")
, (VariableTok,"c")
, (SpaceTok," ")
, (VariableTok,"xs")
, (SymbolTok,")")
, (SpaceTok,"\n")
]
explicitForall :: [(Token, Text)]
explicitForall =
[ (VariableTok,"x")
, (SpaceTok," ")
, (SymbolTok,"::")
, (SpaceTok," ")
, (KeywordTok,"forall")
, (SpaceTok," ")
, (VariableTok,"a")
, (OperatorTok,".")
, (SpaceTok," ")
, (VariableTok,"a")
, (SpaceTok,"\n")
, (VariableTok,"x")
, (SpaceTok," ")
, (SymbolTok,"=")
, (SpaceTok," ")
, (VariableTok,"undefined")
, (SpaceTok,"\n")
]
lambdaCase :: [(Token, Text)]
lambdaCase =
[ (VariableTok,"foo")
, (SpaceTok," ")
, (SymbolTok,"::")
, (SpaceTok," ")
, (ConstructorTok,"Foo")
, (SpaceTok," ")
, (SymbolTok,"->")
, (SpaceTok," ")
, (ConstructorTok,"Maybe")
, (SpaceTok," ")
, (ConstructorTok,"Bar")
, (SpaceTok,"\n")
, (VariableTok,"foo")
, (SpaceTok," ")
, (SymbolTok,"=")
, (SpaceTok," ")
, (SymbolTok,"\\")
, (SymbolTok,"case")
, (SpaceTok,"\n ")
, (ConstructorTok,"Foo")
, (SpaceTok," ")
, (SymbolTok,"->")
, (SpaceTok," ")
, (ConstructorTok,"Just")
, (SpaceTok," ")
, (ConstructorTok,"Bar")
, (SpaceTok,"\n ")
, (SymbolTok,"_")
, (SpaceTok," ")
, (SymbolTok,"->")
, (SpaceTok," ")
, (ConstructorTok,"Nothing")
, (SpaceTok,"\n")
]