...

Source file src/github.com/json-iterator/go/iter_skip_sloppy_test.go

Documentation: github.com/json-iterator/go

     1  //+build jsoniter_sloppy
     2  
     3  package jsoniter
     4  
     5  import (
     6  	"github.com/stretchr/testify/require"
     7  	"io"
     8  	"testing"
     9  )
    10  
    11  func Test_string_end(t *testing.T) {
    12  	end, escaped := ParseString(ConfigDefault, `abc"`).findStringEnd()
    13  	if end != 4 {
    14  		t.Fatal(end)
    15  	}
    16  	if escaped != false {
    17  		t.Fatal(escaped)
    18  	}
    19  	end, escaped = ParseString(ConfigDefault, `abc\\"`).findStringEnd()
    20  	if end != 6 {
    21  		t.Fatal(end)
    22  	}
    23  	if escaped != true {
    24  		t.Fatal(escaped)
    25  	}
    26  	end, escaped = ParseString(ConfigDefault, `abc\\\\"`).findStringEnd()
    27  	if end != 8 {
    28  		t.Fatal(end)
    29  	}
    30  	if escaped != true {
    31  		t.Fatal(escaped)
    32  	}
    33  	end, escaped = ParseString(ConfigDefault, `abc\"`).findStringEnd()
    34  	if end != -1 {
    35  		t.Fatal(end)
    36  	}
    37  	if escaped != false {
    38  		t.Fatal(escaped)
    39  	}
    40  	end, escaped = ParseString(ConfigDefault, `abc\`).findStringEnd()
    41  	if end != -1 {
    42  		t.Fatal(end)
    43  	}
    44  	if escaped != true {
    45  		t.Fatal(escaped)
    46  	}
    47  	end, escaped = ParseString(ConfigDefault, `abc\\`).findStringEnd()
    48  	if end != -1 {
    49  		t.Fatal(end)
    50  	}
    51  	if escaped != false {
    52  		t.Fatal(escaped)
    53  	}
    54  	end, escaped = ParseString(ConfigDefault, `\\`).findStringEnd()
    55  	if end != -1 {
    56  		t.Fatal(end)
    57  	}
    58  	if escaped != false {
    59  		t.Fatal(escaped)
    60  	}
    61  	end, escaped = ParseString(ConfigDefault, `\`).findStringEnd()
    62  	if end != -1 {
    63  		t.Fatal(end)
    64  	}
    65  	if escaped != true {
    66  		t.Fatal(escaped)
    67  	}
    68  }
    69  
    70  type StagedReader struct {
    71  	r1 string
    72  	r2 string
    73  	r3 string
    74  	r  int
    75  }
    76  
    77  func (reader *StagedReader) Read(p []byte) (n int, err error) {
    78  	reader.r++
    79  	switch reader.r {
    80  	case 1:
    81  		copy(p, []byte(reader.r1))
    82  		return len(reader.r1), nil
    83  	case 2:
    84  		copy(p, []byte(reader.r2))
    85  		return len(reader.r2), nil
    86  	case 3:
    87  		copy(p, []byte(reader.r3))
    88  		return len(reader.r3), nil
    89  	default:
    90  		return 0, io.EOF
    91  	}
    92  }
    93  
    94  func Test_skip_string(t *testing.T) {
    95  	should := require.New(t)
    96  	iter := ParseString(ConfigDefault, `"abc`)
    97  	iter.skipString()
    98  	should.Equal(1, iter.head)
    99  	iter = ParseString(ConfigDefault, `\""abc`)
   100  	iter.skipString()
   101  	should.Equal(3, iter.head)
   102  	reader := &StagedReader{
   103  		r1: `abc`,
   104  		r2: `"`,
   105  	}
   106  	iter = Parse(ConfigDefault, reader, 4096)
   107  	iter.skipString()
   108  	should.Equal(1, iter.head)
   109  	reader = &StagedReader{
   110  		r1: `abc`,
   111  		r2: `1"`,
   112  	}
   113  	iter = Parse(ConfigDefault, reader, 4096)
   114  	iter.skipString()
   115  	should.Equal(2, iter.head)
   116  	reader = &StagedReader{
   117  		r1: `abc\`,
   118  		r2: `"`,
   119  	}
   120  	iter = Parse(ConfigDefault, reader, 4096)
   121  	iter.skipString()
   122  	should.NotNil(iter.Error)
   123  	reader = &StagedReader{
   124  		r1: `abc\`,
   125  		r2: `""`,
   126  	}
   127  	iter = Parse(ConfigDefault, reader, 4096)
   128  	iter.skipString()
   129  	should.Equal(2, iter.head)
   130  }
   131  
   132  func Test_skip_object(t *testing.T) {
   133  	iter := ParseString(ConfigDefault, `}`)
   134  	iter.skipObject()
   135  	if iter.head != 1 {
   136  		t.Fatal(iter.head)
   137  	}
   138  	iter = ParseString(ConfigDefault, `a}`)
   139  	iter.skipObject()
   140  	if iter.head != 2 {
   141  		t.Fatal(iter.head)
   142  	}
   143  	iter = ParseString(ConfigDefault, `{}}a`)
   144  	iter.skipObject()
   145  	if iter.head != 3 {
   146  		t.Fatal(iter.head)
   147  	}
   148  	reader := &StagedReader{
   149  		r1: `{`,
   150  		r2: `}}a`,
   151  	}
   152  	iter = Parse(ConfigDefault, reader, 4096)
   153  	iter.skipObject()
   154  	if iter.head != 2 {
   155  		t.Fatal(iter.head)
   156  	}
   157  	iter = ParseString(ConfigDefault, `"}"}a`)
   158  	iter.skipObject()
   159  	if iter.head != 4 {
   160  		t.Fatal(iter.head)
   161  	}
   162  }
   163  

View as plain text