使用 HUnit 测试双打的 haskell 相等性?

And*_*yuk 6 haskell

HUnit 有某种方法可以近似相等吗?显然,这失败了:

test1 = TestCase (assertEqual "Should equal" (get_scores) [(0.3, 0.3), (0.6, 0.36), (1.0, 0.3399999)])
Run Code Online (Sandbox Code Playgroud)

Mat*_*ick 1

注意:我不知道是否有正确/官方/可接受的方法来做到这一点。


这是以下的源代码assertEqual

assertEqual :: (Eq a, Show a) => String -- ^ The message prefix 
                              -> a      -- ^ The expected value 
                              -> a      -- ^ The actual value
                              -> Assertion
assertEqual preface expected actual =
  unless (actual == expected) (assertFailure msg)
 where msg = (if null preface then "" else preface ++ "\n") ++
             "expected: " ++ show expected ++ "\n but got: " ++ show actual
Run Code Online (Sandbox Code Playgroud)

基于此以及JUnit 测试双重相等的函数,我们可以以相同的风格创建我们自己的函数:

import Control.Monad (unless)

assertEquals ::   String  -- ^ The message prefix
               -> Double  -- ^ The maximum difference between expected and actual
               -> Double  -- ^ The expected value
               -> Double  -- ^ The actual value
               -> Assertion
assertEquals preface delta expected actual = 
  unless (abs (expected - actual) < delta) (assertFailure msg)
 where msg = ... same as above ...
Run Code Online (Sandbox Code Playgroud)