@@ -20,6 +20,13 @@ func TestDuration_MarshalJSON(t *testing.T) {
2020 {"one minute" , * MustNewDuration (time .Minute ), `"1m0s"` },
2121 {"one hour" , * MustNewDuration (time .Hour ), `"1h0m0s"` },
2222 {"one hour thirty minutes" , * MustNewDuration (time .Hour + 30 * time .Minute ), `"1h30m0s"` },
23+ {"1 day" , * MustNewDuration (24 * time .Hour ), `"1d"` },
24+ {"2 days" , * MustNewDuration (48 * time .Hour ), `"2d"` },
25+ {"1 day 12 hours" , * MustNewDuration (36 * time .Hour ), `"1d12h0m0s"` },
26+ {"3 days 6 hours 30 minutes" , * MustNewDuration (78 * time .Hour + 30 * time .Minute ), `"3d6h30m0s"` },
27+ {"4 days 1 hour 0 minutes 10 seconds" , * MustNewDuration (97 * time .Hour + 10 * time .Second ), `"4d1h0m10s"` },
28+ {"4 days 0 hours 0 minutes 10 seconds" , * MustNewDuration (4 * 24 * time .Hour + 10 * time .Second ), `"4d0h0m10s"` },
29+ {"4 days 0 hours 22 minutes 10 seconds" , * MustNewDuration (4 * 24 * time .Hour + 22 * time .Minute + 10 * time .Second ), `"4d0h22m10s"` },
2330 }
2431 for _ , test := range tests {
2532 t .Run (test .name , func (t * testing.T ) {
@@ -30,6 +37,41 @@ func TestDuration_MarshalJSON(t *testing.T) {
3037 }
3138}
3239
40+ func TestDuration_UnmarshalJSON (t * testing.T ) {
41+ tests := []struct {
42+ name string
43+ input string
44+ want Duration
45+ wantErr bool
46+ }{
47+ {"zero" , `"0s"` , * MustNewDuration (0 ), false },
48+ {"one second" , `"1s"` , * MustNewDuration (time .Second ), false },
49+ {"one minute" , `"1m0s"` , * MustNewDuration (time .Minute ), false },
50+ {"one hour" , `"1h0m0s"` , * MustNewDuration (time .Hour ), false },
51+ {"one hour thirty minutes" , `"1h30m0s"` , * MustNewDuration (time .Hour + 30 * time .Minute ), false },
52+ {"1 day" , `"1d"` , * MustNewDuration (24 * time .Hour ), false },
53+ {"2 days" , `"2d"` , * MustNewDuration (48 * time .Hour ), false },
54+ {"1 day 12 hours" , `"1d12h0m0s"` , * MustNewDuration (36 * time .Hour ), false },
55+ {"3 days 6 hours 30 minutes" , `"3d6h30m0s"` , * MustNewDuration (78 * time .Hour + 30 * time .Minute ), false },
56+ {"4 days 1 hour 0 minutes 10 seconds" , `"4d1h0m10s"` , * MustNewDuration (97 * time .Hour + 10 * time .Second ), false },
57+ {"4 days 0 hours 0 minutes 10 seconds" , `"4d0h0m10s"` , * MustNewDuration (4 * 24 * time .Hour + 10 * time .Second ), false },
58+ {"4 days 0 hours 22 minutes 10 seconds" , `"4d0h22m10s"` , * MustNewDuration (4 * 24 * time .Hour + 22 * time .Minute + 10 * time .Second ), false },
59+ {"invalid" , `"invalid"` , Duration {}, true },
60+ }
61+ for _ , tt := range tests {
62+ t .Run (tt .name , func (t * testing.T ) {
63+ var d Duration
64+ err := json .Unmarshal ([]byte (tt .input ), & d )
65+ if tt .wantErr {
66+ assert .Error (t , err )
67+ } else {
68+ assert .NoError (t , err )
69+ assert .Equal (t , tt .want , d )
70+ }
71+ })
72+ }
73+ }
74+
3375func TestDuration_Scan_Value (t * testing.T ) {
3476 t .Parallel ()
3577
0 commit comments