packages feed

ide-backend-0.9.0: TestSuite/TestSuite/Tests/Compliance.hs

module TestSuite.Tests.Compliance (testGroupCompliance) where

import Prelude hiding (span, mod)
import Data.Monoid
import System.FilePath
import Test.HUnit
import Test.Tasty

import IdeSession
import TestSuite.State
import TestSuite.Session
import TestSuite.Assertions

testGroupCompliance :: TestSuiteEnv -> TestTree
testGroupCompliance env = testGroup "Standards compliance" [
    testGroup "NondecreasingIndentation" $ [
        stdTest env "GHC API should fail without -XNondecreasingIndentation"            test_failWithoutXNDI_GHC
      , stdTest env "both should pass with -XNondecreasingIndentation"                  test_passWithXNDI
      , stdTest env "both should pass with -XNondecreasingIndentation in SessionConfig" test_passWithXNDI_asStaticOpt
      , stdTest env "both should pass with -XHaskell98"                                 test_passWithXH98
      , stdTest env "both should pass with -XHaskell98 in SessionConfig"                test_passWithXH98_asStaticOpt
      ] ++ exeTests env [
        stdTest env "buildExe should fail without -XNondecreasingIndentation"           test_failWithoutXNDI_buildExe
      ]
  ]

test_failWithoutXNDI_GHC :: TestSuiteEnv -> Assertion
test_failWithoutXNDI_GHC env = withAvailableSession env $ \session -> do
    updateSessionD session upd 1
    -- The error messages are different in 7.4 and 7.8.
    -- TODO: can use 'env' to have different assertions for 7.4 and 7.8
    assertOneError session
  where
    src = "module Main where\n\
          \main = do\n\
          \    let foo = do\n\
          \        putStrLn \"hello\"\n\
          \    foo"
    upd = updateSourceFile "src/Main.hs" src

test_failWithoutXNDI_buildExe :: TestSuiteEnv -> Assertion
test_failWithoutXNDI_buildExe env = withAvailableSession env $ \session -> do
    updateSessionD session upd 1
    assertNoErrors session

    let m    = "Main"
        updE = buildExe ["-XHaskell2010"] [(m, "src/Main.hs")]
    updateSessionD session updE 1
    distDir     <- getDistDir session
    buildStderr <- readFile $ distDir </> "build/ide-backend-exe.stderr"
    -- The error messages are different in 7.4 and 7.8.
    -- TODO: can use 'env' to have different assertions for 7.4 and 7.8
    assertEqual "buildStderr empty" False (null buildStderr)
  where
    src = "module Main where\n\
          \main = do\n\
          \    let foo = do\n\
          \        putStrLn \"hello\"\n\
          \    foo"
    upd = updateSourceFile "src/Main.hs" src
       <> updateGhcOpts ["-XHaskell98"]

test_passWithXNDI :: TestSuiteEnv -> Assertion
test_passWithXNDI env = withAvailableSession env $ \session -> do
    updateSessionD session upd 1
    assertNoErrors session

    ifTestingExe env $ do
       let m    = "Main"
           updE = buildExe [] [(m, "src/Main.hs")]
       updateSessionD session updE 1
       distDir     <- getDistDir session
       buildStderr <- readFile $ distDir </> "build/ide-backend-exe.stderr"
       assertEqual "buildStderr empty" True (null buildStderr)
  where
    src = "module Main where\n\
          \main = do\n\
          \    let foo = do\n\
          \        putStrLn \"hello\"\n\
          \    foo"
    upd = updateSourceFile "src/Main.hs" src
       <> updateGhcOpts ["-XNondecreasingIndentation"]

test_passWithXNDI_asStaticOpt :: TestSuiteEnv -> Assertion
test_passWithXNDI_asStaticOpt env = withAvailableSession' env (withGhcOpts ["-XNondecreasingIndentation"]) $ \session -> do
    updateSessionD session upd 1
    assertNoErrors session

    ifTestingExe env $ do
       let m    = "Main"
           updE = buildExe [] [(m, "src/Main.hs")]
       updateSessionD session updE 1
       distDir     <- getDistDir session
       buildStderr <- readFile $ distDir </> "build/ide-backend-exe.stderr"
       assertEqual "buildStderr empty" True (null buildStderr)
  where
    src = "module Main where\n\
          \main = do\n\
          \    let foo = do\n\
          \        putStrLn \"hello\"\n\
          \    foo"
    upd = updateSourceFile "src/Main.hs" src

test_passWithXH98 :: TestSuiteEnv -> Assertion
test_passWithXH98 env = withAvailableSession env $ \session -> do
    updateSessionD session upd 1
    assertNoErrors session

    ifTestingExe env $ do
       let m    = "Main"
           updE = buildExe [] [(m, "src/Main.hs")]
       updateSessionD session updE 2 -- Should be 1 (#189)
       distDir     <- getDistDir session
       buildStderr <- readFile $ distDir </> "build/ide-backend-exe.stderr"
       assertEqual "buildStderr empty" True (null buildStderr)
  where
    src = "module Main where\n\
          \main = do\n\
          \    let foo = do\n\
          \        putStrLn \"hello\"\n\
          \    foo"
    upd = updateSourceFile "src/Main.hs" src
       <> updateGhcOpts ["-XHaskell98"]


test_passWithXH98_asStaticOpt :: TestSuiteEnv -> Assertion
test_passWithXH98_asStaticOpt env = withAvailableSession' env (withGhcOpts ["-XHaskell98"]) $ \session -> do
    updateSessionD session upd 1
    assertNoErrors session

    ifTestingExe env $ do
       let m    = "Main"
           updE = buildExe [] [(m, "src/Main.hs")]
       updateSessionD session updE 2 -- Should be 1 (#189)
       distDir     <- getDistDir session
       buildStderr <- readFile $ distDir </> "build/ide-backend-exe.stderr"
       assertEqual "buildStderr empty" True (null buildStderr)
  where
    src = "module Main where\n\
          \main = do\n\
          \    let foo = do\n\
          \        putStrLn \"hello\"\n\
          \    foo"
    upd = updateSourceFile "src/Main.hs" src