dhall-haskell/dhall/tests/Lint.hs
Gabriel Gonzalez 203a22818e
Fix bug when linting multi-let expressions (#703)
`dhall lint` was incorrectly deleting `let` bindings that are being used
due to not checking other `let` bindings within the same multi-`let`
expression for free variable occurrences.

This change fixes that and adds the first regression test for `dhall
lint`
2018-11-24 08:32:04 -08:00

59 lines
1.8 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module Lint where
import Data.Monoid (mempty, (<>))
import Data.Text (Text)
import Test.Tasty (TestTree)
import qualified Control.Exception
import qualified Data.Text
import qualified Data.Text.IO
import qualified Dhall.Core
import qualified Dhall.Import
import qualified Dhall.Lint
import qualified Dhall.Parser
import qualified Test.Tasty
import qualified Test.Tasty.HUnit
lintTests :: TestTree
lintTests =
Test.Tasty.testGroup "format tests"
[ should
"correctly handle multi-let expressions"
"success/multilet"
]
should :: Text -> Text -> TestTree
should name basename =
Test.Tasty.HUnit.testCase (Data.Text.unpack name) $ do
let inputFile =
Data.Text.unpack ("./tests/lint/" <> basename <> "A.dhall")
let outputFile =
Data.Text.unpack ("./tests/lint/" <> basename <> "B.dhall")
inputText <- Data.Text.IO.readFile inputFile
parsedInput <- case Dhall.Parser.exprFromText mempty inputText of
Left exception -> Control.Exception.throwIO exception
Right expression -> return expression
let lintedInput = Dhall.Lint.lint parsedInput
actualExpression <- Dhall.Import.load lintedInput
outputText <- Data.Text.IO.readFile outputFile
parsedOutput <- case Dhall.Parser.exprFromText mempty outputText of
Left exception -> Control.Exception.throwIO exception
Right expression -> return expression
resolvedOutput <- Dhall.Import.load parsedOutput
let expectedExpression = Dhall.Core.denote resolvedOutput
let message =
"The linted expression did not match the expected output"
Test.Tasty.HUnit.assertEqual message expectedExpression actualExpression