我有一個簡單函數集合的逆函數(簡單的移位碼):快速檢查測試失敗
encode, decode :: Int -> String -> String
和他們測試通過一些簡單的手動測試正常,但一個快速檢查測試報告失敗:
*** 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)
參考:赫頓,2007年
quickCheck $ (\s n-> (decode n $ encode n s) == s)
什麼是實際測試? –
查看「encode」和「decode」的定義也可能有用。 –
您需要在您的問題中包含失敗測試的定義。 –