Add tests for vector/_first

These turned up an oversight in the implementation in `vector/_first` that is addressed in the next commit.
This commit is contained in:
Nic McPhee 2020-12-17 18:42:57 -06:00
parent b3d9d89f4c
commit f2eecc774f

View File

@ -6,6 +6,8 @@
[propeller.push.state :as state] [propeller.push.state :as state]
[propeller.push.instructions.vector :as vector])) [propeller.push.instructions.vector :as vector]))
;;; vector/_emptyvector
(defn check-empty-vector (defn check-empty-vector
[generator value-type] [generator value-type]
(let [stack-type (keyword (str "vector_" value-type))] (let [stack-type (keyword (str "vector_" value-type))]
@ -28,6 +30,38 @@
(empty-vector-spec gen/boolean "boolean") (empty-vector-spec gen/boolean "boolean")
(empty-vector-spec gen/string "string") (empty-vector-spec gen/string "string")
;;; vector/_first
(defn check-first
[generator value-type]
(let [stack-type (keyword (str "vector_" value-type))]
(prop/for-all [vect (gen/vector generator)]
(let [start-state (state/push-to-stack state/empty-state
stack-type
vect)
end-state (vector/_first stack-type start-state)]
(or
(and (empty? vect)
(= (state/peek-stack end-state stack-type)
vect))
(and
(= (first vect)
(state/peek-stack end-state (keyword value-type)))
(state/empty-stack? end-state stack-type)))))))
(defmacro first-spec
[generator value-type]
`(defspec ~(symbol (str "first-spec-" value-type))
100
(check-first ~generator ~value-type)))
(first-spec gen/small-integer "integer")
(first-spec gen/double "float")
(first-spec gen/boolean "boolean")
(first-spec gen/string "string")
;;; vector/_indexof
(defn check-expected-index (defn check-expected-index
"Creates an otherwise empty Push state with the given vector on the "Creates an otherwise empty Push state with the given vector on the
appropriate vector stack (assumed to be :vector_<value-type>), and appropriate vector stack (assumed to be :vector_<value-type>), and
@ -68,6 +102,8 @@
(indexof-spec gen/boolean "boolean") (indexof-spec gen/boolean "boolean")
(indexof-spec gen/string "string") (indexof-spec gen/string "string")
;;; vector/_subvec
(defn clean-subvec-bounds (defn clean-subvec-bounds
[start stop vect-size] [start stop vect-size]
(let [start (max 0 start) (let [start (max 0 start)