content: import qualified Data.ByteString.Lazy as LBS
  import qualified Data.ByteString.Lazy.Char8 as LBS8
  import GLua.Position (LineColPos (..), Region (..))
  import qualified GLuaFixer.Interface as GLua
  import GLuaFixer.LintMessage (
    Issue (..),
    LintMessage (..),
    Severity (..),
   )
  import GLuaFixer.LintSettings (LintSettings, defaultLintSettings)
  import Test.Tasty (TestTree, defaultMain, testGroup)
  import Test.Tasty.HUnit (testCase, (@=?))
  
  main :: IO ()
  main = defaultMain tests
  
  tests :: TestTree
  tests =
    testGroup
      "Unit tests"
      [ testQuotedStringWarningPosition
      , testEmptyIfWarningPosition
      ]
  
  -- | Regression test for https://github.com/FPtje/GLuaFixer/issues/169
  testQuotedStringWarningPosition :: TestTree
  testQuotedStringWarningPosition =
    testCase "The syntax inconsistency warning is thrown and in the right region" $
      let
        input = "bar = a or b\nfoo = \"\" and \"\" and \"dddd\" || \"[]\""
        expectedRegion1 = Region (LineColPos 0 8 8) (LineColPos 0 10 10)
        warning1 = SyntaxInconsistency "||" "or"
        msg1 = LintMessage LintWarning expectedRegion1 warning1 testFilePath
  
        expectedRegion2 = Region (LineColPos 1 27 40) (LineColPos 1 29 42)
        warning2 = SyntaxInconsistency "||" "or"
        msg2 = LintMessage LintWarning expectedRegion2 warning2 testFilePath
      in
        [msg1, msg2] @=? lintString input
  
  -- | Regression test for https://github.com/FPtje/GLuaFixer/issues/170
  testEmptyIfWarningPosition :: TestTree
  testEmptyIfWarningPosition = do
    testCase "The empty-if-statement is thrown and in the right region for if-statements" $
      let
        inputEmptyIf = "if true then end"
        inputWithElse = "if true then\nelse print(1) end"
        expectedRegionEmptyIf = Region (LineColPos 0 0 0) (LineColPos 0 16 16)
        expectedRegionWithElse = Region (LineColPos 0 0 0) (LineColPos 1 0 13)
        warning = EmptyIf
        msgEmptyIf = LintMessage LintWarning expectedRegionEmptyIf warning testFilePath
        msgWithElse = LintMessage LintWarning expectedRegionWithElse warning testFilePath
      in
        do
          lintString inputEmptyIf @=? [msgEmptyIf]
          lintString inputWithElse @=? [msgWithElse]
  
  -- | Helper to lint a string
  lintString :: String -> [LintMessage]
  lintString input =
    let
      settings = defaultLintSettings
    in
      case GLua.lex settings testFilePath input of
        Left errs -> errs
        Right mTokens -> case GLua.parse settings testFilePath mTokens of
          Left errs -> errs
          Right ast -> GLua.lexiconLint testFilePath settings mTokens <> GLua.astLint testFilePath settings ast
  
  testFilePath :: String
  testFilePath = "test input"
  