この質問Controlling how test data is generated in QuickCheck に似た問題があります。以下に、私の詳細、使用しているコード、および私が持っている特定の質問を明確にします。
フィボナッチ数列を入力として使用する fizz-buzz プログラムを作成しました。2つのことをテストしたいと思います。(1) 特定の条件を満たす Int を指定すると、プログラムは正しい文字列を出力しますか? (2) 私のフィボナッチジェネレーターはフィボナッチ数を生成していますか?
私が抱えている問題は、上記のリンクに似ています。sの範囲Int
が大きすぎます。最初の 1000 個のフィボナッチ数と言うようにテストを制限するにはどうすればよいですか?
これは、適切かつ最小限であると私が考えるコードです。詳しく説明する必要がある場合はお知らせください。
import Data.Numbers.Primes (isPrime)
import Test.Hspec (Spec,hspec,describe,it,shouldBe)
import Test.Hspec.QuickCheck (prop)
qcheck :: Spec
qcheck = do
describe "QuickCheck test fiz" $
prop "QuickCheck test" $ modfiz
describe "QuickCheck test fib" $
prop "QuickCheck test fib" $ testfib
modfiz int
| int <= 0 = True -- code smell, should never generate number less than or equal to zero.
| int == 3 = test3
| int == 5 = test5
| int `mod` 15 == 0 = testMod35
| int `mod` 3 == 0 = testMod3
| int `mod` 5 == 0 = testMod5
| isPrime int == True = testPrime
| otherwise = testRest
where
test3 =
Right "Buzz BuzzFizz" == fizzbuzz 3
test5 =
Right "Fizz BuzzFizz" == fizzbuzz 5
testMod3 =
Right "Buzz " == fizzbuzz int
testMod5 =
Right "Fizz " == fizzbuzz int
testMod35 =
Right "Buzz Fizz " == fizzbuzz int
testPrime =
Right "BuzzFizz" == fizzbuzz int
testRest =
Right (show int) == fizzbuzz int
testfib :: Integer -> Bool
testfib n =
case (fibb n) of
Left _ -> False
Right n' -> isFib n'
fibb
を取り、Int
その n 番目のフィボナッチを見つけます。そうfibb 6
返しRight 8
ます。Left
値はこの問題には関係ありません。
私が気づいたのは、 a を記述し、 anewtype
をラップし[Int]
て新しいArbitrary
インスタンスを作成する必要があるという答えでした。ただし、答えは2012年のものであり、必要なことを実行できるように見えることにも気付きましQuickCheck 2
たArgs
datatype
。Args
では、テストの範囲を制限する (最初の 1000 個のフィボナッチ数が必要なだけ)、また実行するテストの数を制限するために、新しい を作成できますか? そうでない場合、上記のリンクの解決策は私が取らなければならないアプローチですか?