github.com/danil/iso8583@v0.21.0/bitmap64/bitmap64_test.go (about) 1 package bitmap64_test 2 3 import ( 4 "fmt" 5 "runtime" 6 "strconv" 7 "testing" 8 9 "github.com/danil/iso8583/bitmap64" 10 ) 11 12 var testArray = [8]byte{0x46, 0x01, 0xa8, 0xe1, 0xa2, 0x0a, 0xf1, 0xf6} 13 14 var NewTestCases = []struct { 15 input []byte 16 expected bitmap64.Bitmap 17 line int 18 benchmark bool 19 }{ 20 { 21 input: testArray[:], 22 expected: bitmap64.Bitmap(testArray), 23 line: func() int { _, _, l, _ := runtime.Caller(1); return l }(), 24 benchmark: true, 25 }, 26 } 27 28 func TestNew(t *testing.T) { 29 _, testFile, _, _ := runtime.Caller(0) 30 for _, tc := range NewTestCases { 31 tc := tc 32 t.Run(strconv.Itoa(tc.line), func(t *testing.T) { 33 t.Parallel() 34 linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line) 35 b := bitmap64.New(tc.input) 36 if b != tc.expected { 37 t.Errorf("[bitmap] expected: %#v, received: %#v - %s", tc.expected, b, linkToExample) 38 } 39 }) 40 } 41 } 42 43 func BenchmarkNew(b *testing.B) { 44 b.ReportAllocs() 45 for _, tc := range NewTestCases { 46 if !tc.benchmark { 47 continue 48 } 49 b.Run(strconv.Itoa(tc.line), func(b *testing.B) { 50 for i := 0; i < b.N; i++ { 51 _ = bitmap64.New(tc.input) 52 } 53 }) 54 } 55 } 56 57 func getLine() int { 58 _, _, line, _ := runtime.Caller(1) 59 return line 60 } 61 62 var BitmapGetTestCases = []struct { 63 input [8]byte 64 index int 65 expected bool 66 line int 67 benchmark bool 68 }{ 69 {testArray, 1, false, getLine(), true}, 70 {testArray, 2, true, getLine(), false}, 71 {testArray, 3, false, getLine(), false}, 72 {testArray, 4, false, getLine(), false}, 73 {testArray, 5, false, getLine(), false}, 74 {testArray, 6, true, getLine(), false}, 75 {testArray, 7, true, getLine(), false}, 76 {testArray, 8, false, getLine(), false}, 77 {testArray, 9, false, getLine(), false}, 78 {testArray, 10, false, getLine(), false}, 79 {testArray, 11, false, getLine(), false}, 80 {testArray, 12, false, getLine(), false}, 81 {testArray, 13, false, getLine(), false}, 82 {testArray, 14, false, getLine(), false}, 83 {testArray, 15, false, getLine(), false}, 84 {testArray, 16, true, getLine(), false}, 85 {testArray, 17, true, getLine(), false}, 86 {testArray, 18, false, getLine(), false}, 87 {testArray, 19, true, getLine(), false}, 88 {testArray, 20, false, getLine(), false}, 89 {testArray, 21, true, getLine(), false}, 90 {testArray, 22, false, getLine(), false}, 91 {testArray, 23, false, getLine(), false}, 92 {testArray, 24, false, getLine(), false}, 93 {testArray, 25, true, getLine(), false}, 94 {testArray, 26, true, getLine(), false}, 95 {testArray, 27, true, getLine(), false}, 96 {testArray, 28, false, getLine(), false}, 97 {testArray, 29, false, getLine(), false}, 98 {testArray, 30, false, getLine(), false}, 99 {testArray, 31, false, getLine(), false}, 100 {testArray, 32, true, getLine(), false}, 101 {testArray, 33, true, getLine(), false}, 102 {testArray, 34, false, getLine(), false}, 103 {testArray, 35, true, getLine(), false}, 104 {testArray, 36, false, getLine(), false}, 105 {testArray, 37, false, getLine(), false}, 106 {testArray, 38, false, getLine(), false}, 107 {testArray, 39, true, getLine(), false}, 108 {testArray, 40, false, getLine(), false}, 109 {testArray, 41, false, getLine(), false}, 110 {testArray, 42, false, getLine(), false}, 111 {testArray, 43, false, getLine(), false}, 112 {testArray, 44, false, getLine(), false}, 113 {testArray, 45, true, getLine(), false}, 114 {testArray, 46, false, getLine(), false}, 115 {testArray, 47, true, getLine(), false}, 116 {testArray, 48, false, getLine(), false}, 117 {testArray, 49, true, getLine(), false}, 118 {testArray, 50, true, getLine(), false}, 119 {testArray, 51, true, getLine(), false}, 120 {testArray, 52, true, getLine(), false}, 121 {testArray, 53, false, getLine(), false}, 122 {testArray, 54, false, getLine(), false}, 123 {testArray, 55, false, getLine(), false}, 124 {testArray, 56, true, getLine(), false}, 125 {testArray, 57, true, getLine(), false}, 126 {testArray, 58, true, getLine(), false}, 127 {testArray, 59, true, getLine(), false}, 128 {testArray, 60, true, getLine(), false}, 129 {testArray, 61, false, getLine(), false}, 130 {testArray, 62, true, getLine(), false}, 131 {testArray, 63, true, getLine(), false}, 132 {testArray, 64, false, getLine(), false}, 133 } 134 135 func TestBitmapGet(t *testing.T) { 136 _, testFile, _, _ := runtime.Caller(0) 137 for _, tc := range BitmapGetTestCases { 138 tc := tc 139 t.Run(fmt.Sprintf("%d %t %d", tc.index, tc.expected, tc.line), func(t *testing.T) { 140 t.Parallel() 141 linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line) 142 b := bitmap64.Bitmap(tc.input) 143 ok := b.Get(tc.index) 144 if ok != tc.expected { 145 t.Errorf("[bit %d] expected: %t, received: %t - %s", tc.index, tc.expected, ok, linkToExample) 146 } 147 }) 148 } 149 } 150 151 func BenchmarkBitmapGet(b *testing.B) { 152 b.ReportAllocs() 153 for _, tc := range BitmapGetTestCases { 154 if !tc.benchmark { 155 continue 156 } 157 b.Run(strconv.Itoa(tc.line), func(b *testing.B) { 158 for i := 0; i < b.N; i++ { 159 b := bitmap64.Bitmap(tc.input) 160 _ = b.Get(tc.index) 161 } 162 }) 163 } 164 } 165 166 var BitmapGetOutOfRangeTestCases = []struct { 167 input [8]byte 168 index int 169 expected interface{} 170 line int 171 benchmark bool 172 }{ 173 {testArray, 0, "index out of range from 1 to 64", getLine(), true}, 174 {testArray, 1, nil, getLine(), true}, 175 {testArray, 64, nil, getLine(), false}, 176 {testArray, 65, "index out of range from 1 to 64", getLine(), false}, 177 } 178 179 func TestBitmapGetOutOfRange(t *testing.T) { 180 _, testFile, _, _ := runtime.Caller(0) 181 for _, tc := range BitmapGetOutOfRangeTestCases { 182 tc := tc 183 t.Run(fmt.Sprintf("%d %t %d", tc.index, tc.expected, tc.line), func(t *testing.T) { 184 t.Parallel() 185 linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line) 186 defer func() { 187 if p := recover(); p != tc.expected { 188 t.Errorf("[panic] expected: %#v, received: %#v - %s", tc.expected, p, linkToExample) 189 } 190 }() 191 b := bitmap64.Bitmap(tc.input) 192 b.Get(tc.index) 193 }) 194 } 195 } 196 197 var BitmapSetTestCases = []struct { 198 input [8]byte 199 index int 200 line int 201 benchmark bool 202 }{ 203 {testArray, 1, getLine(), true}, 204 {testArray, 2, getLine(), false}, 205 {testArray, 3, getLine(), false}, 206 {testArray, 4, getLine(), false}, 207 {testArray, 5, getLine(), false}, 208 {testArray, 6, getLine(), false}, 209 {testArray, 7, getLine(), false}, 210 {testArray, 8, getLine(), false}, 211 {testArray, 9, getLine(), false}, 212 {testArray, 10, getLine(), true}, 213 {testArray, 11, getLine(), true}, 214 {testArray, 12, getLine(), false}, 215 {testArray, 13, getLine(), false}, 216 {testArray, 14, getLine(), false}, 217 {testArray, 15, getLine(), false}, 218 {testArray, 16, getLine(), false}, 219 {testArray, 17, getLine(), false}, 220 {testArray, 18, getLine(), false}, 221 {testArray, 19, getLine(), false}, 222 {testArray, 20, getLine(), true}, 223 {testArray, 21, getLine(), true}, 224 {testArray, 22, getLine(), false}, 225 {testArray, 23, getLine(), false}, 226 {testArray, 24, getLine(), false}, 227 {testArray, 25, getLine(), false}, 228 {testArray, 26, getLine(), false}, 229 {testArray, 27, getLine(), false}, 230 {testArray, 28, getLine(), false}, 231 {testArray, 29, getLine(), false}, 232 {testArray, 30, getLine(), true}, 233 {testArray, 31, getLine(), true}, 234 {testArray, 32, getLine(), false}, 235 {testArray, 33, getLine(), false}, 236 {testArray, 34, getLine(), false}, 237 {testArray, 35, getLine(), false}, 238 {testArray, 36, getLine(), false}, 239 {testArray, 37, getLine(), false}, 240 {testArray, 38, getLine(), false}, 241 {testArray, 39, getLine(), false}, 242 {testArray, 40, getLine(), true}, 243 {testArray, 41, getLine(), true}, 244 {testArray, 42, getLine(), false}, 245 {testArray, 43, getLine(), false}, 246 {testArray, 44, getLine(), false}, 247 {testArray, 45, getLine(), false}, 248 {testArray, 46, getLine(), false}, 249 {testArray, 47, getLine(), false}, 250 {testArray, 48, getLine(), false}, 251 {testArray, 49, getLine(), false}, 252 {testArray, 50, getLine(), true}, 253 {testArray, 51, getLine(), true}, 254 {testArray, 52, getLine(), false}, 255 {testArray, 53, getLine(), false}, 256 {testArray, 54, getLine(), false}, 257 {testArray, 55, getLine(), false}, 258 {testArray, 56, getLine(), false}, 259 {testArray, 57, getLine(), false}, 260 {testArray, 58, getLine(), false}, 261 {testArray, 59, getLine(), false}, 262 {testArray, 60, getLine(), false}, 263 {testArray, 61, getLine(), false}, 264 {testArray, 62, getLine(), false}, 265 {testArray, 63, getLine(), false}, 266 {testArray, 64, getLine(), false}, 267 } 268 269 func TestBitmapSet(t *testing.T) { 270 _, testFile, _, _ := runtime.Caller(0) 271 for _, tc := range BitmapSetTestCases { 272 tc := tc 273 t.Run(fmt.Sprintf("%d %d", tc.index, tc.line), func(t *testing.T) { 274 t.Parallel() 275 linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line) 276 b := bitmap64.Bitmap([8]byte{}) 277 b.Set(tc.index) 278 if !b.Get(tc.index) { 279 t.Errorf("[bit %d] expected true, but it is false - %s", tc.index, linkToExample) 280 } 281 }) 282 } 283 } 284 285 func BenchmarkBitmapSet(b *testing.B) { 286 b.ReportAllocs() 287 for _, tc := range BitmapSetTestCases { 288 if !tc.benchmark { 289 continue 290 } 291 b.Run(strconv.Itoa(tc.line), func(b *testing.B) { 292 for i := 0; i < b.N; i++ { 293 b := bitmap64.Bitmap(tc.input) 294 b.Set(tc.index) 295 } 296 }) 297 } 298 } 299 300 var BitmapSetOutOfRangeTestCases = []struct { 301 input [8]byte 302 index int 303 expected interface{} 304 line int 305 benchmark bool 306 }{ 307 {testArray, 0, "index out of range from 1 to 64", getLine(), true}, 308 {testArray, 1, nil, getLine(), true}, 309 {testArray, 42, nil, getLine(), false}, 310 {testArray, 65, "index out of range from 1 to 64", getLine(), false}, 311 } 312 313 func TestBitmapSetOutOfRange(t *testing.T) { 314 _, testFile, _, _ := runtime.Caller(0) 315 for _, tc := range BitmapSetOutOfRangeTestCases { 316 tc := tc 317 t.Run(fmt.Sprintf("%d %t %d", tc.index, tc.expected, tc.line), func(t *testing.T) { 318 t.Parallel() 319 linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line) 320 defer func() { 321 if p := recover(); p != tc.expected { 322 t.Errorf("[panic] expected: %#v, received: %#v - %s", tc.expected, p, linkToExample) 323 } 324 }() 325 b := bitmap64.Bitmap(tc.input) 326 b.Set(tc.index) 327 }) 328 } 329 }