github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libgo/go/strconv/atoi_test.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package strconv_test
     6  
     7  import (
     8  	"errors"
     9  	"reflect"
    10  	. "strconv"
    11  	"testing"
    12  )
    13  
    14  type atoui64Test struct {
    15  	in  string
    16  	out uint64
    17  	err error
    18  }
    19  
    20  var atoui64tests = []atoui64Test{
    21  	{"", 0, ErrSyntax},
    22  	{"0", 0, nil},
    23  	{"1", 1, nil},
    24  	{"12345", 12345, nil},
    25  	{"012345", 12345, nil},
    26  	{"12345x", 0, ErrSyntax},
    27  	{"98765432100", 98765432100, nil},
    28  	{"18446744073709551615", 1<<64 - 1, nil},
    29  	{"18446744073709551616", 1<<64 - 1, ErrRange},
    30  	{"18446744073709551620", 1<<64 - 1, ErrRange},
    31  }
    32  
    33  var btoui64tests = []atoui64Test{
    34  	{"", 0, ErrSyntax},
    35  	{"0", 0, nil},
    36  	{"1", 1, nil},
    37  	{"12345", 12345, nil},
    38  	{"012345", 012345, nil},
    39  	{"0x12345", 0x12345, nil},
    40  	{"0X12345", 0x12345, nil},
    41  	{"12345x", 0, ErrSyntax},
    42  	{"98765432100", 98765432100, nil},
    43  	{"18446744073709551615", 1<<64 - 1, nil},
    44  	{"18446744073709551616", 1<<64 - 1, ErrRange},
    45  	{"18446744073709551620", 1<<64 - 1, ErrRange},
    46  	{"0xFFFFFFFFFFFFFFFF", 1<<64 - 1, nil},
    47  	{"0x10000000000000000", 1<<64 - 1, ErrRange},
    48  	{"01777777777777777777777", 1<<64 - 1, nil},
    49  	{"01777777777777777777778", 0, ErrSyntax},
    50  	{"02000000000000000000000", 1<<64 - 1, ErrRange},
    51  	{"0200000000000000000000", 1 << 61, nil},
    52  }
    53  
    54  type atoi64Test struct {
    55  	in  string
    56  	out int64
    57  	err error
    58  }
    59  
    60  var atoi64tests = []atoi64Test{
    61  	{"", 0, ErrSyntax},
    62  	{"0", 0, nil},
    63  	{"-0", 0, nil},
    64  	{"1", 1, nil},
    65  	{"-1", -1, nil},
    66  	{"12345", 12345, nil},
    67  	{"-12345", -12345, nil},
    68  	{"012345", 12345, nil},
    69  	{"-012345", -12345, nil},
    70  	{"98765432100", 98765432100, nil},
    71  	{"-98765432100", -98765432100, nil},
    72  	{"9223372036854775807", 1<<63 - 1, nil},
    73  	{"-9223372036854775807", -(1<<63 - 1), nil},
    74  	{"9223372036854775808", 1<<63 - 1, ErrRange},
    75  	{"-9223372036854775808", -1 << 63, nil},
    76  	{"9223372036854775809", 1<<63 - 1, ErrRange},
    77  	{"-9223372036854775809", -1 << 63, ErrRange},
    78  }
    79  
    80  var btoi64tests = []atoi64Test{
    81  	{"", 0, ErrSyntax},
    82  	{"0", 0, nil},
    83  	{"-0", 0, nil},
    84  	{"1", 1, nil},
    85  	{"-1", -1, nil},
    86  	{"12345", 12345, nil},
    87  	{"-12345", -12345, nil},
    88  	{"012345", 012345, nil},
    89  	{"-012345", -012345, nil},
    90  	{"0x12345", 0x12345, nil},
    91  	{"-0X12345", -0x12345, nil},
    92  	{"12345x", 0, ErrSyntax},
    93  	{"-12345x", 0, ErrSyntax},
    94  	{"98765432100", 98765432100, nil},
    95  	{"-98765432100", -98765432100, nil},
    96  	{"9223372036854775807", 1<<63 - 1, nil},
    97  	{"-9223372036854775807", -(1<<63 - 1), nil},
    98  	{"9223372036854775808", 1<<63 - 1, ErrRange},
    99  	{"-9223372036854775808", -1 << 63, nil},
   100  	{"9223372036854775809", 1<<63 - 1, ErrRange},
   101  	{"-9223372036854775809", -1 << 63, ErrRange},
   102  }
   103  
   104  type atoui32Test struct {
   105  	in  string
   106  	out uint32
   107  	err error
   108  }
   109  
   110  var atoui32tests = []atoui32Test{
   111  	{"", 0, ErrSyntax},
   112  	{"0", 0, nil},
   113  	{"1", 1, nil},
   114  	{"12345", 12345, nil},
   115  	{"012345", 12345, nil},
   116  	{"12345x", 0, ErrSyntax},
   117  	{"987654321", 987654321, nil},
   118  	{"4294967295", 1<<32 - 1, nil},
   119  	{"4294967296", 1<<32 - 1, ErrRange},
   120  }
   121  
   122  type atoi32Test struct {
   123  	in  string
   124  	out int32
   125  	err error
   126  }
   127  
   128  var atoi32tests = []atoi32Test{
   129  	{"", 0, ErrSyntax},
   130  	{"0", 0, nil},
   131  	{"-0", 0, nil},
   132  	{"1", 1, nil},
   133  	{"-1", -1, nil},
   134  	{"12345", 12345, nil},
   135  	{"-12345", -12345, nil},
   136  	{"012345", 12345, nil},
   137  	{"-012345", -12345, nil},
   138  	{"12345x", 0, ErrSyntax},
   139  	{"-12345x", 0, ErrSyntax},
   140  	{"987654321", 987654321, nil},
   141  	{"-987654321", -987654321, nil},
   142  	{"2147483647", 1<<31 - 1, nil},
   143  	{"-2147483647", -(1<<31 - 1), nil},
   144  	{"2147483648", 1<<31 - 1, ErrRange},
   145  	{"-2147483648", -1 << 31, nil},
   146  	{"2147483649", 1<<31 - 1, ErrRange},
   147  	{"-2147483649", -1 << 31, ErrRange},
   148  }
   149  
   150  type numErrorTest struct {
   151  	num, want string
   152  }
   153  
   154  var numErrorTests = []numErrorTest{
   155  	{"0", `strconv.ParseFloat: parsing "0": failed`},
   156  	{"`", "strconv.ParseFloat: parsing \"`\": failed"},
   157  	{"1\x00.2", `strconv.ParseFloat: parsing "1\x00.2": failed`},
   158  }
   159  
   160  func init() {
   161  	// The atoi routines return NumErrors wrapping
   162  	// the error and the string.  Convert the tables above.
   163  	for i := range atoui64tests {
   164  		test := &atoui64tests[i]
   165  		if test.err != nil {
   166  			test.err = &NumError{"ParseUint", test.in, test.err}
   167  		}
   168  	}
   169  	for i := range btoui64tests {
   170  		test := &btoui64tests[i]
   171  		if test.err != nil {
   172  			test.err = &NumError{"ParseUint", test.in, test.err}
   173  		}
   174  	}
   175  	for i := range atoi64tests {
   176  		test := &atoi64tests[i]
   177  		if test.err != nil {
   178  			test.err = &NumError{"ParseInt", test.in, test.err}
   179  		}
   180  	}
   181  	for i := range btoi64tests {
   182  		test := &btoi64tests[i]
   183  		if test.err != nil {
   184  			test.err = &NumError{"ParseInt", test.in, test.err}
   185  		}
   186  	}
   187  	for i := range atoui32tests {
   188  		test := &atoui32tests[i]
   189  		if test.err != nil {
   190  			test.err = &NumError{"ParseUint", test.in, test.err}
   191  		}
   192  	}
   193  	for i := range atoi32tests {
   194  		test := &atoi32tests[i]
   195  		if test.err != nil {
   196  			test.err = &NumError{"ParseInt", test.in, test.err}
   197  		}
   198  	}
   199  }
   200  
   201  func TestParseUint64(t *testing.T) {
   202  	for i := range atoui64tests {
   203  		test := &atoui64tests[i]
   204  		out, err := ParseUint(test.in, 10, 64)
   205  		if test.out != out || !reflect.DeepEqual(test.err, err) {
   206  			t.Errorf("Atoui64(%q) = %v, %v want %v, %v",
   207  				test.in, out, err, test.out, test.err)
   208  		}
   209  	}
   210  }
   211  
   212  func TestParseUint64Base(t *testing.T) {
   213  	for i := range btoui64tests {
   214  		test := &btoui64tests[i]
   215  		out, err := ParseUint(test.in, 0, 64)
   216  		if test.out != out || !reflect.DeepEqual(test.err, err) {
   217  			t.Errorf("ParseUint(%q) = %v, %v want %v, %v",
   218  				test.in, out, err, test.out, test.err)
   219  		}
   220  	}
   221  }
   222  
   223  func TestParseInt64(t *testing.T) {
   224  	for i := range atoi64tests {
   225  		test := &atoi64tests[i]
   226  		out, err := ParseInt(test.in, 10, 64)
   227  		if test.out != out || !reflect.DeepEqual(test.err, err) {
   228  			t.Errorf("Atoi64(%q) = %v, %v want %v, %v",
   229  				test.in, out, err, test.out, test.err)
   230  		}
   231  	}
   232  }
   233  
   234  func TestParseInt64Base(t *testing.T) {
   235  	for i := range btoi64tests {
   236  		test := &btoi64tests[i]
   237  		out, err := ParseInt(test.in, 0, 64)
   238  		if test.out != out || !reflect.DeepEqual(test.err, err) {
   239  			t.Errorf("ParseInt(%q) = %v, %v want %v, %v",
   240  				test.in, out, err, test.out, test.err)
   241  		}
   242  	}
   243  }
   244  
   245  func TestParseUint(t *testing.T) {
   246  	switch IntSize {
   247  	case 32:
   248  		for i := range atoui32tests {
   249  			test := &atoui32tests[i]
   250  			out, err := ParseUint(test.in, 10, 0)
   251  			if test.out != uint32(out) || !reflect.DeepEqual(test.err, err) {
   252  				t.Errorf("Atoui(%q) = %v, %v want %v, %v",
   253  					test.in, out, err, test.out, test.err)
   254  			}
   255  		}
   256  	case 64:
   257  		for i := range atoui64tests {
   258  			test := &atoui64tests[i]
   259  			out, err := ParseUint(test.in, 10, 0)
   260  			if test.out != uint64(out) || !reflect.DeepEqual(test.err, err) {
   261  				t.Errorf("Atoui(%q) = %v, %v want %v, %v",
   262  					test.in, out, err, test.out, test.err)
   263  			}
   264  		}
   265  	}
   266  }
   267  
   268  func TestParseInt(t *testing.T) {
   269  	switch IntSize {
   270  	case 32:
   271  		for i := range atoi32tests {
   272  			test := &atoi32tests[i]
   273  			out, err := ParseInt(test.in, 10, 0)
   274  			if test.out != int32(out) || !reflect.DeepEqual(test.err, err) {
   275  				t.Errorf("Atoi(%q) = %v, %v want %v, %v",
   276  					test.in, out, err, test.out, test.err)
   277  			}
   278  		}
   279  	case 64:
   280  		for i := range atoi64tests {
   281  			test := &atoi64tests[i]
   282  			out, err := ParseInt(test.in, 10, 0)
   283  			if test.out != int64(out) || !reflect.DeepEqual(test.err, err) {
   284  				t.Errorf("Atoi(%q) = %v, %v want %v, %v",
   285  					test.in, out, err, test.out, test.err)
   286  			}
   287  		}
   288  	}
   289  }
   290  
   291  func TestNumError(t *testing.T) {
   292  	for _, test := range numErrorTests {
   293  		err := &NumError{
   294  			Func: "ParseFloat",
   295  			Num:  test.num,
   296  			Err:  errors.New("failed"),
   297  		}
   298  		if got := err.Error(); got != test.want {
   299  			t.Errorf(`(&NumError{"ParseFloat", %q, "failed"}).Error() = %v, want %v`, test.num, got, test.want)
   300  		}
   301  	}
   302  }
   303  
   304  func BenchmarkAtoi(b *testing.B) {
   305  	for i := 0; i < b.N; i++ {
   306  		ParseInt("12345678", 10, 0)
   307  	}
   308  }
   309  
   310  func BenchmarkAtoiNeg(b *testing.B) {
   311  	for i := 0; i < b.N; i++ {
   312  		ParseInt("-12345678", 10, 0)
   313  	}
   314  }
   315  
   316  func BenchmarkAtoi64(b *testing.B) {
   317  	for i := 0; i < b.N; i++ {
   318  		ParseInt("12345678901234", 10, 64)
   319  	}
   320  }
   321  
   322  func BenchmarkAtoi64Neg(b *testing.B) {
   323  	for i := 0; i < b.N; i++ {
   324  		ParseInt("-12345678901234", 10, 64)
   325  	}
   326  }