You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
2.8 KiB
151 lines
2.8 KiB
package iso8601_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"gitoa.ru/go-4devs/iso8601"
|
|
)
|
|
|
|
func TestFormatDuration(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := map[string]struct {
|
|
val time.Duration
|
|
expect string
|
|
}{
|
|
"1 day": {
|
|
val: time.Hour * 24,
|
|
expect: "P1D",
|
|
},
|
|
"1 hour": {
|
|
val: time.Hour,
|
|
expect: "PT1H",
|
|
},
|
|
"1 second": {
|
|
val: time.Second,
|
|
expect: "PT1S",
|
|
},
|
|
"1 nanosecond": {
|
|
val: time.Nanosecond,
|
|
expect: "PT0.000000001S",
|
|
},
|
|
"negative": {
|
|
val: -time.Hour * 24,
|
|
expect: "-P1D",
|
|
},
|
|
"zero": {
|
|
val: time.Duration(0),
|
|
expect: "PT0S",
|
|
},
|
|
}
|
|
|
|
for name, test := range cases {
|
|
result := iso8601.FormatDuration(test.val)
|
|
if result != test.expect {
|
|
t.Errorf("test:%v got:%v, expect:%v", name, result, test.expect)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestParseDuration(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cases := map[string]struct {
|
|
opts []iso8601.Option
|
|
parse string
|
|
expect time.Duration
|
|
}{
|
|
"base": {
|
|
parse: "P3Y6M4DT12H30M17S",
|
|
expect: parseDuration(t, "30780h30m17s"),
|
|
},
|
|
"base ofer time": {
|
|
parse: "P3Y6M4DT12H30M17S",
|
|
expect: parseDuration(t, "30756h30m17s"),
|
|
opts: []iso8601.Option{
|
|
iso8601.From(func() time.Time {
|
|
return parseTime(t, "2006-01-02T15:04:05Z")
|
|
}),
|
|
},
|
|
},
|
|
"base ofer time with delimiter": {
|
|
parse: "PT12H30.5M",
|
|
expect: parseDuration(t, "12h30m30s"),
|
|
opts: []iso8601.Option{
|
|
iso8601.From(func() time.Time {
|
|
return parseTime(t, "2006-01-02T15:04:05Z")
|
|
}),
|
|
},
|
|
},
|
|
"zero time": {
|
|
parse: "P3Y6M4DT12H30M17S",
|
|
expect: parseDuration(t, "30756h30m17s"),
|
|
opts: []iso8601.Option{
|
|
iso8601.From(func() time.Time {
|
|
return time.Time{}
|
|
}),
|
|
},
|
|
},
|
|
"only time": {
|
|
parse: "PT12H30M17S",
|
|
expect: parseDuration(t, "12h30m17s"),
|
|
},
|
|
"time with days": {
|
|
parse: "P10DT12H30M17S",
|
|
expect: parseDuration(t, "252h30m17s"),
|
|
},
|
|
"time with days with options": {
|
|
parse: "P10DT12H30M17S",
|
|
expect: parseDuration(t, "252h30m17s"),
|
|
opts: []iso8601.Option{
|
|
iso8601.From(func() time.Time {
|
|
return time.Time{}
|
|
}),
|
|
},
|
|
},
|
|
"one day": {
|
|
parse: "P1D",
|
|
expect: time.Hour * 24,
|
|
},
|
|
"1 nanosecond": {
|
|
parse: "PT0.000000001S",
|
|
expect: time.Nanosecond,
|
|
},
|
|
}
|
|
|
|
for name, test := range cases {
|
|
dur, err := iso8601.ParseDuration(test.parse, test.opts...)
|
|
if err != nil {
|
|
t.Errorf("%s: %v", name, err)
|
|
}
|
|
|
|
if dur != test.expect {
|
|
t.Errorf("test: %v expect:%v given:%v", name, test.expect, dur)
|
|
}
|
|
}
|
|
}
|
|
|
|
func parseDuration(t *testing.T, in string) time.Duration {
|
|
t.Helper()
|
|
|
|
duration, err := time.ParseDuration(in)
|
|
if err != nil {
|
|
t.Error(err)
|
|
t.FailNow()
|
|
}
|
|
|
|
return duration
|
|
}
|
|
|
|
func parseTime(t *testing.T, in string) time.Time {
|
|
t.Helper()
|
|
|
|
duration, err := time.Parse(time.RFC3339, in)
|
|
if err != nil {
|
|
t.Error(err)
|
|
t.FailNow()
|
|
}
|
|
|
|
return duration
|
|
}
|
|
|