Filling the biggest untested clojure.core areas found in a coverage audit (168 of 506 provided fns had no spec). New + expanded suites: - regex-spec.janet (20): #"…" literals, regex?, re-find/re-matches/re-seq (match/no-match/groups), re-pattern, and clojure.string split/replace with regex (incl $1 backrefs). Whole area was previously unspecced. - sorted-spec.janet (14): sorted-map/sorted-set construction + ordering, sorted?, subseq/rsubseq. Pins the working subset — get/conj/assoc/keys/vals on sorted colls and the by-comparator ctors are not yet first-class (jolt-ti9). - predicates-spec +14: seqable?, integer?, reduced?/unreduced, not-empty. - numbers-spec +5: rand/rand-int/rand-nth invariants. Fix: sorted? was bound to core-sorted-map? so it returned false for sorted-sets; now true for both sorted maps and sets (core-sorted?). Filed: jolt-ti9 (sorted collections incomplete: get/conj/assoc/keys/vals don't operate on the sorted wrapper; sorted-*-by ignore the comparator). Gate green incl full jpm build + jpm test.
33 lines
1.8 KiB
Text
33 lines
1.8 KiB
Text
# Specification: regular expressions — #"…" literals and the re-* fns.
|
|
# (Whole area previously unspecced; some cases adapted from jank reader-macro/regex.)
|
|
(use ../support/harness)
|
|
|
|
(defspec "regex / literals & predicate"
|
|
["regex? literal" "true" "(regex? #\"\\d+\")"]
|
|
["regex? non-regex" "false" "(regex? \"\\d+\")"]
|
|
["escaped digits" "\"42\"" "(re-find #\"\\d+\" \"x42y\")"]
|
|
["escaped ws/non-ws" "\"x a\"" "(re-find #\"\\S\\s\\S\" \"x a b y\")"])
|
|
|
|
(defspec "regex / re-find"
|
|
["match" "\"123\"" "(re-find #\"\\d+\" \"abc123def\")"]
|
|
["no match nil" "nil" "(re-find #\"\\d+\" \"abc\")"]
|
|
["with groups" "[\"a1\" \"a\" \"1\"]" "(re-find #\"([a-z])(\\d)\" \"--a1--\")"]
|
|
["first match only" "\"1\"" "(re-find #\"\\d\" \"1 2 3\")"])
|
|
|
|
(defspec "regex / re-matches"
|
|
["full match" "\"123\"" "(re-matches #\"\\d+\" \"123\")"]
|
|
["partial = nil" "nil" "(re-matches #\"\\d+\" \"123abc\")"]
|
|
["groups" "[\"12\" \"1\" \"2\"]" "(re-matches #\"(\\d)(\\d)\" \"12\")"]
|
|
["no match nil" "nil" "(re-matches #\"x+\" \"yyy\")"])
|
|
|
|
(defspec "regex / re-seq"
|
|
["all matches" "(quote (\"1\" \"22\" \"333\"))" "(re-seq #\"\\d+\" \"a1b22c333\")"]
|
|
["empty when none" "nil" "(seq (re-seq #\"z\" \"abc\"))"]
|
|
["words" "(quote (\"foo\" \"bar\"))" "(re-seq #\"\\w+\" \"foo bar\")"])
|
|
|
|
(defspec "regex / re-pattern & string ops"
|
|
["re-pattern build" "\"hi\"" "(re-find (re-pattern \"\\\\w+\") \"hi!\")"]
|
|
["re-pattern is regex?" "true" "(regex? (re-pattern \"a\"))"]
|
|
["split on regex" "[\"a\" \"b\" \"c\"]" "(do (require '[clojure.string :as s]) (s/split \"a1b2c\" #\"\\d\"))"]
|
|
["replace regex" "\"X-X\"" "(do (require '[clojure.string :as s]) (s/replace \"a-b\" #\"[a-z]\" \"X\"))"]
|
|
["replace $1" "\"[a][b]\"" "(do (require '[clojure.string :as s]) (s/replace \"ab\" #\"([a-z])\" \"[$1]\"))"])
|