Это ошибка?NullPointerException при попытке сгенерировать из s / или spec, который включает ноль - PullRequest
0 голосов
/ 07 октября 2018

Я нашел способ генерировать исключения NullPointerException, генерируя значения с использованием спецификации s/or.Я хочу иметь возможность генерировать и помечать значение nil, нет s/nilable не подходит.

Это ошибка в clojure.spec?

(ns blah
  (:require [clojure.spec.alpha :as s])) 

(s/def ::fine (s/or :int int? :nil nil?)
(s/def ::throws (s/or :int (s/int-in 1 5) :zero zero? :nil nil?)

(s/exercise ::fine)
=>
([nil [:nil nil]
 [-1 [:int -1]]
 [nil [:nil nil]]
 [0 [:int 0]]
 [nil [:nil nil]]
 [15 [:int 15]]
 [-25 [:int -25]]
 [nil [:nil nil]]
 [-2 [:int -2]]
 [-30 [:int -30]]])]])

(s/exercise ::throws)
=>
NullPointerException   clojure.lang.Numbers.ops (Numbers.java:1018)

Если выограничьте количество упражнений ::throws, вы видите правильные значения :int и :zero, это бросок :nil.

1 Ответ

0 голосов
/ 07 октября 2018

Это работает:

(s/def ::works (s/or :int (s/int-in 1 5) :nil nil? :zero zero?))

Я предполагаю, что спецификация попытается соответствовать в порядке альтернатив or.Соответствие nil с использованием предиката zero? приведет к сбою, но перемещение nil? перед этим предотвратит это.

Также работает использование набора вместо предиката:

(s/def ::throws (s/or :int (s/int-in 1 5) :zero #{0} :nil nil?))
...