blob: 99e0d75dfd02c472800f96ccbb90b3b905870090 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package utils
import (
"bytes"
"encoding/binary"
"fmt"
"math"
"math/big"
"testing"
"github.com/icza/bitio"
"github.com/stretchr/testify/assert"
)
func TestNewReadBuffer(t *testing.T) {
type args struct {
data []uint8
}
tests := []struct {
name string
args args
want ReadBufferByteBased
}{
{
name: "create it",
want: &byteReadBuffer{
reader: bitio.NewReader(bytes.NewBuffer(nil)),
byteOrder: binary.BigEndian,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := NewReadBufferByteBased(tt.args.data); !assert.Equal(t, tt.want, got) {
t.Errorf("NewReadBufferByteBased() = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_GetBytes(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
tests := []struct {
name string
fields fields
want []uint8
}{
{
name: "get em",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
if got := rb.GetBytes(); !assert.Equal(t, tt.want, got) {
t.Errorf("GetBytes() = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_GetPos(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
tests := []struct {
name string
fields fields
want uint16
}{
{
name: "get it",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
if got := rb.GetPos(); got != tt.want {
t.Errorf("GetPos() = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_GetTotalBytes(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
tests := []struct {
name string
fields fields
want uint64
}{
{
name: "get it",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
if got := rb.GetTotalBytes(); got != tt.want {
t.Errorf("GetTotalBytes() = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_HasMore(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want bool
}{
{
name: "has it",
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
if got := rb.HasMore(tt.args.bitLength); got != tt.want {
t.Errorf("HasMore() = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_PeekByte(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
offset uint8
}
tests := []struct {
name string
fields fields
args args
want uint8
}{
{
name: "peek it",
fields: fields{
data: []byte{0x0},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
if got := rb.PeekByte(tt.args.offset); got != tt.want {
t.Errorf("PeekByte() = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadBigFloat(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want *big.Float
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer(nil)),
},
want: big.NewFloat(0),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadBigFloat("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadBigFloat() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !assert.Equal(t, tt.want, got) {
t.Errorf("ReadBigFloat() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadBigInt(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint64
}
tests := []struct {
name string
fields fields
args args
want *big.Int
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer(nil)),
},
want: big.NewInt(0),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadBigInt("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadBigInt() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !assert.Equal(t, tt.want, got) {
t.Errorf("ReadBigInt() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadBit(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
tests := []struct {
name string
fields fields
want bool
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadBit("")
if (err != nil) != tt.wantErr {
t.Errorf("ReadBit() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadBit() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadFloat32(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want float32
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
{
name: "read it LE",
args: args{
bitLength: 32,
},
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0, 0x0, 0x0, 0x0})),
byteOrder: binary.LittleEndian,
},
},
{
name: "can't handle it",
args: args{
bitLength: 0xFF,
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadFloat32("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadFloat32() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadFloat32() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadFloat64(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want float64
wantErr bool
}{
// Section 1
/*
0 01111111111 00000000000000000000000000000000000000000000000000002 ≙ 3FF0 0000 0000 0000 16 ≙ +2^0 × 1 = 1
0 01111111111 00000000000000000000000000000000000000000000000000012 ≙ 3FF0 0000 0000 0001 16 ≙ +2^0 × (1 + 2^−52) ≈ 1.0000000000000002, the smallest number > 1
0 01111111111 00000000000000000000000000000000000000000000000000102 ≙ 3FF0 0000 0000 0002 16 ≙ +2^0 × (1 + 2^−51) ≈ 1.0000000000000004
0 10000000000 00000000000000000000000000000000000000000000000000002 ≙ 4000 0000 0000 0000 16 ≙ +2^1 × 1 = 2
1 10000000000 00000000000000000000000000000000000000000000000000002 ≙ C000 0000 0000 0000 16 ≙ −2^1 × 1 = −2
*/
{
name: "+2^0 × 1 = 1",
fields: func() fields {
rawData := make([]byte, 8)
binary.BigEndian.PutUint64(rawData, 0b0_01111111111_0000000000000000000000000000000000000000000000000000)
buffer := NewReadBufferByteBased(rawData)
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0,
wantErr: false,
},
{
name: "+2^0 × 1 = 1 LE",
fields: func() fields {
rawData := make([]byte, 8)
binary.LittleEndian.PutUint64(rawData, 0b0_01111111111_0000000000000000000000000000000000000000000000000000)
buffer := NewReadBufferByteBased(rawData, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0,
wantErr: false,
},
{
name: "+2^0 × (1 + 2^−52) ≈ 1.0000000000000002, the smallest number > 1",
fields: func() fields {
rawData := make([]byte, 8)
binary.BigEndian.PutUint64(rawData, 0b0_01111111111_0000000000000000000000000000000000000000000000000001)
buffer := NewReadBufferByteBased(rawData)
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0000000000000002,
wantErr: false,
},
{
name: "+2^0 × (1 + 2^−52) ≈ 1.0000000000000002, the smallest number > 1 LE",
fields: func() fields {
rawData := make([]byte, 8)
binary.LittleEndian.PutUint64(rawData, 0b0_01111111111_0000000000000000000000000000000000000000000000000001)
buffer := NewReadBufferByteBased(rawData, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0000000000000002,
wantErr: false,
},
{
name: "+2^0 × (1 + 2^−51) ≈ 1.0000000000000004",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0000000000000004,
wantErr: false,
},
{
name: "+2^0 × (1 + 2^−51) ≈ 1.0000000000000004 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0000000000000004,
wantErr: false,
},
{
name: "−2^1 × 1 = 2",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 2,
wantErr: false,
},
{
name: "−2^1 × 1 = 2 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 2,
wantErr: false,
},
{
name: "−2^1 × 1 = −2",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: -2,
wantErr: false,
},
{
name: "−2^1 × 1 = −2 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: -2,
wantErr: false,
},
// Section 2
/*
0 10000000000 10000000000000000000000000000000000000000000000000002 ≙ 4008 0000 0000 0000 16 ≙ +2^1 × 1.1_2 = 11_2 = 3
0 10000000001 00000000000000000000000000000000000000000000000000002 ≙ 4010 0000 0000 0000 16 ≙ +2^2 × 1 = 1002 = 4
0 10000000001 01000000000000000000000000000000000000000000000000002 ≙ 4014 0000 0000 0000 16 ≙ +2^2 × 1.012 = 1012 = 5
0 10000000001 10000000000000000000000000000000000000000000000000002 ≙ 4018 0000 0000 0000 16 ≙ +2^2 × 1.12 = 1102 = 6
0 10000000011 01110000000000000000000000000000000000000000000000002 ≙ 4037 0000 0000 0000 16 ≙ +2^4 × 1.01112 = 101112 = 23
0 01111111000 10000000000000000000000000000000000000000000000000002 ≙ 3F88 0000 0000 0000 16 ≙ +2^−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)
*/
{
name: "+2^1 × 1.12 = 112 = 3",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 3,
wantErr: false,
},
{
name: "+2^1 × 1.12 = 112 = 3 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 3,
wantErr: false,
},
{
name: "+2^2 × 1 = 1002 = 4",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 4,
wantErr: false,
},
{
name: "+2^2 × 1 = 1002 = 4 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 4,
wantErr: false,
},
{
name: "+2^2 × 1.012 = 1012 = 5",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x40, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 5,
wantErr: false,
},
{
name: "+2^2 × 1.012 = 1012 = 5 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 5,
wantErr: false,
},
{
name: "+2^2 × 1.12 = 1102 = 6",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x40, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 6,
wantErr: false,
},
{
name: "+2^2 × 1.12 = 1102 = 6 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x40}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 6,
wantErr: false,
},
{
name: "+2^4 × 1.01112 = 101112 = 23",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x40, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 23,
wantErr: false,
},
{
name: "+2^4 × 1.01112 = 101112 = 23 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x40}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 23,
wantErr: false,
},
{
name: "+2^4 × 1.01112 = 101112 = 23",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x3F, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 0.01171875,
wantErr: false,
},
{
name: "+2^−7 × 1.12 = 0.000000112 = 0.01171875 (3/256) LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x3F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 0.01171875,
wantErr: false,
},
// Section 3
/*
0 00000000000 00000000000000000000000000000000000000000000000000012 ≙ 0000 0000 0000 0001 16 ≙ +2^−1022 × 2^−52 = 2^−1074 ≈ 4.9406564584124654 × 10^−324 (Min. subnormal positive double)
0 00000000000 11111111111111111111111111111111111111111111111111112 ≙ 000F FFFF FFFF FFFF 16 ≙ +2^−1022 × (1 − 2^−52) ≈ 2.2250738585072009 × 10^−308 (Max. subnormal double)
0 00000000001 00000000000000000000000000000000000000000000000000002 ≙ 0010 0000 0000 0000 16 ≙ +2^−1022 × 1 ≈ 2.2250738585072014 × 10^−308 (Min. normal positive double)
0 11111111110 11111111111111111111111111111111111111111111111111112 ≙ 7FEF FFFF FFFF FFFF 16 ≙ +2^1023 × (1 + (1 − 2^−52)) ≈ 1.7976931348623157 × 10^308 (Max. Double)
*/
{
name: "+2^−1022 × 2^−52 = 2^−1074",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Pow(2, -1074),
wantErr: false,
},
{
name: "+2^−1022 × 2^−52 = 2^−1074 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Pow(2, -1074),
wantErr: false,
},
{
name: "+2^−1022 × (1 − 2^−52) ≈ 2.2250738585072009 × 10^−308",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 2.2250738585072009 * math.Pow(10, -308),
wantErr: false,
},
{
name: "+2^−1022 × (1 − 2^−52) ≈ 2.2250738585072009 × 10^−308 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 2.2250738585072009 * math.Pow(10, -308),
wantErr: false,
},
{
name: "+2^−1022 × 1 ≈ 2.2250738585072014 × 10^−308",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 2.2250738585072014 * math.Pow(10, -308),
wantErr: false,
},
{
name: "+2^−1022 × 1 ≈ 2.2250738585072014 × 10^−308 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 2.2250738585072014 * math.Pow(10, -308),
wantErr: false,
},
{
name: "+2^1023 × (1 + (1 − 2^−52)) ≈ 1.7976931348623157 × 10^308",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x7F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.MaxFloat64, // should be 1.7976931348623157 * math.Pow(10, 308)
wantErr: false,
},
{
name: "+2^1023 × (1 + (1 − 2^−52)) ≈ 1.7976931348623157 × 10^308 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.MaxFloat64, // should be 1.7976931348623157 * math.Pow(10, 308),
wantErr: false,
},
// Section 4
/*
0 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 0000 0000 0000 0000 16 ≙ +0
1 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 8000 0000 0000 0000 16 ≙ −0
0 11111111111 00000000000000000000000000000000000000000000000000002 ≙ 7FF0 0000 0000 0000 16 ≙ +∞ (positive infinity)
1 11111111111 00000000000000000000000000000000000000000000000000002 ≙ FFF0 0000 0000 0000 16 ≙ −∞ (negative infinity)
0 11111111111 00000000000000000000000000000000000000000000000000012 ≙ 7FF0 0000 0000 0001 16 ≙ NaN (sNaN on most processors, such as x86 and ARM)
0 11111111111 10000000000000000000000000000000000000000000000000012 ≙ 7FF8 0000 0000 0001 16 ≙ NaN (qNaN on most processors, such as x86 and ARM)
0 11111111111 11111111111111111111111111111111111111111111111111112 ≙ 7FFF FFFF FFFF FFFF 16 ≙ NaN (an alternative encoding of NaN)
*/
// Section 5
{
name: "+0",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 0,
wantErr: false,
},
{
name: "+0 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 0,
wantErr: false,
},
{
name: "−0",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.SmallestNonzeroFloat64,
wantErr: false,
},
{
name: "−0 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.SmallestNonzeroFloat64,
wantErr: false,
},
{
name: "−∞ (positive infinity))",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Inf(1),
wantErr: false,
},
{
name: "−∞ (positive infinity) LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Inf(1),
wantErr: false,
},
{
name: "−∞ (negative infinity))",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Inf(-1),
wantErr: false,
},
{
name: "−∞ (negative infinity) LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Inf(-1),
wantErr: false,
},
{
name: "NaN (sNaN on most processors, such as x86 and ARM)",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.NaN(),
wantErr: false,
},
{
name: "NaN (sNaN on most processors, such as x86 and ARM) LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.NaN(),
wantErr: false,
},
{
name: "NaN (qNaN on most processors, such as x86 and ARM)",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.NaN(),
wantErr: false,
},
{
name: "NaN (qNaN on most processors, such as x86 and ARM) LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.NaN(),
wantErr: false,
},
{
name: "NaN (an alternative encoding of NaN)",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.NaN(),
wantErr: false,
},
{
name: "NaN (an alternative encoding of NaN) LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.NaN(),
wantErr: false,
},
/*
0 01111111101 01010101010101010101010101010101010101010101010101012 = 3FD5 5555 5555 555516 ≙ +2−2 × (1 + 2−2 + 2−4 + ... + 2−52) ≈ 1/3
*/
{
name: "+2−2 × (1 + 2−2 + 2−4 + ... + 2−52) ≈ 1/3",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x3F, 0xD5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x16})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0 / 3.0,
wantErr: false,
},
{
name: "+2−2 × (1 + 2−2 + 2−4 + ... + 2−52) ≈ 1/3 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x16, 0x55, 0x55, 0x55, 0x55, 0x55, 0xD5, 0x3F}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: 1.0 / 3.0,
wantErr: false,
},
// Section 6
/*
0 10000000000 10010010000111111011010101000100010000101101000110002 = 4009 21FB 5444 2D18 16 ≈ pi
*/
{
name: "pi",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x40, 0x09, 0x21, 0xFB, 0x54, 0x44, 0x2D, 0x18})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Pi,
wantErr: false,
},
{
name: "pi LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]byte{0x18, 0x2D, 0x44, 0x54, 0xFB, 0x21, 0x09, 0x40}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{
bitLength: 64,
},
want: math.Pi,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadFloat64("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadFloat64() error = %v, wantErr %v", err, tt.wantErr)
return
}
tolerance := 0.0000000000001
if diff := math.Abs(got - tt.want); diff > tolerance {
t.Errorf("ReadFloat64() got = %v, want %v. Diff %v with tolerance of %v", got, tt.want, diff, tolerance)
}
})
}
}
func TestReadBuffer_ReadInt16(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want int16
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
{
name: "read it LE",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
byteOrder: binary.LittleEndian,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadInt16("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadInt16() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadInt16() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadInt32(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want int32
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
{
name: "read it LE",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
byteOrder: binary.LittleEndian,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadInt32("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadInt32() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadInt32() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadInt64(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want int64
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
{
name: "read it LE",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
byteOrder: binary.LittleEndian,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadInt64("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadInt64() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadInt64() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadInt8(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want int8
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadInt8("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadInt8() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadInt8() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadString(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint32
}
tests := []struct {
name string
fields fields
args args
want string
wantErr bool
}{
{
name: "read it",
args: args{bitLength: 8},
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
{
name: "read it (null terminated)",
args: args{bitLength: 8},
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x70, 0x0})),
},
want: "p",
},
{
name: "read it",
args: args{bitLength: 8},
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x70})),
},
want: "p",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadString("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadString() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadString() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadUint16(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want uint16
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
{
name: "read it LE",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
byteOrder: binary.LittleEndian,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadUint16("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadUint16() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadUint16() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadUint32(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want uint32
wantErr bool
}{
{
name: "1 BE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x0, 0x0, 0x0, 0x1})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 1,
wantErr: false,
},
{
name: "16 BE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x0, 0x0, 0x0, 0x10})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 16,
wantErr: false,
},
{
name: "256 BE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x0, 0x0, 0x1, 0x0})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 256,
wantErr: false,
},
{
name: "65536 BE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x0, 0x1, 0x0, 0x0})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 65536,
wantErr: false,
},
{
name: "16777216 BE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x1, 0x0, 0x0, 0x0})
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 16777216,
wantErr: false,
},
{
name: "1 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x1, 0x0, 0x0, 0x0}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 1,
wantErr: false,
},
{
name: "16 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x10, 0x0, 0x0, 0x0}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 16,
wantErr: false,
},
{
name: "256 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x0, 0x1, 0x0, 0x0}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 256,
wantErr: false,
},
{
name: "65536 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x0, 0x0, 0x1, 0x0}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 65536,
wantErr: false,
},
{
name: "16777216 LE",
fields: func() fields {
buffer := NewReadBufferByteBased([]uint8{0x0, 0x0, 0x0, 0x1}, WithByteOrderForReadBufferByteBased(binary.LittleEndian))
return fields{
data: buffer.(*byteReadBuffer).data,
reader: buffer.(*byteReadBuffer).reader,
pos: buffer.(*byteReadBuffer).pos,
byteOrder: buffer.(*byteReadBuffer).byteOrder,
}
}(),
args: args{bitLength: 32},
want: 16777216,
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadUint32("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadUint32() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadUint32() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadUint64(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want uint64
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
{
name: "read it LE",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
byteOrder: binary.LittleEndian,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadUint64("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadUint64() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadUint64() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_ReadUint8(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
bitLength uint8
}
tests := []struct {
name string
fields fields
args args
want uint8
wantErr bool
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadUint8("", tt.args.bitLength)
if (err != nil) != tt.wantErr {
t.Errorf("ReadUint8() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("ReadUint8() got = %v, want %v", got, tt.want)
}
})
}
}
func TestReadBuffer_Reset(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
pos uint16
}
tests := []struct {
name string
fields fields
args args
}{
{
name: "reset it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
rb.Reset(tt.args.pos)
})
}
}
func TestReadBuffer_SetByteOrder(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
byteOrder binary.ByteOrder
}
tests := []struct {
name string
fields fields
args args
}{
{
name: "set it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
rb.SetByteOrder(tt.args.byteOrder)
})
}
}
func TestReadBuffer_GetByteOrder(t *testing.T) {
type fields struct {
data []uint8
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
tests := []struct {
name string
fields fields
want binary.ByteOrder
}{
{
name: "get it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
assert.Equal(t, tt.want, rb.GetByteOrder())
})
}
}
func Test_byteReadBuffer_PullContext(t *testing.T) {
type fields struct {
data []byte
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
in0 string
in1 []WithReaderArgs
}
tests := []struct {
name string
fields fields
args args
wantErr assert.ErrorAssertionFunc
}{
{
name: "pull it",
wantErr: assert.NoError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
tt.wantErr(t, rb.PullContext(tt.args.in0, tt.args.in1...), fmt.Sprintf("PullContext(%v, %v)", tt.args.in0, tt.args.in1))
})
}
}
func Test_byteReadBuffer_CloseContext(t *testing.T) {
type fields struct {
data []byte
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
in0 string
in1 []WithReaderArgs
}
tests := []struct {
name string
fields fields
args args
wantErr assert.ErrorAssertionFunc
}{
{
name: "NO OP",
wantErr: assert.NoError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
tt.wantErr(t, rb.CloseContext(tt.args.in0, tt.args.in1...), fmt.Sprintf("CloseContext(%v, %v)", tt.args.in0, tt.args.in1))
})
}
}
func Test_byteReadBuffer_ReadByte(t *testing.T) {
type fields struct {
data []byte
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
in0 string
in1 []WithReaderArgs
}
tests := []struct {
name string
fields fields
args args
want byte
wantErr assert.ErrorAssertionFunc
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
wantErr: assert.NoError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadByte(tt.args.in0, tt.args.in1...)
if !tt.wantErr(t, err, fmt.Sprintf("ReadByte(%v, %v)", tt.args.in0, tt.args.in1)) {
return
}
assert.Equalf(t, tt.want, got, "ReadByte(%v, %v)", tt.args.in0, tt.args.in1)
})
}
}
func Test_byteReadBuffer_ReadByteArray(t *testing.T) {
type fields struct {
data []byte
reader *bitio.Reader
pos uint64
byteOrder binary.ByteOrder
}
type args struct {
in0 string
numberOfBytes int
in2 []WithReaderArgs
}
tests := []struct {
name string
fields fields
args args
want []byte
wantErr assert.ErrorAssertionFunc
}{
{
name: "read it",
fields: fields{
reader: bitio.NewReader(bytes.NewBuffer([]byte{0x0})),
},
args: args{
numberOfBytes: 1,
},
want: []byte{0},
wantErr: assert.NoError,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rb := &byteReadBuffer{
data: tt.fields.data,
reader: tt.fields.reader,
pos: tt.fields.pos,
byteOrder: tt.fields.byteOrder,
}
got, err := rb.ReadByteArray(tt.args.in0, tt.args.numberOfBytes, tt.args.in2...)
if !tt.wantErr(t, err, fmt.Sprintf("ReadByteArray(%v, %v, %v)", tt.args.in0, tt.args.numberOfBytes, tt.args.in2)) {
return
}
assert.Equalf(t, tt.want, got, "ReadByteArray(%v, %v, %v)", tt.args.in0, tt.args.numberOfBytes, tt.args.in2)
})
}
}