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 }