diff --git a/src/humidity/core.clj b/src/humidity/core.clj index 4a8c768..3bd4857 100644 --- a/src/humidity/core.clj +++ b/src/humidity/core.clj @@ -39,7 +39,6 @@ relative-humidity saturation-vapour-pressure temperature temperature-celsius temperature-kelvin volume wet-bulb-temperature-celsius] :as packet}] - (println packet) (if temperature (resolve-humidity (assoc (dissoc packet :temperature) :temperature-celsius temperature)) @@ -61,9 +60,10 @@ (relative-humidity-fn packet)) :saturation-vapour-pressure (when-not saturation-vapour-pressure (saturation-vapour-pressure-fn packet)) - :temperature-celsius (when - (and temperature-kelvin - (not temperature-celsius)) + :temperature-celsius (cond + temperature temperature + (and temperature-kelvin + (not temperature-celsius)) (- temperature-kelvin celsius-offset)) :temperature-kelvin (when (and temperature-celsius @@ -81,3 +81,45 @@ (let [p' (resolve-humidity p)] (if (= (keys p) (keys p')) p (recur p'))))) + +(defn validation-error + [key limit a b] + (let [m (max a b) + error (abs (float (/ (compare a b) (if (zero? m) 0.000001 m) (/ limit 100))))] + (if (> error limit) + (do + (println (format "ERROR: key: %s; a: %s; b %s; errror: %s%%." key a b error)) + false) + true))) + +(def ^:dynamic + *validation-limit* + "Percentage limit for discrepancies in values during validation." + 1) + +(defn validate + "Validate a packet by recalculating each value. Discrepancies within + `*validation-limit*`% will be ignored." + [& {:keys [pressure-millibars pressure-pascals temperature-celsius + temperature-kelvin] :as packet}] + (let [v (?assoc (into (sorted-map) packet) + :absolute-humidity (absolute-humidity-fn packet) + :actual-vapour-pressure (actual-vapour-pressure-fn packet) + :dew-point-celsius (dew-point-celsius-fn packet) + :pressure-pascals (if pressure-millibars + (* pressure-millibars 100) Pa) + :pressure-millibars (if pressure-pascals + (float (/ pressure-pascals 100)) + (float (/ Pa 100))) + :relative-humidity (relative-humidity-fn packet) + :saturation-vapour-pressure + (saturation-vapour-pressure-fn packet) + :temperature-celsius (- temperature-kelvin celsius-offset) + :temperature-kelvin (+ temperature-celsius celsius-offset) + :volume (volume-fn packet) + :wet-bulb-temperature-celsius + (wet-bulb-temperature-celsius-fn packet))] + (empty? + (remove true? + (map #(validation-error % *validation-limit* (packet %) (v %)) + (keys packet)))))) \ No newline at end of file diff --git a/test/humidity/core_test.clj b/test/humidity/core_test.clj index ca007fe..fca45ee 100644 --- a/test/humidity/core_test.clj +++ b/test/humidity/core_test.clj @@ -1,7 +1,7 @@ (ns humidity.core-test (:require [clojure.test :refer [deftest is testing]] - [humidity.core :refer [resolution]])) + [humidity.core :refer [resolution validate]])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; @@ -40,3 +40,32 @@ packet {:relative-humidity 100 :temperature-celsius 35} actual (resolution packet)] (is (= actual expected)))) + +(deftest validation-test + (testing "validation" + (let [expected true + actual (validate {:absolute-humidity 3953.618101887827, + :actual-vapour-pressure 4765.10094206357, + :dew-point-celsius 35.00000000000001, + :pressure-millibars 1013.25, + :pressure-pascals 101325, + :relative-humidity 100, + :saturation-vapour-pressure 5622.488734516426, + :temperature-celsius 35, + :temperature-kelvin 308.15, + :volume 1.1281347245103424, + :wet-bulb-temperature-celsius 35.11625928298915})] + (is (= actual expected))) + (let [expected false + actual (validate {:absolute-humidity 3953.618101887827, + :actual-vapour-pressure 4765.10094206357, + :dew-point-celsius 35.00000000000001, + :pressure-millibars 1013.25, + :pressure-pascals 101325, + :relative-humidity 95, ;; <-- deliberately wrong + :saturation-vapour-pressure 5622.488734516426, + :temperature-celsius 35, + :temperature-kelvin 308.15, + :volume 1.1281347245103424, + :wet-bulb-temperature-celsius 35.11625928298915})] + (is (= actual expected))))) \ No newline at end of file diff --git a/test/humidity/dew_point_test.clj b/test/humidity/dew_point_test.clj index 95f5a76..099c2a2 100644 --- a/test/humidity/dew_point_test.clj +++ b/test/humidity/dew_point_test.clj @@ -1,6 +1,5 @@ (ns humidity.dew-point-test (:require [clojure.test :refer [deftest is testing]] - [humidity.constants :refer [celsius-offset]] [humidity.dew-point-celsius :refer [dew-point-celsius-fn]])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; diff --git a/test/humidity/relative_test.clj b/test/humidity/relative_test.clj index fbf5acd..5794aee 100644 --- a/test/humidity/relative_test.clj +++ b/test/humidity/relative_test.clj @@ -1,7 +1,7 @@ (ns humidity.relative-test (:require [clojure.test :refer [deftest is testing]] [humidity.constants :refer [celsius-offset]] - [humidity.relative-humidity :refer [relative-humidity-fn relative-humidity-fn]])) + [humidity.relative-humidity :refer [relative-humidity-fn]])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;