github.com/danil/iso8583@v0.21.0/codec8583/ebcdic_x_text_encoding_code_page_037_test.go (about)

     1  package codec8583_test
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"runtime"
     7  	"testing"
     8  
     9  	"golang.org/x/text/encoding"
    10  	"golang.org/x/text/encoding/charmap"
    11  )
    12  
    13  func getLine() int {
    14  	_, _, line, _ := runtime.Caller(1)
    15  	return line
    16  }
    17  
    18  var testCases = []struct {
    19  	fromEBCDIC string
    20  	toEBCDIC   string
    21  	fromASCII  string
    22  	toASCII    string
    23  	line       int
    24  	benchmark  bool
    25  }{
    26  	{"\x00", "\x00", "\x00", "\x00", getLine(), false},
    27  	{"\x01", "\x01", "\x01", "\x01", getLine(), false},
    28  	{"\x02", "\x02", "\x02", "\x02", getLine(), false},
    29  	{"\x03", "\x03", "\x03", "\x03", getLine(), false},
    30  	{"\x04", "\x04", "\x1a", "\x1a", getLine(), false},
    31  	{"\x05", "\x05", "\t", "\t", getLine(), false},
    32  	{"\x06", "\x06", "\x1a", "\x1a", getLine(), false},
    33  	{"\x07", "\x07", "\x7f", "\x7f", getLine(), false},
    34  	{"\x08", "\x08", "\x1a", "\x1a", getLine(), false},
    35  	{"\x09", "\x09", "\x1a", "\x1a", getLine(), false},
    36  	{"\x0a", "\x0a", "\x1a", "\x1a", getLine(), false},
    37  	{"\x0b", "\x0b", "\v", "\v", getLine(), false},
    38  	{"\x0c", "\x0c", "\f", "\f", getLine(), false},
    39  	{"\x0d", "\x0d", "\r", "\r", getLine(), false},
    40  	{"\x0e", "\x0e", "\x0e", "\x0e", getLine(), false},
    41  	{"\x0f", "\x0f", "\x0f", "\x0f", getLine(), false},
    42  	{"\x10", "\x10", "\x10", "\x10", getLine(), false},
    43  	{"\x11", "\x11", "\x11", "\x11", getLine(), false},
    44  	{"\x12", "\x12", "\x12", "\x12", getLine(), false},
    45  	{"\x13", "\x13", "\x13", "\x13", getLine(), false},
    46  	{"\x14", "\x14", "\x1a", "\x1a", getLine(), false},
    47  	{"\x15", "\x15", "\x85", "\x85", getLine(), false},
    48  	{"\x16", "\x16", "\b", "\b", getLine(), false},
    49  	{"\x17", "\x17", "\x1a", "\x1a", getLine(), false},
    50  	{"\x18", "\x18", "\x18", "\x18", getLine(), false},
    51  	{"\x19", "\x19", "\x19", "\x19", getLine(), false},
    52  	{"\x1a", "\x1a", "\x1a", "\x1a", getLine(), false},
    53  	{"\x1b", "\x1b", "\x1a", "\x1a", getLine(), false},
    54  	{"\x1c", "\x1c", "\x1c", "\x1c", getLine(), false},
    55  	{"\x1d", "\x1d", "\x1d", "\x1d", getLine(), false},
    56  	{"\x1e", "\x1e", "\x1e", "\x1e", getLine(), false},
    57  	{"\x1f", "\x1f", "\x1f", "\x1f", getLine(), false},
    58  	{"\x20", "\x20", "\x1a", "\x1a", getLine(), false},
    59  	{"\x21", "\x21", "\x1a", "\x1a", getLine(), false},
    60  	{"\x22", "\x22", "\x1a", "\x1a", getLine(), false},
    61  	{"\x23", "\x23", "\x1a", "\x1a", getLine(), false},
    62  	{"\x24", "\x24", "\x1a", "\x1a", getLine(), false},
    63  	{"\x25", "\x25", "\n", "\n", getLine(), false},
    64  	{"\x26", "\x26", "\x17", "\x17", getLine(), false},
    65  	{"\x27", "\x27", "\x1b", "\x1b", getLine(), false},
    66  	{"\x28", "\x28", "\x1a", "\x1a", getLine(), false},
    67  	{"\x29", "\x29", "\x1a", "\x1a", getLine(), false},
    68  	{"\x2a", "\x2a", "\x1a", "\x1a", getLine(), false},
    69  	{"\x2b", "\x2b", "\x1a", "\x1a", getLine(), false},
    70  	{"\x2c", "\x2c", "\x1a", "\x1a", getLine(), false},
    71  	{"\x2d", "\x2d", "\x05", "\x05", getLine(), false},
    72  	{"\x2e", "\x2e", "\x06", "\x06", getLine(), false},
    73  	{"\x2f", "\x2f", "\a", "\a", getLine(), false},
    74  	{"\x30", "\x30", "\x1a", "\x1a", getLine(), false},
    75  	{"\x31", "\x31", "\x1a", "\x1a", getLine(), false},
    76  	{"\x32", "\x32", "\x16", "\x16", getLine(), false},
    77  	{"\x33", "\x33", "\x1a", "\x1a", getLine(), false},
    78  	{"\x34", "\x34", "\x1a", "\x1a", getLine(), false},
    79  	{"\x35", "\x35", "\x1a", "\x1a", getLine(), false},
    80  	{"\x36", "\x36", "\x1a", "\x1a", getLine(), false},
    81  	{"\x37", "\x37", "\x04", "\x04", getLine(), false},
    82  	{"\x38", "\x38", "\x1a", "\x1a", getLine(), false},
    83  	{"\x39", "\x39", "\x1a", "\x1a", getLine(), false},
    84  	{"\x3a", "\x3a", "\x1a", "\x1a", getLine(), false},
    85  	{"\x3b", "\x3b", "\x1a", "\x1a", getLine(), false},
    86  	{"\x3c", "\x3c", "\x14", "\x14", getLine(), false},
    87  	{"\x3d", "\x3d", "\x15", "\x15", getLine(), false},
    88  	{"\x3e", "\x3e", "\x1a", "\x1a", getLine(), false},
    89  	{"\x3f", "\x3f", "\x1a", "\x1a", getLine(), false},
    90  	{"\x40", "\x40", " ", " ", getLine(), false},
    91  	{"\x41", "\x41", "\x1a", "\x1a", getLine(), false},
    92  	{"\x42", "\x42", "\x1a", "\x1a", getLine(), false},
    93  	{"\x43", "\x43", "\x1a", "\x1a", getLine(), false},
    94  	{"\x44", "\x44", "\x1a", "\x1a", getLine(), false},
    95  	{"\x45", "\x45", "\x1a", "\x1a", getLine(), false},
    96  	{"\x46", "\x46", "\x1a", "\x1a", getLine(), false},
    97  	{"\x47", "\x47", "\x1a", "\x1a", getLine(), false},
    98  	{"\x48", "\x48", "\x1a", "\x1a", getLine(), false},
    99  	{"\x49", "\x49", "\x1a", "\x1a", getLine(), false},
   100  	{"\x4a", "\x4a", "\xa2", "\xa2", getLine(), false}, // ¢
   101  	{"\x4b", "\x4b", ".", ".", getLine(), false},
   102  	{"\x4c", "\x4c", "<", "<", getLine(), false},
   103  	{"\x4d", "\x4d", "(", "(", getLine(), false},
   104  	{"\x4e", "\x4e", "+", "+", getLine(), false},
   105  	{"\x4f", "\x4f", "|", "|", getLine(), false},
   106  	{"\x50", "\x50", "&", "&", getLine(), false},
   107  	{"\x51", "\x51", "\x1a", "\x1a", getLine(), false},
   108  	{"\x52", "\x52", "\x1a", "\x1a", getLine(), false},
   109  	{"\x53", "\x53", "\x1a", "\x1a", getLine(), false},
   110  	{"\x54", "\x54", "\x1a", "\x1a", getLine(), false},
   111  	{"\x55", "\x55", "\x1a", "\x1a", getLine(), false},
   112  	{"\x56", "\x56", "\x1a", "\x1a", getLine(), false},
   113  	{"\x57", "\x57", "\x1a", "\x1a", getLine(), false},
   114  	{"\x58", "\x58", "\x1a", "\x1a", getLine(), false},
   115  	{"\x59", "\x59", "\x1a", "\x1a", getLine(), false},
   116  	{"\x5a", "\x5a", "!", "!", getLine(), false},
   117  	{"\x5b", "\x5b", "$", "$", getLine(), false},
   118  	{"\x5c", "\x5c", "*", "*", getLine(), false},
   119  	{"\x5d", "\x5d", ")", ")", getLine(), false},
   120  	{"\x5e", "\x5e", ";", ";", getLine(), false},
   121  	{"\x5f", "\x5f", "¬", "¬", getLine(), false},
   122  	{"\x60", "\x60", "-", "-", getLine(), false},
   123  	{"\x61", "\x61", "/", "/", getLine(), false},
   124  	{"\x62", "\x62", "\x1a", "\x1a", getLine(), false},
   125  	{"\x63", "\x63", "\x1a", "\x1a", getLine(), false},
   126  	{"\x64", "\x64", "\x1a", "\x1a", getLine(), false},
   127  	{"\x65", "\x65", "\x1a", "\x1a", getLine(), false},
   128  	{"\x66", "\x66", "\x1a", "\x1a", getLine(), false},
   129  	{"\x67", "\x67", "\x1a", "\x1a", getLine(), false},
   130  	{"\x68", "\x68", "\x1a", "\x1a", getLine(), false},
   131  	{"\x69", "\x69", "\x1a", "\x1a", getLine(), false},
   132  	{"\x6a", "\x6a", "¦", "¦", getLine(), false},
   133  	{"\x6b", "\x6b", ",", ",", getLine(), false},
   134  	{"\x6c", "\x6c", "%", "%", getLine(), false},
   135  	{"\x6d", "\x6d", "_", "_", getLine(), false},
   136  	{"\x6e", "\x6e", ">", ">", getLine(), false},
   137  	{"\x6f", "\x6f", "?", "?", getLine(), false},
   138  	{"\x70", "\x70", "\x1a", "\x1a", getLine(), false},
   139  	{"\x71", "\x71", "\x1a", "\x1a", getLine(), false},
   140  	{"\x72", "\x72", "\x1a", "\x1a", getLine(), false},
   141  	{"\x73", "\x73", "\x1a", "\x1a", getLine(), false},
   142  	{"\x74", "\x74", "\x1a", "\x1a", getLine(), false},
   143  	{"\x75", "\x75", "\x1a", "\x1a", getLine(), false},
   144  	{"\x76", "\x76", "\x1a", "\x1a", getLine(), false},
   145  	{"\x77", "\x77", "\x1a", "\x1a", getLine(), false},
   146  	{"\x78", "\x78", "\x1a", "\x1a", getLine(), false},
   147  	{"\x79", "\x79", "`", "`", getLine(), false},
   148  	{"\x7a", "\x7a", ":", ":", getLine(), false},
   149  	{"\x7b", "\x7b", "#", "#", getLine(), false},
   150  	{"\x7c", "\x7c", "@", "@", getLine(), false},
   151  	{"\x7d", "\x7d", "'", "'", getLine(), false},
   152  	{"\x7e", "\x7e", "=", "=", getLine(), false},
   153  	{"\x7f", "\x7f", `"`, `"`, getLine(), false},
   154  	{"\x80", "\x80", "\x1a", "\x1a", getLine(), false},
   155  	{"\x81", "\x81", "a", "a", getLine(), false},
   156  	{"\x82", "\x82", "b", "b", getLine(), false},
   157  	{"\x83", "\x83", "c", "c", getLine(), false},
   158  	{"\x84", "\x84", "d", "d", getLine(), false},
   159  	{"\x85", "\x85", "e", "e", getLine(), false},
   160  	{"\x86", "\x86", "f", "f", getLine(), false},
   161  	{"\x87", "\x87", "g", "g", getLine(), false},
   162  	{"\x88", "\x88", "h", "h", getLine(), false},
   163  	{"\x89", "\x89", "i", "i", getLine(), false},
   164  	{"\x8a", "\x8a", "\x1a", "\x1a", getLine(), false},
   165  	{"\x8b", "\x8b", "\x1a", "\x1a", getLine(), false},
   166  	{"\x8c", "\x8c", "\x1a", "\x1a", getLine(), false},
   167  	{"\x8d", "\x8d", "\x1a", "\x1a", getLine(), false},
   168  	{"\x8e", "\x8e", "\x1a", "\x1a", getLine(), false},
   169  	{"\x8f", "\x8f", "±", "±", getLine(), false},
   170  	{"\x90", "\x90", "\x1a", "\x1a", getLine(), false},
   171  	{"\x91", "\x91", "j", "j", getLine(), false},
   172  	{"\x92", "\x92", "k", "k", getLine(), false},
   173  	{"\x93", "\x93", "l", "l", getLine(), false},
   174  	{"\x94", "\x94", "m", "m", getLine(), false},
   175  	{"\x95", "\x95", "n", "n", getLine(), false},
   176  	{"\x96", "\x96", "o", "o", getLine(), false},
   177  	{"\x97", "\x97", "p", "p", getLine(), false},
   178  	{"\x98", "\x98", "q", "q", getLine(), false},
   179  	{"\x99", "\x99", "r", "r", getLine(), false},
   180  	{"\x9a", "\x9a", "\x1a", "\x1a", getLine(), false},
   181  	{"\x9b", "\x9b", "\x1a", "\x1a", getLine(), false},
   182  	{"\x9c", "\x9c", "\x1a", "\x1a", getLine(), false},
   183  	{"\x9d", "\x9d", "\x1a", "\x1a", getLine(), false},
   184  	{"\x9e", "\x9e", "\x1a", "\x1a", getLine(), false},
   185  	{"\x9f", "\x9f", "\x1a", "\x1a", getLine(), false},
   186  	{"\xa0", "\xa0", "\x1a", "\x1a", getLine(), false},
   187  	{"\xa1", "\xa1", "~", "~", getLine(), false},
   188  	{"\xa2", "\xa2", "s", "s", getLine(), false},
   189  	{"\xa3", "\xa3", "t", "t", getLine(), false},
   190  	{"\xa4", "\xa4", "u", "u", getLine(), false},
   191  	{"\xa5", "\xa5", "v", "v", getLine(), false},
   192  	{"\xa6", "\xa6", "w", "w", getLine(), false},
   193  	{"\xa7", "\xa7", "x", "x", getLine(), false},
   194  	{"\xa8", "\xa8", "y", "y", getLine(), false},
   195  	{"\xa9", "\xa9", "z", "z", getLine(), false},
   196  	{"\xaa", "\xaa", "\x1a", "\x1a", getLine(), false},
   197  	{"\xab", "\xab", "\x1a", "\x1a", getLine(), false},
   198  	{"\xac", "\xac", "\x1a", "\x1a", getLine(), false},
   199  	{"\xad", "\xad", "\x1a", "\x1a", getLine(), false},
   200  	{"\xae", "\xae", "\x1a", "\x1a", getLine(), false},
   201  	{"\xaf", "\xaf", "\x1a", "\x1a", getLine(), false},
   202  	{"\xb0", "\xb0", "^", "^", getLine(), false},
   203  	{"\xb1", "\xb1", "\x1a", "\x1a", getLine(), false},
   204  	{"\xb2", "\xb2", "\x1a", "\x1a", getLine(), false},
   205  	{"\xb3", "\xb3", "\x1a", "\x1a", getLine(), false},
   206  	{"\xb4", "\xb4", "\x1a", "\x1a", getLine(), false},
   207  	{"\xb5", "\xb5", "\x1a", "\x1a", getLine(), false},
   208  	{"\xb6", "\xb6", "\x1a", "\x1a", getLine(), false},
   209  	{"\xb7", "\xb7", "\x1a", "\x1a", getLine(), false},
   210  	{"\xb8", "\xb8", "\x1a", "\x1a", getLine(), false},
   211  	{"\xb9", "\xb9", "\x1a", "\x1a", getLine(), false},
   212  	{"\xba", "\xba", "[", "[", getLine(), false},
   213  	{"\xbb", "\xbb", "]", "]", getLine(), false},
   214  	{"\xbc", "\xbc", "\x1a", "\x1a", getLine(), false},
   215  	{"\xbd", "\xbd", "\x1a", "\x1a", getLine(), false},
   216  	{"\xbe", "\xbe", "\x1a", "\x1a", getLine(), false},
   217  	{"\xbf", "\xbf", "\x1a", "\x1a", getLine(), false},
   218  	{"\xc0", "\xc0", "{", "{", getLine(), false},
   219  	{"\xc1", "\xc1", "A", "A", getLine(), false},
   220  	{"\xc2", "\xc2", "B", "B", getLine(), false},
   221  	{"\xc3", "\xc3", "C", "C", getLine(), false},
   222  	{"\xc4", "\xc4", "D", "D", getLine(), false},
   223  	{"\xc5", "\xc5", "E", "E", getLine(), false},
   224  	{"\xc6", "\xc6", "F", "F", getLine(), false},
   225  	{"\xc7", "\xc7", "G", "G", getLine(), false},
   226  	{"\xc8", "\xc8", "H", "H", getLine(), false},
   227  	{"\xc9", "\xc9", "I", "I", getLine(), false},
   228  	{"\xca", "\xca", "\x1a", "\x1a", getLine(), false},
   229  	{"\xcb", "\xcb", "\x1a", "\x1a", getLine(), false},
   230  	{"\xcc", "\xcc", "\x1a", "\x1a", getLine(), false},
   231  	{"\xcd", "\xcd", "\x1a", "\x1a", getLine(), false},
   232  	{"\xce", "\xce", "\x1a", "\x1a", getLine(), false},
   233  	{"\xcf", "\xcf", "\x1a", "\x1a", getLine(), false},
   234  	{"\xd0", "\xd0", "}", "}", getLine(), false},
   235  	{"\xd1", "\xd1", "J", "J", getLine(), false},
   236  	{"\xd2", "\xd2", "K", "K", getLine(), false},
   237  	{"\xd3", "\xd3", "L", "L", getLine(), false},
   238  	{"\xd4", "\xd4", "M", "M", getLine(), false},
   239  	{"\xd5", "\xd5", "N", "N", getLine(), false},
   240  	{"\xd6", "\xd6", "O", "O", getLine(), false},
   241  	{"\xd7", "\xd7", "P", "P", getLine(), false},
   242  	{"\xd8", "\xd8", "Q", "Q", getLine(), false},
   243  	{"\xd9", "\xd9", "R", "R", getLine(), false},
   244  	{"\xda", "\xda", "\x1a", "\x1a", getLine(), false},
   245  	{"\xdb", "\xdb", "\x1a", "\x1a", getLine(), false},
   246  	{"\xdc", "\xdc", "\x1a", "\x1a", getLine(), false},
   247  	{"\xdd", "\xdd", "\x1a", "\x1a", getLine(), false},
   248  	{"\xde", "\xde", "\x1a", "\x1a", getLine(), false},
   249  	{"\xdf", "\xdf", "\x1a", "\x1a", getLine(), false},
   250  	{"\xe0", "\xe0", "\\", "\\", getLine(), false},
   251  	{"\xe1", "\xe1", "\x1a", "\x1a", getLine(), false},
   252  	{"\xe2", "\xe2", "S", "S", getLine(), false},
   253  	{"\xe3", "\xe3", "T", "T", getLine(), false},
   254  	{"\xe4", "\xe4", "U", "U", getLine(), false},
   255  	{"\xe5", "\xe5", "V", "V", getLine(), false},
   256  	{"\xe6", "\xe6", "W", "W", getLine(), false},
   257  	{"\xe7", "\xe7", "X", "X", getLine(), false},
   258  	{"\xe8", "\xe8", "Y", "Y", getLine(), false},
   259  	{"\xe9", "\xe9", "Z", "Z", getLine(), false},
   260  	{"\xea", "\xea", "\x1a", "\x1a", getLine(), false},
   261  	{"\xeb", "\xeb", "\x1a", "\x1a", getLine(), false},
   262  	{"\xec", "\xec", "\x1a", "\x1a", getLine(), false},
   263  	{"\xed", "\xed", "\x1a", "\x1a", getLine(), false},
   264  	{"\xee", "\xee", "\x1a", "\x1a", getLine(), false},
   265  	{"\xef", "\xef", "\x1a", "\x1a", getLine(), false},
   266  	{"\xf0", "\xf0", "0", "0", getLine(), false},
   267  	{"\xf1", "\xf1", "1", "1", getLine(), false},
   268  	{"\xf2", "\xf2", "2", "2", getLine(), false},
   269  	{"\xf3", "\xf3", "3", "3", getLine(), false},
   270  	{"\xf4", "\xf4", "4", "4", getLine(), false},
   271  	{"\xf5", "\xf5", "5", "5", getLine(), false},
   272  	{"\xf6", "\xf6", "6", "6", getLine(), false},
   273  	{"\xf7", "\xf7", "7", "7", getLine(), false},
   274  	{"\xf8", "\xf8", "8", "8", getLine(), false},
   275  	{"\xf9", "\xf9", "9", "9", getLine(), false},
   276  	{"\xfa", "\xfa", "\x1a", "\x1a", getLine(), false},
   277  	{"\xfb", "\xfb", "\x1a", "\x1a", getLine(), false},
   278  	{"\xfc", "\xfc", "\x1a", "\x1a", getLine(), false},
   279  	{"\xfd", "\xfd", "\x1a", "\x1a", getLine(), false},
   280  	{"\xfe", "\xfe", "\x1a", "\x1a", getLine(), false},
   281  	{"\xff", "\xff", "\x1a", "\x1a", getLine(), false},
   282  	{"\xc8\x85\x93\x93\x96\x6b\x40\xe6\x96\x99\x93\x84\x5a", "\xc8\x85\x93\x93\x96\x6b\x40\xe6\x96\x99\x93\x84\x5a", "Hello, World!", "Hello, World!", getLine(), true},
   283  }
   284  
   285  func TestXTextEncodingCodePage037Decode(t *testing.T) {
   286  	_, testFile, _, _ := runtime.Caller(0)
   287  	for _, tc := range testCases {
   288  		tc := tc
   289  		switch tc.toASCII {
   290  		case string(encoding.ASCIISub), "\x85", "\xad", "\xa0", "\xa2":
   291  			continue
   292  		}
   293  		t.Run(fmt.Sprintf("%#v %#v %d", tc.fromEBCDIC, tc.toASCII, tc.line), func(t *testing.T) {
   294  			t.Parallel()
   295  			linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line)
   296  			decoder := charmap.CodePage037.NewDecoder()
   297  			dst := make([]byte, len(tc.toASCII))
   298  			nDst, nSrc, err := decoder.Transform(dst, []byte(tc.fromEBCDIC), true)
   299  			if err != nil {
   300  				t.Fatalf("unexpected decoder transform error: %v - %s", err, linkToExample)
   301  			}
   302  			if nSrc != len(tc.fromEBCDIC) {
   303  				t.Errorf("unexpected source bytes number: %d, expected %d %s",
   304  					nSrc, len(tc.fromEBCDIC), linkToExample)
   305  			}
   306  			if nDst != len(tc.toASCII) {
   307  				t.Errorf("unexpected destination bytes number: %d, expected %d %s",
   308  					nDst, len(tc.toASCII), linkToExample)
   309  			}
   310  			if string(dst[:nDst]) != tc.toASCII {
   311  				t.Errorf("unexpected UTF-8 string: %q, expected: %q %s", string(dst[:nDst]), tc.toASCII, linkToExample)
   312  			}
   313  		})
   314  	}
   315  }
   316  
   317  func BenchmarkXTextEncodingCodePage037Decode(b *testing.B) {
   318  	b.ReportAllocs()
   319  	for _, tc := range testCases {
   320  		if !tc.benchmark {
   321  			continue
   322  		}
   323  		b.Run(fmt.Sprintf("%#v %#v %d", tc.fromEBCDIC, tc.toASCII, tc.line), func(b *testing.B) {
   324  			decoder := charmap.CodePage037.NewDecoder()
   325  			for i := 0; i < b.N; i++ {
   326  				dst := make([]byte, len(tc.toASCII))
   327  				_, _, err := decoder.Transform(dst, []byte(tc.fromEBCDIC), true)
   328  				if err != nil {
   329  					log.Fatal(err)
   330  				}
   331  			}
   332  		})
   333  	}
   334  }
   335  
   336  func TestXTextEncodingCodePage037Encode(t *testing.T) {
   337  	_, testFile, _, _ := runtime.Caller(0)
   338  	for _, tc := range testCases {
   339  		tc := tc
   340  		switch tc.fromASCII {
   341  		case string(encoding.ASCIISub), "\x85", "\xad", "\xa0", "\xa2":
   342  			continue
   343  		}
   344  		t.Run(fmt.Sprintf("%#v %#v %d", tc.fromASCII, tc.toEBCDIC, tc.line), func(t *testing.T) {
   345  			t.Parallel()
   346  			linkToExample := fmt.Sprintf("%s:%d", testFile, tc.line)
   347  			encoder := charmap.CodePage037.NewEncoder()
   348  			dst := make([]byte, len(tc.toEBCDIC))
   349  			nDst, nSrc, err := encoder.Transform(dst, []byte(tc.fromASCII), true)
   350  			if err != nil {
   351  				t.Fatalf("unexpected encoder transform error: %v - %s", err, linkToExample)
   352  			}
   353  			if nSrc != len(tc.fromASCII) {
   354  				t.Errorf("unexpected source bytes number: %d, expected: %d %s",
   355  					nSrc, len(tc.fromASCII), linkToExample)
   356  			}
   357  			if nDst != len(tc.toEBCDIC) {
   358  				t.Errorf("unexpected destination bytes number: %d, expected: %d %s",
   359  					nDst, len(tc.toEBCDIC), linkToExample)
   360  			}
   361  			if string(dst[:nDst]) != tc.toEBCDIC {
   362  				t.Errorf("unexpected EBCDIC string: %#v, expected: %#v %s", string(dst[:nDst]), tc.toEBCDIC, linkToExample)
   363  			}
   364  		})
   365  	}
   366  }
   367  
   368  func BenchmarkXTextEncodingCodePage037Encode(b *testing.B) {
   369  	b.ReportAllocs()
   370  	for _, tc := range testCases {
   371  		if !tc.benchmark {
   372  			continue
   373  		}
   374  		b.Run(fmt.Sprintf("%#v %#v %d", tc.fromASCII, tc.toEBCDIC, tc.line), func(b *testing.B) {
   375  			encoder := charmap.CodePage037.NewEncoder()
   376  			for i := 0; i < b.N; i++ {
   377  				dst := make([]byte, len(tc.toEBCDIC))
   378  				_, _, err := encoder.Transform(dst, []byte(tc.fromASCII), true)
   379  				if err != nil {
   380  					log.Fatal(err)
   381  				}
   382  			}
   383  		})
   384  	}
   385  }