Nutritioustim
Nutritioustim

Reputation: 2738

Is clojure.spec check generating bad input?

Using clojure.spec (org.clojure/clojurescript {:mvn/version "1.10.520"}), I have a function spec that specifies a map for its input.

gen/generate and gen/sample work fine. But calling cljs.spec.test.alpha/check errors with input that should be a map, but is passed a collection (Error: More than one element found in structure). Ie, it looks like the spec system is generating bad input.

Is this a bug with spec?

bar spec

(s/def ::check-run
  (s/keys
    :req-un
    [::action
     ::check_run
     ::installation
     ::organization
     ::repository
     ::sender]))

foo.cljs

(s/def ::payload :bar/check-run)
(s/def ::check-run-started (s/keys :req-un [::payload]))

(s/fdef check-run->cijob-created
  :args (s/cat :arg ::check-run-started))

(defn check-run->cijob-created [arg])

While the function spec only declares A, the spec system is generating B.

;; A
{:payload {:action "", :check_run {:html_url "", }}, ...}

;; B
[({:payload {:action "", :check_run {:html_url "", }}, ...}})]

workbench

(cljs.spec.test.alpha/check
  `foo/check-run->cijob-created
  {:clojure.spec.test.check/opts {:num-tests 10}})


[{:spec #object[cljs.spec.alpha.t_cljs$spec$alpha50916],

  :clojure.spec.test.check/ret
  {:shrunk
   {:total-nodes-visited 313, :depth 148, :pass? false, :result #object[Error Error: More than one element found in structure: 0], :result-data #:clojure.test.check.properties{:error #object[Error Error: More than one element found in structure: 0]}, :time-shrinking-ms 11299,
    :smallest
    [({:payload {:action "", :check_run {:html_url "", }}, ...}})]},

  :sym foo/check-run->cijob-created,
  :failure #object[Error Error: More than one element found in structure: 0]}]


  [1]: https://clojure.org/about/spec

Upvotes: 1

Views: 109

Answers (1)

Nutritioustim
Nutritioustim

Reputation: 2738

Ok, figured this one out. It was failing due to my use of a specter macro (with navigators). I’m not sure how. But somehow this messes up test.check generators. I’m assuming it’s some kind of strange interplay that’s unworkable with Clojurescript’s macro system.

Anyways, migrating to a simpler get-in fixed the problem.

Upvotes: 1

Related Questions