35 lines
1.1 KiB
Clojure
35 lines
1.1 KiB
Clojure
|
|
(ns clojure.data.json-gen-test
|
||
|
|
(:require [clojure.data.json :as json]
|
||
|
|
[clojure.spec.alpha :as s]
|
||
|
|
[clojure.spec.gen.alpha :as sgen]
|
||
|
|
[clojure.spec.test.alpha :as stest]
|
||
|
|
[clojure.test :refer :all]))
|
||
|
|
|
||
|
|
(s/def ::json-number
|
||
|
|
(s/with-gen
|
||
|
|
number?
|
||
|
|
#(sgen/one-of [(sgen/large-integer) (sgen/double* {:infinite? false :NaN? false})])))
|
||
|
|
|
||
|
|
(s/def ::json-scalar (s/or :boolean boolean?
|
||
|
|
:number ::json-number
|
||
|
|
:string string?
|
||
|
|
:nil nil?))
|
||
|
|
|
||
|
|
(s/def ::json-value (s/or :object ::json-object
|
||
|
|
:array ::json-array
|
||
|
|
:scalar ::json-scalar))
|
||
|
|
|
||
|
|
(s/def ::json-array (s/coll-of ::json-value :gen-max 12))
|
||
|
|
(s/def ::json-object (s/map-of string? ::json-value
|
||
|
|
:gen-max 10))
|
||
|
|
|
||
|
|
(s/fdef json/write-str
|
||
|
|
:args (s/cat :json ::json-value)
|
||
|
|
:ret string?
|
||
|
|
:fn #(= (->> % :args :json (s/unform ::json-value))
|
||
|
|
(json/read-str (-> % :ret))))
|
||
|
|
|
||
|
|
(deftest roundtrip
|
||
|
|
(let [results (stest/check `json/write-str)]
|
||
|
|
(is (every? nil? (mapv :failure results)))))
|