我有一个简单的反向函数功能集(简单的移位代码):
encode, decode :: Int -> String -> String
他们通过一些简单的手动测试进行测试,但是quickCheck测试报告失败:
*** Failed! Falsifiable (after 8 tests and 4 shrinks):
"\254"
0
但手动运行同样的测试效果很好:
*Main> decode 0 ( encode 0 "\254")
"c"
我不是在问为什么它会失败(这是我要追逐的东西),但为什么当手表(看似)同样的测试有效时,quickCheck会失败?
我怀疑它与字符编码有关,一个解码它,另一个将它视为字符串,但我不确定原因。
这个问题是关于测试如何工作,而不是(还是!)函数或失败的原因,但这里是代码:
import Data.Char
let2int c = ord c - ord 'a'
int2let n = chr (ord 'a' + n)
shift :: Int -> Char -> Char
shift n c | isLower c = int2let ((let2int c + n) `mod` 26)
| otherwise = c
encode, decode :: Int -> String -> String
encode n xs = [shift n x | x <- xs]
decode n = encode (-n)
参考:Hutton,2007
quickCheck $ (\s n-> (decode n $ encode n s) == s)
答案 0 :(得分:1)
您提供的信息不足 - 下次请提供完整的测试和完整的代码。当应用于quickCheck
的输出时,除了失败的结果之外,还没有任何神奇的因素可用于测试中的表达式。
从您的代码中我发现您的测试是decode 0 . encode 0 ~ id
。这不是真的,只要看看ghci的输出:
*Main Test.QuickCheck> quickCheck (\x -> x == decode 0 (encode 0 x))
*** Failed! Falsifiable (after 13 tests and 4 shrinks):
"\244"
*Main Test.QuickCheck> decode 0 (encode 0 "\244")
"r"
*Main Test.QuickCheck> "\244" == "r"
False