github.com/bytedance/sonic@v1.11.7-0.20240517092252-d2edb31b167b/internal/native/avx2/native_test.go (about) 1 // +build amd64 2 3 4 // Code generated by Makefile, DO NOT EDIT. 5 6 // Code generated by Makefile, DO NOT EDIT. 7 8 /* 9 * Copyright 2021 ByteDance Inc. 10 * 11 * Licensed under the Apache License, Version 2.0 (the "License"); 12 * you may not use this file except in compliance with the License. 13 * You may obtain a copy of the License at 14 * 15 * http://www.apache.org/licenses/LICENSE-2.0 16 * 17 * Unless required by applicable law or agreed to in writing, software 18 * distributed under the License is distributed on an "AS IS" BASIS, 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20 * See the License for the specific language governing permissions and 21 * limitations under the License. 22 */ 23 24 package avx2 25 26 import ( 27 `encoding/hex` 28 `fmt` 29 `math` 30 `strings` 31 `testing` 32 `unsafe` 33 34 `github.com/bytedance/sonic/internal/native/types` 35 `github.com/bytedance/sonic/internal/rt` 36 `github.com/davecgh/go-spew/spew` 37 `github.com/stretchr/testify/assert` 38 `github.com/stretchr/testify/require` 39 ) 40 41 func TestNative_Value(t *testing.T) { 42 var v types.JsonState 43 s := ` -12345` 44 p := (*rt.GoString)(unsafe.Pointer(&s)) 45 x := value(p.Ptr, p.Len, 0, &v, 0) 46 assert.Equal(t, 9, x) 47 assert.Equal(t, types.V_INTEGER, v.Vt) 48 assert.Equal(t, int64(-12345), v.Iv) 49 assert.Equal(t, 3, v.Ep) 50 } 51 52 func TestNative_Value_OutOfBound(t *testing.T) { 53 var v types.JsonState 54 mem := []byte{'"', '"'} 55 s := rt.Mem2Str(mem[:1]) 56 p := (*rt.GoString)(unsafe.Pointer(&s)) 57 x := value(p.Ptr, p.Len, 0, &v, 0) 58 assert.Equal(t, 1, x) 59 assert.Equal(t, -int(types.ERR_EOF), int(v.Vt)) 60 } 61 62 func TestNative_Quote(t *testing.T) { 63 s := "hello\b\f\n\r\t\\\"\u666fworld" 64 d := make([]byte, 256) 65 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 66 sp := (*rt.GoString)(unsafe.Pointer(&s)) 67 rv := quote(sp.Ptr, sp.Len, dp.Ptr, &dp.Len, 0) 68 if rv < 0 { 69 require.NoError(t, types.ParsingError(-rv)) 70 } 71 assert.Equal(t, len(s), rv) 72 assert.Equal(t, 35, len(d)) 73 assert.Equal(t, `hello\u0008\u000c\n\r\t\\\"景world`, string(d)) 74 } 75 76 func TestNative_QuoteNoMem(t *testing.T) { 77 s := "hello\b\f\n\r\t\\\"\u666fworld" 78 d := make([]byte, 10) 79 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 80 sp := (*rt.GoString)(unsafe.Pointer(&s)) 81 rv := quote(sp.Ptr, sp.Len, dp.Ptr, &dp.Len, 0) 82 assert.Equal(t, -6, rv) 83 assert.Equal(t, 5, len(d)) 84 assert.Equal(t, `hello`, string(d)) 85 } 86 87 func TestNative_DoubleQuote(t *testing.T) { 88 s := "hello\b\f\n\r\t\\\"\u666fworld" 89 d := make([]byte, 256) 90 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 91 sp := (*rt.GoString)(unsafe.Pointer(&s)) 92 rv := quote(sp.Ptr, sp.Len, dp.Ptr, &dp.Len, types.F_DOUBLE_UNQUOTE) 93 if rv < 0 { 94 require.NoError(t, types.ParsingError(-rv)) 95 } 96 assert.Equal(t, len(s), rv) 97 assert.Equal(t, 44, len(d)) 98 assert.Equal(t, `hello\\u0008\\u000c\\n\\r\\t\\\\\\\"景world`, string(d)) 99 } 100 101 func TestNative_Unquote(t *testing.T) { 102 s := `hello\b\f\n\r\t\\\"\u2333world` 103 d := make([]byte, 0, len(s)) 104 ep := -1 105 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 106 sp := (*rt.GoString)(unsafe.Pointer(&s)) 107 rv := unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, 0) 108 if rv < 0 { 109 require.NoError(t, types.ParsingError(-rv)) 110 } 111 dp.Len = rv 112 assert.Equal(t, -1, ep) 113 assert.Equal(t, "hello\b\f\n\r\t\\\"\u2333world", string(d)) 114 } 115 116 func TestNative_UnquoteError(t *testing.T) { 117 s := `asdf\` 118 d := make([]byte, 0, len(s)) 119 ep := -1 120 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 121 sp := (*rt.GoString)(unsafe.Pointer(&s)) 122 rv := unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, 0) 123 assert.Equal(t, -int(types.ERR_EOF), rv) 124 assert.Equal(t, 5, ep) 125 s = `asdf\gqwer` 126 d = make([]byte, 0, len(s)) 127 ep = -1 128 dp = (*rt.GoSlice)(unsafe.Pointer(&d)) 129 sp = (*rt.GoString)(unsafe.Pointer(&s)) 130 rv = unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, 0) 131 assert.Equal(t, -int(types.ERR_INVALID_ESCAPE), rv) 132 assert.Equal(t, 5, ep) 133 s = `asdf\u1gggqwer` 134 d = make([]byte, 0, len(s)) 135 ep = -1 136 dp = (*rt.GoSlice)(unsafe.Pointer(&d)) 137 sp = (*rt.GoString)(unsafe.Pointer(&s)) 138 rv = unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, 0) 139 assert.Equal(t, -int(types.ERR_INVALID_CHAR), rv) 140 assert.Equal(t, 7, ep) 141 s = `asdf\ud800qwer` 142 d = make([]byte, 0, len(s)) 143 ep = -1 144 dp = (*rt.GoSlice)(unsafe.Pointer(&d)) 145 sp = (*rt.GoString)(unsafe.Pointer(&s)) 146 rv = unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, 0) 147 assert.Equal(t, -int(types.ERR_INVALID_UNICODE), rv) 148 assert.Equal(t, 6, ep) 149 s = `asdf\\ud800qwer` 150 d = make([]byte, 0, len(s)) 151 ep = -1 152 dp = (*rt.GoSlice)(unsafe.Pointer(&d)) 153 sp = (*rt.GoString)(unsafe.Pointer(&s)) 154 rv = unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, types.F_DOUBLE_UNQUOTE) 155 assert.Equal(t, -int(types.ERR_INVALID_UNICODE), rv) 156 assert.Equal(t, 7, ep) 157 s = `asdf\ud800\ud800qwer` 158 d = make([]byte, 0, len(s)) 159 ep = -1 160 dp = (*rt.GoSlice)(unsafe.Pointer(&d)) 161 sp = (*rt.GoString)(unsafe.Pointer(&s)) 162 rv = unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, 0) 163 assert.Equal(t, -int(types.ERR_INVALID_UNICODE), rv) 164 assert.Equal(t, 12, ep) 165 s = `asdf\\ud800\\ud800qwer` 166 d = make([]byte, 0, len(s)) 167 ep = -1 168 dp = (*rt.GoSlice)(unsafe.Pointer(&d)) 169 sp = (*rt.GoString)(unsafe.Pointer(&s)) 170 rv = unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, types.F_DOUBLE_UNQUOTE) 171 assert.Equal(t, -int(types.ERR_INVALID_UNICODE), rv) 172 assert.Equal(t, 14, ep) 173 } 174 175 func TestNative_DoubleUnquote(t *testing.T) { 176 s := `hello\\b\\f\\n\\r\\t\\\\\\\"\\u2333world` 177 d := make([]byte, 0, len(s)) 178 ep := -1 179 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 180 sp := (*rt.GoString)(unsafe.Pointer(&s)) 181 rv := unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, types.F_DOUBLE_UNQUOTE) 182 if rv < 0 { 183 require.NoError(t, types.ParsingError(-rv)) 184 } 185 dp.Len = rv 186 assert.Equal(t, -1, ep) 187 assert.Equal(t, "hello\b\f\n\r\t\\\"\u2333world", string(d)) 188 } 189 190 func TestNative_UnquoteUnicodeReplacement(t *testing.T) { 191 s := `hello\ud800world` 192 d := make([]byte, 0, len(s)) 193 ep := -1 194 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 195 sp := (*rt.GoString)(unsafe.Pointer(&s)) 196 rv := unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, types.F_UNICODE_REPLACE) 197 if rv < 0 { 198 require.NoError(t, types.ParsingError(-rv)) 199 } 200 dp.Len = rv 201 assert.Equal(t, -1, ep) 202 assert.Equal(t, "hello\ufffdworld", string(d)) 203 s = `hello\ud800\ud800world` 204 d = make([]byte, 0, len(s)) 205 ep = -1 206 dp = (*rt.GoSlice)(unsafe.Pointer(&d)) 207 sp = (*rt.GoString)(unsafe.Pointer(&s)) 208 rv = unquote(sp.Ptr, sp.Len, dp.Ptr, &ep, types.F_UNICODE_REPLACE) 209 if rv < 0 { 210 require.NoError(t, types.ParsingError(-rv)) 211 } 212 dp.Len = rv 213 assert.Equal(t, -1, ep) 214 assert.Equal(t, "hello\ufffd\ufffdworld", string(d)) 215 } 216 217 func TestNative_HTMLEscape(t *testing.T) { 218 s := "hello\u2029\u2028<&>world" 219 d := make([]byte, 256) 220 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 221 sp := (*rt.GoString)(unsafe.Pointer(&s)) 222 rv := html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len) 223 if rv < 0 { 224 require.NoError(t, types.ParsingError(-rv)) 225 } 226 assert.Equal(t, len(s), rv) 227 assert.Equal(t, 40, len(d)) 228 assert.Equal(t, `hello\u2029\u2028\u003c\u0026\u003eworld`, string(d)) 229 } 230 231 func TestNative_HTMLEscapeNoMem(t *testing.T) { 232 s := "hello\u2029\u2028<&>world" 233 d := make([]byte, 10) 234 dp := (*rt.GoSlice)(unsafe.Pointer(&d)) 235 sp := (*rt.GoString)(unsafe.Pointer(&s)) 236 rv := html_escape(sp.Ptr, sp.Len, dp.Ptr, &dp.Len) 237 assert.Equal(t, -6, rv) 238 assert.Equal(t, 5, len(d)) 239 assert.Equal(t, `hello`, string(d)) 240 } 241 242 func TestNative_Vstring(t *testing.T) { 243 var v types.JsonState 244 i := 0 245 s := `test"test\n2"` 246 vstring(&s, &i, &v, 0) 247 assert.Equal(t, 5, i) 248 assert.Equal(t, -1, v.Ep) 249 assert.Equal(t, int64(0), v.Iv) 250 vstring(&s, &i, &v, 0) 251 assert.Equal(t, 13, i) 252 assert.Equal(t, 9, v.Ep) 253 assert.Equal(t, int64(5), v.Iv) 254 } 255 256 func TestNative_Vstring_ValidUnescapedChars(t *testing.T) { 257 var v types.JsonState 258 valid := uint64(types.F_VALIDATE_STRING) 259 i := 0 260 s := "test\x1f\"" 261 vstring(&s, &i, &v, valid) 262 assert.Equal(t, -int(types.ERR_INVALID_CHAR), int(v.Vt)) 263 } 264 265 func TestNative_VstringEscapeEOF(t *testing.T) { 266 var v types.JsonState 267 i := 0 268 s := `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"x` 269 vstring(&s, &i, &v, 0) 270 assert.Equal(t, 95, i) 271 assert.Equal(t, 63, v.Ep) 272 assert.Equal(t, int64(0), v.Iv) 273 } 274 275 func TestNative_VstringHangUpOnRandomData(t *testing.T) { 276 v, e := hex.DecodeString( 277 "228dc61efd54ef80a908fb6026b7f2d5f92a257ba8b347c995f259eb8685376a" + 278 "8c4500262d9c308b3f3ec2577689cf345d9f86f9b5d18d3e463bec5c22df2d2e" + 279 "4506010eba1dae7278", 280 ) 281 assert.Nil(t, e) 282 p := 1 283 s := rt.Mem2Str(v) 284 var js types.JsonState 285 vstring(&s, &p, &js, 0) 286 fmt.Printf("js: %s\n", spew.Sdump(js)) 287 } 288 289 func TestNative_Vnumber(t *testing.T) { 290 var v types.JsonState 291 i := 0 292 s := "1234" 293 vnumber(&s, &i, &v) 294 assert.Equal(t, 4, i) 295 assert.Equal(t, 0, v.Ep) 296 assert.Equal(t, int64(1234), v.Iv) 297 assert.Equal(t, types.V_INTEGER, v.Vt) 298 i = 0 299 s = "1.234" 300 vnumber(&s, &i, &v) 301 assert.Equal(t, 5, i) 302 assert.Equal(t, 0, v.Ep) 303 assert.Equal(t, 1.234, v.Dv) 304 assert.Equal(t, types.V_DOUBLE, v.Vt) 305 i = 0 306 s = "1.234e5" 307 vnumber(&s, &i, &v) 308 assert.Equal(t, 7, i) 309 assert.Equal(t, 0, v.Ep) 310 assert.Equal(t, 1.234e5, v.Dv) 311 assert.Equal(t, types.V_DOUBLE, v.Vt) 312 i = 0 313 s = "0.0125" 314 vnumber(&s, &i, &v) 315 assert.Equal(t, 6, i) 316 assert.Equal(t, 0, v.Ep) 317 assert.Equal(t, 0.0125, v.Dv) 318 assert.Equal(t, types.V_DOUBLE, v.Vt) 319 i = 0 320 s = "100000000000000000000" 321 vnumber(&s, &i, &v) 322 assert.Equal(t, 21, i) 323 assert.Equal(t, 0, v.Ep) 324 assert.Equal(t, 100000000000000000000.0, v.Dv) 325 assert.Equal(t, types.V_DOUBLE, v.Vt) 326 i = 0 327 s = "999999999999999900000" 328 vnumber(&s, &i, &v) 329 assert.Equal(t, 21, i) 330 assert.Equal(t, 0, v.Ep) 331 assert.Equal(t, 999999999999999900000.0, v.Dv) 332 assert.Equal(t, types.V_DOUBLE, v.Vt) 333 i = 0 334 s = "-1.234" 335 vnumber(&s, &i, &v) 336 assert.Equal(t, 6, i) 337 assert.Equal(t, 0, v.Ep) 338 assert.Equal(t, -1.234, v.Dv) 339 assert.Equal(t, types.V_DOUBLE, v.Vt) 340 } 341 342 func TestNative_Vsigned(t *testing.T) { 343 var v types.JsonState 344 i := 0 345 s := "1234" 346 vsigned(&s, &i, &v) 347 assert.Equal(t, 4, i) 348 assert.Equal(t, 0, v.Ep) 349 assert.Equal(t, int64(1234), v.Iv) 350 assert.Equal(t, types.V_INTEGER, v.Vt) 351 i = 0 352 s = "-1234" 353 vsigned(&s, &i, &v) 354 assert.Equal(t, 5, i) 355 assert.Equal(t, 0, v.Ep) 356 assert.Equal(t, int64(-1234), v.Iv) 357 assert.Equal(t, types.V_INTEGER, v.Vt) 358 i = 0 359 s = "9223372036854775807" 360 vsigned(&s, &i, &v) 361 assert.Equal(t, 19, i) 362 assert.Equal(t, 0, v.Ep) 363 assert.Equal(t, int64(math.MaxInt64), v.Iv) 364 assert.Equal(t, types.V_INTEGER, v.Vt) 365 i = 0 366 s = "-9223372036854775808" 367 vsigned(&s, &i, &v) 368 assert.Equal(t, 20, i) 369 assert.Equal(t, 0, v.Ep) 370 assert.Equal(t, int64(math.MinInt64), v.Iv) 371 assert.Equal(t, types.V_INTEGER, v.Vt) 372 i = 0 373 s = "9223372036854775808" 374 vsigned(&s, &i, &v) 375 assert.Equal(t, 18, i) 376 assert.Equal(t, 0, v.Ep) 377 assert.Equal(t, types.ValueType(-int(types.ERR_INTEGER_OVERFLOW)), v.Vt) 378 i = 0 379 s = "-9223372036854775809" 380 vsigned(&s, &i, &v) 381 assert.Equal(t, 19, i) 382 assert.Equal(t, 0, v.Ep) 383 assert.Equal(t, types.ValueType(-int(types.ERR_INTEGER_OVERFLOW)), v.Vt) 384 i = 0 385 s = "1.234" 386 vsigned(&s, &i, &v) 387 assert.Equal(t, 1, i) 388 assert.Equal(t, 0, v.Ep) 389 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 390 i = 0 391 s = "0.0125" 392 vsigned(&s, &i, &v) 393 assert.Equal(t, 1, i) 394 assert.Equal(t, 0, v.Ep) 395 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 396 i = 0 397 s = "-1234e5" 398 vsigned(&s, &i, &v) 399 assert.Equal(t, 5, i) 400 assert.Equal(t, 0, v.Ep) 401 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 402 i = 0 403 s = "-1234e-5" 404 vsigned(&s, &i, &v) 405 assert.Equal(t, 5, i) 406 assert.Equal(t, 0, v.Ep) 407 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 408 } 409 410 func TestNative_Vunsigned(t *testing.T) { 411 var v types.JsonState 412 i := 0 413 s := "1234" 414 vunsigned(&s, &i, &v) 415 assert.Equal(t, 4, i) 416 assert.Equal(t, 0, v.Ep) 417 assert.Equal(t, int64(1234), v.Iv) 418 assert.Equal(t, types.V_INTEGER, v.Vt) 419 i = 0 420 s = "18446744073709551615" 421 vunsigned(&s, &i, &v) 422 assert.Equal(t, 20, i) 423 assert.Equal(t, 0, v.Ep) 424 assert.Equal(t, ^int64(0), v.Iv) 425 assert.Equal(t, types.V_INTEGER, v.Vt) 426 i = 0 427 s = "18446744073709551616" 428 vunsigned(&s, &i, &v) 429 assert.Equal(t, 19, i) 430 assert.Equal(t, 0, v.Ep) 431 assert.Equal(t, types.ValueType(-int(types.ERR_INTEGER_OVERFLOW)), v.Vt) 432 i = 0 433 s = "-1234" 434 vunsigned(&s, &i, &v) 435 assert.Equal(t, 0, i) 436 assert.Equal(t, 0, v.Ep) 437 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 438 i = 0 439 s = "1.234" 440 vunsigned(&s, &i, &v) 441 assert.Equal(t, 1, i) 442 assert.Equal(t, 0, v.Ep) 443 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 444 i = 0 445 s = "0.0125" 446 vunsigned(&s, &i, &v) 447 assert.Equal(t, 1, i) 448 assert.Equal(t, 0, v.Ep) 449 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 450 i = 0 451 s = "1234e5" 452 vunsigned(&s, &i, &v) 453 assert.Equal(t, 4, i) 454 assert.Equal(t, 0, v.Ep) 455 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 456 i = 0 457 s = "-1234e5" 458 vunsigned(&s, &i, &v) 459 assert.Equal(t, 0, i) 460 assert.Equal(t, 0, v.Ep) 461 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 462 i = 0 463 s = "-1.234e5" 464 vunsigned(&s, &i, &v) 465 assert.Equal(t, 0, i) 466 assert.Equal(t, 0, v.Ep) 467 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 468 i = 0 469 s = "-1.234e-5" 470 vunsigned(&s, &i, &v) 471 assert.Equal(t, 0, i) 472 assert.Equal(t, 0, v.Ep) 473 assert.Equal(t, types.ValueType(-int(types.ERR_INVALID_NUMBER_FMT)), v.Vt) 474 } 475 476 func TestNative_SkipOne(t *testing.T) { 477 p := 0 478 s := ` {"asdf": [null, true, false, 1, 2.0, -3]}, 1234.5` 479 q := skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 480 assert.Equal(t, 42, p) 481 assert.Equal(t, 1, q) 482 p = 0 483 s = `1 2.5 -3 "asdf\nqwer" true false null {} []` 484 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 485 assert.Equal(t, 1, p) 486 assert.Equal(t, 0, q) 487 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 488 assert.Equal(t, 5, p) 489 assert.Equal(t, 2, q) 490 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 491 assert.Equal(t, 8, p) 492 assert.Equal(t, 6, q) 493 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 494 assert.Equal(t, 21, p) 495 assert.Equal(t, 9, q) 496 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 497 assert.Equal(t, 26, p) 498 assert.Equal(t, 22, q) 499 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 500 assert.Equal(t, 32, p) 501 assert.Equal(t, 27, q) 502 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 503 assert.Equal(t, 37, p) 504 assert.Equal(t, 33, q) 505 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 506 assert.Equal(t, 40, p) 507 assert.Equal(t, 38, q) 508 q = skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 509 assert.Equal(t, 43, p) 510 assert.Equal(t, 41, q) 511 } 512 513 func TestNative_SkipOne_Error(t *testing.T) { 514 for _, s := range([]string{ 515 "-", "+", "0.", "0. ", "+1", "0.0e ", "9e+", "0e-", 516 "tru", "fals", "nul", "trux", "fals ", 517 `"asdf`, `"\\\"`, 518 }) { 519 p := 0 520 q := skip_one(&s, &p, &types.StateMachine{}, uint64(0)) 521 assert.True(t, q < 0) 522 } 523 } 524 525 func TestNative_SkipArray(t *testing.T) { 526 p := 0 527 s := `null, true, false, 1, 2.0, -3, {"asdf": "wqer"}],` 528 skip_array(&s, &p, &types.StateMachine{}, uint64(0)) 529 assert.Equal(t, p, 48) 530 } 531 532 func TestNative_SkipObject(t *testing.T) { 533 p := 0 534 s := `"asdf": "wqer"},` 535 skip_object(&s, &p, &types.StateMachine{}, uint64(0)) 536 assert.Equal(t, p, 15) 537 } 538 539 func TestNative_SkipNumber(t *testing.T) { 540 p := 0 541 s := `-1.23e+12` 542 q := skip_number(&s, &p) 543 assert.Equal(t, 9, p) 544 assert.Equal(t, 0, q) 545 } 546 547 func TestNative_SkipNumberInJson(t *testing.T) { 548 p := 0x13 549 s := "{\"h\":\"1.00000\",\"i\":true,\"pass3\":1}" 550 q := skip_number(&s, &p) 551 assert.Equal(t, 0x13, p) 552 assert.Equal(t, -2, q) 553 } 554 555 func TestNative_SkipOneFast(t *testing.T) { 556 p := 0 557 s := ` {"asdf": [null, true, false, 1, 2.0, -3]}, 1234.5` 558 q := skip_one_fast(&s, &p) 559 assert.Equal(t, 42, p) 560 assert.Equal(t, 1, q) 561 p = 0 562 s = `1, 2.5, -3, "asdf\nqwer", true, false, null, {}, [],` 563 q = skip_one_fast(&s, &p) 564 assert.Equal(t, 1, p) 565 assert.Equal(t, 0, q) 566 p += 1 567 q = skip_one_fast(&s, &p) 568 assert.Equal(t, 6, p) 569 assert.Equal(t, 3, q) 570 p += 1 571 q = skip_one_fast(&s, &p) 572 assert.Equal(t, 10, p) 573 assert.Equal(t, 8, q) 574 p += 1 575 q = skip_one_fast(&s, &p) 576 assert.Equal(t, 24, p) 577 assert.Equal(t, 12, q) 578 p += 1 579 q = skip_one_fast(&s, &p) 580 assert.Equal(t, 30, p) 581 assert.Equal(t, 26, q) 582 p += 1 583 q = skip_one_fast(&s, &p) 584 assert.Equal(t, 37, p) 585 assert.Equal(t, 32, q) 586 p += 1 587 q = skip_one_fast(&s, &p) 588 assert.Equal(t, 43, p) 589 assert.Equal(t, 39, q) 590 p += 1 591 q = skip_one_fast(&s, &p) 592 assert.Equal(t, 47, p) 593 assert.Equal(t, 45, q) 594 p += 1 595 q = skip_one_fast(&s, &p) 596 assert.Equal(t, 51, p) 597 assert.Equal(t, 49, q) 598 } 599 600 func TestNative_SkipOneFast_Error(t *testing.T) { 601 for _, s := range([]string{ 602 "{{", "[{", "{{}", 603 `"asdf`, `"\\\"`, 604 }) { 605 p := 0 606 q := skip_one_fast(&s, &p) 607 assert.True(t, q < 0) 608 } 609 } 610 611 func TestNative_GetByPath(t *testing.T) { 612 s := `{"asdf": [null, true, false, 1, 2.0, -3]}, 1234.5` 613 p := 0 614 path := []interface{}{"asdf", 4} 615 ret := get_by_path(&s, &p, &path, types.NewStateMachine()) 616 assert.Equal(t, strings.Index(s, "2.0"), ret) 617 } 618 619 func BenchmarkNative_SkipOneFast(b *testing.B) { 620 b.ResetTimer() 621 for i:=0; i<b.N; i++ { 622 s := `{"asdf": [null, true, false, 1, 2.0, -3]}, 1234.5` 623 p := 0 624 _ = skip_one_fast(&s, &p) 625 } 626 } 627 628 func BenchmarkNative_GetByPath(b *testing.B) { 629 b.ResetTimer() 630 for i:=0; i<b.N; i++ { 631 s := `{"asdf": [null, true, false, 1, 2.0, -3]}, 1234.5` 632 p := 0 633 path := []interface{}{"asdf", 3} 634 sm := types.NewStateMachine() 635 _ = get_by_path(&s, &p, &path, sm) 636 types.FreeStateMachine(sm) 637 } 638 }