github.com/saferwall/pe@v1.5.2/cmd/size_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "reflect" 6 "runtime" 7 "strings" 8 "testing" 9 ) 10 11 func ExampleBytesSize() { 12 fmt.Println(BytesSize(1024)) 13 fmt.Println(BytesSize(1024 * 1024)) 14 fmt.Println(BytesSize(1048576)) 15 fmt.Println(BytesSize(2 * MiB)) 16 fmt.Println(BytesSize(3.42 * GiB)) 17 fmt.Println(BytesSize(5.372 * TiB)) 18 fmt.Println(BytesSize(2.22 * PiB)) 19 } 20 21 func ExampleHumanSize() { 22 fmt.Println(HumanSize(1000)) 23 fmt.Println(HumanSize(1024)) 24 fmt.Println(HumanSize(1000000)) 25 fmt.Println(HumanSize(1048576)) 26 fmt.Println(HumanSize(2 * MB)) 27 fmt.Println(HumanSize(float64(3.42 * GB))) 28 fmt.Println(HumanSize(float64(5.372 * TB))) 29 fmt.Println(HumanSize(float64(2.22 * PB))) 30 } 31 32 func ExampleFromHumanSize() { 33 fmt.Println(FromHumanSize("32")) 34 fmt.Println(FromHumanSize("32b")) 35 fmt.Println(FromHumanSize("32B")) 36 fmt.Println(FromHumanSize("32k")) 37 fmt.Println(FromHumanSize("32K")) 38 fmt.Println(FromHumanSize("32kb")) 39 fmt.Println(FromHumanSize("32Kb")) 40 fmt.Println(FromHumanSize("32Mb")) 41 fmt.Println(FromHumanSize("32Gb")) 42 fmt.Println(FromHumanSize("32Tb")) 43 fmt.Println(FromHumanSize("32Pb")) 44 } 45 46 func ExampleRAMInBytes() { 47 fmt.Println(RAMInBytes("32")) 48 fmt.Println(RAMInBytes("32b")) 49 fmt.Println(RAMInBytes("32B")) 50 fmt.Println(RAMInBytes("32k")) 51 fmt.Println(RAMInBytes("32K")) 52 fmt.Println(RAMInBytes("32kb")) 53 fmt.Println(RAMInBytes("32Kb")) 54 fmt.Println(RAMInBytes("32Mb")) 55 fmt.Println(RAMInBytes("32Gb")) 56 fmt.Println(RAMInBytes("32Tb")) 57 fmt.Println(RAMInBytes("32Pb")) 58 fmt.Println(RAMInBytes("32PB")) 59 fmt.Println(RAMInBytes("32P")) 60 } 61 62 func TestBytesSize(t *testing.T) { 63 assertEquals(t, "1KiB", BytesSize(1024)) 64 assertEquals(t, "1MiB", BytesSize(1024*1024)) 65 assertEquals(t, "1MiB", BytesSize(1048576)) 66 assertEquals(t, "2MiB", BytesSize(2*MiB)) 67 assertEquals(t, "3.42GiB", BytesSize(3.42*GiB)) 68 assertEquals(t, "5.372TiB", BytesSize(5.372*TiB)) 69 assertEquals(t, "2.22PiB", BytesSize(2.22*PiB)) 70 assertEquals(t, "1.049e+06YiB", BytesSize(KiB*KiB*KiB*KiB*KiB*PiB)) 71 } 72 73 func TestHumanSize(t *testing.T) { 74 assertEquals(t, "1kB", HumanSize(1000)) 75 assertEquals(t, "1.024kB", HumanSize(1024)) 76 assertEquals(t, "1MB", HumanSize(1000000)) 77 assertEquals(t, "1.049MB", HumanSize(1048576)) 78 assertEquals(t, "2MB", HumanSize(2*MB)) 79 assertEquals(t, "3.42GB", HumanSize(float64(3.42*GB))) 80 assertEquals(t, "5.372TB", HumanSize(float64(5.372*TB))) 81 assertEquals(t, "2.22PB", HumanSize(float64(2.22*PB))) 82 assertEquals(t, "1e+04YB", HumanSize(float64(10000000000000*PB))) 83 } 84 85 func TestFromHumanSize(t *testing.T) { 86 assertSuccessEquals(t, 0, FromHumanSize, "0") 87 assertSuccessEquals(t, 0, FromHumanSize, "0b") 88 assertSuccessEquals(t, 0, FromHumanSize, "0B") 89 assertSuccessEquals(t, 0, FromHumanSize, "0 B") 90 assertSuccessEquals(t, 32, FromHumanSize, "32") 91 assertSuccessEquals(t, 32, FromHumanSize, "32b") 92 assertSuccessEquals(t, 32, FromHumanSize, "32B") 93 assertSuccessEquals(t, 32*KB, FromHumanSize, "32k") 94 assertSuccessEquals(t, 32*KB, FromHumanSize, "32K") 95 assertSuccessEquals(t, 32*KB, FromHumanSize, "32kb") 96 assertSuccessEquals(t, 32*KB, FromHumanSize, "32Kb") 97 assertSuccessEquals(t, 32*MB, FromHumanSize, "32Mb") 98 assertSuccessEquals(t, 32*GB, FromHumanSize, "32Gb") 99 assertSuccessEquals(t, 32*TB, FromHumanSize, "32Tb") 100 assertSuccessEquals(t, 32*PB, FromHumanSize, "32Pb") 101 102 assertSuccessEquals(t, 32.5*KB, FromHumanSize, "32.5kB") 103 assertSuccessEquals(t, 32.5*KB, FromHumanSize, "32.5 kB") 104 assertSuccessEquals(t, 32, FromHumanSize, "32.5 B") 105 assertSuccessEquals(t, 300, FromHumanSize, "0.3 K") 106 assertSuccessEquals(t, 300, FromHumanSize, ".3kB") 107 108 assertSuccessEquals(t, 0, FromHumanSize, "0.") 109 assertSuccessEquals(t, 0, FromHumanSize, "0. ") 110 assertSuccessEquals(t, 0, FromHumanSize, "0.b") 111 assertSuccessEquals(t, 0, FromHumanSize, "0.B") 112 assertSuccessEquals(t, 0, FromHumanSize, "-0") 113 assertSuccessEquals(t, 0, FromHumanSize, "-0b") 114 assertSuccessEquals(t, 0, FromHumanSize, "-0B") 115 assertSuccessEquals(t, 0, FromHumanSize, "-0 b") 116 assertSuccessEquals(t, 0, FromHumanSize, "-0 B") 117 assertSuccessEquals(t, 32, FromHumanSize, "32.") 118 assertSuccessEquals(t, 32, FromHumanSize, "32.b") 119 assertSuccessEquals(t, 32, FromHumanSize, "32.B") 120 assertSuccessEquals(t, 32, FromHumanSize, "32. b") 121 assertSuccessEquals(t, 32, FromHumanSize, "32. B") 122 123 // We do not tolerate extra leading or trailing spaces 124 // (except for a space after the number and a missing suffix). 125 assertSuccessEquals(t, 0, FromHumanSize, "0 ") 126 127 assertError(t, FromHumanSize, " 0") 128 assertError(t, FromHumanSize, " 0b") 129 assertError(t, FromHumanSize, " 0B") 130 assertError(t, FromHumanSize, " 0 B") 131 assertError(t, FromHumanSize, "0b ") 132 assertError(t, FromHumanSize, "0B ") 133 assertError(t, FromHumanSize, "0 B ") 134 135 assertError(t, FromHumanSize, "") 136 assertError(t, FromHumanSize, "hello") 137 assertError(t, FromHumanSize, ".") 138 assertError(t, FromHumanSize, ". ") 139 assertError(t, FromHumanSize, " ") 140 assertError(t, FromHumanSize, " ") 141 assertError(t, FromHumanSize, " .") 142 assertError(t, FromHumanSize, " . ") 143 assertError(t, FromHumanSize, "-32") 144 assertError(t, FromHumanSize, "-32b") 145 assertError(t, FromHumanSize, "-32B") 146 assertError(t, FromHumanSize, "-32 b") 147 assertError(t, FromHumanSize, "-32 B") 148 assertError(t, FromHumanSize, "32b.") 149 assertError(t, FromHumanSize, "32B.") 150 assertError(t, FromHumanSize, "32 b.") 151 assertError(t, FromHumanSize, "32 B.") 152 assertError(t, FromHumanSize, "32 bb") 153 assertError(t, FromHumanSize, "32 BB") 154 assertError(t, FromHumanSize, "32 b b") 155 assertError(t, FromHumanSize, "32 B B") 156 assertError(t, FromHumanSize, "32 b") 157 assertError(t, FromHumanSize, "32 B") 158 assertError(t, FromHumanSize, " 32 ") 159 assertError(t, FromHumanSize, "32m b") 160 assertError(t, FromHumanSize, "32bm") 161 } 162 163 func TestRAMInBytes(t *testing.T) { 164 assertSuccessEquals(t, 32, RAMInBytes, "32") 165 assertSuccessEquals(t, 32, RAMInBytes, "32b") 166 assertSuccessEquals(t, 32, RAMInBytes, "32B") 167 assertSuccessEquals(t, 32*KiB, RAMInBytes, "32k") 168 assertSuccessEquals(t, 32*KiB, RAMInBytes, "32K") 169 assertSuccessEquals(t, 32*KiB, RAMInBytes, "32kb") 170 assertSuccessEquals(t, 32*KiB, RAMInBytes, "32Kb") 171 assertSuccessEquals(t, 32*KiB, RAMInBytes, "32Kib") 172 assertSuccessEquals(t, 32*KiB, RAMInBytes, "32KIB") 173 assertSuccessEquals(t, 32*MiB, RAMInBytes, "32Mb") 174 assertSuccessEquals(t, 32*GiB, RAMInBytes, "32Gb") 175 assertSuccessEquals(t, 32*TiB, RAMInBytes, "32Tb") 176 assertSuccessEquals(t, 32*PiB, RAMInBytes, "32Pb") 177 assertSuccessEquals(t, 32*PiB, RAMInBytes, "32PB") 178 assertSuccessEquals(t, 32*PiB, RAMInBytes, "32P") 179 180 assertSuccessEquals(t, 32, RAMInBytes, "32.3") 181 tmp := 32.3 * MiB 182 assertSuccessEquals(t, int64(tmp), RAMInBytes, "32.3 mb") 183 tmp = 0.3 * MiB 184 assertSuccessEquals(t, int64(tmp), RAMInBytes, "0.3MB") 185 186 assertError(t, RAMInBytes, "") 187 assertError(t, RAMInBytes, "hello") 188 assertError(t, RAMInBytes, "-32") 189 assertError(t, RAMInBytes, " 32 ") 190 assertError(t, RAMInBytes, "32m b") 191 assertError(t, RAMInBytes, "32bm") 192 } 193 194 func BenchmarkParseSize(b *testing.B) { 195 for i := 0; i < b.N; i++ { 196 for _, s := range []string{ 197 "", "32", "32b", "32 B", "32k", "32.5 K", "32kb", "32 Kb", 198 "32.8Mb", "32.9Gb", "32.777Tb", "32Pb", "0.3Mb", "-1", 199 } { 200 FromHumanSize(s) 201 RAMInBytes(s) 202 } 203 } 204 } 205 206 func assertEquals(t *testing.T, expected, actual interface{}) { 207 t.Helper() 208 if expected != actual { 209 t.Errorf("Expected '%v' but got '%v'", expected, actual) 210 } 211 } 212 213 // func that maps to the parse function signatures as testing abstraction 214 type parseFn func(string) (int64, error) 215 216 // Define 'String()' for pretty-print 217 func (fn parseFn) String() string { 218 fnName := runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name() 219 return fnName[strings.LastIndex(fnName, ".")+1:] 220 } 221 222 func assertSuccessEquals(t *testing.T, expected int64, fn parseFn, arg string) { 223 t.Helper() 224 res, err := fn(arg) 225 if err != nil || res != expected { 226 t.Errorf("%s(\"%s\") -> expected '%d' but got '%d' with error '%v'", fn, arg, expected, res, err) 227 } 228 } 229 230 func assertError(t *testing.T, fn parseFn, arg string) { 231 t.Helper() 232 res, err := fn(arg) 233 if err == nil && res != -1 { 234 t.Errorf("%s(\"%s\") -> expected error but got '%d'", fn, arg, res) 235 } 236 }