packages feed

moonlight-pale-0.1.0.0: test/diagnostic/WriterSpec.hs

module WriterSpec
  ( tests,
  )
where

import Moonlight.Pale.Diagnostic.Core
  ( Diagnosed,
    DiagnosticSeverity (..),
    emitDiagnostic,
    filterBySeverity,
    pureDiagnosed,
    runDiagnosed,
  )
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (assertEqual, testCase)

data WriterNote = WriterNote
  { writerNoteSeverity :: DiagnosticSeverity,
    writerNoteMessage :: String
  }
  deriving stock (Eq, Show)

tests :: TestTree
tests =
  testGroup
    "pale.diagnostic.writer"
    [ testCase "runDiagnosed returns the value and emitted notes in emission order" $
        assertEqual
          "diagnosed writer result"
          ("accepted", [infoNote, warningNote, errorNote])
          (runDiagnosed workedDiagnosed),
      testCase "filterBySeverity keeps notes at or above the threshold" $
        assertEqual
          "severity-filtered notes"
          [warningNote, errorNote]
          (filterBySeverity writerNoteSeverity DiagWarning writerNotes)
    ]

workedDiagnosed :: Diagnosed WriterNote String
workedDiagnosed =
  emitDiagnostic infoNote
    *> emitDiagnostic warningNote
    *> emitDiagnostic errorNote
    *> pureDiagnosed "accepted"

writerNotes :: [WriterNote]
writerNotes =
  [ infoNote,
    warningNote,
    errorNote
  ]

infoNote :: WriterNote
infoNote =
  WriterNote
    { writerNoteSeverity = DiagInfo,
      writerNoteMessage = "local section observed"
    }

warningNote :: WriterNote
warningNote =
  WriterNote
    { writerNoteSeverity = DiagWarning,
      writerNoteMessage = "overlap pending"
    }

errorNote :: WriterNote
errorNote =
  WriterNote
    { writerNoteSeverity = DiagError,
      writerNoteMessage = "gluing obstruction"
    }