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  }