ライブラリ内のさまざまなタイプに対して、同様のテストを多数実行したいと考えています。
簡単にするために、クラスを実装する多くのベクター型があり、ライブラリ内のすべての型で機能するNum
同じ QuickCheck プロパティ チェックを生成したいとします。prop_absNorm x y = abs x + abs y >= abs (x+y)
TH を使用してそのようなプロパティを生成します。
$(writeTests
(\t ->
[d| prop_absNorm :: $(t) -> $(t) -> Bool
prop_absNorm x y = abs x + abs y >= abs (x+y)
|])
)
テストを生成する関数には、次の署名があります。
writeTests :: (TypeQ -> Q [Dec]) -> Q [Dec]
この関数は、ベクター クラスのすべてのインスタンスVectorMath (n::Nat) t
(および同時に のインスタンスNum
) を検索し、reify ''VectorMath
それに応じてすべての prop 関数を生成します。
-ddump-splices
次のようなものを示しています。
prop_absNormIntX4 :: Vector 4 Int -> Vector 4 Int -> Bool
prop_absNormIntX4 x y = abs x + abs y >= abs (x+y)
prop_absNormCIntX4 :: Vector 4 CInt -> Vector 4 CInt -> Bool
prop_absNormCIntX4 x y = abs x + abs y >= abs (x+y)
...
prop_absNormFloatX4 :: Vector 4 Float -> Vector 4 Float -> Bool
prop_absNormFloatX4 x y = abs x + abs y >= abs (x+y)
prop_absNormFloatX3 :: Vector 3 Float -> Vector 3 Float -> Bool
prop_absNormFloatX3 x y = abs x + abs y >= abs (x+y)
問題は、手動で作成されたプロパティはすべてチェックされますが、生成されたプロパティはチェックされないことです。
注 1: 同じファイルに生成されたプロパティと生成されていないプロパティがあります (つまり、TH 式$(..)
は他の props と同じファイルにあります)。
注 2: prop 関数を作成するための型のリストは可変です。後で の他のインスタンスを追加したいVectorMath
ので、テスト リストに自動的に追加されます。
問題は、HTF(おそらくTHも使用する)が生成されたコードを含むファイルではなく、元のファイルを解析することだと思いますが、なぜこれが起こるのかわかりません。
だから私の質問は: この問題を解決するにはどうすればよいですか? TH で生成された props を使用できない場合、さまざまなタイプで QuickCheck テストを実行できますか (つまり、それらを に代入しますprop_absNorm :: Vector 4 a -> Vector 4 a -> Bool
)?
また、別の方法として、TH をさらに使用して手動でテスト エントリを htf_Main に追加することもできますが、これを行う方法はまだわかりません。そして、それはきれいな解決策のようには見えません。