Skip to content

Commit 4ac48ac

Browse files
authored
Merge pull request #168 from hpidcock/time-checkers
Added time checkers After, Before and Almost
2 parents dc6a1ef + 73894f1 commit 4ac48ac

2 files changed

Lines changed: 128 additions & 0 deletions

File tree

checkers/time.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright 2022 Canonical Ltd.
2+
// Licensed under the LGPLv3, see LICENCE file for details.
3+
4+
package checkers
5+
6+
import (
7+
"fmt"
8+
"math"
9+
"reflect"
10+
"time"
11+
12+
gc "gopkg.in/check.v1"
13+
)
14+
15+
type timeCompareChecker struct {
16+
*gc.CheckerInfo
17+
compareFunc func(time.Time, time.Time) bool
18+
}
19+
20+
// After checks whether the obtained time.Time is After the want time.Time.
21+
var After gc.Checker = &timeCompareChecker{
22+
CheckerInfo: &gc.CheckerInfo{Name: "After", Params: []string{"obtained", "want"}},
23+
compareFunc: func(t1, t2 time.Time) bool {
24+
return t1.After(t2)
25+
},
26+
}
27+
28+
// Before checks whether the obtained time.Time is Before the want time.Time.
29+
var Before gc.Checker = &timeCompareChecker{
30+
CheckerInfo: &gc.CheckerInfo{Name: "Before", Params: []string{"obtained", "want"}},
31+
compareFunc: func(t1, t2 time.Time) bool {
32+
return t1.Before(t2)
33+
},
34+
}
35+
36+
// Almost checks whether the obtained time.Time is within 1s of the want time.Time.
37+
var Almost gc.Checker = &timeCompareChecker{
38+
CheckerInfo: &gc.CheckerInfo{Name: "Almost", Params: []string{"obtained", "want"}},
39+
compareFunc: func(t1, t2 time.Time) bool {
40+
return math.Abs(t1.Sub(t2).Seconds()) <= 1.0
41+
},
42+
}
43+
44+
func (checker *timeCompareChecker) Check(params []interface{}, names []string) (result bool, error string) {
45+
if len(params) != 2 {
46+
return false, fmt.Sprintf("expected 2 parameters, received %d", len(params))
47+
}
48+
t1, ok := params[0].(time.Time)
49+
if !ok {
50+
return false, fmt.Sprintf("obtained param: expected type time.Time, received type %s", reflect.ValueOf(params[0]).Type())
51+
}
52+
t2, ok := params[1].(time.Time)
53+
if !ok {
54+
return false, fmt.Sprintf("want param: expected type time.Time, received type %s", reflect.ValueOf(params[1]).Type())
55+
}
56+
return checker.compareFunc(t1, t2), ""
57+
}

checkers/time_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright 2022 Canonical Ltd.
2+
// Licensed under the LGPLv3, see LICENCE file for details.
3+
4+
package checkers_test
5+
6+
import (
7+
"time"
8+
9+
gc "gopkg.in/check.v1"
10+
11+
jc "github.com/juju/testing/checkers"
12+
)
13+
14+
type TimeSuite struct{}
15+
16+
var _ = gc.Suite(&TimeSuite{})
17+
18+
func (s *TimeSuite) TestBefore(c *gc.C) {
19+
now := time.Now()
20+
c.Assert(now, jc.Before, now.Add(time.Second))
21+
c.Assert(now, gc.Not(jc.Before), now.Add(-time.Second))
22+
23+
result, msg := jc.Before.Check([]interface{}{time.Time{}}, nil)
24+
c.Assert(result, gc.Equals, false)
25+
c.Check(msg, gc.Equals, `expected 2 parameters, received 1`)
26+
27+
result, msg = jc.Before.Check([]interface{}{42, time.Time{}}, nil)
28+
c.Assert(result, gc.Equals, false)
29+
c.Assert(msg, gc.Equals, `obtained param: expected type time.Time, received type int`)
30+
31+
result, msg = jc.Before.Check([]interface{}{time.Time{}, "wow"}, nil)
32+
c.Assert(result, gc.Equals, false)
33+
c.Assert(msg, gc.Matches, `want param: expected type time.Time, received type string`)
34+
}
35+
36+
func (s *TimeSuite) TestAfter(c *gc.C) {
37+
now := time.Now()
38+
c.Assert(now, gc.Not(jc.After), now.Add(time.Second))
39+
c.Assert(now, jc.After, now.Add(-time.Second))
40+
41+
result, msg := jc.After.Check([]interface{}{time.Time{}}, nil)
42+
c.Assert(result, gc.Equals, false)
43+
c.Check(msg, gc.Equals, `expected 2 parameters, received 1`)
44+
45+
result, msg = jc.After.Check([]interface{}{42, time.Time{}}, nil)
46+
c.Assert(result, gc.Equals, false)
47+
c.Assert(msg, gc.Equals, `obtained param: expected type time.Time, received type int`)
48+
49+
result, msg = jc.After.Check([]interface{}{time.Time{}, "wow"}, nil)
50+
c.Assert(result, gc.Equals, false)
51+
c.Assert(msg, gc.Matches, `want param: expected type time.Time, received type string`)
52+
}
53+
54+
func (s *TimeSuite) TestAlmost(c *gc.C) {
55+
now := time.Now()
56+
c.Assert(now, gc.Not(jc.Almost), now.Add(1001*time.Millisecond))
57+
c.Assert(now, jc.Almost, now.Add(-time.Second))
58+
c.Assert(now, jc.Almost, now.Add(time.Second))
59+
60+
result, msg := jc.Almost.Check([]interface{}{time.Time{}}, nil)
61+
c.Assert(result, gc.Equals, false)
62+
c.Check(msg, gc.Equals, `expected 2 parameters, received 1`)
63+
64+
result, msg = jc.Almost.Check([]interface{}{42, time.Time{}}, nil)
65+
c.Assert(result, gc.Equals, false)
66+
c.Assert(msg, gc.Equals, `obtained param: expected type time.Time, received type int`)
67+
68+
result, msg = jc.Almost.Check([]interface{}{time.Time{}, "wow"}, nil)
69+
c.Assert(result, gc.Equals, false)
70+
c.Assert(msg, gc.Matches, `want param: expected type time.Time, received type string`)
71+
}

0 commit comments

Comments
 (0)