J'utilise les spécifications Clojure aux spécifications d'une structure de données simple:Création d'un générateur de spécifications Clojure pour une structure de données imbriquées avec des contraintes à travers les couches
{:max 10
:data [[3 8 1]
[9 0 1]]}
La valeur :data
est un vecteur de vecteurs de taille égale des nombres entiers l'intervalle de zéro à la valeur :max
inclusivement. J'ai exprimé cela avec spec comme suit:
(s/def ::max pos-int?)
(s/def ::row (s/coll-of nat-int? :kind vector?, :min-count 1))
(s/def ::data (s/and (s/coll-of ::row :kind vector?, :min-count 1)
#(apply = (map count %))))
(s/def ::image (s/and (s/keys :req-un [::max ::data])
(fn [{:keys [max data]}]
(every? #(<= 0 % max) (flatten data)))))
générateurs automatiques fonctionnent très bien pour les trois premières spécifications, mais pas pour ::image
. (s/exercise ::image)
échoue toujours après 100 essais.
J'ai essayé de créer un générateur personnalisé pour ::image
mais je n'ai pas réussi. Je ne vois pas comment je pourrais exprimer les contraintes qui traversent les couches de la structure imbriquée (la clé :max
contraint les valeurs dans un vecteur ailleurs).
Est-il possible de créer un générateur Clojure spec/test.check qui génère ::image
s?