Skip to content

Commit

Permalink
fix read string bug when using reader
Browse files Browse the repository at this point in the history
  • Loading branch information
zerosnake0 committed Feb 2, 2020
1 parent 3aac47e commit e8f72fe
Show file tree
Hide file tree
Showing 12 changed files with 65 additions and 37 deletions.
25 changes: 17 additions & 8 deletions helper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@ func withIterator(data string, cb func(it *Iterator)) {
cb(it)
}

type oneByteReader struct {
b string
err error
type stepByteReader struct {
b string
step int
err error
}

var _ io.Reader = &oneByteReader{}
var _ io.Reader = &stepByteReader{}

func (o *oneByteReader) Read(p []byte) (n int, err error) {
func (o *stepByteReader) Read(p []byte) (n int, err error) {
if len(p) == 0 {
return 0, nil
}
Expand All @@ -41,9 +42,17 @@ func (o *oneByteReader) Read(p []byte) (n int, err error) {
}
return 0, io.EOF
}
p[0] = o.b[0]
o.b = o.b[1:]
return 1, nil
step := o.step
if step == 0 {
step = 1
} else {
if len(p) < step {
step = len(p)
}
}
n = copy(p[:step], o.b)
o.b = o.b[n:]
return n, nil
}

type repeatByteReader struct {
Expand Down
10 changes: 5 additions & 5 deletions iterator_float32_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func TestIterator_Float_ReadFloat32_LeadingZero(t *testing.T) {
t.Run("reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0",
err: e,
})
Expand Down Expand Up @@ -106,7 +106,7 @@ func TestIterator_Float_ReadFloat32_LeadingZero(t *testing.T) {
t.Run("fraction reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0.",
err: e,
})
Expand All @@ -117,7 +117,7 @@ func TestIterator_Float_ReadFloat32_LeadingZero(t *testing.T) {
t.Run("fraction reader error 2", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0.1",
err: e,
})
Expand Down Expand Up @@ -160,7 +160,7 @@ func TestIterator_Float_ReadFloat32_LeadingZero(t *testing.T) {
t.Run("exponent reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0.1e+1",
err: e,
})
Expand Down Expand Up @@ -216,7 +216,7 @@ func TestIterator_Float_ReadFloat32_NonLeadingZero(t *testing.T) {
t.Run("reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "10",
err: e,
})
Expand Down
10 changes: 5 additions & 5 deletions iterator_float64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func TestIterator_Float_ReadFloat64_LeadingZero(t *testing.T) {
t.Run("reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0",
err: e,
})
Expand Down Expand Up @@ -105,7 +105,7 @@ func TestIterator_Float_ReadFloat64_LeadingZero(t *testing.T) {
t.Run("fraction reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0.",
err: e,
})
Expand All @@ -116,7 +116,7 @@ func TestIterator_Float_ReadFloat64_LeadingZero(t *testing.T) {
t.Run("fraction reader error 2", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0.1",
err: e,
})
Expand Down Expand Up @@ -159,7 +159,7 @@ func TestIterator_Float_ReadFloat64_LeadingZero(t *testing.T) {
t.Run("exponent reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "0.1e+1",
err: e,
})
Expand Down Expand Up @@ -215,7 +215,7 @@ func TestIterator_Float_ReadFloat64_NonLeadingZero(t *testing.T) {
t.Run("reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: "10",
err: e,
})
Expand Down
2 changes: 1 addition & 1 deletion iterator_int16_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func TestIterator_Int_ReadUint16(t *testing.T) {
t.Run("reader", func(t *testing.T) {
withIterator("", func(it *Iterator) {
var m uint16 = math.MaxUint16
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: fmt.Sprint(m),
})
u, err := it.ReadUint16()
Expand Down
2 changes: 1 addition & 1 deletion iterator_int32_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func TestIterator_Int_ReadUint32(t *testing.T) {
t.Run("reader", func(t *testing.T) {
withIterator("", func(it *Iterator) {
var m uint32 = math.MaxUint32
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: fmt.Sprint(m),
})
u, err := it.ReadUint32()
Expand Down
2 changes: 1 addition & 1 deletion iterator_int64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func TestIterator_Int_ReadUint64(t *testing.T) {
t.Run("reader", func(t *testing.T) {
withIterator("", func(it *Iterator) {
var m uint64 = math.MaxUint64
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: fmt.Sprint(m),
})
u, err := it.ReadUint64()
Expand Down
2 changes: 1 addition & 1 deletion iterator_int8_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func TestIterator_Int_ReadUint8(t *testing.T) {
t.Run("reader", func(t *testing.T) {
withIterator("", func(it *Iterator) {
var m uint8 = math.MaxUint8
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: fmt.Sprint(m),
})
u, err := it.ReadUint8()
Expand Down
12 changes: 6 additions & 6 deletions iterator_number_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func TestIterator_Number_ReadNumber_LeadingZero(t *testing.T) {
t.Run("reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 0",
err: e,
})
Expand Down Expand Up @@ -91,7 +91,7 @@ func TestIterator_Number_ReadNumber_LeadingZero(t *testing.T) {
t.Run("fraction error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 0.12",
err: e,
})
Expand Down Expand Up @@ -134,7 +134,7 @@ func TestIterator_Number_ReadNumber_LeadingZero(t *testing.T) {
t.Run("exponent end error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 0.1e+2",
err: e,
})
Expand Down Expand Up @@ -162,7 +162,7 @@ func TestIterator_Number_ReadNumber_NonLeadingZero(t *testing.T) {
t.Run("reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 1",
err: e,
})
Expand Down Expand Up @@ -213,7 +213,7 @@ func TestIterator_Number_ReadNumber_NonLeadingZero(t *testing.T) {
t.Run("fraction error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 1.23",
err: e,
})
Expand Down Expand Up @@ -256,7 +256,7 @@ func TestIterator_Number_ReadNumber_NonLeadingZero(t *testing.T) {
t.Run("exponent end error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 1.2e+3",
err: e,
})
Expand Down
2 changes: 1 addition & 1 deletion iterator_pool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func TestIteratorPool(t *testing.T) {
}

f(func(it *Iterator) {
it.Reset(&oneByteReader{})
it.Reset(&stepByteReader{})
})

data := []byte("test")
Expand Down
8 changes: 4 additions & 4 deletions iterator_skip_number_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func TestIterator_Skip_SkipNumber(t *testing.T) {
t.Run("reader error after zero", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " -0",
err: e,
})
Expand Down Expand Up @@ -108,7 +108,7 @@ func TestIterator_Skip_SkipNumber(t *testing.T) {
t.Run("non zero reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 1",
err: e,
})
Expand Down Expand Up @@ -147,7 +147,7 @@ func TestIterator_Skip_SkipNumber(t *testing.T) {
t.Run("fraction reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 1.2",
err: e,
})
Expand Down Expand Up @@ -182,7 +182,7 @@ func TestIterator_Skip_SkipNumber(t *testing.T) {
t.Run("exponent reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: " 0e+1",
err: e,
})
Expand Down
4 changes: 4 additions & 0 deletions iterator_str.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ func (it *Iterator) readStringAsSlice() (_ []byte, err error) {
}
}
buf := append(it.tmpBuffer[:0], it.buffer[it.head:it.tail]...)
it.head = it.tail
if err := it.readMore(); err != nil {
return nil, err
}
buf, err = it.readStringAsSliceSlow(buf)
it.tmpBuffer = buf
return buf, err
Expand Down
23 changes: 19 additions & 4 deletions iterator_str_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func TestIterator_Str_readU4(t *testing.T) {
})
t.Run("reader", func(t *testing.T) {
withIterator("", func(it *Iterator) {
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: src,
})
s, err := it.ReadString()
Expand Down Expand Up @@ -194,7 +194,7 @@ func TestIterator_Str_readStringAsSlice(t *testing.T) {
t.Run("reader error", func(t *testing.T) {
withIterator("", func(it *Iterator) {
e := errors.New("test")
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
err: e,
})
_, err := it.ReadString()
Expand Down Expand Up @@ -237,7 +237,7 @@ func TestIterator_Str_readStringAsSlice(t *testing.T) {
})
t.Run("reade err", func(t *testing.T) {
withIterator("", func(it *Iterator) {
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: `"\n`,
})
_, err := it.ReadString()
Expand All @@ -246,7 +246,7 @@ func TestIterator_Str_readStringAsSlice(t *testing.T) {
})
t.Run("reader", func(t *testing.T) {
withIterator("", func(it *Iterator) {
it.Reset(&oneByteReader{
it.Reset(&stepByteReader{
b: `"\n"`,
})
s, err := it.ReadString()
Expand All @@ -255,6 +255,21 @@ func TestIterator_Str_readStringAsSlice(t *testing.T) {
require.Equal(t, "\n", s)
})
})
t.Run("reader 2", func(t *testing.T) {
withIterator("", func(it *Iterator) {
it.Reset(&stepByteReader{
b: `"abc"`,
step: 2,
})
vt, err := it.NextValueType()
require.NoError(t, err)
require.Equal(t, StringValue, vt)

s, err := it.ReadString()
require.NoError(t, err)
require.Equal(t, "abc", s)
})
})
}

func TestIterator_Str_ReadStringAsSlice(t *testing.T) {
Expand Down

0 comments on commit e8f72fe

Please sign in to comment.