// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package gob

import (
	"bytes";
	"math";
	"os";
	"reflect";
	"strings";
	"testing";
	"unsafe";
)

// Guarantee encoding format by comparing some encodings to hand-written values
type EncodeT struct {
	x	uint64;
	b	[]byte;
}

var encodeT = []EncodeT{
	EncodeT{0x00, []byte{0x00}},
	EncodeT{0x0F, []byte{0x0F}},
	EncodeT{0xFF, []byte{0xFF, 0xFF}},
	EncodeT{0xFFFF, []byte{0xFE, 0xFF, 0xFF}},
	EncodeT{0xFFFFFF, []byte{0xFD, 0xFF, 0xFF, 0xFF}},
	EncodeT{0xFFFFFFFF, []byte{0xFC, 0xFF, 0xFF, 0xFF, 0xFF}},
	EncodeT{0xFFFFFFFFFF, []byte{0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
	EncodeT{0xFFFFFFFFFFFF, []byte{0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
	EncodeT{0xFFFFFFFFFFFFFF, []byte{0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
	EncodeT{0xFFFFFFFFFFFFFFFF, []byte{0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}},
	EncodeT{0x1111, []byte{0xFE, 0x11, 0x11}},
	EncodeT{0x1111111111111111, []byte{0xF8, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}},
	EncodeT{0x8888888888888888, []byte{0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88}},
	EncodeT{1 << 63, []byte{0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},
}


// Test basic encode/decode routines for unsigned integers
func TestUintCodec(t *testing.T) {
	b := new(bytes.Buffer);
	encState := new(encoderState);
	encState.b = b;
	for _, tt := range encodeT {
		b.Reset();
		encodeUint(encState, tt.x);
		if encState.err != nil {
			t.Error("encodeUint:", tt.x, encState.err)
		}
		if !bytes.Equal(tt.b, b.Bytes()) {
			t.Errorf("encodeUint: %#x encode: expected % x got % x", tt.x, tt.b, b.Bytes())
		}
	}
	decState := newDecodeState(b);
	for u := uint64(0); ; u = (u + 1) * 7 {
		b.Reset();
		encodeUint(encState, u);
		if encState.err != nil {
			t.Error("encodeUint:", u, encState.err)
		}
		v := decodeUint(decState);
		if decState.err != nil {
			t.Error("DecodeUint:", u, decState.err)
		}
		if u != v {
			t.Errorf("Encode/Decode: sent %#x received %#x\n", u, v)
		}
		if u&(1<<63) != 0 {
			break
		}
	}
}

func verifyInt(i int64, t *testing.T) {
	var b = new(bytes.Buffer);
	encState := new(encoderState);
	encState.b = b;
	encodeInt(encState, i);
	if encState.err != nil {
		t.Error("encodeInt:", i, encState.err)
	}
	decState := newDecodeState(b);
	decState.buf = make([]byte, 8);
	j := decodeInt(decState);
	if decState.err != nil {
		t.Error("DecodeInt:", i, decState.err)
	}
	if i != j {
		t.Errorf("Encode/Decode: sent %#x received %#x\n", uint64(i), uint64(j))
	}
}

// Test basic encode/decode routines for signed integers
func TestIntCodec(t *testing.T) {
	for u := uint64(0); ; u = (u + 1) * 7 {
		// Do positive and negative values
		i := int64(u);
		verifyInt(i, t);
		verifyInt(-i, t);
		verifyInt(^i, t);
		if u&(1<<63) != 0 {
			break
		}
	}
	verifyInt(-1<<63, t);	// a tricky case
}

// The result of encoding a true boolean with field number 7
var boolResult = []byte{0x07, 0x01}
// The result of encoding a number 17 with field number 7
var signedResult = []byte{0x07, 2 * 17}
var unsignedResult = []byte{0x07, 17}
var floatResult = []byte{0x07, 0xFE, 0x31, 0x40}
// The result of encoding "hello" with field number 6
var bytesResult = []byte{0x07, 0x05, 'h', 'e', 'l', 'l', 'o'}

func newencoderState(b *bytes.Buffer) *encoderState {
	b.Reset();
	state := new(encoderState);
	state.b = b;
	state.fieldnum = -1;
	return state;
}

// Test instruction execution for encoding.
// Do not run the machine yet; instead do individual instructions crafted by hand.
func TestScalarEncInstructions(t *testing.T) {
	var b = new(bytes.Buffer);

	// bool
	{
		data := struct{ a bool }{true};
		instr := &encInstr{encBool, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(boolResult, b.Bytes()) {
			t.Errorf("bool enc instructions: expected % x got % x", boolResult, b.Bytes())
		}
	}

	// int
	{
		b.Reset();
		data := struct{ a int }{17};
		instr := &encInstr{encInt, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(signedResult, b.Bytes()) {
			t.Errorf("int enc instructions: expected % x got % x", signedResult, b.Bytes())
		}
	}

	// uint
	{
		b.Reset();
		data := struct{ a uint }{17};
		instr := &encInstr{encUint, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(unsignedResult, b.Bytes()) {
			t.Errorf("uint enc instructions: expected % x got % x", unsignedResult, b.Bytes())
		}
	}

	// int8
	{
		b.Reset();
		data := struct{ a int8 }{17};
		instr := &encInstr{encInt8, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(signedResult, b.Bytes()) {
			t.Errorf("int8 enc instructions: expected % x got % x", signedResult, b.Bytes())
		}
	}

	// uint8
	{
		b.Reset();
		data := struct{ a uint8 }{17};
		instr := &encInstr{encUint8, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(unsignedResult, b.Bytes()) {
			t.Errorf("uint8 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
		}
	}

	// int16
	{
		b.Reset();
		data := struct{ a int16 }{17};
		instr := &encInstr{encInt16, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(signedResult, b.Bytes()) {
			t.Errorf("int16 enc instructions: expected % x got % x", signedResult, b.Bytes())
		}
	}

	// uint16
	{
		b.Reset();
		data := struct{ a uint16 }{17};
		instr := &encInstr{encUint16, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(unsignedResult, b.Bytes()) {
			t.Errorf("uint16 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
		}
	}

	// int32
	{
		b.Reset();
		data := struct{ a int32 }{17};
		instr := &encInstr{encInt32, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(signedResult, b.Bytes()) {
			t.Errorf("int32 enc instructions: expected % x got % x", signedResult, b.Bytes())
		}
	}

	// uint32
	{
		b.Reset();
		data := struct{ a uint32 }{17};
		instr := &encInstr{encUint32, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(unsignedResult, b.Bytes()) {
			t.Errorf("uint32 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
		}
	}

	// int64
	{
		b.Reset();
		data := struct{ a int64 }{17};
		instr := &encInstr{encInt64, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(signedResult, b.Bytes()) {
			t.Errorf("int64 enc instructions: expected % x got % x", signedResult, b.Bytes())
		}
	}

	// uint64
	{
		b.Reset();
		data := struct{ a uint64 }{17};
		instr := &encInstr{encUint64, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(unsignedResult, b.Bytes()) {
			t.Errorf("uint64 enc instructions: expected % x got % x", unsignedResult, b.Bytes())
		}
	}

	// float
	{
		b.Reset();
		data := struct{ a float }{17};
		instr := &encInstr{encFloat, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(floatResult, b.Bytes()) {
			t.Errorf("float enc instructions: expected % x got % x", floatResult, b.Bytes())
		}
	}

	// float32
	{
		b.Reset();
		data := struct{ a float32 }{17};
		instr := &encInstr{encFloat32, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(floatResult, b.Bytes()) {
			t.Errorf("float32 enc instructions: expected % x got % x", floatResult, b.Bytes())
		}
	}

	// float64
	{
		b.Reset();
		data := struct{ a float64 }{17};
		instr := &encInstr{encFloat64, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(floatResult, b.Bytes()) {
			t.Errorf("float64 enc instructions: expected % x got % x", floatResult, b.Bytes())
		}
	}

	// bytes == []uint8
	{
		b.Reset();
		data := struct{ a []byte }{strings.Bytes("hello")};
		instr := &encInstr{encUint8Array, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(bytesResult, b.Bytes()) {
			t.Errorf("bytes enc instructions: expected % x got % x", bytesResult, b.Bytes())
		}
	}

	// string
	{
		b.Reset();
		data := struct{ a string }{"hello"};
		instr := &encInstr{encString, 6, 0, 0};
		state := newencoderState(b);
		instr.op(instr, state, unsafe.Pointer(&data));
		if !bytes.Equal(bytesResult, b.Bytes()) {
			t.Errorf("string enc instructions: expected % x got % x", bytesResult, b.Bytes())
		}
	}
}

func execDec(typ string, instr *decInstr, state *decodeState, t *testing.T, p unsafe.Pointer) {
	v := int(decodeUint(state));
	if state.err != nil {
		t.Fatalf("decoding %s field: %v", typ, state.err)
	}
	if v+state.fieldnum != 6 {
		t.Fatalf("decoding field number %d, got %d", 6, v+state.fieldnum)
	}
	instr.op(instr, state, decIndirect(p, instr.indir));
	state.fieldnum = 6;
}

func newDecodeStateFromData(data []byte) *decodeState {
	state := newDecodeState(bytes.NewBuffer(data));
	state.fieldnum = -1;
	return state;
}

// Test instruction execution for decoding.
// Do not run the machine yet; instead do individual instructions crafted by hand.
func TestScalarDecInstructions(t *testing.T) {
	ovfl := os.ErrorString("overflow");

	// bool
	{
		var data struct {
			a bool;
		}
		instr := &decInstr{decBool, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(boolResult);
		execDec("bool", instr, state, t, unsafe.Pointer(&data));
		if data.a != true {
			t.Errorf("bool a = %v not true", data.a)
		}
	}
	// int
	{
		var data struct {
			a int;
		}
		instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
		state := newDecodeStateFromData(signedResult);
		execDec("int", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("int a = %v not 17", data.a)
		}
	}

	// uint
	{
		var data struct {
			a uint;
		}
		instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
		state := newDecodeStateFromData(unsignedResult);
		execDec("uint", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("uint a = %v not 17", data.a)
		}
	}

	// int8
	{
		var data struct {
			a int8;
		}
		instr := &decInstr{decInt8, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(signedResult);
		execDec("int8", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("int8 a = %v not 17", data.a)
		}
	}

	// uint8
	{
		var data struct {
			a uint8;
		}
		instr := &decInstr{decUint8, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(unsignedResult);
		execDec("uint8", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("uint8 a = %v not 17", data.a)
		}
	}

	// int16
	{
		var data struct {
			a int16;
		}
		instr := &decInstr{decInt16, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(signedResult);
		execDec("int16", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("int16 a = %v not 17", data.a)
		}
	}

	// uint16
	{
		var data struct {
			a uint16;
		}
		instr := &decInstr{decUint16, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(unsignedResult);
		execDec("uint16", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("uint16 a = %v not 17", data.a)
		}
	}

	// int32
	{
		var data struct {
			a int32;
		}
		instr := &decInstr{decInt32, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(signedResult);
		execDec("int32", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("int32 a = %v not 17", data.a)
		}
	}

	// uint32
	{
		var data struct {
			a uint32;
		}
		instr := &decInstr{decUint32, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(unsignedResult);
		execDec("uint32", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("uint32 a = %v not 17", data.a)
		}
	}

	// uintptr
	{
		var data struct {
			a uintptr;
		}
		instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
		state := newDecodeStateFromData(unsignedResult);
		execDec("uintptr", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("uintptr a = %v not 17", data.a)
		}
	}

	// int64
	{
		var data struct {
			a int64;
		}
		instr := &decInstr{decInt64, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(signedResult);
		execDec("int64", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("int64 a = %v not 17", data.a)
		}
	}

	// uint64
	{
		var data struct {
			a uint64;
		}
		instr := &decInstr{decUint64, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(unsignedResult);
		execDec("uint64", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("uint64 a = %v not 17", data.a)
		}
	}

	// float
	{
		var data struct {
			a float;
		}
		instr := &decInstr{decOpMap[valueKind(data.a)], 6, 0, 0, ovfl};
		state := newDecodeStateFromData(floatResult);
		execDec("float", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("float a = %v not 17", data.a)
		}
	}

	// float32
	{
		var data struct {
			a float32;
		}
		instr := &decInstr{decFloat32, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(floatResult);
		execDec("float32", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("float32 a = %v not 17", data.a)
		}
	}

	// float64
	{
		var data struct {
			a float64;
		}
		instr := &decInstr{decFloat64, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(floatResult);
		execDec("float64", instr, state, t, unsafe.Pointer(&data));
		if data.a != 17 {
			t.Errorf("float64 a = %v not 17", data.a)
		}
	}

	// bytes == []uint8
	{
		var data struct {
			a []byte;
		}
		instr := &decInstr{decUint8Array, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(bytesResult);
		execDec("bytes", instr, state, t, unsafe.Pointer(&data));
		if string(data.a) != "hello" {
			t.Errorf(`bytes a = %q not "hello"`, string(data.a))
		}
	}

	// string
	{
		var data struct {
			a string;
		}
		instr := &decInstr{decString, 6, 0, 0, ovfl};
		state := newDecodeStateFromData(bytesResult);
		execDec("bytes", instr, state, t, unsafe.Pointer(&data));
		if data.a != "hello" {
			t.Errorf(`bytes a = %q not "hello"`, data.a)
		}
	}
}

func TestEndToEnd(t *testing.T) {
	type T2 struct {
		t string;
	}
	s1 := "string1";
	s2 := "string2";
	type T1 struct {
		a, b, c	int;
		n	*[3]float;
		strs	*[2]string;
		int64s	*[]int64;
		s	string;
		y	[]byte;
		t	*T2;
	}
	t1 := &T1{
		a: 17,
		b: 18,
		c: -5,
		n: &[3]float{1.5, 2.5, 3.5},
		strs: &[2]string{s1, s2},
		int64s: &[]int64{77, 89, 123412342134},
		s: "Now is the time",
		y: strings.Bytes("hello, sailor"),
		t: &T2{"this is T2"},
	};
	b := new(bytes.Buffer);
	encode(b, t1);
	var _t1 T1;
	decode(b, getTypeInfoNoError(reflect.Typeof(_t1)).id, &_t1);
	if !reflect.DeepEqual(t1, &_t1) {
		t.Errorf("encode expected %v got %v", *t1, _t1)
	}
}

func TestOverflow(t *testing.T) {
	type inputT struct {
		maxi	int64;
		mini	int64;
		maxu	uint64;
		maxf	float64;
		minf	float64;
	}
	var it inputT;
	var err os.Error;
	id := getTypeInfoNoError(reflect.Typeof(it)).id;
	b := new(bytes.Buffer);

	// int8
	b.Reset();
	it = inputT{
		maxi: math.MaxInt8 + 1,
	};
	type outi8 struct {
		maxi	int8;
		mini	int8;
	}
	var o1 outi8;
	encode(b, it);
	err = decode(b, id, &o1);
	if err == nil || err.String() != `value for "maxi" out of range` {
		t.Error("wrong overflow error for int8:", err)
	}
	it = inputT{
		mini: math.MinInt8 - 1,
	};
	b.Reset();
	encode(b, it);
	err = decode(b, id, &o1);
	if err == nil || err.String() != `value for "mini" out of range` {
		t.Error("wrong underflow error for int8:", err)
	}

	// int16
	b.Reset();
	it = inputT{
		maxi: math.MaxInt16 + 1,
	};
	type outi16 struct {
		maxi	int16;
		mini	int16;
	}
	var o2 outi16;
	encode(b, it);
	err = decode(b, id, &o2);
	if err == nil || err.String() != `value for "maxi" out of range` {
		t.Error("wrong overflow error for int16:", err)
	}
	it = inputT{
		mini: math.MinInt16 - 1,
	};
	b.Reset();
	encode(b, it);
	err = decode(b, id, &o2);
	if err == nil || err.String() != `value for "mini" out of range` {
		t.Error("wrong underflow error for int16:", err)
	}

	// int32
	b.Reset();
	it = inputT{
		maxi: math.MaxInt32 + 1,
	};
	type outi32 struct {
		maxi	int32;
		mini	int32;
	}
	var o3 outi32;
	encode(b, it);
	err = decode(b, id, &o3);
	if err == nil || err.String() != `value for "maxi" out of range` {
		t.Error("wrong overflow error for int32:", err)
	}
	it = inputT{
		mini: math.MinInt32 - 1,
	};
	b.Reset();
	encode(b, it);
	err = decode(b, id, &o3);
	if err == nil || err.String() != `value for "mini" out of range` {
		t.Error("wrong underflow error for int32:", err)
	}

	// uint8
	b.Reset();
	it = inputT{
		maxu: math.MaxUint8 + 1,
	};
	type outu8 struct {
		maxu uint8;
	}
	var o4 outu8;
	encode(b, it);
	err = decode(b, id, &o4);
	if err == nil || err.String() != `value for "maxu" out of range` {
		t.Error("wrong overflow error for uint8:", err)
	}

	// uint16
	b.Reset();
	it = inputT{
		maxu: math.MaxUint16 + 1,
	};
	type outu16 struct {
		maxu uint16;
	}
	var o5 outu16;
	encode(b, it);
	err = decode(b, id, &o5);
	if err == nil || err.String() != `value for "maxu" out of range` {
		t.Error("wrong overflow error for uint16:", err)
	}

	// uint32
	b.Reset();
	it = inputT{
		maxu: math.MaxUint32 + 1,
	};
	type outu32 struct {
		maxu uint32;
	}
	var o6 outu32;
	encode(b, it);
	err = decode(b, id, &o6);
	if err == nil || err.String() != `value for "maxu" out of range` {
		t.Error("wrong overflow error for uint32:", err)
	}

	// float32
	b.Reset();
	it = inputT{
		maxf: math.MaxFloat32 * 2,
	};
	type outf32 struct {
		maxf	float32;
		minf	float32;
	}
	var o7 outf32;
	encode(b, it);
	err = decode(b, id, &o7);
	if err == nil || err.String() != `value for "maxf" out of range` {
		t.Error("wrong overflow error for float32:", err)
	}
}


func TestNesting(t *testing.T) {
	type RT struct {
		a	string;
		next	*RT;
	}
	rt := new(RT);
	rt.a = "level1";
	rt.next = new(RT);
	rt.next.a = "level2";
	b := new(bytes.Buffer);
	encode(b, rt);
	var drt RT;
	decode(b, getTypeInfoNoError(reflect.Typeof(drt)).id, &drt);
	if drt.a != rt.a {
		t.Errorf("nesting: encode expected %v got %v", *rt, drt)
	}
	if drt.next == nil {
		t.Errorf("nesting: recursion failed")
	}
	if drt.next.a != rt.next.a {
		t.Errorf("nesting: encode expected %v got %v", *rt.next, *drt.next)
	}
}

// These three structures have the same data with different indirections
type T0 struct {
	a	int;
	b	int;
	c	int;
	d	int;
}
type T1 struct {
	a	int;
	b	*int;
	c	**int;
	d	***int;
}
type T2 struct {
	a	***int;
	b	**int;
	c	*int;
	d	int;
}

func TestAutoIndirection(t *testing.T) {
	// First transfer t1 into t0
	var t1 T1;
	t1.a = 17;
	t1.b = new(int);
	*t1.b = 177;
	t1.c = new(*int);
	*t1.c = new(int);
	**t1.c = 1777;
	t1.d = new(**int);
	*t1.d = new(*int);
	**t1.d = new(int);
	***t1.d = 17777;
	b := new(bytes.Buffer);
	encode(b, t1);
	var t0 T0;
	t0Id := getTypeInfoNoError(reflect.Typeof(t0)).id;
	decode(b, t0Id, &t0);
	if t0.a != 17 || t0.b != 177 || t0.c != 1777 || t0.d != 17777 {
		t.Errorf("t1->t0: expected {17 177 1777 17777}; got %v", t0)
	}

	// Now transfer t2 into t0
	var t2 T2;
	t2.d = 17777;
	t2.c = new(int);
	*t2.c = 1777;
	t2.b = new(*int);
	*t2.b = new(int);
	**t2.b = 177;
	t2.a = new(**int);
	*t2.a = new(*int);
	**t2.a = new(int);
	***t2.a = 17;
	b.Reset();
	encode(b, t2);
	t0 = T0{};
	decode(b, t0Id, &t0);
	if t0.a != 17 || t0.b != 177 || t0.c != 1777 || t0.d != 17777 {
		t.Errorf("t2->t0 expected {17 177 1777 17777}; got %v", t0)
	}

	// Now transfer t0 into t1
	t0 = T0{17, 177, 1777, 17777};
	b.Reset();
	encode(b, t0);
	t1 = T1{};
	t1Id := getTypeInfoNoError(reflect.Typeof(t1)).id;
	decode(b, t1Id, &t1);
	if t1.a != 17 || *t1.b != 177 || **t1.c != 1777 || ***t1.d != 17777 {
		t.Errorf("t0->t1 expected {17 177 1777 17777}; got {%d %d %d %d}", t1.a, *t1.b, **t1.c, ***t1.d)
	}

	// Now transfer t0 into t2
	b.Reset();
	encode(b, t0);
	t2 = T2{};
	t2Id := getTypeInfoNoError(reflect.Typeof(t2)).id;
	decode(b, t2Id, &t2);
	if ***t2.a != 17 || **t2.b != 177 || *t2.c != 1777 || t2.d != 17777 {
		t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.a, **t2.b, *t2.c, t2.d)
	}

	// Now do t2 again but without pre-allocated pointers.
	b.Reset();
	encode(b, t0);
	***t2.a = 0;
	**t2.b = 0;
	*t2.c = 0;
	t2.d = 0;
	decode(b, t2Id, &t2);
	if ***t2.a != 17 || **t2.b != 177 || *t2.c != 1777 || t2.d != 17777 {
		t.Errorf("t0->t2 expected {17 177 1777 17777}; got {%d %d %d %d}", ***t2.a, **t2.b, *t2.c, t2.d)
	}
}

type RT0 struct {
	a	int;
	b	string;
	c	float;
}
type RT1 struct {
	c	float;
	b	string;
	a	int;
	notSet	string;
}

func TestReorderedFields(t *testing.T) {
	var rt0 RT0;
	rt0.a = 17;
	rt0.b = "hello";
	rt0.c = 3.14159;
	b := new(bytes.Buffer);
	encode(b, rt0);
	rt0Id := getTypeInfoNoError(reflect.Typeof(rt0)).id;
	var rt1 RT1;
	// Wire type is RT0, local type is RT1.
	decode(b, rt0Id, &rt1);
	if rt0.a != rt1.a || rt0.b != rt1.b || rt0.c != rt1.c {
		t.Errorf("rt1->rt0: expected %v; got %v", rt0, rt1)
	}
}

// Like an RT0 but with fields we'll ignore on the decode side.
type IT0 struct {
	a		int64;
	b		string;
	ignore_d	[]int;
	ignore_e	[3]float;
	ignore_f	bool;
	ignore_g	string;
	ignore_h	[]byte;
	ignore_i	*RT1;
	c		float;
}

func TestIgnoredFields(t *testing.T) {
	var it0 IT0;
	it0.a = 17;
	it0.b = "hello";
	it0.c = 3.14159;
	it0.ignore_d = []int{1, 2, 3};
	it0.ignore_e[0] = 1.0;
	it0.ignore_e[1] = 2.0;
	it0.ignore_e[2] = 3.0;
	it0.ignore_f = true;
	it0.ignore_g = "pay no attention";
	it0.ignore_h = strings.Bytes("to the curtain");
	it0.ignore_i = &RT1{3.1, "hi", 7, "hello"};

	b := new(bytes.Buffer);
	encode(b, it0);
	rt0Id := getTypeInfoNoError(reflect.Typeof(it0)).id;
	var rt1 RT1;
	// Wire type is IT0, local type is RT1.
	err := decode(b, rt0Id, &rt1);
	if err != nil {
		t.Error("error: ", err)
	}
	if int(it0.a) != rt1.a || it0.b != rt1.b || it0.c != rt1.c {
		t.Errorf("rt1->rt0: expected %v; got %v", it0, rt1)
	}
}

type Bad0 struct {
	inter	interface{};
	c	float;
}

func TestInvalidField(t *testing.T) {
	var bad0 Bad0;
	bad0.inter = 17;
	b := new(bytes.Buffer);
	err := encode(b, &bad0);
	if err == nil {
		t.Error("expected error; got none")
	} else if strings.Index(err.String(), "interface") < 0 {
		t.Error("expected type error; got", err)
	}
}
