// 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 (
	"reflect";
	"testing";
)

type typeT struct {
	id	typeId;
	str	string;
}

var basicTypes = []typeT{
	typeT{tBool, "bool"},
	typeT{tInt, "int"},
	typeT{tUint, "uint"},
	typeT{tFloat, "float"},
	typeT{tBytes, "bytes"},
	typeT{tString, "string"},
}

func getTypeUnlocked(name string, rt reflect.Type) gobType {
	typeLock.Lock();
	defer typeLock.Unlock();
	t, err := getType(name, rt);
	if err != nil {
		panicln("getTypeUnlocked:", err.String())
	}
	return t;
}

// Sanity checks
func TestBasic(t *testing.T) {
	for _, tt := range basicTypes {
		if tt.id.String() != tt.str {
			t.Errorf("checkType: expected %q got %s", tt.str, tt.id.String())
		}
		if tt.id == 0 {
			t.Errorf("id for %q is zero", tt.str)
		}
	}
}

// Reregister some basic types to check registration is idempotent.
func TestReregistration(t *testing.T) {
	newtyp := getTypeUnlocked("int", reflect.Typeof(int(0)));
	if newtyp != tInt.gobType() {
		t.Errorf("reregistration of %s got new type", newtyp.String())
	}
	newtyp = getTypeUnlocked("uint", reflect.Typeof(uint(0)));
	if newtyp != tUint.gobType() {
		t.Errorf("reregistration of %s got new type", newtyp.String())
	}
	newtyp = getTypeUnlocked("string", reflect.Typeof("hello"));
	if newtyp != tString.gobType() {
		t.Errorf("reregistration of %s got new type", newtyp.String())
	}
}

func TestArrayType(t *testing.T) {
	var a3 [3]int;
	a3int := getTypeUnlocked("foo", reflect.Typeof(a3));
	newa3int := getTypeUnlocked("bar", reflect.Typeof(a3));
	if a3int != newa3int {
		t.Errorf("second registration of [3]int creates new type")
	}
	var a4 [4]int;
	a4int := getTypeUnlocked("goo", reflect.Typeof(a4));
	if a3int == a4int {
		t.Errorf("registration of [3]int creates same type as [4]int")
	}
	var b3 [3]bool;
	a3bool := getTypeUnlocked("", reflect.Typeof(b3));
	if a3int == a3bool {
		t.Errorf("registration of [3]bool creates same type as [3]int")
	}
	str := a3bool.String();
	expected := "[3]bool";
	if str != expected {
		t.Errorf("array printed as %q; expected %q", str, expected)
	}
}

func TestSliceType(t *testing.T) {
	var s []int;
	sint := getTypeUnlocked("slice", reflect.Typeof(s));
	var news []int;
	newsint := getTypeUnlocked("slice1", reflect.Typeof(news));
	if sint != newsint {
		t.Errorf("second registration of []int creates new type")
	}
	var b []bool;
	sbool := getTypeUnlocked("", reflect.Typeof(b));
	if sbool == sint {
		t.Errorf("registration of []bool creates same type as []int")
	}
	str := sbool.String();
	expected := "[]bool";
	if str != expected {
		t.Errorf("slice printed as %q; expected %q", str, expected)
	}
}

type Bar struct {
	x string;
}

// This structure has pointers and refers to itself, making it a good test case.
type Foo struct {
	a	int;
	b	int32;	// will become int
	c	string;
	d	[]byte;
	e	*float;		// will become float
	f	****float64;	// will become float
	g	*Bar;
	h	*Bar;	// should not interpolate the definition of Bar again
	i	*Foo;	// will not explode
}

func TestStructType(t *testing.T) {
	sstruct := getTypeUnlocked("Foo", reflect.Typeof(Foo{}));
	str := sstruct.String();
	// If we can print it correctly, we built it correctly.
	expected := "Foo = struct { a int; b int; c string; d bytes; e float; f float; g Bar = struct { x string; }; h Bar; i Foo; }";
	if str != expected {
		t.Errorf("struct printed as %q; expected %q", str, expected)
	}
}
