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  }