github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/fs/countsuffix_test.go (about) 1 package fs 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 // Check it satisfies the interfaces 13 var ( 14 _ flagger = (*CountSuffix)(nil) 15 _ flaggerNP = CountSuffix(0) 16 ) 17 18 func TestCountSuffixString(t *testing.T) { 19 for _, test := range []struct { 20 in float64 21 want string 22 }{ 23 {0, "0"}, 24 {102, "102"}, 25 {1000, "1k"}, 26 {1000 * 1000, "1M"}, 27 {1000 * 1000 * 1000, "1G"}, 28 {10 * 1000 * 1000 * 1000, "10G"}, 29 {10.1 * 1000 * 1000 * 1000, "10.100G"}, 30 {-1, "off"}, 31 {-100, "off"}, 32 } { 33 ss := CountSuffix(test.in) 34 got := ss.String() 35 assert.Equal(t, test.want, got) 36 } 37 } 38 39 func TestCountSuffixUnit(t *testing.T) { 40 for _, test := range []struct { 41 in float64 42 want string 43 }{ 44 {0, "0 Byte"}, 45 {102, "102 Byte"}, 46 {1000, "1 kByte"}, 47 {1000 * 1000, "1 MByte"}, 48 {1000 * 1000 * 1000, "1 GByte"}, 49 {10 * 1000 * 1000 * 1000, "10 GByte"}, 50 {10.1 * 1000 * 1000 * 1000, "10.100 GByte"}, 51 {10 * 1000 * 1000 * 1000 * 1000, "10 TByte"}, 52 {10 * 1000 * 1000 * 1000 * 1000 * 1000, "10 PByte"}, 53 {1 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000, "1 EByte"}, 54 {-1, "off"}, 55 {-100, "off"}, 56 } { 57 ss := CountSuffix(test.in) 58 got := ss.Unit("Byte") 59 assert.Equal(t, test.want, got) 60 } 61 } 62 63 func TestCountSuffixSet(t *testing.T) { 64 for _, test := range []struct { 65 in string 66 want int64 67 err bool 68 }{ 69 {"0", 0, false}, 70 {"1b", 1, false}, 71 {"100B", 100, false}, 72 {"0.1k", 100, false}, 73 {"0.1", 100, false}, 74 {"1K", 1000, false}, 75 {"1k", 1000, false}, 76 {"1KB", 1000, false}, 77 {"1kB", 1000, false}, 78 {"1kb", 1000, false}, 79 {"1", 1000, false}, 80 {"2.5", 1000 * 2.5, false}, 81 {"1M", 1000 * 1000, false}, 82 {"1MB", 1000 * 1000, false}, 83 {"1.g", 1000 * 1000 * 1000, false}, 84 {"10G", 10 * 1000 * 1000 * 1000, false}, 85 {"10T", 10 * 1000 * 1000 * 1000 * 1000, false}, 86 {"10P", 10 * 1000 * 1000 * 1000 * 1000 * 1000, false}, 87 {"off", -1, false}, 88 {"OFF", -1, false}, 89 {"", 0, true}, 90 {"1q", 0, true}, 91 {"1.q", 0, true}, 92 {"1q", 0, true}, 93 {"-1K", 0, true}, 94 {"1i", 0, true}, 95 {"1iB", 0, true}, 96 {"1Ki", 0, true}, 97 {"1KiB", 0, true}, 98 } { 99 ss := CountSuffix(0) 100 err := ss.Set(test.in) 101 if test.err { 102 require.Error(t, err, test.in) 103 } else { 104 require.NoError(t, err, test.in) 105 } 106 assert.Equal(t, test.want, int64(ss)) 107 } 108 } 109 110 func TestCountSuffixScan(t *testing.T) { 111 var v CountSuffix 112 n, err := fmt.Sscan(" 17M ", &v) 113 require.NoError(t, err) 114 assert.Equal(t, 1, n) 115 assert.Equal(t, CountSuffix(17000000), v) 116 } 117 118 func TestCountSuffixUnmarshalJSON(t *testing.T) { 119 for _, test := range []struct { 120 in string 121 want int64 122 err bool 123 }{ 124 {`"0"`, 0, false}, 125 {`"102B"`, 102, false}, 126 {`"1K"`, 1000, false}, 127 {`"2.5"`, 1000 * 2.5, false}, 128 {`"1M"`, 1000 * 1000, false}, 129 {`"1.g"`, 1000 * 1000 * 1000, false}, 130 {`"10G"`, 10 * 1000 * 1000 * 1000, false}, 131 {`"off"`, -1, false}, 132 {`""`, 0, true}, 133 {`"1q"`, 0, true}, 134 {`"-1K"`, 0, true}, 135 {`0`, 0, false}, 136 {`102`, 102, false}, 137 {`1000`, 1000, false}, 138 {`1000000000`, 1000000000, false}, 139 {`1.1.1`, 0, true}, 140 } { 141 var ss CountSuffix 142 err := json.Unmarshal([]byte(test.in), &ss) 143 if test.err { 144 require.Error(t, err, test.in) 145 } else { 146 require.NoError(t, err, test.in) 147 } 148 assert.Equal(t, test.want, int64(ss)) 149 } 150 }