|
| 1 | +(ns java-time.mock |
| 2 | + (:require [java-time |
| 3 | + [core :as core] |
| 4 | + [temporal :as temporal] |
| 5 | + [zone :as zone]]) |
| 6 | + (:import (java.time Clock))) |
| 7 | + |
| 8 | +(definterface IMockClock |
| 9 | + (^void advanceClock [amount])) |
| 10 | + |
| 11 | +(defn ^Clock mock-clock |
| 12 | + "Returns a mock implementation of the `java.time.Clock`. The mock supports |
| 13 | + `advance-clock!` operation which allows to move the time in the clock, e.g.: |
| 14 | +
|
| 15 | + (let [clock (mock-clock 0 \"UTC\")] |
| 16 | + (with-clock clock |
| 17 | + (is (= (value clock) 0)) |
| 18 | + (is (= (instant) (instant 0))) |
| 19 | + (advance-clock! clock (j/millis 1)) |
| 20 | + (is (= (value clock) 1)) |
| 21 | + (is (= (instant) (instant 1))))) |
| 22 | +
|
| 23 | + You can move the clock back via advancing by a negative temporal amount. |
| 24 | +
|
| 25 | + Creates a clock at epoch in the default timezone when called without arguments." |
| 26 | + ([] (mock-clock 0)) |
| 27 | + ([instant] (mock-clock instant (zone/zone-id))) |
| 28 | + ([instant zone] |
| 29 | + (let [!instant (atom (temporal/instant instant)) |
| 30 | + zone (zone/zone-id zone)] |
| 31 | + (proxy [Clock IMockClock] [] |
| 32 | + (advanceClock [amount] |
| 33 | + (swap! !instant core/plus amount) |
| 34 | + nil) |
| 35 | + |
| 36 | + (getZone [] zone) |
| 37 | + (withZone [zone'] |
| 38 | + (mock-clock @!instant zone')) |
| 39 | + (instant [] @!instant) |
| 40 | + |
| 41 | + (equals [other] |
| 42 | + (if (and (instance? IMockClock other) (zone/clock? other)) |
| 43 | + (let [^Clock clock other] |
| 44 | + (and (= zone (.getZone clock)) |
| 45 | + (= @!instant (.instant clock)))) |
| 46 | + false)) |
| 47 | + (hashCode [] |
| 48 | + (bit-xor (hash @!instant) (hash zone))) |
| 49 | + (toString [] |
| 50 | + (str "MockClock[" @!instant "," zone "]")))))) |
| 51 | + |
| 52 | +(defn advance-clock! |
| 53 | + "Advances the `clock` by the given time `amount`. |
| 54 | +
|
| 55 | + This mutates the mock clock." |
| 56 | + [^IMockClock clock amount] |
| 57 | + (.advanceClock clock amount)) |
0 commit comments