@@ -2,27 +2,33 @@ package klog
22
33import (
44 "github.com/stretchr/testify/assert"
5+ "github.com/stretchr/testify/require"
56 "testing"
67)
78
89func TestSerialiseDurationOnlyWithMeaningfulValues (t * testing.T ) {
910 assert .Equal (t , "0m" , NewDuration (0 , 0 ).ToString ())
1011 assert .Equal (t , "1m" , NewDuration (0 , 1 ).ToString ())
12+ assert .Equal (t , "34m" , NewDuration (0 , 34 ).ToString ())
13+ assert .Equal (t , "59m" , NewDuration (0 , 59 ).ToString ())
14+ assert .Equal (t , "1h" , NewDuration (1 , 0 ).ToString ())
1115 assert .Equal (t , "15h" , NewDuration (15 , 0 ).ToString ())
12- }
13-
14- func TestSerialiseDurationOfLargeHourValues (t * testing.T ) {
16+ assert .Equal (t , "15h3m" , NewDuration (15 , 3 ).ToString ())
1517 assert .Equal (t , "265h45m" , NewDuration (265 , 45 ).ToString ())
18+ assert .Equal (t , "4716278h48m" , NewDuration (4716278 , 48 ).ToString ())
19+ assert .Equal (t , "153722867280912930h7m" , NewDuration (0 , 9223372036854775807 ).ToString ())
1620}
1721
1822func TestSerialiseDurationWithoutLeadingZeros (t * testing.T ) {
1923 assert .Equal (t , "2h6m" , NewDuration (2 , 6 ).ToString ())
2024}
2125
2226func TestSerialiseDurationOfNegativeValues (t * testing.T ) {
27+ assert .Equal (t , "-2h4m" , NewDuration (- 2 , - 4 ).ToString ())
2328 assert .Equal (t , "-3h18m" , NewDuration (- 3 , - 18 ).ToString ())
24- assert .Equal (t , "-3h " , NewDuration (- 3 , 0 ).ToString ())
29+ assert .Equal (t , "-812747h " , NewDuration (- 812747 , 0 ).ToString ())
2530 assert .Equal (t , "-18m" , NewDuration (0 , - 18 ).ToString ())
31+ assert .Equal (t , "-153722867280912930h7m" , NewDuration (0 , - 9223372036854775807 ).ToString ())
2632}
2733
2834func TestSerialiseDurationWithSign (t * testing.T ) {
@@ -70,13 +76,19 @@ func TestParsingDurationWithHoursAndMinutes(t *testing.T) {
7076}
7177
7278func TestParsingDurationWithHourValueOnly (t * testing.T ) {
73- for _ , d := range []string {
74- "13h" ,
75- "13h0m" ,
79+ for _ , d := range []struct {
80+ text string
81+ expect Duration
82+ }{
83+ {"0h" , NewDuration (0 , 0 )},
84+ {"1h" , NewDuration (1 , 0 )},
85+ {"13h" , NewDuration (13 , 0 )},
86+ {"9882187612h" , NewDuration (9882187612 , 0 )},
87+ {"13h0m" , NewDuration (13 , 0 )},
7688 } {
77- duration , err := NewDurationFromString (d )
89+ duration , err := NewDurationFromString (d . text )
7890 assert .Nil (t , err )
79- assert .Equal (t , NewDuration ( 13 , 0 ) , duration )
91+ assert .Equal (t , d . expect , duration )
8092 }
8193}
8294
@@ -85,12 +97,16 @@ func TestParsingDurationWithMinuteValueOnly(t *testing.T) {
8597 text string
8698 expect Duration
8799 }{
100+ {"1m" , NewDuration (0 , 1 )},
88101 {"48m" , NewDuration (0 , 48 )},
102+ {"59m" , NewDuration (0 , 59 )},
103+
89104 {"0h48m" , NewDuration (0 , 48 )},
90105
91106 // Minutes >60 are okay if there is no hour part present
107+ {"60m" , NewDuration (1 , 0 )},
92108 {"120m" , NewDuration (2 , 0 )},
93- {"150m " , NewDuration (2 , 30 )},
109+ {"568721940327m " , NewDuration (0 , 568721940327 )},
94110 } {
95111 duration , err := NewDurationFromString (d .text )
96112 assert .Nil (t , err )
@@ -131,7 +147,7 @@ func TestParsingFailsWithInvalidValue(t *testing.T) {
131147 "6h asdf" ,
132148 "qwer 30m" ,
133149 "⠙⠛m" , // Braille digits
134- "四二h" , // Japanese digits
150+ "四二h" , // Japanese digits
135151 "᠒h᠐᠒m" , // Mongolean digits
136152 } {
137153 duration , err := NewDurationFromString (d )
@@ -143,6 +159,7 @@ func TestParsingFailsWithInvalidValue(t *testing.T) {
143159func TestParsingFailsWithMinutesGreaterThan60WhenHourPartPresent (t * testing.T ) {
144160 for _ , d := range []string {
145161 "1h60m" ,
162+ "0h60m" ,
146163 "8h1653m" ,
147164 "-8h1653m" ,
148165 } {
@@ -151,3 +168,72 @@ func TestParsingFailsWithMinutesGreaterThan60WhenHourPartPresent(t *testing.T) {
151168 assert .Equal (t , nil , duration )
152169 }
153170}
171+
172+ func TestParsingDurationWithMaxValue (t * testing.T ) {
173+ t .Run ("max" , func (t * testing.T ) {
174+ d , err := NewDurationFromString ("9223372036854775807m" )
175+ require .Nil (t , err )
176+ assert .Equal (t , NewDuration (0 , 9223372036854775807 ), d )
177+ })
178+ t .Run ("max" , func (t * testing.T ) {
179+ d , err := NewDurationFromString ("153722867280912930h7m" )
180+ require .Nil (t , err )
181+ assert .Equal (t , NewDuration (153722867280912930 , 7 ), d )
182+ })
183+ t .Run ("min" , func (t * testing.T ) {
184+ d , err := NewDurationFromString ("-9223372036854775807m" )
185+ require .Nil (t , err )
186+ assert .Equal (t , NewDuration (0 , - 9223372036854775807 ), d )
187+ })
188+ t .Run ("max" , func (t * testing.T ) {
189+ d , err := NewDurationFromString ("-153722867280912930h7m" )
190+ require .Nil (t , err )
191+ assert .Equal (t , NewDuration (- 153722867280912930 , - 7 ), d )
192+ })
193+ }
194+
195+ func TestParsingDurationTooBigToRepresent (t * testing.T ) {
196+ for _ , d := range []string {
197+ "9223372036854775808m" ,
198+ "-9223372036854775808m" ,
199+ "9223372036854775808h" ,
200+ "-9223372036854775808h" ,
201+ "153722867280912930h08m" ,
202+ "-153722867280912930h08m" ,
203+ } {
204+ assert .Panics (t , func () {
205+ _ , _ = NewDurationFromString (d )
206+ }, d )
207+ }
208+ }
209+
210+ func TestDurationPlusMinus (t * testing.T ) {
211+ for _ , d := range []struct {
212+ sum Duration
213+ expect int
214+ }{
215+ {NewDuration (0 , 0 ).Plus (NewDuration (0 , 0 )), 0 },
216+ {NewDuration (0 , 0 ).Plus (NewDuration (0 , 1 )), 1 },
217+ {NewDuration (0 , 0 ).Plus (NewDuration (1 , 2 )), 62 },
218+ {NewDuration (1382 , 9278 ).Plus (NewDuration (4718 , 5010 )), 380288 },
219+ {NewDuration (0 , 9223372036854775806 ).Plus (NewDuration (0 , 1 )), 9223372036854775807 },
220+ {NewDuration (0 , 0 ).Plus (NewDuration (0 , - 9223372036854775807 )), - 9223372036854775807 },
221+
222+ {NewDuration (0 , 0 ).Minus (NewDuration (0 , 0 )), 0 },
223+ {NewDuration (0 , 0 ).Minus (NewDuration (0 , 1 )), - 1 },
224+ {NewDuration (0 , 0 ).Minus (NewDuration (1 , 2 )), - 62 },
225+ {NewDuration (1382 , 9278 ).Minus (NewDuration (4718 , 5010 )), - 195892 },
226+ } {
227+ assert .Equal (t , d .sum .InMinutes (), d .expect )
228+ }
229+ }
230+
231+ func TestPanicsIfAdditionOverflows (t * testing.T ) {
232+ assert .Panics (t , func () {
233+ NewDuration (0 , 9223372036854775807 ).Plus (NewDuration (0 , 1 ))
234+ })
235+
236+ assert .Panics (t , func () {
237+ NewDuration (0 , - 9223372036854775807 ).Plus (NewDuration (0 , - 1 ))
238+ })
239+ }
0 commit comments