packages feed

tricorder-0.1.0.0: test/Unit/Tricorder/CLI/RenderSpec.hs

module Unit.Tricorder.CLI.RenderSpec (spec_Render) where

import Test.Hspec

import Tricorder.BuildState
    ( Diagnostic (..)
    , Severity (..)
    )
import Tricorder.CLI.Render (diagnosticBlock)


spec_Render :: Spec
spec_Render = do
    describe "diagnosticBlock" do
        it "includes the one-liner prefix for an error" do
            diagnosticBlock errMsg `shouldContainT` "E Foo.hs:10 type mismatch"

        it "includes the full text body after the first line" do
            diagnosticBlock errMsg `shouldContainT` "\ntype mismatch"

        it "uses 'W' prefix for warnings" do
            diagnosticBlock warnMsg `shouldContainT` "W Bar.hs:3 unused import"

        it "contains both title and text when they differ" do
            let d = mixedMsg
            diagnosticBlock d `shouldContainT` "short title"
            diagnosticBlock d `shouldContainT` "full body of the message"
  where
    shouldContainT :: Text -> Text -> Expectation
    shouldContainT a b = toString a `shouldContain` toString b


--------------------------------------------------------------------------------
-- Helpers
--------------------------------------------------------------------------------

errMsg :: Diagnostic
errMsg =
    Diagnostic
        { severity = SError
        , file = "Foo.hs"
        , line = 10
        , col = 1
        , endLine = 10
        , endCol = 5
        , title = "type mismatch"
        , text = "type mismatch"
        }


warnMsg :: Diagnostic
warnMsg =
    Diagnostic
        { severity = SWarning
        , file = "Bar.hs"
        , line = 3
        , col = 1
        , endLine = 3
        , endCol = 10
        , title = "unused import"
        , text = "unused import"
        }


mixedMsg :: Diagnostic
mixedMsg =
    Diagnostic
        { severity = SError
        , file = "Baz.hs"
        , line = 5
        , col = 1
        , endLine = 5
        , endCol = 20
        , title = "short title"
        , text = "full body of the message"
        }