diff options
| author | Michael Stapelberg <stapelberg@debian.org> | 2013-03-04 21:27:36 +0100 | 
|---|---|---|
| committer | Michael Stapelberg <michael@stapelberg.de> | 2013-03-04 21:27:36 +0100 | 
| commit | 04b08da9af0c450d645ab7389d1467308cfc2db8 (patch) | |
| tree | db247935fa4f2f94408edc3acd5d0d4f997aa0d8 /src/pkg/encoding/binary/binary_test.go | |
| parent | 917c5fb8ec48e22459d77e3849e6d388f93d3260 (diff) | |
| download | golang-04b08da9af0c450d645ab7389d1467308cfc2db8.tar.gz | |
Imported Upstream version 1.1~hg20130304upstream/1.1_hg20130304
Diffstat (limited to 'src/pkg/encoding/binary/binary_test.go')
| -rw-r--r-- | src/pkg/encoding/binary/binary_test.go | 90 | 
1 files changed, 74 insertions, 16 deletions
| diff --git a/src/pkg/encoding/binary/binary_test.go b/src/pkg/encoding/binary/binary_test.go index ff361b7e3..056f0998f 100644 --- a/src/pkg/encoding/binary/binary_test.go +++ b/src/pkg/encoding/binary/binary_test.go @@ -9,6 +9,7 @@ import (  	"io"  	"math"  	"reflect" +	"strings"  	"testing"  ) @@ -120,18 +121,14 @@ func testWrite(t *testing.T, order ByteOrder, b []byte, s1 interface{}) {  	checkResult(t, "Write", order, err, buf.Bytes(), b)  } -func TestBigEndianRead(t *testing.T) { testRead(t, BigEndian, big, s) } - -func TestLittleEndianRead(t *testing.T) { testRead(t, LittleEndian, little, s) } - -func TestBigEndianWrite(t *testing.T) { testWrite(t, BigEndian, big, s) } - -func TestLittleEndianWrite(t *testing.T) { testWrite(t, LittleEndian, little, s) } +func TestLittleEndianRead(t *testing.T)     { testRead(t, LittleEndian, little, s) } +func TestLittleEndianWrite(t *testing.T)    { testWrite(t, LittleEndian, little, s) } +func TestLittleEndianPtrWrite(t *testing.T) { testWrite(t, LittleEndian, little, &s) } +func TestBigEndianRead(t *testing.T)     { testRead(t, BigEndian, big, s) } +func TestBigEndianWrite(t *testing.T)    { testWrite(t, BigEndian, big, s) }  func TestBigEndianPtrWrite(t *testing.T) { testWrite(t, BigEndian, big, &s) } -func TestLittleEndianPtrWrite(t *testing.T) { testWrite(t, LittleEndian, little, &s) } -  func TestReadSlice(t *testing.T) {  	slice := make([]int32, 2)  	err := Read(bytes.NewBuffer(src), BigEndian, slice) @@ -147,20 +144,81 @@ func TestWriteSlice(t *testing.T) {  func TestWriteT(t *testing.T) {  	buf := new(bytes.Buffer)  	ts := T{} -	err := Write(buf, BigEndian, ts) -	if err == nil { -		t.Errorf("WriteT: have nil, want non-nil") +	if err := Write(buf, BigEndian, ts); err == nil { +		t.Errorf("WriteT: have err == nil, want non-nil")  	}  	tv := reflect.Indirect(reflect.ValueOf(ts))  	for i, n := 0, tv.NumField(); i < n; i++ { -		err = Write(buf, BigEndian, tv.Field(i).Interface()) -		if err == nil { -			t.Errorf("WriteT.%v: have nil, want non-nil", tv.Field(i).Type()) +		typ := tv.Field(i).Type().String() +		if typ == "[4]int" { +			typ = "int" // the problem is int, not the [4] +		} +		if err := Write(buf, BigEndian, tv.Field(i).Interface()); err == nil { +			t.Errorf("WriteT.%v: have err == nil, want non-nil", tv.Field(i).Type()) +		} else if !strings.Contains(err.Error(), typ) { +			t.Errorf("WriteT: have err == %q, want it to mention %s", err, typ)  		}  	}  } +type BlankFields struct { +	A uint32 +	_ int32 +	B float64 +	_ [4]int16 +	C byte +	_ [7]byte +	_ struct { +		f [8]float32 +	} +} + +type BlankFieldsProbe struct { +	A  uint32 +	P0 int32 +	B  float64 +	P1 [4]int16 +	C  byte +	P2 [7]byte +	P3 struct { +		F [8]float32 +	} +} + +func TestBlankFields(t *testing.T) { +	buf := new(bytes.Buffer) +	b1 := BlankFields{A: 1234567890, B: 2.718281828, C: 42} +	if err := Write(buf, LittleEndian, &b1); err != nil { +		t.Error(err) +	} + +	// zero values must have been written for blank fields +	var p BlankFieldsProbe +	if err := Read(buf, LittleEndian, &p); err != nil { +		t.Error(err) +	} + +	// quick test: only check first value of slices +	if p.P0 != 0 || p.P1[0] != 0 || p.P2[0] != 0 || p.P3.F[0] != 0 { +		t.Errorf("non-zero values for originally blank fields: %#v", p) +	} + +	// write p and see if we can probe only some fields +	if err := Write(buf, LittleEndian, &p); err != nil { +		t.Error(err) +	} + +	// read should ignore blank fields in b2 +	var b2 BlankFields +	if err := Read(buf, LittleEndian, &b2); err != nil { +		t.Error(err) +	} +	if b1.A != b2.A || b1.B != b2.B || b1.C != b2.C { +		t.Errorf("%#v != %#v", b1, b2) +	} +} +  type byteSliceReader struct {  	remain []byte  } @@ -187,7 +245,7 @@ func BenchmarkReadStruct(b *testing.B) {  	bsr := &byteSliceReader{}  	var buf bytes.Buffer  	Write(&buf, BigEndian, &s) -	n := dataSize(reflect.ValueOf(s)) +	n, _ := dataSize(reflect.ValueOf(s))  	b.SetBytes(int64(n))  	t := s  	b.ResetTimer() | 
