github.com/ncw/rclone@v1.48.1-0.20190724201158-a35aa1360e3e/fs/parseduration_test.go (about) 1 package fs 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/spf13/pflag" 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 // Check it satisfies the interface 14 var _ pflag.Value = (*Duration)(nil) 15 16 func TestParseDuration(t *testing.T) { 17 for _, test := range []struct { 18 in string 19 want time.Duration 20 err bool 21 }{ 22 {"0", 0, false}, 23 {"", 0, true}, 24 {"1ms", time.Millisecond, false}, 25 {"1s", time.Second, false}, 26 {"1m", time.Minute, false}, 27 {"1.5m", (3 * time.Minute) / 2, false}, 28 {"1h", time.Hour, false}, 29 {"1d", time.Hour * 24, false}, 30 {"1w", time.Hour * 24 * 7, false}, 31 {"1M", time.Hour * 24 * 30, false}, 32 {"1y", time.Hour * 24 * 365, false}, 33 {"1.5y", time.Hour * 24 * 365 * 3 / 2, false}, 34 {"-1s", -time.Second, false}, 35 {"1.s", time.Second, false}, 36 {"1x", 0, true}, 37 {"off", time.Duration(DurationOff), false}, 38 {"1h2m3s", time.Hour + 2*time.Minute + 3*time.Second, false}, 39 } { 40 duration, err := ParseDuration(test.in) 41 if test.err { 42 require.Error(t, err) 43 } else { 44 require.NoError(t, err) 45 } 46 assert.Equal(t, test.want, duration) 47 } 48 } 49 50 func TestDurationString(t *testing.T) { 51 for _, test := range []struct { 52 in time.Duration 53 want string 54 }{ 55 {time.Duration(0), "0s"}, 56 {time.Second, "1s"}, 57 {time.Minute, "1m0s"}, 58 {time.Millisecond, "1ms"}, 59 {time.Second, "1s"}, 60 {(3 * time.Minute) / 2, "1m30s"}, 61 {time.Hour, "1h0m0s"}, 62 {time.Hour * 24, "1d"}, 63 {time.Hour * 24 * 7, "1w"}, 64 {time.Hour * 24 * 30, "1M"}, 65 {time.Hour * 24 * 365, "1y"}, 66 {time.Hour * 24 * 365 * 3 / 2, "1.5y"}, 67 {-time.Second, "-1s"}, 68 {time.Second, "1s"}, 69 {time.Duration(DurationOff), "off"}, 70 {time.Hour + 2*time.Minute + 3*time.Second, "1h2m3s"}, 71 {time.Hour * 24, "1d"}, 72 {time.Hour * 24 * 7, "1w"}, 73 {time.Hour * 24 * 30, "1M"}, 74 {time.Hour * 24 * 365, "1y"}, 75 {time.Hour * 24 * 365 * 3 / 2, "1.5y"}, 76 {-time.Hour * 24 * 365 * 3 / 2, "-1.5y"}, 77 } { 78 got := Duration(test.in).String() 79 assert.Equal(t, test.want, got) 80 // Test the reverse 81 reverse, err := ParseDuration(test.want) 82 assert.NoError(t, err) 83 assert.Equal(t, test.in, reverse) 84 } 85 } 86 87 func TestDurationReadableString(t *testing.T) { 88 for _, test := range []struct { 89 negative bool 90 in time.Duration 91 want string 92 }{ 93 // Edge Cases 94 {false, time.Duration(DurationOff), "off"}, 95 // Base Cases 96 {false, time.Duration(0), "0s"}, 97 {true, time.Millisecond, "1ms"}, 98 {true, time.Second, "1s"}, 99 {true, time.Minute, "1m"}, 100 {true, (3 * time.Minute) / 2, "1m30s"}, 101 {true, time.Hour, "1h"}, 102 {true, time.Hour * 24, "1d"}, 103 {true, time.Hour * 24 * 7, "1w"}, 104 {true, time.Hour * 24 * 365, "1y"}, 105 // Composite Cases 106 {true, time.Hour + 2*time.Minute + 3*time.Second, "1h2m3s"}, 107 {true, time.Hour * 24 * (365 + 14), "1y2w"}, 108 {true, time.Hour*24*4 + time.Hour*3 + time.Minute*2 + time.Second, "4d3h2m1s"}, 109 {true, time.Hour * 24 * (365*3 + 7*2 + 1), "3y2w1d"}, 110 {true, time.Hour*24*(365*3+7*2+1) + time.Hour*2 + time.Second, "3y2w1d2h1s"}, 111 {true, time.Hour*24*(365*3+7*2+1) + time.Second, "3y2w1d1s"}, 112 {true, time.Hour*24*(365+7*2+3) + time.Hour*4 + time.Minute*5 + time.Second*6 + time.Millisecond*7, "1y2w3d4h5m6s7ms"}, 113 } { 114 got := Duration(test.in).ReadableString() 115 assert.Equal(t, test.want, got) 116 117 // Test Negative Case 118 if test.negative { 119 got = Duration(-test.in).ReadableString() 120 assert.Equal(t, "-"+test.want, got) 121 } 122 } 123 } 124 125 func TestDurationScan(t *testing.T) { 126 var v Duration 127 n, err := fmt.Sscan(" 17m ", &v) 128 require.NoError(t, err) 129 assert.Equal(t, 1, n) 130 assert.Equal(t, Duration(17*60*time.Second), v) 131 }