2022-02-13 01:48:07 +08:00
|
|
|
// Copyright 2022 Kentaro Hibino. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
|
|
|
|
2021-12-10 22:47:16 +08:00
|
|
|
// Package timeutil exports functions and types related to time and date.
|
|
|
|
package timeutil
|
|
|
|
|
|
|
|
import "time"
|
|
|
|
|
|
|
|
// A Clock is an object that can tell you the current time.
|
|
|
|
//
|
|
|
|
// This interface allows decoupling code that uses time from the code that creates
|
|
|
|
// a point in time. You can use this to your advantage by injecting Clocks into interfaces
|
|
|
|
// rather than having implementations call time.Now() directly.
|
|
|
|
//
|
|
|
|
// Use RealClock() in production.
|
|
|
|
// Use SimulatedClock() in test.
|
|
|
|
type Clock interface {
|
|
|
|
Now() time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewRealClock() Clock { return &realTimeClock{} }
|
|
|
|
|
|
|
|
type realTimeClock struct{}
|
|
|
|
|
|
|
|
func (_ *realTimeClock) Now() time.Time { return time.Now() }
|
|
|
|
|
|
|
|
// A SimulatedClock is a concrete Clock implementation that doesn't "tick" on its own.
|
|
|
|
// Time is advanced by explicit call to the AdvanceTime() or SetTime() functions.
|
|
|
|
type SimulatedClock struct {
|
|
|
|
t time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewSimulatedClock(t time.Time) *SimulatedClock {
|
|
|
|
return &SimulatedClock{t}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *SimulatedClock) Now() time.Time { return c.t }
|
|
|
|
|
|
|
|
func (c *SimulatedClock) SetTime(t time.Time) { c.t = t }
|
|
|
|
|
2022-02-13 01:48:07 +08:00
|
|
|
func (c *SimulatedClock) AdvanceTime(d time.Duration) { c.t = c.t.Add(d) }
|