github.com/goshafaq/sonic@v0.0.0-20231026082336-871835fb94c6/internal/native/native_amd64_test.tmpl (about)

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