@@ -2,6 +2,7 @@ package gronx
2
2
3
3
import (
4
4
"fmt"
5
+ "strings"
5
6
"testing"
6
7
"time"
7
8
)
@@ -73,32 +74,96 @@ func TestNextTickAfter(t *testing.T) {
73
74
})
74
75
}
75
76
76
- // https://github.com/adhocore/gronx/issues/51
77
- func TestIsUnreachableYearCurrentYear (t * testing.T ) {
77
+ func TestIsUnreachableYearPrevTickBefore (t * testing.T ) {
78
78
now := time .Date (2024 , time .November , 8 , 22 , 18 , 16 , 0 , time .UTC )
79
+ tests := []struct {
80
+ name string
81
+ cronExpr string
82
+ expectedTime time.Time
83
+ expectError bool
84
+ }{
85
+ {
86
+ // https://github.com/adhocore/gronx/issues/51
87
+ name : "Current Year - Previous Tick" ,
88
+ cronExpr : "30 15 4 11 * 2024" ,
89
+ expectedTime : time .Date (2024 , time .November , 4 , 15 , 30 , 0 , 0 , time .UTC ),
90
+ expectError : false ,
91
+ },
92
+ {
93
+ name : "Next Year - Previous Tick (Unreachable Year)" ,
94
+ cronExpr : "30 15 4 11 * 2025" ,
95
+ expectedTime : time.Time {}, // Error expected
96
+ expectError : true ,
97
+ },
98
+ {
99
+ name : "Previous Year - Previous Tick" ,
100
+ cronExpr : "30 15 4 11 * 2023" ,
101
+ expectedTime : time .Date (2023 , time .November , 4 , 15 , 30 , 0 , 0 , time .UTC ),
102
+ expectError : false ,
103
+ },
104
+ }
79
105
80
- cronExpr := "30 15 4 11 * 2024"
81
- expectedTime := time .Date (2024 , time .November , 4 , 15 , 30 , 0 , 0 , time .UTC )
82
- actualTime , err := PrevTickBefore (cronExpr , now , true )
83
-
84
- if err != nil {
85
- t .Errorf ("got unexpected error: %s" , err )
86
- } else if ! actualTime .Equal (expectedTime ) {
87
- t .Errorf ("expected previous tick to be %v, got %v" , expectedTime , actualTime )
106
+ for _ , tc := range tests {
107
+ t .Run (tc .name , func (t * testing.T ) {
108
+ actualTime , err := PrevTickBefore (tc .cronExpr , now , true )
109
+ if tc .expectError {
110
+ if err == nil || ! strings .Contains (err .Error (), "unreachable year segment" ) {
111
+ t .Errorf ("expected unreachable year error, got: %v" , err )
112
+ }
113
+ } else {
114
+ if err != nil {
115
+ t .Errorf ("unexpected error: %v" , err )
116
+ } else if ! actualTime .Equal (tc .expectedTime ) {
117
+ t .Errorf ("expected previous tick to be %v, got %v" , tc .expectedTime , actualTime )
118
+ }
119
+ }
120
+ })
88
121
}
89
122
}
90
123
91
- // https://github.com/adhocore/gronx/issues/53
92
- func TestIsUnreachableYearCurrentYearReverse (t * testing.T ) {
124
+ func TestIsUnreachableYearNextTickAfter (t * testing.T ) {
93
125
now := time .Date (2024 , time .November , 8 , 22 , 18 , 16 , 0 , time .UTC )
126
+ tests := []struct {
127
+ name string
128
+ cronExpr string
129
+ expectedTime time.Time
130
+ expectError bool
131
+ }{
132
+ {
133
+ // https://github.com/adhocore/gronx/issues/53
134
+ name : "Current Year - Next Tick" ,
135
+ cronExpr : "30 15 31 12 * 2024" ,
136
+ expectedTime : time .Date (2024 , time .December , 31 , 15 , 30 , 0 , 0 , time .UTC ),
137
+ expectError : false ,
138
+ },
139
+ {
140
+ name : "Next Year - Next Tick" ,
141
+ cronExpr : "30 15 31 12 * 2025" ,
142
+ expectedTime : time .Date (2025 , time .December , 31 , 15 , 30 , 0 , 0 , time .UTC ),
143
+ expectError : false ,
144
+ },
145
+ {
146
+ name : "Previous Year - Next Tick (Unreachable Year)" ,
147
+ cronExpr : "30 15 31 12 * 2023" ,
148
+ expectedTime : time.Time {}, // Error expected
149
+ expectError : true ,
150
+ },
151
+ }
94
152
95
- cronExpr := "30 15 31 12 * 2024"
96
- expectedTime := time .Date (2024 , time .December , 31 , 15 , 30 , 0 , 0 , time .UTC )
97
- actualTime , err := NextTickAfter (cronExpr , now , false )
98
-
99
- if err != nil {
100
- t .Errorf ("got unexpected error: %s" , err )
101
- } else if ! actualTime .Equal (expectedTime ) {
102
- t .Errorf ("expected previous tick to be %v, got %v" , expectedTime , actualTime )
153
+ for _ , tc := range tests {
154
+ t .Run (tc .name , func (t * testing.T ) {
155
+ actualTime , err := NextTickAfter (tc .cronExpr , now , false )
156
+ if tc .expectError {
157
+ if err == nil || ! strings .Contains (err .Error (), "unreachable year segment" ) {
158
+ t .Errorf ("expected unreachable year error, got: %v" , err )
159
+ }
160
+ } else {
161
+ if err != nil {
162
+ t .Errorf ("unexpected error: %v" , err )
163
+ } else if ! actualTime .Equal (tc .expectedTime ) {
164
+ t .Errorf ("expected next tick to be %v, got %v" , tc .expectedTime , actualTime )
165
+ }
166
+ }
167
+ })
103
168
}
104
169
}
0 commit comments