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