Skip to content

Commit a2e9d83

Browse files
committed
fix: 添加参数检查和单元测试
1 parent 2ce7e35 commit a2e9d83

11 files changed

+223
-2
lines changed

README.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[![Forks](https://img.shields.io/github/forks/mingforpc/timeexpression)]()
55
[![Stars](https://img.shields.io/github/stars/mingforpc/timeexpression)]()
66
[![Forks](https://img.shields.io/github/license/mingforpc/timeexpression)]()
7-
[![Coverage](https://img.shields.io/badge/coverage-93%25-yellowgreen.svg)]()
7+
[![Coverage](https://img.shields.io/badge/coverage-94%25-yellowgreen.svg)]()
88

99
一个时间表达式的工具,方便用于配置活动时间。
1010

@@ -37,7 +37,6 @@ isIn := expr.IsIn(now) // 结果 false
3737

3838
## TODO:
3939

40-
0. 更好的参数检验和检查
4140
1. 语法上支持: `w`开头配置按星期几的方式
4241
2. 语法上支持: `r`开头配置相对开始时间的方式
4342
3. 支持计算周期已经开始了多少次,本次周期是第几次等函数

day_expression.go

+14
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,23 @@ func newDayExpression(expression string) (*dayExpression, error) {
5252
dayExpression.end = dayExpression.start
5353
}
5454

55+
err = dayExpression.check()
56+
if err != nil {
57+
return nil, err
58+
}
59+
5560
return dayExpression, nil
5661
}
5762

63+
// check 检查参数
64+
func (expression *dayExpression) check() error {
65+
if expression.start > expression.end {
66+
return errors.New("day error: start after end")
67+
}
68+
69+
return nil
70+
}
71+
5872
func (expression *dayExpression) isIn(day int) bool {
5973
if expression.start <= day && expression.end >= day {
6074
return true

day_expression_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ func TestNewDayExpression(t *testing.T) {
6464
end: 0,
6565
isAll: false,
6666
},
67+
{
68+
exp: "03-02",
69+
err: errors.New("day error: start after end"),
70+
start: 0,
71+
end: 0,
72+
isAll: false,
73+
},
6774
}
6875

6976
for _, data := range testDatas {

hour_expression.go

+30
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package timeexpression
22

33
import (
44
"errors"
5+
"sort"
56
"strings"
67
)
78

@@ -30,14 +31,43 @@ func newHourExpression(hourStr string) (*hourExpression, error) {
3031
hourUnits = append(hourUnits, unitExpression)
3132
}
3233

34+
// 简单对开始时间排序(从小到大)
35+
sort.Slice(hourUnits, func(i, j int) bool {
36+
return hourUnits[i].start.toSec() < hourUnits[j].start.toSec()
37+
})
38+
3339
expression := &hourExpression{
3440
hourUnits: hourUnits,
3541
isAll: isAll,
3642
}
3743

44+
err := expression.check()
45+
if err != nil {
46+
return nil, err
47+
}
48+
3849
return expression, nil
3950
}
4051

52+
// check 检查参数
53+
func (expression *hourExpression) check() error {
54+
55+
// 时间不能有重叠
56+
// 时间已经被排序过了
57+
var preUnit *hourUnitExpression
58+
for _, unit := range expression.hourUnits {
59+
if preUnit == nil {
60+
preUnit = unit
61+
} else {
62+
if preUnit.end.toSec() >= unit.start.toSec() {
63+
return errors.New("hour error: time overlapping")
64+
}
65+
}
66+
}
67+
68+
return nil
69+
}
70+
4171
func (expression *hourExpression) isIn(hour, minute, sec int) bool {
4272
for _, unitExpression := range expression.hourUnits {
4373
if unitExpression.isIn(hour, minute, sec) {

hour_expression_test.go

+43
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,54 @@
11
package timeexpression
22

33
import (
4+
"errors"
5+
"fmt"
46
"github.com/stretchr/testify/assert"
57
"testing"
68
"time"
79
)
810

11+
func TestHourExpression_new(t *testing.T) {
12+
testDatas := []struct {
13+
exp string
14+
err error
15+
isAll bool
16+
}{
17+
{
18+
exp: "*",
19+
err: nil,
20+
isAll: true,
21+
},
22+
{
23+
exp: "11:00:00-12:00:00,13:00:00-14:00:00",
24+
err: nil,
25+
isAll: false,
26+
},
27+
{
28+
exp: "11:00:00-12:00:00,12:00:00-14:00:00",
29+
err: errors.New("hour error: time overlapping"),
30+
isAll: false,
31+
},
32+
{
33+
exp: "11:00:00-12:00:00,11:30:00-14:00:00",
34+
err: errors.New("hour error: time overlapping"),
35+
isAll: false,
36+
},
37+
}
38+
39+
for i, data := range testDatas {
40+
fmt.Printf("[%d] [%s]\n", i, data.exp)
41+
expression, err := newHourExpression(data.exp)
42+
if data.err != nil {
43+
assert.NotNil(t, err)
44+
assert.EqualError(t, data.err, err.Error())
45+
} else {
46+
assert.NotNil(t, expression)
47+
assert.Equal(t, data.isAll, expression.isAll)
48+
}
49+
}
50+
}
51+
952
func TestHourExpression_IsIn(t *testing.T) {
1053
expression, err := newHourExpression("13:00:03-16:59:59,23:00:00-23:30:00")
1154
if err != nil {

hour_unit_expression.go

+17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package timeexpression
22

33
import (
4+
"errors"
45
"strings"
56
)
67

@@ -52,9 +53,25 @@ func newHourUnitExpression(unitStr string) (*hourUnitExpression, error) {
5253
return nil, err
5354
}
5455

56+
err = expression.check()
57+
if err != nil {
58+
return nil, err
59+
}
60+
5561
return expression, nil
5662
}
5763

64+
// check 检查参数是否正确
65+
func (expression *hourUnitExpression) check() error {
66+
startSec := expression.start.toSec()
67+
endSec := expression.end.toSec()
68+
if startSec >= endSec {
69+
return errors.New("hour error: start after end")
70+
}
71+
72+
return nil
73+
}
74+
5875
// isIn 是否在表达式范围内
5976
func (expression *hourUnitExpression) isIn(hour, minute, sec int) bool {
6077

hour_unit_expression_test.go

+74
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package timeexpression
22

33
import (
4+
"errors"
5+
"fmt"
6+
"github.com/stretchr/testify/assert"
47
"testing"
58
"time"
69
)
@@ -10,6 +13,77 @@ type testData struct {
1013
result bool
1114
}
1215

16+
func TestHourUnitExpression_New(t *testing.T) {
17+
testDatas := []struct {
18+
exp string
19+
err error
20+
start hourUnit
21+
end hourUnit
22+
isAll bool
23+
}{
24+
{
25+
exp: "[13]",
26+
err: ErrHourUnitFormat,
27+
start: hourUnit{},
28+
end: hourUnit{},
29+
isAll: false,
30+
},
31+
{
32+
exp: "*",
33+
err: nil,
34+
start: hourUnit{
35+
Hour: 0,
36+
Minute: 0,
37+
Sec: 0,
38+
},
39+
end: hourUnit{
40+
Hour: 24,
41+
Minute: 0,
42+
Sec: 0,
43+
},
44+
isAll: true,
45+
},
46+
{
47+
exp: "12:00:00-13:00:00",
48+
err: nil,
49+
start: hourUnit{
50+
Hour: 12,
51+
Minute: 0,
52+
Sec: 0,
53+
},
54+
end: hourUnit{
55+
Hour: 13,
56+
Minute: 0,
57+
Sec: 0,
58+
},
59+
isAll: false,
60+
},
61+
{
62+
exp: "13:00:00-12:00:00",
63+
err: errors.New("hour error: start after end"),
64+
start: hourUnit{},
65+
end: hourUnit{},
66+
isAll: false,
67+
},
68+
}
69+
70+
for i, data := range testDatas {
71+
fmt.Printf("[%d] ex[%s]\n", i, data.exp)
72+
73+
expression, err := newHourUnitExpression(data.exp)
74+
if data.err != nil {
75+
assert.NotNil(t, err)
76+
assert.EqualError(t, data.err, err.Error())
77+
} else {
78+
assert.NotNil(t, expression)
79+
assert.Equal(t, data.start, expression.start)
80+
assert.Equal(t, data.end, expression.end)
81+
assert.Equal(t, data.isAll, expression.isAll)
82+
}
83+
84+
}
85+
}
86+
1387
// TestHourUnitExpression_IsIn 判断日期格式
1488
func TestHourUnitExpression_IsIn(t *testing.T) {
1589
expression, err := newHourUnitExpression("13:00:03-16:59:59")

month_expression.go

+13
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,22 @@ func newMonthExpression(expression string) (*monthExpression, error) {
5252
monthExpression.end = monthExpression.start
5353
}
5454

55+
err = monthExpression.check()
56+
if err != nil {
57+
return nil, err
58+
}
59+
5560
return monthExpression, nil
5661
}
5762

63+
func (expression *monthExpression) check() error {
64+
if expression.start > expression.end {
65+
return errors.New("month error: start after end")
66+
}
67+
68+
return nil
69+
}
70+
5871
// isIn 月份是否在周期内
5972
func (expression *monthExpression) isIn(month int) bool {
6073
if expression.start <= month && expression.end >= month {

month_expression_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ func TestNewMonthExpression(t *testing.T) {
5757
Message: "",
5858
},
5959
},
60+
{
61+
expr: "06-03",
62+
err: errors.New("month error: start after end"),
63+
},
6064
}
6165

6266
for _, testData := range testDataList {

year_expression.go

+15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package timeexpression
22

33
import (
4+
"errors"
45
"strings"
56
"time"
67
)
@@ -52,9 +53,23 @@ func newYearExpression(expression string) (*yearExpression, error) {
5253
yearExpression.end = yearExpression.start
5354
}
5455

56+
err = yearExpression.check()
57+
if err != nil {
58+
return nil, err
59+
}
60+
5561
return yearExpression, nil
5662
}
5763

64+
// check 检查参数
65+
func (expression *yearExpression) check() error {
66+
if expression.start > expression.end {
67+
return errors.New("year error: start after end")
68+
}
69+
70+
return nil
71+
}
72+
5873
// isIn 是否在范围内
5974
func (expression *yearExpression) isIn(year int) bool {
6075

year_expression_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package timeexpression
22

33
import (
4+
"errors"
45
"github.com/stretchr/testify/assert"
56
"testing"
67
"time"
@@ -56,6 +57,10 @@ func TestNewYearExpression(t *testing.T) {
5657
Message: "",
5758
},
5859
},
60+
{
61+
exp: "2001-1999",
62+
err: errors.New("year error: start after end"),
63+
},
5964
}
6065

6166
for _, data := range testDatas {

0 commit comments

Comments
 (0)