kimchi/strfmt/duration_test.go

226 lines
5.4 KiB
Go

// Copyright 2015 go-swagger maintainers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package strfmt
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"go.mongodb.org/mongo-driver/bson"
)
func TestDuration(t *testing.T) {
pp := Duration(0)
err := pp.UnmarshalText([]byte("0ms"))
assert.NoError(t, err)
err = pp.UnmarshalText([]byte("yada"))
assert.Error(t, err)
orig := "2ms"
b := []byte(orig)
bj := []byte("\"" + orig + "\"")
err = pp.UnmarshalText(b)
assert.NoError(t, err)
err = pp.UnmarshalText([]byte("three week"))
assert.Error(t, err)
err = pp.UnmarshalText([]byte("9999999999999999999999999999999999999999999999999999999 weeks"))
assert.Error(t, err)
txt, err := pp.MarshalText()
assert.NoError(t, err)
assert.Equal(t, orig, string(txt))
err = pp.UnmarshalJSON(bj)
assert.NoError(t, err)
assert.EqualValues(t, orig, pp.String())
err = pp.UnmarshalJSON([]byte("yada"))
assert.Error(t, err)
err = pp.UnmarshalJSON([]byte(`"12 parsecs"`))
assert.Error(t, err)
err = pp.UnmarshalJSON([]byte(`"12 y"`))
assert.Error(t, err)
b, err = pp.MarshalJSON()
assert.NoError(t, err)
assert.Equal(t, bj, b)
dur := Duration(42)
bsonData, err := bson.Marshal(&dur)
assert.NoError(t, err)
var durCopy Duration
err = bson.Unmarshal(bsonData, &durCopy)
assert.NoError(t, err)
assert.Equal(t, dur, durCopy)
}
func testDurationParser(t *testing.T, toParse string, expected time.Duration) {
t.Helper()
r, e := ParseDuration(toParse)
assert.NoError(t, e)
assert.Equal(t, expected, r)
}
func TestDurationParser_Failed(t *testing.T) {
_, e := ParseDuration("45 wekk")
assert.Error(t, e)
}
func TestIsDuration_Failed(t *testing.T) {
e := IsDuration("45 weeekks")
assert.False(t, e)
}
func testDurationSQLScanner(t *testing.T, dur time.Duration) {
t.Helper()
values := []interface{}{int64(dur), float64(dur)}
for _, value := range values {
var result Duration
err := result.Scan(value)
assert.NoError(t, err)
assert.Equal(t, dur, time.Duration(result))
// And the other way around
resv, erv := result.Value()
assert.NoError(t, erv)
assert.EqualValues(t, value, resv)
}
}
func TestDurationScanner_Nil(t *testing.T) {
var result Duration
err := result.Scan(nil)
assert.NoError(t, err)
assert.EqualValues(t, 0, time.Duration(result))
err = result.Scan("1 ms")
assert.Error(t, err)
}
func TestDurationParser(t *testing.T) {
testcases := map[string]time.Duration{
// parse the short forms without spaces
"1ns": 1 * time.Nanosecond,
"1us": 1 * time.Microsecond,
"1µs": 1 * time.Microsecond,
"1ms": 1 * time.Millisecond,
"1s": 1 * time.Second,
"1m": 1 * time.Minute,
"1h": 1 * time.Hour,
"1hr": 1 * time.Hour,
"1d": 24 * time.Hour,
"1w": 7 * 24 * time.Hour,
"1wk": 7 * 24 * time.Hour,
// parse the long forms without spaces
"1nanoseconds": 1 * time.Nanosecond,
"1nanos": 1 * time.Nanosecond,
"1microseconds": 1 * time.Microsecond,
"1micros": 1 * time.Microsecond,
"1millis": 1 * time.Millisecond,
"1milliseconds": 1 * time.Millisecond,
"1second": 1 * time.Second,
"1sec": 1 * time.Second,
"1min": 1 * time.Minute,
"1minute": 1 * time.Minute,
"1hour": 1 * time.Hour,
"1day": 24 * time.Hour,
"1week": 7 * 24 * time.Hour,
// parse the short forms with spaces
"1 ns": 1 * time.Nanosecond,
"1 us": 1 * time.Microsecond,
"1 µs": 1 * time.Microsecond,
"1 ms": 1 * time.Millisecond,
"1 s": 1 * time.Second,
"1 m": 1 * time.Minute,
"1 h": 1 * time.Hour,
"1 hr": 1 * time.Hour,
"1 d": 24 * time.Hour,
"1 w": 7 * 24 * time.Hour,
"1 wk": 7 * 24 * time.Hour,
// parse the long forms without spaces
"1 nanoseconds": 1 * time.Nanosecond,
"1 nanos": 1 * time.Nanosecond,
"1 microseconds": 1 * time.Microsecond,
"1 micros": 1 * time.Microsecond,
"1 millis": 1 * time.Millisecond,
"1 milliseconds": 1 * time.Millisecond,
"1 second": 1 * time.Second,
"1 sec": 1 * time.Second,
"1 min": 1 * time.Minute,
"1 minute": 1 * time.Minute,
"1 hour": 1 * time.Hour,
"1 day": 24 * time.Hour,
"1 week": 7 * 24 * time.Hour,
}
for str, dur := range testcases {
testDurationParser(t, str, dur)
testDurationSQLScanner(t, dur)
}
}
func TestIsDuration_Caveats(t *testing.T) {
// This works too
e := IsDuration("45 weeks")
assert.True(t, e)
// This works too
e = IsDuration("45 weekz")
assert.True(t, e)
// This works too
e = IsDuration("12 hours")
assert.True(t, e)
// This works too
e = IsDuration("12 minutes")
assert.True(t, e)
// This does not work
e = IsDuration("12 phours")
assert.False(t, e)
}
func TestDeepCopyDuration(t *testing.T) {
dur := Duration(42)
in := &dur
out := new(Duration)
in.DeepCopyInto(out)
assert.Equal(t, in, out)
out2 := in.DeepCopy()
assert.Equal(t, in, out2)
var inNil *Duration
out3 := inNil.DeepCopy()
assert.Nil(t, out3)
}