gitee.com/quant1x/gox@v1.7.6/fastjson/parser_test.go (about) 1 package fastjson 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strings" 7 "testing" 8 "time" 9 ) 10 11 func TestParseRawNumber(t *testing.T) { 12 t.Run("success", func(t *testing.T) { 13 f := func(s, expectedRN, expectedTail string) { 14 t.Helper() 15 16 rn, tail, err := parseRawNumber(s) 17 if err != nil { 18 t.Fatalf("unexpected error: %s", err) 19 } 20 if rn != expectedRN { 21 t.Fatalf("unexpected raw number; got %q; want %q", rn, expectedRN) 22 } 23 if tail != expectedTail { 24 t.Fatalf("unexpected tail; got %q; want %q", tail, expectedTail) 25 } 26 } 27 28 f("0", "0", "") 29 f("0tail", "0", "tail") 30 f("123", "123", "") 31 f("123tail", "123", "tail") 32 f("-123tail", "-123", "tail") 33 f("-12.345tail", "-12.345", "tail") 34 f("-12.345e67tail", "-12.345e67", "tail") 35 f("-12.345E+67 tail", "-12.345E+67", " tail") 36 f("-12.345E-67,tail", "-12.345E-67", ",tail") 37 f("-1234567.8e+90tail", "-1234567.8e+90", "tail") 38 }) 39 40 t.Run("error", func(t *testing.T) { 41 f := func(s, expectedTail string) { 42 t.Helper() 43 44 _, tail, err := parseRawNumber(s) 45 if err == nil { 46 t.Fatalf("expecting non-nil error") 47 } 48 if tail != expectedTail { 49 t.Fatalf("unexpected tail; got %q; want %q", tail, expectedTail) 50 } 51 } 52 53 f("xyz", "xyz") 54 f(" ", " ") 55 f("[", "[") 56 f(",", ",") 57 f("{", "{") 58 f("\"", "\"") 59 }) 60 } 61 62 func TestUnescapeStringBestEffort(t *testing.T) { 63 t.Run("success", func(t *testing.T) { 64 testUnescapeStringBestEffort(t, ``, ``) 65 testUnescapeStringBestEffort(t, `\"`, `"`) 66 testUnescapeStringBestEffort(t, `\\`, `\`) 67 testUnescapeStringBestEffort(t, `\\\"`, `\"`) 68 testUnescapeStringBestEffort(t, `\\\"абв`, `\"абв`) 69 testUnescapeStringBestEffort(t, `йцук\n\"\\Y`, "йцук\n\"\\Y") 70 testUnescapeStringBestEffort(t, `q\u1234we`, "q\u1234we") 71 testUnescapeStringBestEffort(t, `п\ud83e\udd2dи`, "п🤭и") 72 }) 73 74 t.Run("error", func(t *testing.T) { 75 testUnescapeStringBestEffort(t, `\`, ``) 76 testUnescapeStringBestEffort(t, `foo\qwe`, `foo\qwe`) 77 testUnescapeStringBestEffort(t, `\"x\uyz\"`, `"x\uyz"`) 78 testUnescapeStringBestEffort(t, `\u12\"пролw`, `\u12"пролw`) 79 testUnescapeStringBestEffort(t, `п\ud83eи`, "п\\ud83eи") 80 }) 81 } 82 83 func testUnescapeStringBestEffort(t *testing.T, s, expectedS string) { 84 t.Helper() 85 86 // unescapeString modifies the original s, so call it 87 // on a byte slice copy. 88 b := append([]byte{}, s...) 89 us := unescapeStringBestEffort(b2s(b)) 90 if us != expectedS { 91 t.Fatalf("unexpected unescaped string; got %q; want %q", us, expectedS) 92 } 93 } 94 95 func TestParseRawString(t *testing.T) { 96 t.Run("success", func(t *testing.T) { 97 f := func(s, expectedRS, expectedTail string) { 98 t.Helper() 99 100 rs, tail, err := parseRawString(s[1:]) 101 if err != nil { 102 t.Fatalf("unexpected error on parseRawString: %s", err) 103 } 104 if rs != expectedRS { 105 t.Fatalf("unexpected string on parseRawString; got %q; want %q", rs, expectedRS) 106 } 107 if tail != expectedTail { 108 t.Fatalf("unexpected tail on parseRawString; got %q; want %q", tail, expectedTail) 109 } 110 111 // parseRawKey results must be identical to parseRawString. 112 rs, tail, err = parseRawKey(s[1:], false) 113 if err != nil { 114 t.Fatalf("unexpected error on parseRawKey: %s", err) 115 } 116 if rs != expectedRS { 117 t.Fatalf("unexpected string on parseRawKey; got %q; want %q", rs, expectedRS) 118 } 119 if tail != expectedTail { 120 t.Fatalf("unexpected tail on parseRawKey; got %q; want %q", tail, expectedTail) 121 } 122 } 123 124 f(`""`, "", "") 125 f(`""xx`, "", "xx") 126 f(`"foobar"`, "foobar", "") 127 f(`"foobar"baz`, "foobar", "baz") 128 f(`"\""`, `\"`, "") 129 f(`"\""tail`, `\"`, "tail") 130 f(`"\\"`, `\\`, "") 131 f(`"\\"tail`, `\\`, "tail") 132 f(`"x\\"`, `x\\`, "") 133 f(`"x\\"tail`, `x\\`, "tail") 134 f(`"x\\y"`, `x\\y`, "") 135 f(`"x\\y"tail`, `x\\y`, "tail") 136 f(`"\\\"й\n\"я"tail`, `\\\"й\n\"я`, "tail") 137 f(`"\\\\\\\\"tail`, `\\\\\\\\`, "tail") 138 }) 139 140 t.Run("error", func(t *testing.T) { 141 f := func(s, expectedTail string) { 142 t.Helper() 143 144 _, tail, err := parseRawString(s[1:]) 145 if err == nil { 146 t.Fatalf("expecting non-nil error on parseRawString") 147 } 148 if tail != expectedTail { 149 t.Fatalf("unexpected tail on parseRawString; got %q; want %q", tail, expectedTail) 150 } 151 152 // parseRawKey results must be identical to parseRawString. 153 _, tail, err = parseRawKey(s[1:], false) 154 if err == nil { 155 t.Fatalf("expecting non-nil error on parseRawKey") 156 } 157 if tail != expectedTail { 158 t.Fatalf("unexpected tail on parseRawKey; got %q; want %q", tail, expectedTail) 159 } 160 } 161 162 f(`"`, "") 163 f(`"unclosed string`, "") 164 f(`"\"`, "") 165 f(`"\"unclosed`, "") 166 f(`"foo\\\\\"тест\n\r\t`, "") 167 }) 168 } 169 170 func TestParserPool(t *testing.T) { 171 var pp ParserPool 172 for i := 0; i < 10; i++ { 173 p := pp.Get() 174 if _, err := p.Parse("null"); err != nil { 175 t.Fatalf("cannot parse null: %s", err) 176 } 177 pp.Put(p) 178 } 179 } 180 181 func TestValueInvalidTypeConversion(t *testing.T) { 182 var p Parser 183 184 v, err := p.Parse(`[{},[],"",123.45,true,null]`) 185 if err != nil { 186 t.Fatalf("unexpected error: %s", err) 187 } 188 a := v.GetArray() 189 190 // object 191 _, err = a[0].Object() 192 if err != nil { 193 t.Fatalf("unexpected error when obtaining object: %s", err) 194 } 195 _, err = a[0].Array() 196 if err == nil { 197 t.Fatalf("expecting non-nil error when trying to obtain array from object") 198 } 199 200 // array 201 _, err = a[1].Array() 202 if err != nil { 203 t.Fatalf("unexpected error when obtaining array: %s", err) 204 } 205 _, err = a[1].Object() 206 if err == nil { 207 t.Fatalf("expecting non-nil error when trying to obtain object from array") 208 } 209 210 // string 211 _, err = a[2].StringBytes() 212 if err != nil { 213 t.Fatalf("unexpected error when obtaining string: %s", err) 214 } 215 _, err = a[2].Int() 216 if err == nil { 217 t.Fatalf("expecting non-nil error when trying to obtain int from string") 218 } 219 220 // number 221 _, err = a[3].Float64() 222 if err != nil { 223 t.Fatalf("unexpected error when obtaining float64: %s", err) 224 } 225 _, err = a[3].StringBytes() 226 if err == nil { 227 t.Fatalf("expecting non-nil error when trying to obtain string from number") 228 } 229 230 // true 231 _, err = a[4].Bool() 232 if err != nil { 233 t.Fatalf("unexpected error when obtaining bool: %s", err) 234 } 235 _, err = a[4].StringBytes() 236 if err == nil { 237 t.Fatalf("expecting non-nil error when trying to obtain string from bool") 238 } 239 240 // null 241 _, err = a[5].Bool() 242 if err == nil { 243 t.Fatalf("expecting non-nil error when trying to obtain bool from null") 244 } 245 } 246 247 func TestT2(t *testing.T) { 248 var p Parser 249 type TestObject struct { 250 field1 string 251 } 252 v, err := p.Parse(`[{day:"2019-04-11",open:"3241.547",high:"3254.126",low:"3185.546",close:"3189.962",volume:"35303187900",ma_price5:3232.587,ma_volume5:41419447120,ma_price10:3181.212,ma_volume10:40779040810,ma_price30:3089.348,ma_volume30:41522822373}]`) 253 if err != nil { 254 t.Errorf("%+v\n", err) 255 } 256 //should.Equal("Hello", obj.field1) 257 fmt.Println(v) 258 } 259 260 func TestValueGetTyped(t *testing.T) { 261 var p Parser 262 263 v, err := p.Parse(`{foo: 123, "bar": "433", "baz": true, "obj":{}, "arr":[1,2,3], 264 "zero_float1": 0.00, 265 "zero_float2": -0e123 266 }`) 267 if err != nil { 268 t.Fatalf("unexpected error: %s", err) 269 } 270 271 if !v.Exists("foo") { 272 t.Fatalf("foo must exist in the v") 273 } 274 if v.Exists("foo", "bar") { 275 t.Fatalf("foo.bar mustn't exist in the v") 276 } 277 if v.Exists("foobar") { 278 t.Fatalf("foobar mustn't exist in the v") 279 } 280 281 o := v.GetObject("obj") 282 os := o.String() 283 if os != "{}" { 284 t.Fatalf("unexpected object; got %s; want %s", os, "{}") 285 } 286 o = v.GetObject("arr") 287 if o != nil { 288 t.Fatalf("unexpected non-nil object: %s", o) 289 } 290 o = v.GetObject("foo", "bar") 291 if o != nil { 292 t.Fatalf("unexpected non-nil object: %s", o) 293 } 294 a := v.GetArray("arr") 295 if len(a) != 3 { 296 t.Fatalf("unexpected array len; got %d; want %d", len(a), 3) 297 } 298 a = v.GetArray("obj") 299 if a != nil { 300 t.Fatalf("unexpected non-nil array: %s", a) 301 } 302 a = v.GetArray("foo", "bar") 303 if a != nil { 304 t.Fatalf("unexpected non-nil array: %s", a) 305 } 306 n := v.GetInt("foo") 307 if n != 123 { 308 t.Fatalf("unexpected value; got %d; want %d", n, 123) 309 } 310 un := v.GetUint("foo") 311 if un != 123 { 312 t.Fatalf("unexpected value; got %d; want %d", un, 123) 313 } 314 n = v.GetInt("bar") 315 if n != 0 { 316 t.Fatalf("unexpected non-zero value; got %d", n) 317 } 318 f := v.GetFloat64("foo") 319 if f != 123.0 { 320 t.Fatalf("unexpected value; got %f; want %f", f, 123.0) 321 } 322 f = v.GetFloat64("bar") 323 if f != 0 { 324 t.Fatalf("unexpected value; got %f; want %f", f, 0.0) 325 } 326 f = v.GetFloat64("foooo", "bar") 327 if f != 0 { 328 t.Fatalf("unexpected value; got %f; want %f", f, 0.0) 329 } 330 f = v.GetFloat64() 331 if f != 0 { 332 t.Fatalf("unexpected value; got %f; want %f", f, 0.0) 333 } 334 sb := v.GetStringBytes("bar") 335 if string(sb) != "433" { 336 t.Fatalf("unexpected value; got %q; want %q", sb, "443") 337 } 338 sb = v.GetStringBytes("foo") 339 if sb != nil { 340 t.Fatalf("unexpected value; got %q; want %q", sb, []byte(nil)) 341 } 342 bv := v.GetBool("baz") 343 if !bv { 344 t.Fatalf("unexpected value; got %v; want %v", bv, true) 345 } 346 bv = v.GetBool("bar") 347 if bv { 348 t.Fatalf("unexpected value; got %v; want %v", bv, false) 349 } 350 351 zv := v.Get("zero_float1") 352 zf, err := zv.Float64() 353 if err != nil { 354 t.Fatalf("unexpected error: %s", err) 355 } 356 if zf != 0 { 357 t.Fatalf("unexpected zero_float1 value: %f. Expecting 0", zf) 358 } 359 360 zv = v.Get("zero_float2") 361 zf, err = zv.Float64() 362 if err != nil { 363 t.Fatalf("unexpected error: %s", err) 364 } 365 if zf != 0 { 366 t.Fatalf("unexpected zero_float1 value: %f. Expecting 0", zf) 367 } 368 } 369 370 func TestVisitNil(t *testing.T) { 371 var p Parser 372 v, err := p.Parse(`{}`) 373 if err != nil { 374 t.Fatalf("unexpected error: %s", err) 375 } 376 o := v.GetObject("non-existing-key") 377 if o != nil { 378 t.Fatalf("obtained an object for non-existing key: %#v", o) 379 } 380 o.Visit(func(k []byte, v *Value) { 381 t.Fatalf("unexpected visit call; k=%q; v=%s", k, v) 382 }) 383 } 384 385 func TestValueGet(t *testing.T) { 386 var pp ParserPool 387 388 p := pp.Get() 389 v, err := p.ParseBytes([]byte(`{"xx":33.33,"foo":[123,{"bar":["baz"],"x":"y"}], "": "empty-key", "empty-value": ""}`)) 390 if err != nil { 391 t.Fatalf("unexpected error: %s", err) 392 } 393 394 t.Run("positive", func(t *testing.T) { 395 sb := v.GetStringBytes("") 396 if string(sb) != "empty-key" { 397 t.Fatalf("unexpected value for empty key; got %q; want %q", sb, "empty-key") 398 } 399 sb = v.GetStringBytes("empty-value") 400 if string(sb) != "" { 401 t.Fatalf("unexpected non-empty value: %q", sb) 402 } 403 404 vv := v.Get("foo", "1") 405 if vv == nil { 406 t.Fatalf("cannot find the required value") 407 } 408 o, err := vv.Object() 409 if err != nil { 410 t.Fatalf("cannot obtain object: %s", err) 411 } 412 413 n := 0 414 o.Visit(func(k []byte, v *Value) { 415 n++ 416 switch string(k) { 417 case "bar": 418 if v.Type() != TypeArray { 419 t.Fatalf("unexpected value type; got %d; want %d", v.Type(), TypeArray) 420 } 421 s := v.String() 422 if s != `["baz"]` { 423 t.Fatalf("unexpected array; got %q; want %q", s, `["baz"]`) 424 } 425 case "x": 426 sb, err := v.StringBytes() 427 if err != nil { 428 t.Fatalf("cannot obtain string: %s", err) 429 } 430 if string(sb) != "y" { 431 t.Fatalf("unexpected string; got %q; want %q", sb, "y") 432 } 433 default: 434 t.Fatalf("unknown key: %s", k) 435 } 436 }) 437 if n != 2 { 438 t.Fatalf("unexpected number of items visited in the array; got %d; want %d", n, 2) 439 } 440 }) 441 442 t.Run("negative", func(t *testing.T) { 443 vv := v.Get("nonexisting", "path") 444 if vv != nil { 445 t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv) 446 } 447 vv = v.Get("foo", "bar", "baz") 448 if vv != nil { 449 t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv) 450 } 451 vv = v.Get("foo", "-123") 452 if vv != nil { 453 t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv) 454 } 455 vv = v.Get("foo", "234") 456 if vv != nil { 457 t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv) 458 } 459 vv = v.Get("xx", "yy") 460 if vv != nil { 461 t.Fatalf("expecting nil value for nonexisting path. Got %#v", vv) 462 } 463 }) 464 465 pp.Put(p) 466 } 467 468 func TestParserParse(t *testing.T) { 469 var p Parser 470 471 t.Run("complex-string", func(t *testing.T) { 472 v, err := p.Parse(`{"тест":1, "\\\"фыва\"":2, "\\\"\u1234x":"\\fЗУ\\\\"}`) 473 if err != nil { 474 t.Fatalf("unexpected error: %s", err) 475 } 476 n := v.GetInt("тест") 477 if n != 1 { 478 t.Fatalf("unexpected int; got %d; want %d", n, 1) 479 } 480 n = v.GetInt(`\"фыва"`) 481 if n != 2 { 482 t.Fatalf("unexpected int; got %d; want %d", n, 2) 483 } 484 sb := v.GetStringBytes("\\\"\u1234x") 485 if string(sb) != `\fЗУ\\` { 486 t.Fatalf("unexpected string; got %q; want %q", sb, `\fЗУ\\`) 487 } 488 }) 489 490 t.Run("invalid-string-escape", func(t *testing.T) { 491 v, err := p.Parse(`"fo\u"`) 492 if err != nil { 493 t.Fatalf("unexpected error when parsing string") 494 } 495 // Make sure only valid string part remains 496 sb, err := v.StringBytes() 497 if err != nil { 498 t.Fatalf("cannot obtain string: %s", err) 499 } 500 if string(sb) != "fo\\u" { 501 t.Fatalf("unexpected string; got %q; want %q", sb, "fo\\u") 502 } 503 504 v, err = p.Parse(`"foo\ubarz2134"`) 505 if err != nil { 506 t.Fatalf("unexpected error when parsing string") 507 } 508 sb, err = v.StringBytes() 509 if err != nil { 510 t.Fatalf("cannot obtain string: %s", err) 511 } 512 if string(sb) != "foo\\ubarz2134" { 513 t.Fatalf("unexpected string; got %q; want %q", sb, "foo") 514 } 515 }) 516 517 t.Run("invalid-number", func(t *testing.T) { 518 v, err := p.Parse("123+456") 519 if err != nil { 520 t.Fatalf("unexpected error when parsing int") 521 } 522 523 // Make sure invalid int isn't parsed. 524 n, err := v.Int() 525 if err == nil { 526 t.Fatalf("expecting non-nil error") 527 } 528 if n != 0 { 529 t.Fatalf("unexpected int; got %d; want %d", n, 0) 530 } 531 }) 532 533 t.Run("empty-fastjson", func(t *testing.T) { 534 _, err := p.Parse("") 535 if err == nil { 536 t.Fatalf("expecting non-nil error when parsing empty fastjson") 537 } 538 _, err = p.Parse("\n\t \n") 539 if err == nil { 540 t.Fatalf("expecting non-nil error when parsing empty fastjson") 541 } 542 }) 543 544 t.Run("invalid-tail", func(t *testing.T) { 545 _, err := p.Parse("123 456") 546 if err == nil { 547 t.Fatalf("expecting non-nil error when parsing invalid tail") 548 } 549 _, err = p.Parse("[] 1223") 550 if err == nil { 551 t.Fatalf("expecting non-nil error when parsing invalid tail") 552 } 553 }) 554 555 t.Run("invalid-fastjson", func(t *testing.T) { 556 f := func(s string) { 557 t.Helper() 558 if _, err := p.Parse(s); err == nil { 559 t.Fatalf("expecting non-nil error when parsing invalid fastjson %q", s) 560 } 561 } 562 563 f("free") 564 f("tree") 565 f("\x00\x10123") 566 f("1 \n\x01") 567 f("{\x00}") 568 f("[\x00]") 569 f("\"foo\"\x00") 570 f("{\"foo\"\x00:123}") 571 f("nil") 572 f("[foo]") 573 f("{foo}") 574 f("[123 34]") 575 f(`{"foo" "bar"}`) 576 f(`{"foo":123 "bar":"baz"}`) 577 f("-2134.453eec+43") 578 579 if _, err := p.Parse("-2134.453E+43"); err != nil { 580 t.Fatalf("unexpected error when parsing number: %s", err) 581 } 582 583 // Incomplete object key key. 584 f(`{"foo: 123}`) 585 586 // Incomplete string. 587 f(`"{\"foo\": 123}`) 588 589 v, err := p.Parse(`"{\"foo\": 123}"`) 590 if err != nil { 591 t.Fatalf("unexpected error when parsing fastjson string: %s", err) 592 } 593 sb := v.GetStringBytes() 594 if string(sb) != `{"foo": 123}` { 595 t.Fatalf("unexpected string value; got %q; want %q", sb, `{"foo": 123}`) 596 } 597 }) 598 599 t.Run("incomplete-object", func(t *testing.T) { 600 f := func(s string) { 601 t.Helper() 602 if _, err := p.Parse(s); err == nil { 603 t.Fatalf("expecting non-nil error when parsing incomplete object %q", s) 604 } 605 } 606 607 f(" { ") 608 f(`{"foo"`) 609 f(`{"foo":`) 610 f(`{"foo":null`) 611 f(`{"foo":null,`) 612 f(`{"foo":null,}`) 613 f(`{"foo":null,"bar"}`) 614 615 if _, err := p.Parse(`{"foo":null,"bar":"baz"}`); err != nil { 616 t.Fatalf("unexpected error when parsing object: %s", err) 617 } 618 }) 619 620 t.Run("incomplete-array", func(t *testing.T) { 621 f := func(s string) { 622 t.Helper() 623 if _, err := p.Parse(s); err == nil { 624 t.Fatalf("expecting non-nil error when parsing incomplete array %q", s) 625 } 626 } 627 628 f(" [ ") 629 f("[123") 630 f("[123,") 631 f("[123,]") 632 f("[123,{}") 633 f("[123,{},]") 634 635 if _, err := p.Parse("[123,{},[]]"); err != nil { 636 t.Fatalf("unexpected error when parsing array: %s", err) 637 } 638 }) 639 640 t.Run("incomplete-string", func(t *testing.T) { 641 f := func(s string) { 642 t.Helper() 643 if _, err := p.Parse(s); err == nil { 644 t.Fatalf("expecting non-nil error when parsing incomplete string %q", s) 645 } 646 } 647 648 f(` "foo`) 649 f(`"foo\`) 650 f(`"foo\"`) 651 f(`"foo\\\"`) 652 f(`"foo'`) 653 f(`"foo'bar'`) 654 655 if _, err := p.Parse(`"foo\\\""`); err != nil { 656 t.Fatalf("unexpected error when parsing string: %s", err) 657 } 658 }) 659 660 t.Run("empty-object", func(t *testing.T) { 661 v, err := p.Parse("{}") 662 if err != nil { 663 t.Fatalf("cannot parse empty object: %s", err) 664 } 665 tp := v.Type() 666 if tp != TypeObject || tp.String() != "object" { 667 t.Fatalf("unexpected value obtained for empty object: %#v", v) 668 } 669 o, err := v.Object() 670 if err != nil { 671 t.Fatalf("cannot obtain object: %s", err) 672 } 673 n := o.Len() 674 if n != 0 { 675 t.Fatalf("unexpected number of items in empty object: %d; want 0", n) 676 } 677 s := v.String() 678 if s != "{}" { 679 t.Fatalf("unexpected string representation of empty object: got %q; want %q", s, "{}") 680 } 681 }) 682 683 t.Run("empty-array", func(t *testing.T) { 684 v, err := p.Parse("[]") 685 if err != nil { 686 t.Fatalf("cannot parse empty array: %s", err) 687 } 688 tp := v.Type() 689 if tp != TypeArray || tp.String() != "array" { 690 t.Fatalf("unexpected value obtained for empty array: %#v", v) 691 } 692 a, err := v.Array() 693 if err != nil { 694 t.Fatalf("unexpected error: %s", err) 695 } 696 n := len(a) 697 if n != 0 { 698 t.Fatalf("unexpected number of items in empty array: %d; want 0", n) 699 } 700 s := v.String() 701 if s != "[]" { 702 t.Fatalf("unexpected string representation of empty array: got %q; want %q", s, "[]") 703 } 704 }) 705 706 t.Run("null", func(t *testing.T) { 707 v, err := p.Parse("null") 708 if err != nil { 709 t.Fatalf("cannot parse null: %s", err) 710 } 711 tp := v.Type() 712 if tp != TypeNull || tp.String() != "null" { 713 t.Fatalf("unexpected value obtained for null: %#v", v) 714 } 715 s := v.String() 716 if s != "null" { 717 t.Fatalf("unexpected string representation of null; got %q; want %q", s, "null") 718 } 719 }) 720 721 t.Run("true", func(t *testing.T) { 722 v, err := p.Parse("true") 723 if err != nil { 724 t.Fatalf("cannot parse true: %s", err) 725 } 726 tp := v.Type() 727 if tp != TypeTrue || tp.String() != "true" { 728 t.Fatalf("unexpected value obtained for true: %#v", v) 729 } 730 b, err := v.Bool() 731 if err != nil { 732 t.Fatalf("unexpected error: %s", err) 733 } 734 if !b { 735 t.Fatalf("expecting true; got false") 736 } 737 s := v.String() 738 if s != "true" { 739 t.Fatalf("unexpected string representation of true; got %q; want %q", s, "true") 740 } 741 }) 742 743 t.Run("false", func(t *testing.T) { 744 v, err := p.Parse("false") 745 if err != nil { 746 t.Fatalf("cannot parse false: %s", err) 747 } 748 tp := v.Type() 749 if tp != TypeFalse || tp.String() != "false" { 750 t.Fatalf("unexpected value obtained for false: %#v", v) 751 } 752 b, err := v.Bool() 753 if err != nil { 754 t.Fatalf("unexpected error: %s", err) 755 } 756 if b { 757 t.Fatalf("expecting false; got true") 758 } 759 s := v.String() 760 if s != "false" { 761 t.Fatalf("unexpected string representation of false; got %q; want %q", s, "false") 762 } 763 }) 764 765 t.Run("integer", func(t *testing.T) { 766 v, err := p.Parse("12345") 767 if err != nil { 768 t.Fatalf("cannot parse integer: %s", err) 769 } 770 tp := v.Type() 771 if tp != TypeNumber || tp.String() != "number" { 772 t.Fatalf("unexpected type obtained for integer: %#v", v) 773 } 774 n, err := v.Int() 775 if err != nil { 776 t.Fatalf("cannot obtain int: %s", err) 777 } 778 if n != 12345 { 779 t.Fatalf("unexpected value obtained for integer; got %d; want %d", n, 12345) 780 } 781 s := v.String() 782 if s != "12345" { 783 t.Fatalf("unexpected string representation of integer; got %q; want %q", s, "12345") 784 } 785 }) 786 787 t.Run("int64", func(t *testing.T) { 788 v, err := p.Parse("-8838840643388017390") 789 if err != nil { 790 t.Fatalf("cannot parse int64: %s", err) 791 } 792 tp := v.Type() 793 if tp != TypeNumber || tp.String() != "number" { 794 t.Fatalf("unexpected type obtained for int64: %#v", v) 795 } 796 n, err := v.Int64() 797 if err != nil { 798 t.Fatalf("cannot obtain int64: %s", err) 799 } 800 if n != -8838840643388017390 { 801 t.Fatalf("unexpected value obtained for int64; got %d; want %d", n, -8838840643388017390) 802 } 803 s := v.String() 804 if s != "-8838840643388017390" { 805 t.Fatalf("unexpected string representation of int64; got %q; want %q", s, "-8838840643388017390") 806 } 807 }) 808 809 t.Run("uint64", func(t *testing.T) { 810 v, err := p.Parse("18446744073709551615") 811 if err != nil { 812 t.Fatalf("cannot parse uint64: %s", err) 813 } 814 tp := v.Type() 815 if tp != TypeNumber || tp.String() != "number" { 816 t.Fatalf("unexpected type obtained for uint64: %#v", v) 817 } 818 n, err := v.Uint64() 819 if err != nil { 820 t.Fatalf("cannot obtain uint64: %s", err) 821 } 822 if n != 18446744073709551615 { 823 t.Fatalf("unexpected value obtained for uint64; got %d; want %d", n, uint64(18446744073709551615)) 824 } 825 s := v.String() 826 if s != "18446744073709551615" { 827 t.Fatalf("unexpected string representation of uint64; got %q; want %q", s, "18446744073709551615") 828 } 829 }) 830 831 t.Run("float", func(t *testing.T) { 832 v, err := p.Parse("-12.345") 833 if err != nil { 834 t.Fatalf("cannot parse integer: %s", err) 835 } 836 n, err := v.Float64() 837 if err != nil { 838 t.Fatalf("unexpected error: %s", err) 839 } 840 tp := v.Type() 841 if tp != TypeNumber || tp.String() != "number" { 842 t.Fatalf("unexpected type obtained for integer: %#v", v) 843 } 844 if n != -12.345 { 845 t.Fatalf("unexpected value obtained for integer; got %f; want %f", n, -12.345) 846 } 847 s := v.String() 848 if s != "-12.345" { 849 t.Fatalf("unexpected string representation of integer; got %q; want %q", s, "-12.345") 850 } 851 }) 852 853 t.Run("string", func(t *testing.T) { 854 v, err := p.Parse(`"foo bar"`) 855 if err != nil { 856 t.Fatalf("cannot parse string: %s", err) 857 } 858 tp := v.Type() 859 if tp != TypeString || tp.String() != "string" { 860 t.Fatalf("unexpected type obtained for string: %#v", v) 861 } 862 sb, err := v.StringBytes() 863 if err != nil { 864 t.Fatalf("cannot obtain string: %s", err) 865 } 866 if string(sb) != "foo bar" { 867 t.Fatalf("unexpected value obtained for string; got %q; want %q", sb, "foo bar") 868 } 869 ss := v.String() 870 if ss != `"foo bar"` { 871 t.Fatalf("unexpected string representation of string; got %q; want %q", ss, `"foo bar"`) 872 } 873 }) 874 875 t.Run("string-escaped", func(t *testing.T) { 876 v, err := p.Parse(`"\n\t\\foo\"bar\u3423x\/\b\f\r\\"`) 877 if err != nil { 878 t.Fatalf("cannot parse string: %s", err) 879 } 880 tp := v.Type() 881 if tp != TypeString { 882 t.Fatalf("unexpected type obtained for string: %#v", v) 883 } 884 sb, err := v.StringBytes() 885 if err != nil { 886 t.Fatalf("cannot obtain string: %s", err) 887 } 888 if string(sb) != "\n\t\\foo\"bar\u3423x/\b\f\r\\" { 889 t.Fatalf("unexpected value obtained for string; got %q; want %q", sb, "\n\t\\foo\"bar\u3423x/\b\f\r\\") 890 } 891 ss := v.String() 892 if ss != `"\n\t\\foo\"bar㐣x/\b\f\r\\"` { 893 t.Fatalf("unexpected string representation of string; got %q; want %q", ss, `"\n\t\\foo\"bar㐣x/\b\f\r\\"`) 894 } 895 }) 896 897 t.Run("object-one-element", func(t *testing.T) { 898 v, err := p.Parse(` { 899 "foo" : "bar" } `) 900 if err != nil { 901 t.Fatalf("cannot parse object: %s", err) 902 } 903 tp := v.Type() 904 if tp != TypeObject { 905 t.Fatalf("unexpected type obtained for object: %#v", v) 906 } 907 o, err := v.Object() 908 if err != nil { 909 t.Fatalf("cannot obtain object: %s", err) 910 } 911 vv := o.Get("foo") 912 if vv.Type() != TypeString { 913 t.Fatalf("unexpected type for foo item: got %d; want %d", vv.Type(), TypeString) 914 } 915 vv = o.Get("non-existing key") 916 if vv != nil { 917 t.Fatalf("unexpected value obtained for non-existing key: %#v", vv) 918 } 919 920 s := v.String() 921 if s != `{"foo":"bar"}` { 922 t.Fatalf("unexpected string representation for object; got %q; want %q", s, `{"foo":"bar"}`) 923 } 924 }) 925 926 t.Run("object-multi-elements", func(t *testing.T) { 927 v, err := p.Parse(`{"foo": [1,2,3 ] ,"bar":{},"baz":123.456}`) 928 if err != nil { 929 t.Fatalf("cannot parse object: %s", err) 930 } 931 tp := v.Type() 932 if tp != TypeObject { 933 t.Fatalf("unexpected type obtained for object: %#v", v) 934 } 935 o, err := v.Object() 936 if err != nil { 937 t.Fatalf("cannot obtain object: %s", err) 938 } 939 vv := o.Get("foo") 940 if vv.Type() != TypeArray { 941 t.Fatalf("unexpected type for foo item; got %d; want %d", vv.Type(), TypeArray) 942 } 943 vv = o.Get("bar") 944 if vv.Type() != TypeObject { 945 t.Fatalf("unexpected type for bar item; got %d; want %d", vv.Type(), TypeObject) 946 } 947 vv = o.Get("baz") 948 if vv.Type() != TypeNumber { 949 t.Fatalf("unexpected type for baz item; got %d; want %d", vv.Type(), TypeNumber) 950 } 951 vv = o.Get("non-existing-key") 952 if vv != nil { 953 t.Fatalf("unexpected value obtained for non-existing key: %#v", vv) 954 } 955 956 s := v.String() 957 if s != `{"foo":[1,2,3],"bar":{},"baz":123.456}` { 958 t.Fatalf("unexpected string representation for object; got %q; want %q", s, `{"foo":[1,2,3],"bar":{},"baz":123.456}`) 959 } 960 }) 961 962 t.Run("array-one-element", func(t *testing.T) { 963 v, err := p.Parse(` [{"bar":[ [],[[]] ]} ] `) 964 if err != nil { 965 t.Fatalf("cannot parse array: %s", err) 966 } 967 tp := v.Type() 968 if tp != TypeArray { 969 t.Fatalf("unexpected type obtained for array: %#v", v) 970 } 971 a, err := v.Array() 972 if err != nil { 973 t.Fatalf("unexpected error: %s", err) 974 } 975 if len(a) != 1 { 976 t.Fatalf("unexpected array len; got %d; want %d", len(a), 1) 977 } 978 if a[0].Type() != TypeObject { 979 t.Fatalf("unexpected type for a[0]; got %d; want %d", a[0].Type(), TypeObject) 980 } 981 982 s := v.String() 983 if s != `[{"bar":[[],[[]]]}]` { 984 t.Fatalf("unexpected string representation for array; got %q; want %q", s, `[{"bar":[[],[[]]]}]`) 985 } 986 }) 987 988 t.Run("array-multi-elements", func(t *testing.T) { 989 v, err := p.Parse(` [1,"foo",{"bar":[ ],"baz":""} ,[ "x" , "y" ] ] `) 990 if err != nil { 991 t.Fatalf("cannot parse array: %s", err) 992 } 993 tp := v.Type() 994 if tp != TypeArray { 995 t.Fatalf("unexpected type obtained for array: %#v", v) 996 } 997 a, err := v.Array() 998 if err != nil { 999 t.Fatalf("unexpected error: %s", err) 1000 } 1001 if len(a) != 4 { 1002 t.Fatalf("unexpected array len; got %d; want %d", len(a), 4) 1003 } 1004 if a[0].Type() != TypeNumber { 1005 t.Fatalf("unexpected type for a[0]; got %d; want %d", a[0].Type(), TypeNumber) 1006 } 1007 if a[1].Type() != TypeString { 1008 t.Fatalf("unexpected type for a[1]; got %d; want %d", a[1].Type(), TypeString) 1009 } 1010 if a[2].Type() != TypeObject { 1011 t.Fatalf("unexpected type for a[2]; got %d; want %d", a[2].Type(), TypeObject) 1012 } 1013 if a[3].Type() != TypeArray { 1014 t.Fatalf("unexpected type for a[3]; got %d; want %d", a[3].Type(), TypeArray) 1015 } 1016 1017 s := v.String() 1018 if s != `[1,"foo",{"bar":[],"baz":""},["x","y"]]` { 1019 t.Fatalf("unexpected string representation for array; got %q; want %q", s, `[1,"foo",{"bar":[],"baz":""},["x","y"]]`) 1020 } 1021 }) 1022 1023 t.Run("complex-object", func(t *testing.T) { 1024 s := `{"foo":[-1.345678,[[[[[]]]],{}],"bar"],"baz":{"bbb":123}}` 1025 v, err := p.Parse(s) 1026 if err != nil { 1027 t.Fatalf("cannot parse complex object: %s", err) 1028 } 1029 if v.Type() != TypeObject { 1030 t.Fatalf("unexpected type obtained for object: %#v", v) 1031 } 1032 1033 ss := v.String() 1034 if ss != s { 1035 t.Fatalf("unexpected string representation for object; got %q; want %q", ss, s) 1036 } 1037 1038 s = strings.TrimSpace(largeFixture) 1039 v, err = p.Parse(s) 1040 if err != nil { 1041 t.Fatalf("cannot parse largeFixture: %s", err) 1042 } 1043 ss = v.String() 1044 if ss != s { 1045 t.Fatalf("unexpected string representation for object; got\n%q; want\n%q", ss, s) 1046 } 1047 }) 1048 1049 t.Run("complex-object-visit-all", func(t *testing.T) { 1050 n := 0 1051 var f func(k []byte, v *Value) 1052 f = func(k []byte, v *Value) { 1053 switch v.Type() { 1054 case TypeObject: 1055 o, err := v.Object() 1056 if err != nil { 1057 t.Fatalf("cannot obtain object: %s", err) 1058 } 1059 o.Visit(f) 1060 case TypeArray: 1061 a, err := v.Array() 1062 if err != nil { 1063 t.Fatalf("unexpected error: %s", err) 1064 } 1065 for _, vv := range a { 1066 f(nil, vv) 1067 } 1068 case TypeString: 1069 sb, err := v.StringBytes() 1070 if err != nil { 1071 t.Fatalf("cannot obtain string: %s", err) 1072 } 1073 n += len(sb) 1074 case TypeNumber: 1075 nn, err := v.Int() 1076 if err != nil { 1077 t.Fatalf("cannot obtain int: %s", err) 1078 } 1079 n += nn 1080 } 1081 } 1082 1083 s := strings.TrimSpace(largeFixture) 1084 v, err := p.Parse(s) 1085 if err != nil { 1086 t.Fatalf("cannot parse largeFixture: %s", err) 1087 } 1088 o, err := v.Object() 1089 if err != nil { 1090 t.Fatalf("cannot obtain object: %s", err) 1091 } 1092 o.Visit(f) 1093 1094 if n != 21473 { 1095 t.Fatalf("unexpected n; got %d; want %d", n, 21473) 1096 } 1097 1098 // Make sure the fastjson remains valid after visiting all the items. 1099 ss := v.String() 1100 if ss != s { 1101 t.Fatalf("unexpected string representation for object; got\n%q; want\n%q", ss, s) 1102 } 1103 1104 }) 1105 } 1106 1107 func TestParseBigObject(t *testing.T) { 1108 const itemsCount = 10000 1109 1110 // build big fastjson object 1111 var ss []string 1112 for i := 0; i < itemsCount; i++ { 1113 s := fmt.Sprintf(`"key_%d": "value_%d"`, i, i) 1114 ss = append(ss, s) 1115 } 1116 s := "{" + strings.Join(ss, ",") + "}" 1117 1118 // parse it 1119 var p Parser 1120 v, err := p.Parse(s) 1121 if err != nil { 1122 t.Fatalf("unexpected error: %s", err) 1123 } 1124 1125 // Look up object items 1126 for i := 0; i < itemsCount; i++ { 1127 k := fmt.Sprintf("key_%d", i) 1128 expectedV := fmt.Sprintf("value_%d", i) 1129 sb := v.GetStringBytes(k) 1130 if string(sb) != expectedV { 1131 t.Fatalf("unexpected value obtained; got %q; want %q", sb, expectedV) 1132 } 1133 } 1134 1135 // verify non-existing key returns nil 1136 sb := v.GetStringBytes("non-existing-key") 1137 if sb != nil { 1138 t.Fatalf("unexpected non-nil value for non-existing-key: %q", sb) 1139 } 1140 } 1141 1142 func TestParseGetConcurrent(t *testing.T) { 1143 concurrency := 10 1144 ch := make(chan error, concurrency) 1145 s := `{"foo": "bar", "empty_obj": {}}` 1146 for i := 0; i < concurrency; i++ { 1147 go func() { 1148 ch <- testParseGetSerial(s) 1149 }() 1150 } 1151 for i := 0; i < concurrency; i++ { 1152 select { 1153 case err := <-ch: 1154 if err != nil { 1155 t.Fatalf("unexpected error during concurrent test: %s", err) 1156 } 1157 case <-time.After(time.Second): 1158 t.Fatalf("timeout") 1159 } 1160 } 1161 } 1162 1163 func testParseGetSerial(s string) error { 1164 var p Parser 1165 for i := 0; i < 100; i++ { 1166 v, err := p.Parse(s) 1167 if err != nil { 1168 return fmt.Errorf("cannot parse %q: %s", s, err) 1169 } 1170 sb := v.GetStringBytes("foo") 1171 if string(sb) != "bar" { 1172 return fmt.Errorf("unexpected value for key=%q; got %q; want %q", "foo", sb, "bar") 1173 } 1174 vv := v.Get("empty_obj", "non-existing-key") 1175 if vv != nil { 1176 return fmt.Errorf("unexpected non-nil value got: %s", vv) 1177 } 1178 } 1179 return nil 1180 } 1181 1182 type KLine struct { 1183 Day [][]string `json:"day"` 1184 } 1185 1186 type ActionStatus struct { 1187 Code int `json:"code,status"` 1188 Msg string `json:"msg"` 1189 } 1190 1191 type klineData struct { 1192 ActionStatus 1193 Data map[string]KLine `json:"data"` 1194 } 1195 1196 func TestParseKLine(t *testing.T) { 1197 data := `{"code":1,"msg":"success","data":{"sh000001":{"day":[["2021-07-09","3512.230","3524.090","3529.310","3485.050","349884317.000"]],"qt":{"sh000001":["1","\u4e0a\u8bc1\u6307\u6570","000001","3524.09","3525.50","3512.23","349884317","174942159","174942159","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","0.00","0","","20210709155956","-1.41","-0.04","3529.31","3485.05","3524.09\/349884317\/493020839328","349884317","49302084","0.82","14.22","","3529.31","3485.05","1.26","392004.84","500586.05","0.00","-1","-1","1.12","0","3510.12","","","","","","49302083.9328","0.0000","0"," ","ZS","1.47","0.15","","","","3731.69","3174.66","-2.31","-2.40","3.26","","","-0.98"],"market":["2021-07-10 07:04:01|HK_close_\u5df2\u4f11\u5e02|SH_close_\u5df2\u4f11\u5e02|SZ_close_\u5df2\u4f11\u5e02|US_close_\u5df2\u6536\u76d8|SQ_close_\u5df2\u4f11\u5e02|DS_close_\u5df2\u4f11\u5e02|ZS_close_\u5df2\u4f11\u5e02|NEWSH_close_\u5df2\u4f11\u5e02|NEWSZ_close_\u5df2\u4f11\u5e02|NEWHK_close_\u5df2\u4f11\u5e02|NEWUS_close_\u5df2\u6536\u76d8|REPO_close_\u5df2\u4f11\u5e02|UK_close_\u5df2\u4f11\u5e02|KCB_close_\u5df2\u4f11\u5e02|IT_close_\u5df2\u4f11\u5e02|MY_close_\u5df2\u4f11\u5e02|EU_close_\u5df2\u4f11\u5e02|AH_close_\u5df2\u4f11\u5e02|DE_close_\u5df2\u4f11\u5e02|JW_close_\u5df2\u4f11\u5e02|CYB_close_\u5df2\u4f11\u5e02|USA_open_\u76d8\u540e\u4ea4\u6613|USB_close_\u5df2\u6536\u76d8"],"zhishu":["Rank_A_sh","Rank_A_sh","1132","91","711","1934","169.260","-1.440","-0.844","1353133343","49280702","sh688305","sh688682"]},"mx_price":{"mx":[],"price":[]},"prec":"3525.500","version":"14"}}}` 1198 var kline klineData 1199 err := json.Unmarshal([]byte(data), &kline) 1200 if err != nil { 1201 t.Fatalf("解析json失败: %s", err) 1202 } 1203 t.Logf("kline: %+v", kline) 1204 }