Странности с утверждениями клики, HTF и HUnit

Итак, я пытаюсь использовать HTF для запуска некоторых утверждений в стиле HUnit.

% cat tests/TestDemo.hs
{-# OPTIONS_GHC -Wall -F -pgmF htfpp #-}
module Main where
import Test.Framework
import Test.HUnit.Base ((@?=))
import System.Environment (getArgs)

-- just run some tests
main :: IO ()
main = getArgs >>= flip runTestWithArgs Main.allHTFTests

-- all these tests should fail
test_fail_int1 :: Assertion
test_fail_int1 = (0::Int) @?= (1::Int)

test_fail_bool1 :: Assertion
test_fail_bool1 = True @?= False

test_fail_string1 :: Assertion
test_fail_string1 = "0" @?= "1"

test_fail_int2 :: Assertion
test_fail_int2 = [0::Int] @?= [1::Int]

test_fail_string2 :: Assertion
test_fail_string2 = "true" @?= "false"

test_fail_bool2 :: Assertion
test_fail_bool2 = [True] @?= [False]

И когда я использую ghc --make, он работает правильно.

% ghc --make tests/TestDemo.hs
[1 of 1] Compiling Main             ( tests/TestDemo.hs, tests/TestDemo.o )
Linking tests/TestDemo ...
% tests/TestDemoA
...
* Tests:    6
* Passed:   0
* Failures: 6
* Errors:   0

Failures:
  * Main:fail_int1 (tests/TestDemo.hs:9)
  * Main:fail_bool1 (tests/TestDemo.hs:12)
  * Main:fail_string1 (tests/TestDemo.hs:15)
  * Main:fail_int2 (tests/TestDemo.hs:19)
  * Main:fail_string2 (tests/TestDemo.hs:22)
  * Main:fail_bool2 (tests/TestDemo.hs:25)

Но когда я использую кабалу для его создания, не все тесты, которые должны провалиться, проваливаются.

% cat Demo.cabal
...
executable test-demo
  build-depends: base >= 4, HUnit, HTF
  main-is: TestDemo.hs
  hs-source-dirs: tests
% cabal configure
Resolving dependencies...
Configuring Demo-0.0.0...
% cabal build
Preprocessing executables for Demo-0.0.0...
Building Demo-0.0.0...
[1 of 1] Compiling Main             ( tests/TestDemo.hs, dist/build/test-demo/test-demo-tmp/Main.o )
Linking dist/build/test-demo/test-demo ...
% dist/build/test-demo/test-demo
...
* Tests:    6
* Passed:   3
* Failures: 3
* Errors:   0

Failures:
  * Main:fail_int2 (tests/TestDemo.hs:23)
  * Main:fail_string2 (tests/TestDemo.hs:26)
  * Main:fail_bool2 (tests/TestDemo.hs:29)

Что происходит не так и как я могу это исправить?


person rampion    schedule 16.01.2011    source источник


Ответы (1)


Это ошибка в некоторых версиях GHC, связанная с удалением оптимизатором исключений ввода-вывода в некоторых случаях. Это очень часто встречается в коде HUnit, если включена оптимизация. И Кабал устанавливает -O1 по умолчанию, что включает ошибку.

Обновление до GHC 7 исправляет это (на самом деле не рекомендуется, пока библиотеки не догонят его, IE версия платформы haskell сделана для GHC 7).

Вы также можете указать -O0 в параметрах компилятора в разделе файла .cabal, относящемся к вашему тестовому исполняемому файлу. Это то, что я сделал для своего тестового кода, пока не буду готов перенести свой проект на GHC 7.

person Carl    schedule 16.01.2011
comment
На самом деле, я думаю, что это ошибка в HUnit. Функция assertFailure должна использовать throwIO, а не throw. Это предотвратит попытки GHC переписать исключения. - person nominolo; 16.01.2011