...

Text file src/github.com/bytedance/sonic/internal/native/native_test.tmpl

Documentation: github.com/bytedance/sonic/internal/native

     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
    24package {{PACKAGE}}
    25
    26import (
    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
    41func 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
    52func 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
    62func 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
    76func 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
    87func 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
   101func 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
   116func 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
   175func 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
   190func 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
   217func 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
   231func 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
   242func 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
   256func 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
   265func 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
   275func 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
   289func 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
   342func 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
   410func 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
   476func 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
   513func 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
   525func 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
   532func 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
   539func 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
   547func 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
   555func 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
   600func 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
   611func 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
   619func 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
   628func 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}

View as plain text