github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/x/time/unit_test.go (about) 1 // Copyright (c) 2016 Uber Technologies, Inc. 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // THE SOFTWARE. 20 21 package time 22 23 import ( 24 "testing" 25 "time" 26 27 "github.com/stretchr/testify/assert" 28 "github.com/stretchr/testify/require" 29 ) 30 31 func TestUnitValue(t *testing.T) { 32 inputs := []struct { 33 u Unit 34 expected time.Duration 35 }{ 36 {Second, time.Second}, 37 {Millisecond, time.Millisecond}, 38 {Microsecond, time.Microsecond}, 39 {Nanosecond, time.Nanosecond}, 40 {Minute, time.Minute}, 41 {Hour, time.Hour}, 42 {Day, 24 * time.Hour}, 43 {Year, 24 * time.Hour * 365}, 44 } 45 for _, input := range inputs { 46 v, err := input.u.Value() 47 require.NoError(t, err) 48 require.Equal(t, input.expected, v) 49 } 50 51 invalidUnit := Unit(100) 52 _, err := invalidUnit.Value() 53 require.Equal(t, errUnrecognizedTimeUnit, err) 54 } 55 56 func TestUnitCount(t *testing.T) { 57 inputs := []struct { 58 u Unit 59 d time.Duration 60 expected int 61 }{ 62 {Second, time.Second, 1}, 63 {Millisecond, 10 * time.Millisecond, 10}, 64 {Microsecond, time.Nanosecond, 0}, 65 {Nanosecond, time.Microsecond, 1000}, 66 {Minute, 2 * time.Minute, 2}, 67 {Hour, 3 * time.Hour, 3}, 68 {Day, 49 * time.Hour, 2}, 69 {Year, 366 * 24 * time.Hour, 1}, 70 } 71 for _, input := range inputs { 72 c, err := input.u.Count(input.d) 73 require.NoError(t, err) 74 require.Equal(t, input.expected, c) 75 } 76 77 invalidUnit := Unit(100) 78 _, err := invalidUnit.Count(time.Second) 79 require.Error(t, err) 80 81 var ( 82 u = Second 83 invalidDuration = -1 * time.Second 84 ) 85 _, err = u.Count(invalidDuration) 86 require.Error(t, err) 87 } 88 89 func TestUnitMustCount(t *testing.T) { 90 inputs := []struct { 91 u Unit 92 d time.Duration 93 expected int 94 }{ 95 {Second, time.Second, 1}, 96 {Millisecond, 10 * time.Millisecond, 10}, 97 {Microsecond, time.Nanosecond, 0}, 98 {Nanosecond, time.Microsecond, 1000}, 99 {Minute, 2 * time.Minute, 2}, 100 {Hour, 3 * time.Hour, 3}, 101 {Day, 49 * time.Hour, 2}, 102 {Year, 24 * 366 * time.Hour, 1}, 103 } 104 for _, input := range inputs { 105 c := input.u.MustCount(input.d) 106 require.Equal(t, input.expected, c) 107 } 108 109 invalidUnit := Unit(100) 110 require.Panics(t, func() { 111 invalidUnit.MustCount(time.Second) 112 }) 113 114 var ( 115 u = Second 116 invalidDuration = -1 * time.Second 117 ) 118 require.Panics(t, func() { 119 u.MustCount(invalidDuration) 120 }) 121 } 122 123 func TestUnitIsValid(t *testing.T) { 124 inputs := []struct { 125 u Unit 126 expected bool 127 }{ 128 {Second, true}, 129 {Millisecond, true}, 130 {Microsecond, true}, 131 {Nanosecond, true}, 132 {Minute, true}, 133 {Hour, true}, 134 {Day, true}, 135 {Year, true}, 136 {Unit(100), false}, 137 } 138 for _, input := range inputs { 139 require.Equal(t, input.expected, input.u.IsValid()) 140 } 141 } 142 143 func TestUnitFromDuration(t *testing.T) { 144 inputs := []struct { 145 d time.Duration 146 expected Unit 147 }{ 148 {time.Second, Second}, 149 {time.Millisecond, Millisecond}, 150 {time.Microsecond, Microsecond}, 151 {time.Nanosecond, Nanosecond}, 152 {time.Minute, Minute}, 153 {time.Hour, Hour}, 154 {24 * time.Hour, Day}, 155 {365 * 24 * time.Hour, Year}, 156 } 157 for _, input := range inputs { 158 u, err := UnitFromDuration(input.d) 159 require.NoError(t, err) 160 require.Equal(t, input.expected, u) 161 } 162 } 163 164 func TestUnitFromDurationError(t *testing.T) { 165 _, err := UnitFromDuration(time.Hour * 30) 166 require.Equal(t, errConvertDurationToUnit, err) 167 } 168 169 func TestMaxUnitForDuration(t *testing.T) { 170 inputs := []struct { 171 d time.Duration 172 expectedMultiple int64 173 expectedUnit Unit 174 }{ 175 {0, 0, Nanosecond}, 176 {30 * time.Nanosecond, 30, Nanosecond}, 177 {60 * time.Microsecond, 60, Microsecond}, 178 {999 * time.Millisecond, 999, Millisecond}, 179 {20 * time.Second, 20, Second}, 180 {70 * time.Second, 70, Second}, 181 {120 * time.Second, 2, Minute}, 182 {10 * time.Minute, 10, Minute}, 183 {20 * time.Hour, 20, Hour}, 184 {24 * time.Hour, 1, Day}, 185 {25 * time.Hour, 25, Hour}, 186 {24 * 8 * time.Hour, 8, Day}, 187 {24 * 31 * time.Hour, 31, Day}, 188 {24 * 365 * time.Hour, 1, Year}, 189 {24 * 366 * time.Hour, 366, Day}, 190 {24 * 365 * 2 * time.Hour, 2, Year}, 191 {-30 * time.Nanosecond, -30, Nanosecond}, 192 {-60 * time.Microsecond, -60, Microsecond}, 193 {-999 * time.Millisecond, -999, Millisecond}, 194 {-20 * time.Second, -20, Second}, 195 {-70 * time.Second, -70, Second}, 196 {-120 * time.Second, -2, Minute}, 197 {-10 * time.Minute, -10, Minute}, 198 {-20 * time.Hour, -20, Hour}, 199 {-24 * time.Hour, -1, Day}, 200 {-25 * time.Hour, -25, Hour}, 201 {-24 * 8 * time.Hour, -8, Day}, 202 {-24 * 31 * time.Hour, -31, Day}, 203 } 204 for _, input := range inputs { 205 m, u := MaxUnitForDuration(input.d) 206 require.Equal(t, input.expectedMultiple, m) 207 require.Equal(t, input.expectedUnit, u) 208 } 209 } 210 211 func TestDurationFromUnit(t *testing.T) { 212 inputs := []struct { 213 u Unit 214 expected time.Duration 215 }{ 216 {Second, time.Second}, 217 {Millisecond, time.Millisecond}, 218 {Microsecond, time.Microsecond}, 219 {Nanosecond, time.Nanosecond}, 220 {Minute, time.Minute}, 221 {Hour, time.Hour}, 222 {Day, 24 * time.Hour}, 223 {Year, 24 * time.Hour * 365}, 224 } 225 for _, input := range inputs { 226 d, err := DurationFromUnit(input.u) 227 require.NoError(t, err) 228 require.Equal(t, input.expected, d) 229 } 230 } 231 232 func TestDurationFromUnitError(t *testing.T) { 233 _, err := DurationFromUnit(None) 234 require.Equal(t, errConvertUnitToDuration, err) 235 } 236 237 func TestUnitString(t *testing.T) { 238 tests := []struct { 239 u Unit 240 s string 241 }{ 242 {Second, "s"}, 243 {Millisecond, "ms"}, 244 {Microsecond, "us"}, 245 {Nanosecond, "ns"}, 246 {Minute, "m"}, 247 {Hour, "h"}, 248 {Day, "d"}, 249 {Year, "y"}, 250 {None, "unknown"}, 251 } 252 253 for _, test := range tests { 254 assert.Equal(t, test.s, test.u.String(), "invalid String() for %v", test.u) 255 } 256 }