3

::giveeaと aがあるとしましょう::giver:

(s/def ::givee keyword?)
(s/def ::giver keyword?)

そのフォームはunq/gift-pair

(s/def :unq/gift-pair (s/keys :req-un [::givee ::giver]))

そして、次の aがあり:unq/gift-historyます。vectorunq/gift-pair

(s/def :unq/gift-history (s/coll-of :unq/gift-pair :kind vector?))

最後に、次のいずれかを置き換えたいとし:unq/gift-pairますvector

(defn set-gift-pair-in-gift-history [g-hist g-year g-pair]
  (assoc g-hist g-year g-pair))
(s/fdef set-gift-pair-in-gift-history
        :args (s/and (s/cat :g-hist :unq/gift-history
                            :g-year int?
                            :g-pair :unq/gift-pair)
                     #(< (:g-year %) (count (:g-hist %)))
                     #(> (:g-year %) -1))
        :ret :unq/gift-history)

すべて正常に動作します:

(s/conform :unq/gift-history
           (set-gift-pair-in-gift-history [{:givee :me, :giver :you} {:givee :him, :giver :her}] 1 {:givee :dog, :giver :cat}))
=> [{:givee :me, :giver :you} {:givee :dog, :giver :cat}]

私がそれを試みるまでstest/check

(stest/check `set-gift-pair-in-gift-history)
             clojure.lang.ExceptionInfo: Couldn't satisfy such-that predicate after 100 tries.
java.util.concurrent.ExecutionException: clojure.lang.ExceptionInfo: Couldn't satisfy such-that predicate after 100 tries. {}

ベクトル数を制限するために使用しようとしs/int-inましたが(それが問題かもしれないと考えています)、成功しませんでした。

(stest/check `set-gift-pair-in-gift-history)正しく実行する方法についてのアイデアはありますか?

ありがとうございました。

4

1 に答える 1