From 7fa3be056966a3c485f0381546f9d20efcf762cb Mon Sep 17 00:00:00 2001 From: Sam Umbach Date: Mon, 13 Apr 2015 23:34:04 -0400 Subject: [PATCH 1/3] Add failing tests for parsing numbers ending with period, M, or N --- test/valip/test/predicates.clj | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/valip/test/predicates.clj b/test/valip/test/predicates.clj index c38d10f..22023e4 100644 --- a/test/valip/test/predicates.clj +++ b/test/valip/test/predicates.clj @@ -69,6 +69,14 @@ (is (decimal-string? " 8 ")) (is (decimal-string? "1.1")) (is (decimal-string? "3.14159")) + (is (not (decimal-string? "N"))) + (is (not (decimal-string? "M"))) + (is (decimal-string? "3N")) + (is (decimal-string? "3M")) + (is (not (decimal-string? "3.N"))) + (is (decimal-string? "3.M")) + (is (not (decimal-string? "3.14159N"))) + (is (decimal-string? "3.14159M")) (is (not (decimal-string? "foo"))) (is (not (decimal-string? "10x"))) (is (not (decimal-string? "")))) @@ -97,6 +105,32 @@ (is (not ((lte 10) "11"))) (is (not ((lte 10) "")))) +(deftest comparing-bigint-bigdec + (are [input is-lt is-lte is-gte is-gt] + (and (= is-lt (boolean ((lt 10) input))) + (= is-lte (boolean ((lte 10) input))) + (= is-gte (boolean ((gte 10) input))) + (= is-gt (boolean ((gt 10) input)))) + "9" true true false false + "9N" true true false false + "9M" true true false false + "9." true true false false + "9.M" true true false false + "9.99" true true false false + "9.99M" true true false false + "10" false true true false + "10N" false true true false + "10M" false true true false + "10." false true true false + "10.M" false true true false + "10.0" false true true false + "10.0M" false true true false + "10.01" false false true true + "10.01M" false false true true + "11" false false true true + "11N" false false true true + "11M" false false true true)) + (deftest test-over (is (= over gt))) From 30ad80d8a6f372a5682ebdb4fca4d7d2507d897b Mon Sep 17 00:00:00 2001 From: Sam Umbach Date: Mon, 13 Apr 2015 23:41:20 -0400 Subject: [PATCH 2/3] Accept well-formed BigInt and BigDecimal literals --- src/valip/predicates.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/valip/predicates.clj b/src/valip/predicates.clj index fd6ff15..9dec23a 100644 --- a/src/valip/predicates.clj +++ b/src/valip/predicates.clj @@ -49,7 +49,7 @@ Clojure implementations." (defn decimal-string? "Returns true if the string represents a decimal number." [s] - (boolean (re-matches #"\s*[+-]?\d+(\.\d+(M|M|N)?)?\s*" s))) + (boolean (re-matches #"\s*[+-]?\d+(\.\d*M?|M|N)?\s*" s))) (defn digits? "Returns true if a string consists only of numerical digits." @@ -62,7 +62,7 @@ Clojure implementations." (boolean (re-matches #"[A-Za-z0-9]+" s))) (defn- parse-number [x] - (if (and (string? x) (re-matches #"\s*[+-]?\d+(\.\d+M|M|N)?\s*" x)) + (if (and (string? x) (re-matches #"\s*[+-]?\d+(\.\d*M?|M|N)?\s*" x)) (read-string x))) (defn gt From 8af6fd1d688cc62d27b303d68d035f1a39e5366f Mon Sep 17 00:00:00 2001 From: Sam Umbach Date: Mon, 13 Apr 2015 23:45:14 -0400 Subject: [PATCH 3/3] Extract common regular expression to a var --- src/valip/predicates.clj | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/valip/predicates.clj b/src/valip/predicates.clj index 9dec23a..3380293 100644 --- a/src/valip/predicates.clj +++ b/src/valip/predicates.clj @@ -6,6 +6,8 @@ Clojure implementations." [cljs.reader :refer [read-string]]) (:refer-clojure :exclude [read-string])) +(def ^:private number-re #"\s*[+-]?\d+(\.\d*M?|M|N)?\s*") + (defn present? "Returns false if x is nil or blank, true otherwise." [x] @@ -49,7 +51,7 @@ Clojure implementations." (defn decimal-string? "Returns true if the string represents a decimal number." [s] - (boolean (re-matches #"\s*[+-]?\d+(\.\d*M?|M|N)?\s*" s))) + (boolean (re-matches number-re s))) (defn digits? "Returns true if a string consists only of numerical digits." @@ -62,7 +64,7 @@ Clojure implementations." (boolean (re-matches #"[A-Za-z0-9]+" s))) (defn- parse-number [x] - (if (and (string? x) (re-matches #"\s*[+-]?\d+(\.\d*M?|M|N)?\s*" x)) + (if (and (string? x) (re-matches number-re x)) (read-string x))) (defn gt