github.com/rsc/tmp@v0.0.0-20240517235954-6deaab19748b/bootstrap/internal/gc/big/intconv_test.go (about)

     1  // Do not edit. Bootstrap copy of /Users/rsc/g/go/src/cmd/internal/gc/big/intconv_test.go
     2  
     3  // Copyright 2015 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  package big
     8  
     9  import (
    10  	"bytes"
    11  	"fmt"
    12  	"testing"
    13  )
    14  
    15  var stringTests = []struct {
    16  	in   string
    17  	out  string
    18  	base int
    19  	val  int64
    20  	ok   bool
    21  }{
    22  	{in: "", ok: false},
    23  	{in: "a", ok: false},
    24  	{in: "z", ok: false},
    25  	{in: "+", ok: false},
    26  	{in: "-", ok: false},
    27  	{in: "0b", ok: false},
    28  	{in: "0x", ok: false},
    29  	{in: "2", base: 2, ok: false},
    30  	{in: "0b2", base: 0, ok: false},
    31  	{in: "08", ok: false},
    32  	{in: "8", base: 8, ok: false},
    33  	{in: "0xg", base: 0, ok: false},
    34  	{in: "g", base: 16, ok: false},
    35  	{"0", "0", 0, 0, true},
    36  	{"0", "0", 10, 0, true},
    37  	{"0", "0", 16, 0, true},
    38  	{"+0", "0", 0, 0, true},
    39  	{"-0", "0", 0, 0, true},
    40  	{"10", "10", 0, 10, true},
    41  	{"10", "10", 10, 10, true},
    42  	{"10", "10", 16, 16, true},
    43  	{"-10", "-10", 16, -16, true},
    44  	{"+10", "10", 16, 16, true},
    45  	{"0x10", "16", 0, 16, true},
    46  	{in: "0x10", base: 16, ok: false},
    47  	{"-0x10", "-16", 0, -16, true},
    48  	{"+0x10", "16", 0, 16, true},
    49  	{"00", "0", 0, 0, true},
    50  	{"0", "0", 8, 0, true},
    51  	{"07", "7", 0, 7, true},
    52  	{"7", "7", 8, 7, true},
    53  	{"023", "19", 0, 19, true},
    54  	{"23", "23", 8, 19, true},
    55  	{"cafebabe", "cafebabe", 16, 0xcafebabe, true},
    56  	{"0b0", "0", 0, 0, true},
    57  	{"-111", "-111", 2, -7, true},
    58  	{"-0b111", "-7", 0, -7, true},
    59  	{"0b1001010111", "599", 0, 0x257, true},
    60  	{"1001010111", "1001010111", 2, 0x257, true},
    61  }
    62  
    63  func format(base int) string {
    64  	switch base {
    65  	case 2:
    66  		return "%b"
    67  	case 8:
    68  		return "%o"
    69  	case 16:
    70  		return "%x"
    71  	}
    72  	return "%d"
    73  }
    74  
    75  func TestGetString(t *testing.T) {
    76  	z := new(Int)
    77  	for i, test := range stringTests {
    78  		if !test.ok {
    79  			continue
    80  		}
    81  		z.SetInt64(test.val)
    82  
    83  		if test.base == 10 {
    84  			s := z.String()
    85  			if s != test.out {
    86  				t.Errorf("#%da got %s; want %s", i, s, test.out)
    87  			}
    88  		}
    89  
    90  		s := fmt.Sprintf(format(test.base), z)
    91  		if s != test.out {
    92  			t.Errorf("#%db got %s; want %s", i, s, test.out)
    93  		}
    94  	}
    95  }
    96  
    97  func TestSetString(t *testing.T) {
    98  	tmp := new(Int)
    99  	for i, test := range stringTests {
   100  		// initialize to a non-zero value so that issues with parsing
   101  		// 0 are detected
   102  		tmp.SetInt64(1234567890)
   103  		n1, ok1 := new(Int).SetString(test.in, test.base)
   104  		n2, ok2 := tmp.SetString(test.in, test.base)
   105  		expected := NewInt(test.val)
   106  		if ok1 != test.ok || ok2 != test.ok {
   107  			t.Errorf("#%d (input '%s') ok incorrect (should be %t)", i, test.in, test.ok)
   108  			continue
   109  		}
   110  		if !ok1 {
   111  			if n1 != nil {
   112  				t.Errorf("#%d (input '%s') n1 != nil", i, test.in)
   113  			}
   114  			continue
   115  		}
   116  		if !ok2 {
   117  			if n2 != nil {
   118  				t.Errorf("#%d (input '%s') n2 != nil", i, test.in)
   119  			}
   120  			continue
   121  		}
   122  
   123  		if ok1 && !isNormalized(n1) {
   124  			t.Errorf("#%d (input '%s'): %v is not normalized", i, test.in, *n1)
   125  		}
   126  		if ok2 && !isNormalized(n2) {
   127  			t.Errorf("#%d (input '%s'): %v is not normalized", i, test.in, *n2)
   128  		}
   129  
   130  		if n1.Cmp(expected) != 0 {
   131  			t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n1, test.val)
   132  		}
   133  		if n2.Cmp(expected) != 0 {
   134  			t.Errorf("#%d (input '%s') got: %s want: %d", i, test.in, n2, test.val)
   135  		}
   136  	}
   137  }
   138  
   139  var formatTests = []struct {
   140  	input  string
   141  	format string
   142  	output string
   143  }{
   144  	{"<nil>", "%x", "<nil>"},
   145  	{"<nil>", "%#x", "<nil>"},
   146  	{"<nil>", "%#y", "%!y(big.Int=<nil>)"},
   147  
   148  	{"10", "%b", "1010"},
   149  	{"10", "%o", "12"},
   150  	{"10", "%d", "10"},
   151  	{"10", "%v", "10"},
   152  	{"10", "%x", "a"},
   153  	{"10", "%X", "A"},
   154  	{"-10", "%X", "-A"},
   155  	{"10", "%y", "%!y(big.Int=10)"},
   156  	{"-10", "%y", "%!y(big.Int=-10)"},
   157  
   158  	{"10", "%#b", "1010"},
   159  	{"10", "%#o", "012"},
   160  	{"10", "%#d", "10"},
   161  	{"10", "%#v", "10"},
   162  	{"10", "%#x", "0xa"},
   163  	{"10", "%#X", "0XA"},
   164  	{"-10", "%#X", "-0XA"},
   165  	{"10", "%#y", "%!y(big.Int=10)"},
   166  	{"-10", "%#y", "%!y(big.Int=-10)"},
   167  
   168  	{"1234", "%d", "1234"},
   169  	{"1234", "%3d", "1234"},
   170  	{"1234", "%4d", "1234"},
   171  	{"-1234", "%d", "-1234"},
   172  	{"1234", "% 5d", " 1234"},
   173  	{"1234", "%+5d", "+1234"},
   174  	{"1234", "%-5d", "1234 "},
   175  	{"1234", "%x", "4d2"},
   176  	{"1234", "%X", "4D2"},
   177  	{"-1234", "%3x", "-4d2"},
   178  	{"-1234", "%4x", "-4d2"},
   179  	{"-1234", "%5x", " -4d2"},
   180  	{"-1234", "%-5x", "-4d2 "},
   181  	{"1234", "%03d", "1234"},
   182  	{"1234", "%04d", "1234"},
   183  	{"1234", "%05d", "01234"},
   184  	{"1234", "%06d", "001234"},
   185  	{"-1234", "%06d", "-01234"},
   186  	{"1234", "%+06d", "+01234"},
   187  	{"1234", "% 06d", " 01234"},
   188  	{"1234", "%-6d", "1234  "},
   189  	{"1234", "%-06d", "1234  "},
   190  	{"-1234", "%-06d", "-1234 "},
   191  
   192  	{"1234", "%.3d", "1234"},
   193  	{"1234", "%.4d", "1234"},
   194  	{"1234", "%.5d", "01234"},
   195  	{"1234", "%.6d", "001234"},
   196  	{"-1234", "%.3d", "-1234"},
   197  	{"-1234", "%.4d", "-1234"},
   198  	{"-1234", "%.5d", "-01234"},
   199  	{"-1234", "%.6d", "-001234"},
   200  
   201  	{"1234", "%8.3d", "    1234"},
   202  	{"1234", "%8.4d", "    1234"},
   203  	{"1234", "%8.5d", "   01234"},
   204  	{"1234", "%8.6d", "  001234"},
   205  	{"-1234", "%8.3d", "   -1234"},
   206  	{"-1234", "%8.4d", "   -1234"},
   207  	{"-1234", "%8.5d", "  -01234"},
   208  	{"-1234", "%8.6d", " -001234"},
   209  
   210  	{"1234", "%+8.3d", "   +1234"},
   211  	{"1234", "%+8.4d", "   +1234"},
   212  	{"1234", "%+8.5d", "  +01234"},
   213  	{"1234", "%+8.6d", " +001234"},
   214  	{"-1234", "%+8.3d", "   -1234"},
   215  	{"-1234", "%+8.4d", "   -1234"},
   216  	{"-1234", "%+8.5d", "  -01234"},
   217  	{"-1234", "%+8.6d", " -001234"},
   218  
   219  	{"1234", "% 8.3d", "    1234"},
   220  	{"1234", "% 8.4d", "    1234"},
   221  	{"1234", "% 8.5d", "   01234"},
   222  	{"1234", "% 8.6d", "  001234"},
   223  	{"-1234", "% 8.3d", "   -1234"},
   224  	{"-1234", "% 8.4d", "   -1234"},
   225  	{"-1234", "% 8.5d", "  -01234"},
   226  	{"-1234", "% 8.6d", " -001234"},
   227  
   228  	{"1234", "%.3x", "4d2"},
   229  	{"1234", "%.4x", "04d2"},
   230  	{"1234", "%.5x", "004d2"},
   231  	{"1234", "%.6x", "0004d2"},
   232  	{"-1234", "%.3x", "-4d2"},
   233  	{"-1234", "%.4x", "-04d2"},
   234  	{"-1234", "%.5x", "-004d2"},
   235  	{"-1234", "%.6x", "-0004d2"},
   236  
   237  	{"1234", "%8.3x", "     4d2"},
   238  	{"1234", "%8.4x", "    04d2"},
   239  	{"1234", "%8.5x", "   004d2"},
   240  	{"1234", "%8.6x", "  0004d2"},
   241  	{"-1234", "%8.3x", "    -4d2"},
   242  	{"-1234", "%8.4x", "   -04d2"},
   243  	{"-1234", "%8.5x", "  -004d2"},
   244  	{"-1234", "%8.6x", " -0004d2"},
   245  
   246  	{"1234", "%+8.3x", "    +4d2"},
   247  	{"1234", "%+8.4x", "   +04d2"},
   248  	{"1234", "%+8.5x", "  +004d2"},
   249  	{"1234", "%+8.6x", " +0004d2"},
   250  	{"-1234", "%+8.3x", "    -4d2"},
   251  	{"-1234", "%+8.4x", "   -04d2"},
   252  	{"-1234", "%+8.5x", "  -004d2"},
   253  	{"-1234", "%+8.6x", " -0004d2"},
   254  
   255  	{"1234", "% 8.3x", "     4d2"},
   256  	{"1234", "% 8.4x", "    04d2"},
   257  	{"1234", "% 8.5x", "   004d2"},
   258  	{"1234", "% 8.6x", "  0004d2"},
   259  	{"1234", "% 8.7x", " 00004d2"},
   260  	{"1234", "% 8.8x", " 000004d2"},
   261  	{"-1234", "% 8.3x", "    -4d2"},
   262  	{"-1234", "% 8.4x", "   -04d2"},
   263  	{"-1234", "% 8.5x", "  -004d2"},
   264  	{"-1234", "% 8.6x", " -0004d2"},
   265  	{"-1234", "% 8.7x", "-00004d2"},
   266  	{"-1234", "% 8.8x", "-000004d2"},
   267  
   268  	{"1234", "%-8.3d", "1234    "},
   269  	{"1234", "%-8.4d", "1234    "},
   270  	{"1234", "%-8.5d", "01234   "},
   271  	{"1234", "%-8.6d", "001234  "},
   272  	{"1234", "%-8.7d", "0001234 "},
   273  	{"1234", "%-8.8d", "00001234"},
   274  	{"-1234", "%-8.3d", "-1234   "},
   275  	{"-1234", "%-8.4d", "-1234   "},
   276  	{"-1234", "%-8.5d", "-01234  "},
   277  	{"-1234", "%-8.6d", "-001234 "},
   278  	{"-1234", "%-8.7d", "-0001234"},
   279  	{"-1234", "%-8.8d", "-00001234"},
   280  
   281  	{"16777215", "%b", "111111111111111111111111"}, // 2**24 - 1
   282  
   283  	{"0", "%.d", ""},
   284  	{"0", "%.0d", ""},
   285  	{"0", "%3.d", ""},
   286  }
   287  
   288  func TestFormat(t *testing.T) {
   289  	for i, test := range formatTests {
   290  		var x *Int
   291  		if test.input != "<nil>" {
   292  			var ok bool
   293  			x, ok = new(Int).SetString(test.input, 0)
   294  			if !ok {
   295  				t.Errorf("#%d failed reading input %s", i, test.input)
   296  			}
   297  		}
   298  		output := fmt.Sprintf(test.format, x)
   299  		if output != test.output {
   300  			t.Errorf("#%d got %q; want %q, {%q, %q, %q}", i, output, test.output, test.input, test.format, test.output)
   301  		}
   302  	}
   303  }
   304  
   305  var scanTests = []struct {
   306  	input     string
   307  	format    string
   308  	output    string
   309  	remaining int
   310  }{
   311  	{"1010", "%b", "10", 0},
   312  	{"0b1010", "%v", "10", 0},
   313  	{"12", "%o", "10", 0},
   314  	{"012", "%v", "10", 0},
   315  	{"10", "%d", "10", 0},
   316  	{"10", "%v", "10", 0},
   317  	{"a", "%x", "10", 0},
   318  	{"0xa", "%v", "10", 0},
   319  	{"A", "%X", "10", 0},
   320  	{"-A", "%X", "-10", 0},
   321  	{"+0b1011001", "%v", "89", 0},
   322  	{"0xA", "%v", "10", 0},
   323  	{"0 ", "%v", "0", 1},
   324  	{"2+3", "%v", "2", 2},
   325  	{"0XABC 12", "%v", "2748", 3},
   326  }
   327  
   328  func TestScan(t *testing.T) {
   329  	var buf bytes.Buffer
   330  	for i, test := range scanTests {
   331  		x := new(Int)
   332  		buf.Reset()
   333  		buf.WriteString(test.input)
   334  		if _, err := fmt.Fscanf(&buf, test.format, x); err != nil {
   335  			t.Errorf("#%d error: %s", i, err)
   336  		}
   337  		if x.String() != test.output {
   338  			t.Errorf("#%d got %s; want %s", i, x.String(), test.output)
   339  		}
   340  		if buf.Len() != test.remaining {
   341  			t.Errorf("#%d got %d bytes remaining; want %d", i, buf.Len(), test.remaining)
   342  		}
   343  	}
   344  }