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 fmt_test 6 7 import ( 8 "bufio" 9 "bytes" 10 "errors" 11 . "fmt" 12 "io" 13 "math" 14 "reflect" 15 "regexp" 16 "strings" 17 "testing" 18 "unicode/utf8" 19 ) 20 21 type ScanTest struct { 22 text string 23 in interface{} 24 out interface{} 25 } 26 27 type ScanfTest struct { 28 format string 29 text string 30 in interface{} 31 out interface{} 32 } 33 34 type ScanfMultiTest struct { 35 format string 36 text string 37 in []interface{} 38 out []interface{} 39 err string 40 } 41 42 var ( 43 boolVal bool 44 intVal int 45 int8Val int8 46 int16Val int16 47 int32Val int32 48 int64Val int64 49 uintVal uint 50 uint8Val uint8 51 uint16Val uint16 52 uint32Val uint32 53 uint64Val uint64 54 float32Val float32 55 float64Val float64 56 stringVal string 57 bytesVal []byte 58 runeVal rune 59 complex64Val complex64 60 complex128Val complex128 61 renamedBoolVal renamedBool 62 renamedIntVal renamedInt 63 renamedInt8Val renamedInt8 64 renamedInt16Val renamedInt16 65 renamedInt32Val renamedInt32 66 renamedInt64Val renamedInt64 67 renamedUintVal renamedUint 68 renamedUint8Val renamedUint8 69 renamedUint16Val renamedUint16 70 renamedUint32Val renamedUint32 71 renamedUint64Val renamedUint64 72 renamedUintptrVal renamedUintptr 73 renamedStringVal renamedString 74 renamedBytesVal renamedBytes 75 renamedFloat32Val renamedFloat32 76 renamedFloat64Val renamedFloat64 77 renamedComplex64Val renamedComplex64 78 renamedComplex128Val renamedComplex128 79 ) 80 81 type FloatTest struct { 82 text string 83 in float64 84 out float64 85 } 86 87 // Xs accepts any non-empty run of the verb character 88 type Xs string 89 90 func (x *Xs) Scan(state ScanState, verb rune) error { 91 tok, err := state.Token(true, func(r rune) bool { return r == verb }) 92 if err != nil { 93 return err 94 } 95 s := string(tok) 96 if !regexp.MustCompile("^" + string(verb) + "+$").MatchString(s) { 97 return errors.New("syntax error for xs") 98 } 99 *x = Xs(s) 100 return nil 101 } 102 103 var xVal Xs 104 105 // IntString accepts an integer followed immediately by a string. 106 // It tests the embedding of a scan within a scan. 107 type IntString struct { 108 i int 109 s string 110 } 111 112 func (s *IntString) Scan(state ScanState, verb rune) error { 113 if _, err := Fscan(state, &s.i); err != nil { 114 return err 115 } 116 117 tok, err := state.Token(true, nil) 118 if err != nil { 119 return err 120 } 121 s.s = string(tok) 122 return nil 123 } 124 125 var intStringVal IntString 126 127 // myStringReader implements Read but not ReadRune, allowing us to test our readRune wrapper 128 // type that creates something that can read runes given only Read(). 129 type myStringReader struct { 130 r *strings.Reader 131 } 132 133 func (s *myStringReader) Read(p []byte) (n int, err error) { 134 return s.r.Read(p) 135 } 136 137 func newReader(s string) *myStringReader { 138 return &myStringReader{strings.NewReader(s)} 139 } 140 141 var scanTests = []ScanTest{ 142 // Basic types 143 {"T\n", &boolVal, true}, // boolean test vals toggle to be sure they are written 144 {"F\n", &boolVal, false}, // restored to zero value 145 {"21\n", &intVal, 21}, 146 {"0\n", &intVal, 0}, 147 {"000\n", &intVal, 0}, 148 {"0x10\n", &intVal, 0x10}, 149 {"-0x10\n", &intVal, -0x10}, 150 {"0377\n", &intVal, 0377}, 151 {"-0377\n", &intVal, -0377}, 152 {"0\n", &uintVal, uint(0)}, 153 {"000\n", &uintVal, uint(0)}, 154 {"0x10\n", &uintVal, uint(0x10)}, 155 {"0377\n", &uintVal, uint(0377)}, 156 {"22\n", &int8Val, int8(22)}, 157 {"23\n", &int16Val, int16(23)}, 158 {"24\n", &int32Val, int32(24)}, 159 {"25\n", &int64Val, int64(25)}, 160 {"127\n", &int8Val, int8(127)}, 161 {"-21\n", &intVal, -21}, 162 {"-22\n", &int8Val, int8(-22)}, 163 {"-23\n", &int16Val, int16(-23)}, 164 {"-24\n", &int32Val, int32(-24)}, 165 {"-25\n", &int64Val, int64(-25)}, 166 {"-128\n", &int8Val, int8(-128)}, 167 {"+21\n", &intVal, +21}, 168 {"+22\n", &int8Val, int8(+22)}, 169 {"+23\n", &int16Val, int16(+23)}, 170 {"+24\n", &int32Val, int32(+24)}, 171 {"+25\n", &int64Val, int64(+25)}, 172 {"+127\n", &int8Val, int8(+127)}, 173 {"26\n", &uintVal, uint(26)}, 174 {"27\n", &uint8Val, uint8(27)}, 175 {"28\n", &uint16Val, uint16(28)}, 176 {"29\n", &uint32Val, uint32(29)}, 177 {"30\n", &uint64Val, uint64(30)}, 178 {"255\n", &uint8Val, uint8(255)}, 179 {"32767\n", &int16Val, int16(32767)}, 180 {"2.3\n", &float64Val, 2.3}, 181 {"2.3e1\n", &float32Val, float32(2.3e1)}, 182 {"2.3e2\n", &float64Val, 2.3e2}, 183 {"2.3p2\n", &float64Val, 2.3 * 4}, 184 {"2.3p+2\n", &float64Val, 2.3 * 4}, 185 {"2.3p+66\n", &float64Val, 2.3 * (1 << 32) * (1 << 32) * 4}, 186 {"2.3p-66\n", &float64Val, 2.3 / ((1 << 32) * (1 << 32) * 4)}, 187 {"2.35\n", &stringVal, "2.35"}, 188 {"2345678\n", &bytesVal, []byte("2345678")}, 189 {"(3.4e1-2i)\n", &complex128Val, 3.4e1 - 2i}, 190 {"-3.45e1-3i\n", &complex64Val, complex64(-3.45e1 - 3i)}, 191 {"-.45e1-1e2i\n", &complex128Val, complex128(-.45e1 - 100i)}, 192 {"hello\n", &stringVal, "hello"}, 193 194 // Carriage-return followed by newline. (We treat \r\n as \n always.) 195 {"hello\r\n", &stringVal, "hello"}, 196 {"27\r\n", &uint8Val, uint8(27)}, 197 198 // Renamed types 199 {"true\n", &renamedBoolVal, renamedBool(true)}, 200 {"F\n", &renamedBoolVal, renamedBool(false)}, 201 {"101\n", &renamedIntVal, renamedInt(101)}, 202 {"102\n", &renamedIntVal, renamedInt(102)}, 203 {"103\n", &renamedUintVal, renamedUint(103)}, 204 {"104\n", &renamedUintVal, renamedUint(104)}, 205 {"105\n", &renamedInt8Val, renamedInt8(105)}, 206 {"106\n", &renamedInt16Val, renamedInt16(106)}, 207 {"107\n", &renamedInt32Val, renamedInt32(107)}, 208 {"108\n", &renamedInt64Val, renamedInt64(108)}, 209 {"109\n", &renamedUint8Val, renamedUint8(109)}, 210 {"110\n", &renamedUint16Val, renamedUint16(110)}, 211 {"111\n", &renamedUint32Val, renamedUint32(111)}, 212 {"112\n", &renamedUint64Val, renamedUint64(112)}, 213 {"113\n", &renamedUintptrVal, renamedUintptr(113)}, 214 {"114\n", &renamedStringVal, renamedString("114")}, 215 {"115\n", &renamedBytesVal, renamedBytes([]byte("115"))}, 216 217 // Custom scanners. 218 {" vvv ", &xVal, Xs("vvv")}, 219 {" 1234hello", &intStringVal, IntString{1234, "hello"}}, 220 221 // Fixed bugs 222 {"2147483648\n", &int64Val, int64(2147483648)}, // was: integer overflow 223 } 224 225 var scanfTests = []ScanfTest{ 226 {"%v", "TRUE\n", &boolVal, true}, 227 {"%t", "false\n", &boolVal, false}, 228 {"%v", "-71\n", &intVal, -71}, 229 {"%v", "0377\n", &intVal, 0377}, 230 {"%v", "0x44\n", &intVal, 0x44}, 231 {"%d", "72\n", &intVal, 72}, 232 {"%c", "a\n", &runeVal, 'a'}, 233 {"%c", "\u5072\n", &runeVal, '\u5072'}, 234 {"%c", "\u1234\n", &runeVal, '\u1234'}, 235 {"%d", "73\n", &int8Val, int8(73)}, 236 {"%d", "+74\n", &int16Val, int16(74)}, 237 {"%d", "75\n", &int32Val, int32(75)}, 238 {"%d", "76\n", &int64Val, int64(76)}, 239 {"%b", "1001001\n", &intVal, 73}, 240 {"%o", "075\n", &intVal, 075}, 241 {"%x", "a75\n", &intVal, 0xa75}, 242 {"%v", "71\n", &uintVal, uint(71)}, 243 {"%d", "72\n", &uintVal, uint(72)}, 244 {"%d", "73\n", &uint8Val, uint8(73)}, 245 {"%d", "74\n", &uint16Val, uint16(74)}, 246 {"%d", "75\n", &uint32Val, uint32(75)}, 247 {"%d", "76\n", &uint64Val, uint64(76)}, 248 {"%b", "1001001\n", &uintVal, uint(73)}, 249 {"%o", "075\n", &uintVal, uint(075)}, 250 {"%x", "a75\n", &uintVal, uint(0xa75)}, 251 {"%x", "A75\n", &uintVal, uint(0xa75)}, 252 {"%U", "U+1234\n", &intVal, int(0x1234)}, 253 {"%U", "U+4567\n", &uintVal, uint(0x4567)}, 254 255 // Strings 256 {"%s", "using-%s\n", &stringVal, "using-%s"}, 257 {"%x", "7573696e672d2578\n", &stringVal, "using-%x"}, 258 {"%q", `"quoted\twith\\do\u0075bl\x65s"` + "\n", &stringVal, "quoted\twith\\doubles"}, 259 {"%q", "`quoted with backs`\n", &stringVal, "quoted with backs"}, 260 261 // Byte slices 262 {"%s", "bytes-%s\n", &bytesVal, []byte("bytes-%s")}, 263 {"%x", "62797465732d2578\n", &bytesVal, []byte("bytes-%x")}, 264 {"%q", `"bytes\rwith\vdo\u0075bl\x65s"` + "\n", &bytesVal, []byte("bytes\rwith\vdoubles")}, 265 {"%q", "`bytes with backs`\n", &bytesVal, []byte("bytes with backs")}, 266 267 // Renamed types 268 {"%v\n", "true\n", &renamedBoolVal, renamedBool(true)}, 269 {"%t\n", "F\n", &renamedBoolVal, renamedBool(false)}, 270 {"%v", "101\n", &renamedIntVal, renamedInt(101)}, 271 {"%c", "\u0101\n", &renamedIntVal, renamedInt('\u0101')}, 272 {"%o", "0146\n", &renamedIntVal, renamedInt(102)}, 273 {"%v", "103\n", &renamedUintVal, renamedUint(103)}, 274 {"%d", "104\n", &renamedUintVal, renamedUint(104)}, 275 {"%d", "105\n", &renamedInt8Val, renamedInt8(105)}, 276 {"%d", "106\n", &renamedInt16Val, renamedInt16(106)}, 277 {"%d", "107\n", &renamedInt32Val, renamedInt32(107)}, 278 {"%d", "108\n", &renamedInt64Val, renamedInt64(108)}, 279 {"%x", "6D\n", &renamedUint8Val, renamedUint8(109)}, 280 {"%o", "0156\n", &renamedUint16Val, renamedUint16(110)}, 281 {"%d", "111\n", &renamedUint32Val, renamedUint32(111)}, 282 {"%d", "112\n", &renamedUint64Val, renamedUint64(112)}, 283 {"%d", "113\n", &renamedUintptrVal, renamedUintptr(113)}, 284 {"%s", "114\n", &renamedStringVal, renamedString("114")}, 285 {"%q", "\"1155\"\n", &renamedBytesVal, renamedBytes([]byte("1155"))}, 286 {"%g", "116e1\n", &renamedFloat32Val, renamedFloat32(116e1)}, 287 {"%g", "-11.7e+1", &renamedFloat64Val, renamedFloat64(-11.7e+1)}, 288 {"%g", "11+6e1i\n", &renamedComplex64Val, renamedComplex64(11 + 6e1i)}, 289 {"%g", "-11.+7e+1i", &renamedComplex128Val, renamedComplex128(-11. + 7e+1i)}, 290 291 // Interesting formats 292 {"here is\tthe value:%d", "here is the\tvalue:118\n", &intVal, 118}, 293 {"%% %%:%d", "% %:119\n", &intVal, 119}, 294 295 // Corner cases 296 {"%x", "FFFFFFFF\n", &uint32Val, uint32(0xFFFFFFFF)}, 297 298 // Custom scanner. 299 {"%s", " sss ", &xVal, Xs("sss")}, 300 {"%2s", "sssss", &xVal, Xs("ss")}, 301 302 // Fixed bugs 303 {"%d\n", "27\n", &intVal, 27}, // ok 304 {"%d\n", "28 \n", &intVal, 28}, // was: "unexpected newline" 305 {"%v", "0", &intVal, 0}, // was: "EOF"; 0 was taken as base prefix and not counted. 306 {"%v", "0", &uintVal, uint(0)}, // was: "EOF"; 0 was taken as base prefix and not counted. 307 {"%c", " ", &uintVal, uint(' ')}, // %c must accept a blank. 308 {"%c", "\t", &uintVal, uint('\t')}, // %c must accept any space. 309 {"%c", "\n", &uintVal, uint('\n')}, // %c must accept any space. 310 } 311 312 var overflowTests = []ScanTest{ 313 {"128", &int8Val, 0}, 314 {"32768", &int16Val, 0}, 315 {"-129", &int8Val, 0}, 316 {"-32769", &int16Val, 0}, 317 {"256", &uint8Val, 0}, 318 {"65536", &uint16Val, 0}, 319 {"1e100", &float32Val, 0}, 320 {"1e500", &float64Val, 0}, 321 {"(1e100+0i)", &complex64Val, 0}, 322 {"(1+1e100i)", &complex64Val, 0}, 323 {"(1-1e500i)", &complex128Val, 0}, 324 } 325 326 var truth bool 327 var i, j, k int 328 var f float64 329 var s, t string 330 var c complex128 331 var x, y Xs 332 var z IntString 333 var r1, r2, r3 rune 334 335 var multiTests = []ScanfMultiTest{ 336 {"", "", []interface{}{}, []interface{}{}, ""}, 337 {"%d", "23", args(&i), args(23), ""}, 338 {"%2s%3s", "22333", args(&s, &t), args("22", "333"), ""}, 339 {"%2d%3d", "44555", args(&i, &j), args(44, 555), ""}, 340 {"%2d.%3d", "66.777", args(&i, &j), args(66, 777), ""}, 341 {"%d, %d", "23, 18", args(&i, &j), args(23, 18), ""}, 342 {"%3d22%3d", "33322333", args(&i, &j), args(333, 333), ""}, 343 {"%6vX=%3fY", "3+2iX=2.5Y", args(&c, &f), args((3 + 2i), 2.5), ""}, 344 {"%d%s", "123abc", args(&i, &s), args(123, "abc"), ""}, 345 {"%c%c%c", "2\u50c2X", args(&r1, &r2, &r3), args('2', '\u50c2', 'X'), ""}, 346 {"%5s%d", " 1234567 ", args(&s, &i), args("12345", 67), ""}, 347 {"%5s%d", " 12 34 567 ", args(&s, &i), args("12", 34), ""}, 348 349 // Custom scanners. 350 {"%e%f", "eefffff", args(&x, &y), args(Xs("ee"), Xs("fffff")), ""}, 351 {"%4v%s", "12abcd", args(&z, &s), args(IntString{12, "ab"}, "cd"), ""}, 352 353 // Errors 354 {"%t", "23 18", args(&i), nil, "bad verb"}, 355 {"%d %d %d", "23 18", args(&i, &j), args(23, 18), "too few operands"}, 356 {"%d %d", "23 18 27", args(&i, &j, &k), args(23, 18), "too many operands"}, 357 {"%c", "\u0100", args(&int8Val), nil, "overflow"}, 358 {"X%d", "10X", args(&intVal), nil, "input does not match format"}, 359 360 // Bad UTF-8: should see every byte. 361 {"%c%c%c", "\xc2X\xc2", args(&r1, &r2, &r3), args(utf8.RuneError, 'X', utf8.RuneError), ""}, 362 363 // Fixed bugs 364 {"%v%v", "FALSE23", args(&truth, &i), args(false, 23), ""}, 365 } 366 367 func testScan(name string, t *testing.T, scan func(r io.Reader, a ...interface{}) (int, error)) { 368 for _, test := range scanTests { 369 var r io.Reader 370 if name == "StringReader" { 371 r = strings.NewReader(test.text) 372 } else { 373 r = newReader(test.text) 374 } 375 n, err := scan(r, test.in) 376 if err != nil { 377 m := "" 378 if n > 0 { 379 m = Sprintf(" (%d fields ok)", n) 380 } 381 t.Errorf("%s got error scanning %q: %s%s", name, test.text, err, m) 382 continue 383 } 384 if n != 1 { 385 t.Errorf("%s count error on entry %q: got %d", name, test.text, n) 386 continue 387 } 388 // The incoming value may be a pointer 389 v := reflect.ValueOf(test.in) 390 if p := v; p.Kind() == reflect.Ptr { 391 v = p.Elem() 392 } 393 val := v.Interface() 394 if !reflect.DeepEqual(val, test.out) { 395 t.Errorf("%s scanning %q: expected %#v got %#v, type %T", name, test.text, test.out, val, val) 396 } 397 } 398 } 399 400 func TestScan(t *testing.T) { 401 testScan("StringReader", t, Fscan) 402 } 403 404 func TestMyReaderScan(t *testing.T) { 405 testScan("myStringReader", t, Fscan) 406 } 407 408 func TestScanln(t *testing.T) { 409 testScan("StringReader", t, Fscanln) 410 } 411 412 func TestMyReaderScanln(t *testing.T) { 413 testScan("myStringReader", t, Fscanln) 414 } 415 416 func TestScanf(t *testing.T) { 417 for _, test := range scanfTests { 418 n, err := Sscanf(test.text, test.format, test.in) 419 if err != nil { 420 t.Errorf("got error scanning (%q, %q): %s", test.format, test.text, err) 421 continue 422 } 423 if n != 1 { 424 t.Errorf("count error on entry (%q, %q): got %d", test.format, test.text, n) 425 continue 426 } 427 // The incoming value may be a pointer 428 v := reflect.ValueOf(test.in) 429 if p := v; p.Kind() == reflect.Ptr { 430 v = p.Elem() 431 } 432 val := v.Interface() 433 if !reflect.DeepEqual(val, test.out) { 434 t.Errorf("scanning (%q, %q): expected %#v got %#v, type %T", test.format, test.text, test.out, val, val) 435 } 436 } 437 } 438 439 func TestScanOverflow(t *testing.T) { 440 // different machines and different types report errors with different strings. 441 re := regexp.MustCompile("overflow|too large|out of range|not representable") 442 for _, test := range overflowTests { 443 _, err := Sscan(test.text, test.in) 444 if err == nil { 445 t.Errorf("expected overflow scanning %q", test.text) 446 continue 447 } 448 if !re.MatchString(err.Error()) { 449 t.Errorf("expected overflow error scanning %q: %s", test.text, err) 450 } 451 } 452 } 453 454 func verifyNaN(str string, t *testing.T) { 455 var f float64 456 var f32 float32 457 var f64 float64 458 text := str + " " + str + " " + str 459 n, err := Fscan(strings.NewReader(text), &f, &f32, &f64) 460 if err != nil { 461 t.Errorf("got error scanning %q: %s", text, err) 462 } 463 if n != 3 { 464 t.Errorf("count error scanning %q: got %d", text, n) 465 } 466 if !math.IsNaN(float64(f)) || !math.IsNaN(float64(f32)) || !math.IsNaN(f64) { 467 t.Errorf("didn't get NaNs scanning %q: got %g %g %g", text, f, f32, f64) 468 } 469 } 470 471 func TestNaN(t *testing.T) { 472 for _, s := range []string{"nan", "NAN", "NaN"} { 473 verifyNaN(s, t) 474 } 475 } 476 477 func verifyInf(str string, t *testing.T) { 478 var f float64 479 var f32 float32 480 var f64 float64 481 text := str + " " + str + " " + str 482 n, err := Fscan(strings.NewReader(text), &f, &f32, &f64) 483 if err != nil { 484 t.Errorf("got error scanning %q: %s", text, err) 485 } 486 if n != 3 { 487 t.Errorf("count error scanning %q: got %d", text, n) 488 } 489 sign := 1 490 if str[0] == '-' { 491 sign = -1 492 } 493 if !math.IsInf(float64(f), sign) || !math.IsInf(float64(f32), sign) || !math.IsInf(f64, sign) { 494 t.Errorf("didn't get right Infs scanning %q: got %g %g %g", text, f, f32, f64) 495 } 496 } 497 498 func TestInf(t *testing.T) { 499 for _, s := range []string{"inf", "+inf", "-inf", "INF", "-INF", "+INF", "Inf", "-Inf", "+Inf"} { 500 verifyInf(s, t) 501 } 502 } 503 504 func testScanfMulti(name string, t *testing.T) { 505 sliceType := reflect.TypeOf(make([]interface{}, 1)) 506 for _, test := range multiTests { 507 var r io.Reader 508 if name == "StringReader" { 509 r = strings.NewReader(test.text) 510 } else { 511 r = newReader(test.text) 512 } 513 n, err := Fscanf(r, test.format, test.in...) 514 if err != nil { 515 if test.err == "" { 516 t.Errorf("got error scanning (%q, %q): %q", test.format, test.text, err) 517 } else if strings.Index(err.Error(), test.err) < 0 { 518 t.Errorf("got wrong error scanning (%q, %q): %q; expected %q", test.format, test.text, err, test.err) 519 } 520 continue 521 } 522 if test.err != "" { 523 t.Errorf("expected error %q error scanning (%q, %q)", test.err, test.format, test.text) 524 } 525 if n != len(test.out) { 526 t.Errorf("count error on entry (%q, %q): expected %d got %d", test.format, test.text, len(test.out), n) 527 continue 528 } 529 // Convert the slice of pointers into a slice of values 530 resultVal := reflect.MakeSlice(sliceType, n, n) 531 for i := 0; i < n; i++ { 532 v := reflect.ValueOf(test.in[i]).Elem() 533 resultVal.Index(i).Set(v) 534 } 535 result := resultVal.Interface() 536 if !reflect.DeepEqual(result, test.out) { 537 t.Errorf("scanning (%q, %q): expected %#v got %#v", test.format, test.text, test.out, result) 538 } 539 } 540 } 541 542 func TestScanfMulti(t *testing.T) { 543 testScanfMulti("StringReader", t) 544 } 545 546 func TestMyReaderScanfMulti(t *testing.T) { 547 testScanfMulti("myStringReader", t) 548 } 549 550 func TestScanMultiple(t *testing.T) { 551 var a int 552 var s string 553 n, err := Sscan("123abc", &a, &s) 554 if n != 2 { 555 t.Errorf("Sscan count error: expected 2: got %d", n) 556 } 557 if err != nil { 558 t.Errorf("Sscan expected no error; got %s", err) 559 } 560 if a != 123 || s != "abc" { 561 t.Errorf("Sscan wrong values: got (%d %q) expected (123 \"abc\")", a, s) 562 } 563 n, err = Sscan("asdf", &s, &a) 564 if n != 1 { 565 t.Errorf("Sscan count error: expected 1: got %d", n) 566 } 567 if err == nil { 568 t.Errorf("Sscan expected error; got none: %s", err) 569 } 570 if s != "asdf" { 571 t.Errorf("Sscan wrong values: got %q expected \"asdf\"", s) 572 } 573 } 574 575 // Empty strings are not valid input when scanning a string. 576 func TestScanEmpty(t *testing.T) { 577 var s1, s2 string 578 n, err := Sscan("abc", &s1, &s2) 579 if n != 1 { 580 t.Errorf("Sscan count error: expected 1: got %d", n) 581 } 582 if err == nil { 583 t.Error("Sscan <one item> expected error; got none") 584 } 585 if s1 != "abc" { 586 t.Errorf("Sscan wrong values: got %q expected \"abc\"", s1) 587 } 588 n, err = Sscan("", &s1, &s2) 589 if n != 0 { 590 t.Errorf("Sscan count error: expected 0: got %d", n) 591 } 592 if err == nil { 593 t.Error("Sscan <empty> expected error; got none") 594 } 595 // Quoted empty string is OK. 596 n, err = Sscanf(`""`, "%q", &s1) 597 if n != 1 { 598 t.Errorf("Sscanf count error: expected 1: got %d", n) 599 } 600 if err != nil { 601 t.Errorf("Sscanf <empty> expected no error with quoted string; got %s", err) 602 } 603 } 604 605 func TestScanNotPointer(t *testing.T) { 606 r := strings.NewReader("1") 607 var a int 608 _, err := Fscan(r, a) 609 if err == nil { 610 t.Error("expected error scanning non-pointer") 611 } else if strings.Index(err.Error(), "pointer") < 0 { 612 t.Errorf("expected pointer error scanning non-pointer, got: %s", err) 613 } 614 } 615 616 func TestScanlnNoNewline(t *testing.T) { 617 var a int 618 _, err := Sscanln("1 x\n", &a) 619 if err == nil { 620 t.Error("expected error scanning string missing newline") 621 } else if strings.Index(err.Error(), "newline") < 0 { 622 t.Errorf("expected newline error scanning string missing newline, got: %s", err) 623 } 624 } 625 626 func TestScanlnWithMiddleNewline(t *testing.T) { 627 r := strings.NewReader("123\n456\n") 628 var a, b int 629 _, err := Fscanln(r, &a, &b) 630 if err == nil { 631 t.Error("expected error scanning string with extra newline") 632 } else if strings.Index(err.Error(), "newline") < 0 { 633 t.Errorf("expected newline error scanning string with extra newline, got: %s", err) 634 } 635 } 636 637 // eofCounter is a special Reader that counts reads at end of file. 638 type eofCounter struct { 639 reader *strings.Reader 640 eofCount int 641 } 642 643 func (ec *eofCounter) Read(b []byte) (n int, err error) { 644 n, err = ec.reader.Read(b) 645 if n == 0 { 646 ec.eofCount++ 647 } 648 return 649 } 650 651 // TestEOF verifies that when we scan, we see at most EOF once per call to a 652 // Scan function, and then only when it's really an EOF. 653 func TestEOF(t *testing.T) { 654 ec := &eofCounter{strings.NewReader("123\n"), 0} 655 var a int 656 n, err := Fscanln(ec, &a) 657 if err != nil { 658 t.Error("unexpected error", err) 659 } 660 if n != 1 { 661 t.Error("expected to scan one item, got", n) 662 } 663 if ec.eofCount != 0 { 664 t.Error("expected zero EOFs", ec.eofCount) 665 ec.eofCount = 0 // reset for next test 666 } 667 n, err = Fscanln(ec, &a) 668 if err == nil { 669 t.Error("expected error scanning empty string") 670 } 671 if n != 0 { 672 t.Error("expected to scan zero items, got", n) 673 } 674 if ec.eofCount != 1 { 675 t.Error("expected one EOF, got", ec.eofCount) 676 } 677 } 678 679 // TestEOFAtEndOfInput verifies that we see an EOF error if we run out of input. 680 // This was a buglet: we used to get "expected integer". 681 func TestEOFAtEndOfInput(t *testing.T) { 682 var i, j int 683 n, err := Sscanf("23", "%d %d", &i, &j) 684 if n != 1 || i != 23 { 685 t.Errorf("Sscanf expected one value of 23; got %d %d", n, i) 686 } 687 if err != io.EOF { 688 t.Errorf("Sscanf expected EOF; got %q", err) 689 } 690 n, err = Sscan("234", &i, &j) 691 if n != 1 || i != 234 { 692 t.Errorf("Sscan expected one value of 234; got %d %d", n, i) 693 } 694 if err != io.EOF { 695 t.Errorf("Sscan expected EOF; got %q", err) 696 } 697 // Trailing space is tougher. 698 n, err = Sscan("234 ", &i, &j) 699 if n != 1 || i != 234 { 700 t.Errorf("Sscan expected one value of 234; got %d %d", n, i) 701 } 702 if err != io.EOF { 703 t.Errorf("Sscan expected EOF; got %q", err) 704 } 705 } 706 707 var eofTests = []struct { 708 format string 709 v interface{} 710 }{ 711 {"%s", &stringVal}, 712 {"%q", &stringVal}, 713 {"%x", &stringVal}, 714 {"%v", &stringVal}, 715 {"%v", &bytesVal}, 716 {"%v", &intVal}, 717 {"%v", &uintVal}, 718 {"%v", &boolVal}, 719 {"%v", &float32Val}, 720 {"%v", &complex64Val}, 721 {"%v", &renamedStringVal}, 722 {"%v", &renamedBytesVal}, 723 {"%v", &renamedIntVal}, 724 {"%v", &renamedUintVal}, 725 {"%v", &renamedBoolVal}, 726 {"%v", &renamedFloat32Val}, 727 {"%v", &renamedComplex64Val}, 728 } 729 730 func TestEOFAllTypes(t *testing.T) { 731 for i, test := range eofTests { 732 if _, err := Sscanf("", test.format, test.v); err != io.EOF { 733 t.Errorf("#%d: %s %T not eof on empty string: %s", i, test.format, test.v, err) 734 } 735 if _, err := Sscanf(" ", test.format, test.v); err != io.EOF { 736 t.Errorf("#%d: %s %T not eof on trailing blanks: %s", i, test.format, test.v, err) 737 } 738 } 739 } 740 741 // TestUnreadRuneWithBufio verifies that, at least when using bufio, successive 742 // calls to Fscan do not lose runes. 743 func TestUnreadRuneWithBufio(t *testing.T) { 744 r := bufio.NewReader(strings.NewReader("123b")) 745 var i int 746 var a string 747 n, err := Fscanf(r, "%d", &i) 748 if n != 1 || err != nil { 749 t.Errorf("reading int expected one item, no errors; got %d %q", n, err) 750 } 751 if i != 123 { 752 t.Errorf("expected 123; got %d", i) 753 } 754 n, err = Fscanf(r, "%s", &a) 755 if n != 1 || err != nil { 756 t.Errorf("reading string expected one item, no errors; got %d %q", n, err) 757 } 758 if a != "b" { 759 t.Errorf("expected b; got %q", a) 760 } 761 } 762 763 type TwoLines string 764 765 // Scan attempts to read two lines into the object. Scanln should prevent this 766 // because it stops at newline; Scan and Scanf should be fine. 767 func (t *TwoLines) Scan(state ScanState, verb rune) error { 768 chars := make([]rune, 0, 100) 769 for nlCount := 0; nlCount < 2; { 770 c, _, err := state.ReadRune() 771 if err != nil { 772 return err 773 } 774 chars = append(chars, c) 775 if c == '\n' { 776 nlCount++ 777 } 778 } 779 *t = TwoLines(string(chars)) 780 return nil 781 } 782 783 func TestMultiLine(t *testing.T) { 784 input := "abc\ndef\n" 785 // Sscan should work 786 var tscan TwoLines 787 n, err := Sscan(input, &tscan) 788 if n != 1 { 789 t.Errorf("Sscan: expected 1 item; got %d", n) 790 } 791 if err != nil { 792 t.Errorf("Sscan: expected no error; got %s", err) 793 } 794 if string(tscan) != input { 795 t.Errorf("Sscan: expected %q; got %q", input, tscan) 796 } 797 // Sscanf should work 798 var tscanf TwoLines 799 n, err = Sscanf(input, "%s", &tscanf) 800 if n != 1 { 801 t.Errorf("Sscanf: expected 1 item; got %d", n) 802 } 803 if err != nil { 804 t.Errorf("Sscanf: expected no error; got %s", err) 805 } 806 if string(tscanf) != input { 807 t.Errorf("Sscanf: expected %q; got %q", input, tscanf) 808 } 809 // Sscanln should not work 810 var tscanln TwoLines 811 n, err = Sscanln(input, &tscanln) 812 if n != 0 { 813 t.Errorf("Sscanln: expected 0 items; got %d: %q", n, tscanln) 814 } 815 if err == nil { 816 t.Error("Sscanln: expected error; got none") 817 } else if err != io.ErrUnexpectedEOF { 818 t.Errorf("Sscanln: expected io.ErrUnexpectedEOF (ha!); got %s", err) 819 } 820 } 821 822 // simpleReader is a strings.Reader that implements only Read, not ReadRune. 823 // Good for testing readahead. 824 type simpleReader struct { 825 sr *strings.Reader 826 } 827 828 func (s *simpleReader) Read(b []byte) (n int, err error) { 829 return s.sr.Read(b) 830 } 831 832 // TestLineByLineFscanf tests that Fscanf does not read past newline. Issue 833 // 3481. 834 func TestLineByLineFscanf(t *testing.T) { 835 r := &simpleReader{strings.NewReader("1\n2\n")} 836 var i, j int 837 n, err := Fscanf(r, "%v\n", &i) 838 if n != 1 || err != nil { 839 t.Fatalf("first read: %d %q", n, err) 840 } 841 n, err = Fscanf(r, "%v\n", &j) 842 if n != 1 || err != nil { 843 t.Fatalf("second read: %d %q", n, err) 844 } 845 if i != 1 || j != 2 { 846 t.Errorf("wrong values; wanted 1 2 got %d %d", i, j) 847 } 848 } 849 850 // TestScanStateCount verifies the correct byte count is returned. Issue 8512. 851 852 // runeScanner implements the Scanner interface for TestScanStateCount. 853 type runeScanner struct { 854 rune rune 855 size int 856 } 857 858 func (rs *runeScanner) Scan(state ScanState, verb rune) error { 859 r, size, err := state.ReadRune() 860 rs.rune = r 861 rs.size = size 862 return err 863 } 864 865 func TestScanStateCount(t *testing.T) { 866 var a, b, c runeScanner 867 n, err := Sscanf("12", "%c%c%c", &a, &b, &c) 868 if err != nil { 869 t.Fatal(err) 870 } 871 if n != 3 { 872 t.Fatalf("expected 3 items consumed, got %d", n) 873 } 874 if a.rune != '1' || b.rune != '2' || c.rune != '' { 875 t.Errorf("bad scan rune: %q %q %q should be '1' '2' ''", a.rune, b.rune, c.rune) 876 } 877 if a.size != 1 || b.size != 1 || c.size != 3 { 878 t.Errorf("bad scan size: %q %q %q should be 1 1 3", a.size, b.size, c.size) 879 } 880 } 881 882 // RecursiveInt accepts a string matching %d.%d.%d.... 883 // and parses it into a linked list. 884 // It allows us to benchmark recursive descent style scanners. 885 type RecursiveInt struct { 886 i int 887 next *RecursiveInt 888 } 889 890 func (r *RecursiveInt) Scan(state ScanState, verb rune) (err error) { 891 _, err = Fscan(state, &r.i) 892 if err != nil { 893 return 894 } 895 next := new(RecursiveInt) 896 _, err = Fscanf(state, ".%v", next) 897 if err != nil { 898 if err == io.ErrUnexpectedEOF { 899 err = nil 900 } 901 return 902 } 903 r.next = next 904 return 905 } 906 907 // scanInts performs the same scanning task as RecursiveInt.Scan 908 // but without recurring through scanner, so we can compare 909 // performance more directly. 910 func scanInts(r *RecursiveInt, b *bytes.Buffer) (err error) { 911 r.next = nil 912 _, err = Fscan(b, &r.i) 913 if err != nil { 914 return 915 } 916 c, _, err := b.ReadRune() 917 if err != nil { 918 if err == io.EOF { 919 err = nil 920 } 921 return 922 } 923 if c != '.' { 924 return 925 } 926 next := new(RecursiveInt) 927 err = scanInts(next, b) 928 if err == nil { 929 r.next = next 930 } 931 return 932 } 933 934 func makeInts(n int) []byte { 935 var buf bytes.Buffer 936 Fprintf(&buf, "1") 937 for i := 1; i < n; i++ { 938 Fprintf(&buf, ".%d", i+1) 939 } 940 return buf.Bytes() 941 } 942 943 func TestScanInts(t *testing.T) { 944 testScanInts(t, scanInts) 945 testScanInts(t, func(r *RecursiveInt, b *bytes.Buffer) (err error) { 946 _, err = Fscan(b, r) 947 return 948 }) 949 } 950 951 // 800 is small enough to not overflow the stack when using gccgo on a 952 // platform that does not support split stack. 953 const intCount = 800 954 955 func testScanInts(t *testing.T, scan func(*RecursiveInt, *bytes.Buffer) error) { 956 r := new(RecursiveInt) 957 ints := makeInts(intCount) 958 buf := bytes.NewBuffer(ints) 959 err := scan(r, buf) 960 if err != nil { 961 t.Error("unexpected error", err) 962 } 963 i := 1 964 for ; r != nil; r = r.next { 965 if r.i != i { 966 t.Fatalf("bad scan: expected %d got %d", i, r.i) 967 } 968 i++ 969 } 970 if i-1 != intCount { 971 t.Fatalf("bad scan count: expected %d got %d", intCount, i-1) 972 } 973 } 974 975 func BenchmarkScanInts(b *testing.B) { 976 b.ResetTimer() 977 ints := makeInts(intCount) 978 var r RecursiveInt 979 for i := b.N - 1; i >= 0; i-- { 980 buf := bytes.NewBuffer(ints) 981 b.StartTimer() 982 scanInts(&r, buf) 983 b.StopTimer() 984 } 985 } 986 987 func BenchmarkScanRecursiveInt(b *testing.B) { 988 b.ResetTimer() 989 ints := makeInts(intCount) 990 var r RecursiveInt 991 for i := b.N - 1; i >= 0; i-- { 992 buf := bytes.NewBuffer(ints) 993 b.StartTimer() 994 Fscan(buf, &r) 995 b.StopTimer() 996 } 997 } 998 999 // Issue 9124. 1000 // %x on bytes couldn't handle non-space bytes terminating the scan. 1001 func TestHexBytes(t *testing.T) { 1002 var a, b []byte 1003 n, err := Sscanf("00010203", "%x", &a) 1004 if n != 1 || err != nil { 1005 t.Errorf("simple: got count, err = %d, %v; expected 1, nil", n, err) 1006 } 1007 check := func(msg string, x []byte) { 1008 if len(x) != 4 { 1009 t.Errorf("%s: bad length %d", msg, len(x)) 1010 } 1011 for i, b := range x { 1012 if int(b) != i { 1013 t.Errorf("%s: bad x[%d] = %x", msg, i, x[i]) 1014 } 1015 } 1016 } 1017 check("simple", a) 1018 a = nil 1019 1020 n, err = Sscanf("00010203 00010203", "%x %x", &a, &b) 1021 if n != 2 || err != nil { 1022 t.Errorf("simple pair: got count, err = %d, %v; expected 2, nil", n, err) 1023 } 1024 check("simple pair a", a) 1025 check("simple pair b", b) 1026 a = nil 1027 b = nil 1028 1029 n, err = Sscanf("00010203:", "%x", &a) 1030 if n != 1 || err != nil { 1031 t.Errorf("colon: got count, err = %d, %v; expected 1, nil", n, err) 1032 } 1033 check("colon", a) 1034 a = nil 1035 1036 n, err = Sscanf("00010203:00010203", "%x:%x", &a, &b) 1037 if n != 2 || err != nil { 1038 t.Errorf("colon pair: got count, err = %d, %v; expected 2, nil", n, err) 1039 } 1040 check("colon pair a", a) 1041 check("colon pair b", b) 1042 a = nil 1043 b = nil 1044 1045 // This one fails because there is a hex byte after the data, 1046 // that is, an odd number of hex input bytes. 1047 n, err = Sscanf("000102034:", "%x", &a) 1048 if n != 0 || err == nil { 1049 t.Errorf("odd count: got count, err = %d, %v; expected 0, error", n, err) 1050 } 1051 } 1052 1053 func TestScanNewlinesAreSpaces(t *testing.T) { 1054 var a, b int 1055 var tests = []struct { 1056 name string 1057 text string 1058 count int 1059 }{ 1060 {"newlines", "1\n2\n", 2}, 1061 {"no final newline", "1\n2", 2}, 1062 {"newlines with spaces ", "1 \n 2 \n", 2}, 1063 {"no final newline with spaces", "1 \n 2", 2}, 1064 } 1065 for _, test := range tests { 1066 n, err := Sscan(test.text, &a, &b) 1067 if n != test.count { 1068 t.Errorf("%s: expected to scan %d item(s), scanned %d", test.name, test.count, n) 1069 } 1070 if err != nil { 1071 t.Errorf("%s: unexpected error: %s", test.name, err) 1072 } 1073 } 1074 } 1075 1076 func TestScanlnNewlinesTerminate(t *testing.T) { 1077 var a, b int 1078 var tests = []struct { 1079 name string 1080 text string 1081 count int 1082 ok bool 1083 }{ 1084 {"one line one item", "1\n", 1, false}, 1085 {"one line two items with spaces ", " 1 2 \n", 2, true}, 1086 {"one line two items no newline", " 1 2", 2, true}, 1087 {"two lines two items", "1\n2\n", 1, false}, 1088 } 1089 for _, test := range tests { 1090 n, err := Sscanln(test.text, &a, &b) 1091 if n != test.count { 1092 t.Errorf("%s: expected to scan %d item(s), scanned %d", test.name, test.count, n) 1093 } 1094 if test.ok && err != nil { 1095 t.Errorf("%s: unexpected error: %s", test.name, err) 1096 } 1097 if !test.ok && err == nil { 1098 t.Errorf("%s: expected error; got none", test.name) 1099 } 1100 } 1101 } 1102 1103 func TestScanfNewlineMatchFormat(t *testing.T) { 1104 var a, b int 1105 var tests = []struct { 1106 name string 1107 text string 1108 format string 1109 count int 1110 ok bool 1111 }{ 1112 {"newline in both", "1\n2", "%d\n%d\n", 2, true}, 1113 {"newline in input", "1\n2", "%d %d", 1, false}, 1114 {"space-newline in input", "1 \n2", "%d %d", 1, false}, 1115 {"newline in format", "1 2", "%d\n%d", 1, false}, 1116 {"space-newline in format", "1 2", "%d \n%d", 1, false}, 1117 {"space-newline in both", "1 \n2", "%d \n%d", 2, true}, 1118 {"extra space in format", "1\n2", "%d\n %d", 2, true}, 1119 {"two extra spaces in format", "1\n2", "%d \n %d", 2, true}, 1120 } 1121 for _, test := range tests { 1122 n, err := Sscanf(test.text, test.format, &a, &b) 1123 if n != test.count { 1124 t.Errorf("%s: expected to scan %d item(s), scanned %d", test.name, test.count, n) 1125 } 1126 if test.ok && err != nil { 1127 t.Errorf("%s: unexpected error: %s", test.name, err) 1128 } 1129 if !test.ok && err == nil { 1130 t.Errorf("%s: expected error; got none", test.name) 1131 } 1132 } 1133 } 1134 1135 // Test for issue 12090: Was unreading at EOF, double-scanning a byte. 1136 1137 type hexBytes [2]byte 1138 1139 func (h *hexBytes) Scan(ss ScanState, verb rune) error { 1140 var b []byte 1141 _, err := Fscanf(ss, "%4x", &b) 1142 if err != nil { 1143 panic(err) // Really shouldn't happen. 1144 } 1145 copy((*h)[:], b) 1146 return err 1147 } 1148 1149 func TestHexByte(t *testing.T) { 1150 var h hexBytes 1151 n, err := Sscanln("0123\n", &h) 1152 if err != nil { 1153 t.Fatal(err) 1154 } 1155 if n != 1 { 1156 t.Fatalf("expected 1 item; scanned %d", n) 1157 } 1158 if h[0] != 0x01 || h[1] != 0x23 { 1159 t.Fatalf("expected 0123 got %x", h) 1160 } 1161 } 1162