// 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 reflect_test

import (
	"io";
	"os";
	. "reflect";
	"testing";
	"unsafe";
)

type integer int
type T struct {
	a	int;
	b	float64;
	c	string;
	d	*int;
}

type pair struct {
	i	interface{};
	s	string;
}

func isDigit(c uint8) bool {
	return '0' <= c && c <= '9';
}

func assert(t *testing.T, s, want string) {
	if s != want {
		t.Errorf("have %#q want %#q", s, want);
	}
}

func typestring(i interface{}) string {
	return Typeof(i).String();
}

var typeTests = []pair{
	pair{struct {
		x int;
	}{},
		"int",
	},
	pair{struct {
		x int8;
	}{},
		"int8",
	},
	pair{struct {
		x int16;
	}{},
		"int16",
	},
	pair{struct {
		x int32;
	}{},
		"int32",
	},
	pair{struct {
		x int64;
	}{},
		"int64",
	},
	pair{struct {
		x uint;
	}{},
		"uint",
	},
	pair{struct {
		x uint8;
	}{},
		"uint8",
	},
	pair{struct {
		x uint16;
	}{},
		"uint16",
	},
	pair{struct {
		x uint32;
	}{},
		"uint32",
	},
	pair{struct {
		x uint64;
	}{},
		"uint64",
	},
	pair{struct {
		x float;
	}{},
		"float",
	},
	pair{struct {
		x float32;
	}{},
		"float32",
	},
	pair{struct {
		x float64;
	}{},
		"float64",
	},
	pair{struct {
		x int8;
	}{},
		"int8",
	},
	pair{struct {
		x (**int8);
	}{},
		"**int8",
	},
	pair{struct {
		x (**integer);
	}{},
		"**reflect_test.integer",
	},
	pair{struct {
		x ([32]int32);
	}{},
		"[32]int32",
	},
	pair{struct {
		x ([]int8);
	}{},
		"[]int8",
	},
	pair{struct {
		x (map[string]int32);
	}{},
		"map[string] int32",
	},
	pair{struct {
		x (chan<- string);
	}{},
		"chan<- string",
	},
	pair{struct {
		x struct {
			c	chan *int32;
			d	float32;
		};
	}{},
		"struct { c chan *int32; d float32 }",
	},
	pair{struct {
		x (func(a int8, b int32));
	}{},
		"func(int8, int32)",
	},
	pair{struct {
		x struct {
			c func(chan *integer, *int8);
		};
	}{},
		"struct { c func(chan *reflect_test.integer, *int8) }",
	},
	pair{struct {
		x struct {
			a	int8;
			b	int32;
		};
	}{},
		"struct { a int8; b int32 }",
	},
	pair{struct {
		x struct {
			a	int8;
			b	int8;
			c	int32;
		};
	}{},
		"struct { a int8; b int8; c int32 }",
	},
	pair{struct {
		x struct {
			a	int8;
			b	int8;
			c	int8;
			d	int32;
		};
	}{},
		"struct { a int8; b int8; c int8; d int32 }",
	},
	pair{struct {
		x struct {
			a	int8;
			b	int8;
			c	int8;
			d	int8;
			e	int32;
		};
	}{},
		"struct { a int8; b int8; c int8; d int8; e int32 }",
	},
	pair{struct {
		x struct {
			a	int8;
			b	int8;
			c	int8;
			d	int8;
			e	int8;
			f	int32;
		};
	}{},
		"struct { a int8; b int8; c int8; d int8; e int8; f int32 }",
	},
	pair{struct {
		x struct {
			a int8 "hi there";
		};
	}{},
		`struct { a int8 "hi there" }`,
	},
	pair{struct {
		x struct {
			a int8 "hi \x00there\t\n\"\\";
		};
	}{},
		`struct { a int8 "hi \x00there\t\n\"\\" }`,
	},
	pair{struct {
		x struct {
			f func(args ...);
		};
	}{},
		"struct { f func(...) }",
	},
	pair{struct {
		x (interface {
			a(func(func(int) int) (func(func(int)) int));
			b();
		});
	}{},
		"interface { a (func(func(int) (int)) (func(func(int)) (int))); b () }",
	},
}

var valueTests = []pair{
	pair{(int8)(0), "8"},
	pair{(int16)(0), "16"},
	pair{(int32)(0), "32"},
	pair{(int64)(0), "64"},
	pair{(uint8)(0), "8"},
	pair{(uint16)(0), "16"},
	pair{(uint32)(0), "32"},
	pair{(uint64)(0), "64"},
	pair{(float32)(0), "32.1"},
	pair{(float64)(0), "64.2"},
	pair{(string)(""), "stringy cheese"},
	pair{(bool)(false), "true"},
	pair{(*int8)(nil), "*int8(0)"},
	pair{(**int8)(nil), "**int8(0)"},
	pair{([5]int32){}, "[5]int32{0, 0, 0, 0, 0}"},
	pair{(**integer)(nil), "**reflect_test.integer(0)"},
	pair{(map[string]int32)(nil), "map[string] int32{<can't iterate on maps>}"},
	pair{(chan<- string)(nil), "chan<- string"},
	pair{(struct {
		c	chan *int32;
		d	float32;
	}){},
		"struct { c chan *int32; d float32 }{chan *int32, 0}",
	},
	pair{(func(a int8, b int32))(nil), "func(int8, int32)(0)"},
	pair{(struct {
		c func(chan *integer, *int8);
	}){},
		"struct { c func(chan *reflect_test.integer, *int8) }{func(chan *reflect_test.integer, *int8)(0)}",
	},
	pair{(struct {
		a	int8;
		b	int32;
	}){},
		"struct { a int8; b int32 }{0, 0}",
	},
	pair{(struct {
		a	int8;
		b	int8;
		c	int32;
	}){},
		"struct { a int8; b int8; c int32 }{0, 0, 0}",
	},
}

func testType(t *testing.T, i int, typ Type, want string) {
	s := typ.String();
	if s != want {
		t.Errorf("#%d: have %#q, want %#q", i, s, want);
	}
}

func TestTypes(t *testing.T) {
	for i, tt := range typeTests {
		testType(t, i, NewValue(tt.i).(*StructValue).Field(0).Type(), tt.s);
	}
}

func TestSet(t *testing.T) {
	for i, tt := range valueTests {
		v := NewValue(tt.i);
		switch v := v.(type) {
		case *IntValue:
			v.Set(132);
		case *Int8Value:
			v.Set(8);
		case *Int16Value:
			v.Set(16);
		case *Int32Value:
			v.Set(32);
		case *Int64Value:
			v.Set(64);
		case *UintValue:
			v.Set(132);
		case *Uint8Value:
			v.Set(8);
		case *Uint16Value:
			v.Set(16);
		case *Uint32Value:
			v.Set(32);
		case *Uint64Value:
			v.Set(64);
		case *FloatValue:
			v.Set(3200.0);
		case *Float32Value:
			v.Set(32.1);
		case *Float64Value:
			v.Set(64.2);
		case *StringValue:
			v.Set("stringy cheese");
		case *BoolValue:
			v.Set(true);
		}
		s := valueToString(v);
		if s != tt.s {
			t.Errorf("#%d: have %#q, want %#q", i, s, tt.s);
		}
	}
}

func TestSetValue(t *testing.T) {
	for i, tt := range valueTests {
		v := NewValue(tt.i);
		switch v := v.(type) {
		case *IntValue:
			v.SetValue(NewValue(int(132)));
		case *Int8Value:
			v.SetValue(NewValue(int8(8)));
		case *Int16Value:
			v.SetValue(NewValue(int16(16)));
		case *Int32Value:
			v.SetValue(NewValue(int32(32)));
		case *Int64Value:
			v.SetValue(NewValue(int64(64)));
		case *UintValue:
			v.SetValue(NewValue(uint(132)));
		case *Uint8Value:
			v.SetValue(NewValue(uint8(8)));
		case *Uint16Value:
			v.SetValue(NewValue(uint16(16)));
		case *Uint32Value:
			v.SetValue(NewValue(uint32(32)));
		case *Uint64Value:
			v.SetValue(NewValue(uint64(64)));
		case *FloatValue:
			v.SetValue(NewValue(float(3200.0)));
		case *Float32Value:
			v.SetValue(NewValue(float32(32.1)));
		case *Float64Value:
			v.SetValue(NewValue(float64(64.2)));
		case *StringValue:
			v.SetValue(NewValue("stringy cheese"));
		case *BoolValue:
			v.SetValue(NewValue(true));
		}
		s := valueToString(v);
		if s != tt.s {
			t.Errorf("#%d: have %#q, want %#q", i, s, tt.s);
		}
	}
}

var _i = 7

var valueToStringTests = []pair{
	pair{123, "123"},
	pair{123.4, "123.4"},
	pair{byte(123), "123"},
	pair{"abc", "abc"},
	pair{T{123, 456.75, "hello", &_i}, "reflect_test.T{123, 456.75, hello, *int(&7)}"},
	pair{new(chan *T), "*chan *reflect_test.T(&chan *reflect_test.T)"},
	pair{[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
	pair{&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[10]int(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
	pair{[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"},
	pair{&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[]int(&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"},
}

func TestValueToString(t *testing.T) {
	for i, test := range valueToStringTests {
		s := valueToString(NewValue(test.i));
		if s != test.s {
			t.Errorf("#%d: have %#q, want %#q", i, s, test.s);
		}
	}
}

func TestArrayElemSet(t *testing.T) {
	v := NewValue([10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
	v.(*ArrayValue).Elem(4).(*IntValue).Set(123);
	s := valueToString(v);
	const want = "[10]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}";
	if s != want {
		t.Errorf("[10]int: have %#q want %#q", s, want);
	}

	v = NewValue([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
	v.(*SliceValue).Elem(4).(*IntValue).Set(123);
	s = valueToString(v);
	const want1 = "[]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}";
	if s != want1 {
		t.Errorf("[]int: have %#q want %#q", s, want1);
	}
}

func TestPtrPointTo(t *testing.T) {
	var ip *int32;
	var i int32 = 1234;
	vip := NewValue(&ip);
	vi := NewValue(i);
	vip.(*PtrValue).Elem().(*PtrValue).PointTo(vi);
	if *ip != 1234 {
		t.Errorf("got %d, want 1234", *ip);
	}
}

func TestAll(t *testing.T) {	// TODO(r): wrap up better
	testType(t, 1, Typeof((int8)(0)), "int8");
	testType(t, 2, Typeof((*int8)(nil)).(*PtrType).Elem(), "int8");

	typ := Typeof((*struct {
		c	chan *int32;
		d	float32;
	})(nil));
	testType(t, 3, typ, "*struct { c chan *int32; d float32 }");
	etyp := typ.(*PtrType).Elem();
	testType(t, 4, etyp, "struct { c chan *int32; d float32 }");
	styp := etyp.(*StructType);
	f := styp.Field(0);
	testType(t, 5, f.Type, "chan *int32");

	f, present := styp.FieldByName("d");
	if !present {
		t.Errorf("FieldByName says present field is absent");
	}
	testType(t, 6, f.Type, "float32");

	f, present = styp.FieldByName("absent");
	if present {
		t.Errorf("FieldByName says absent field is present");
	}

	typ = Typeof([32]int32{});
	testType(t, 7, typ, "[32]int32");
	testType(t, 8, typ.(*ArrayType).Elem(), "int32");

	typ = Typeof((map[string]*int32)(nil));
	testType(t, 9, typ, "map[string] *int32");
	mtyp := typ.(*MapType);
	testType(t, 10, mtyp.Key(), "string");
	testType(t, 11, mtyp.Elem(), "*int32");

	typ = Typeof((chan<- string)(nil));
	testType(t, 12, typ, "chan<- string");
	testType(t, 13, typ.(*ChanType).Elem(), "string");

	// make sure tag strings are not part of element type
	typ = Typeof(struct {
		d []uint32 "TAG";
	}{}).(*StructType).Field(0).Type;
	testType(t, 14, typ, "[]uint32");
}

func TestInterfaceGet(t *testing.T) {
	var inter struct {
		e interface{};
	}
	inter.e = 123.456;
	v1 := NewValue(&inter);
	v2 := v1.(*PtrValue).Elem().(*StructValue).Field(0);
	assert(t, v2.Type().String(), "interface { }");
	i2 := v2.(*InterfaceValue).Interface();
	v3 := NewValue(i2);
	assert(t, v3.Type().String(), "float");
}

func TestInterfaceValue(t *testing.T) {
	var inter struct {
		e interface{};
	}
	inter.e = 123.456;
	v1 := NewValue(&inter);
	v2 := v1.(*PtrValue).Elem().(*StructValue).Field(0);
	assert(t, v2.Type().String(), "interface { }");
	v3 := v2.(*InterfaceValue).Elem();
	assert(t, v3.Type().String(), "float");

	i3 := v2.Interface();
	if _, ok := i3.(float); !ok {
		t.Error("v2.Interface() did not return float, got ", Typeof(i3));
	}
}

func TestFunctionValue(t *testing.T) {
	v := NewValue(func() {});
	if v.Interface() != v.Interface() {
		t.Fatalf("TestFunction != itself");
	}
	assert(t, v.Type().String(), "func()");
}

func TestCopyArray(t *testing.T) {
	a := []int{1, 2, 3, 4, 10, 9, 8, 7};
	b := []int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44};
	c := []int{11, 22, 33, 44, 1010, 99, 88, 77, 66, 55, 44};
	va := NewValue(&a);
	vb := NewValue(&b);
	for i := 0; i < len(b); i++ {
		if b[i] != c[i] {
			t.Fatalf("b != c before test");
		}
	}
	aa := va.(*PtrValue).Elem().(*SliceValue);
	ab := vb.(*PtrValue).Elem().(*SliceValue);
	for tocopy := 1; tocopy <= 7; tocopy++ {
		aa.SetLen(tocopy);
		ArrayCopy(ab, aa);
		aa.SetLen(8);
		for i := 0; i < tocopy; i++ {
			if a[i] != b[i] {
				t.Errorf("(i) tocopy=%d a[%d]=%d, b[%d]=%d",
					tocopy, i, a[i], i, b[i]);
			}
		}
		for i := tocopy; i < len(b); i++ {
			if b[i] != c[i] {
				if i < len(a) {
					t.Errorf("(ii) tocopy=%d a[%d]=%d, b[%d]=%d, c[%d]=%d",
						tocopy, i, a[i], i, b[i], i, c[i]);
				} else {
					t.Errorf("(iii) tocopy=%d b[%d]=%d, c[%d]=%d",
						tocopy, i, b[i], i, c[i]);
				}
			} else {
				t.Logf("tocopy=%d elem %d is okay\n", tocopy, i);
			}
		}
	}
}

func TestBigUnnamedStruct(t *testing.T) {
	b := struct {
		a, b, c, d int64;
	}{1, 2, 3, 4};
	v := NewValue(b);
	b1 := v.Interface().(struct {
		a, b, c, d int64;
	});
	if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d {
		t.Errorf("NewValue(%v).Interface().(*Big) = %v", b, b1);
	}
}

type big struct {
	a, b, c, d, e int64;
}

func TestBigStruct(t *testing.T) {
	b := big{1, 2, 3, 4, 5};
	v := NewValue(b);
	b1 := v.Interface().(big);
	if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d || b1.e != b.e {
		t.Errorf("NewValue(%v).Interface().(big) = %v", b, b1);
	}
}

type Basic struct {
	x	int;
	y	float32;
}

type NotBasic Basic

type DeepEqualTest struct {
	a, b	interface{};
	eq	bool;
}

var deepEqualTests = []DeepEqualTest{
	// Equalities
	DeepEqualTest{1, 1, true},
	DeepEqualTest{int32(1), int32(1), true},
	DeepEqualTest{0.5, 0.5, true},
	DeepEqualTest{float32(0.5), float32(0.5), true},
	DeepEqualTest{"hello", "hello", true},
	DeepEqualTest{make([]int, 10), make([]int, 10), true},
	DeepEqualTest{&[3]int{1, 2, 3}, &[3]int{1, 2, 3}, true},
	DeepEqualTest{Basic{1, 0.5}, Basic{1, 0.5}, true},
	DeepEqualTest{os.Error(nil), os.Error(nil), true},
	DeepEqualTest{map[int]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, true},

	// Inequalities
	DeepEqualTest{1, 2, false},
	DeepEqualTest{int32(1), int32(2), false},
	DeepEqualTest{0.5, 0.6, false},
	DeepEqualTest{float32(0.5), float32(0.6), false},
	DeepEqualTest{"hello", "hey", false},
	DeepEqualTest{make([]int, 10), make([]int, 11), false},
	DeepEqualTest{&[3]int{1, 2, 3}, &[3]int{1, 2, 4}, false},
	DeepEqualTest{Basic{1, 0.5}, Basic{1, 0.6}, false},
	DeepEqualTest{Basic{1, 0}, Basic{2, 0}, false},
	DeepEqualTest{map[int]string{1: "one", 3: "two"}, map[int]string{2: "two", 1: "one"}, false},
	DeepEqualTest{map[int]string{1: "one", 2: "txo"}, map[int]string{2: "two", 1: "one"}, false},
	DeepEqualTest{map[int]string{1: "one"}, map[int]string{2: "two", 1: "one"}, false},
	DeepEqualTest{map[int]string{2: "two", 1: "one"}, map[int]string{1: "one"}, false},
	DeepEqualTest{nil, 1, false},
	DeepEqualTest{1, nil, false},

	// Mismatched types
	DeepEqualTest{1, 1.0, false},
	DeepEqualTest{int32(1), int64(1), false},
	DeepEqualTest{0.5, "hello", false},
	DeepEqualTest{[]int{1, 2, 3}, [3]int{1, 2, 3}, false},
	DeepEqualTest{&[3]interface{}{1, 2, 4}, &[3]interface{}{1, 2, "s"}, false},
	DeepEqualTest{Basic{1, 0.5}, NotBasic{1, 0.5}, false},
	DeepEqualTest{map[uint]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, false},
}

func TestDeepEqual(t *testing.T) {
	for _, test := range deepEqualTests {
		if r := DeepEqual(test.a, test.b); r != test.eq {
			t.Errorf("DeepEqual(%v, %v) = %v, want %v", test.a, test.b, r, test.eq);
		}
	}
}

func TestTypeof(t *testing.T) {
	for _, test := range deepEqualTests {
		v := NewValue(test.a);
		if v == nil {
			continue;
		}
		typ := Typeof(test.a);
		if typ != v.Type() {
			t.Errorf("Typeof(%v) = %v, but NewValue(%v).Type() = %v", test.a, typ, test.a, v.Type());
		}
	}
}

type Recursive struct {
	x	int;
	r	*Recursive;
}

func TestDeepEqualRecursiveStruct(t *testing.T) {
	a, b := new(Recursive), new(Recursive);
	*a = Recursive{12, a};
	*b = Recursive{12, b};
	if !DeepEqual(a, b) {
		t.Error("DeepEqual(recursive same) = false, want true");
	}
}

type Complex struct {
	a	int;
	b	[3]*Complex;
	c	*string;
	d	map[float]float;
}

func TestDeepEqualComplexStruct(t *testing.T) {
	m := make(map[float]float);
	stra, strb := "hello", "hello";
	a, b := new(Complex), new(Complex);
	*a = Complex{5, [3]*Complex{a, b, a}, &stra, m};
	*b = Complex{5, [3]*Complex{b, a, a}, &strb, m};
	if !DeepEqual(a, b) {
		t.Error("DeepEqual(complex same) = false, want true");
	}
}

func TestDeepEqualComplexStructInequality(t *testing.T) {
	m := make(map[float]float);
	stra, strb := "hello", "helloo";	// Difference is here
	a, b := new(Complex), new(Complex);
	*a = Complex{5, [3]*Complex{a, b, a}, &stra, m};
	*b = Complex{5, [3]*Complex{b, a, a}, &strb, m};
	if DeepEqual(a, b) {
		t.Error("DeepEqual(complex different) = true, want false");
	}
}


func check2ndField(x interface{}, offs uintptr, t *testing.T) {
	s := NewValue(x).(*StructValue);
	f := s.Type().(*StructType).Field(1);
	if f.Offset != offs {
		t.Error("mismatched offsets in structure alignment:", f.Offset, offs);
	}
}

// Check that structure alignment & offsets viewed through reflect agree with those
// from the compiler itself.
func TestAlignment(t *testing.T) {
	type T1inner struct {
		a int;
	}
	type T1 struct {
		T1inner;
		f	int;
	}
	type T2inner struct {
		a, b int;
	}
	type T2 struct {
		T2inner;
		f	int;
	}

	x := T1{T1inner{2}, 17};
	check2ndField(x, uintptr(unsafe.Pointer(&x.f))-uintptr(unsafe.Pointer(&x)), t);

	x1 := T2{T2inner{2, 3}, 17};
	check2ndField(x1, uintptr(unsafe.Pointer(&x1.f))-uintptr(unsafe.Pointer(&x1)), t);
}

type IsNiller interface {
	IsNil() bool;
}

func Nil(a interface{}, t *testing.T) {
	n := NewValue(a).(*StructValue).Field(0).(IsNiller);
	if !n.IsNil() {
		t.Errorf("%v should be nil", a);
	}
}

func NotNil(a interface{}, t *testing.T) {
	n := NewValue(a).(*StructValue).Field(0).(IsNiller);
	if n.IsNil() {
		t.Errorf("value of type %v should not be nil", NewValue(a).Type().String());
	}
}

func TestIsNil(t *testing.T) {
	// These do not implement IsNil
	doNotNil := []interface{}{int(0), float32(0), struct {
		a int;
	}{}};
	for _, ts := range doNotNil {
		ty := Typeof(ts);
		v := MakeZero(ty);
		if _, ok := v.(IsNiller); ok {
			t.Errorf("%s is nilable; should not be", ts);
		}
	}

	// These do implement IsNil.
	// Wrap in extra struct to hide interface type.
	doNil := []interface{}{
		struct {
			x *int;
		}{},
		struct {
			x interface{};
		}{},
		struct {
			x map[string]int;
		}{},
		struct {
			x func() bool;
		}{},
		struct {
			x chan int;
		}{},
		struct {
			x []string;
		}{},
	};
	for _, ts := range doNil {
		ty := Typeof(ts).(*StructType).Field(0).Type;
		v := MakeZero(ty);
		if _, ok := v.(IsNiller); !ok {
			t.Errorf("%s %T is not nilable; should be", ts, v);
		}
	}

	// Check the implementations
	var pi struct {
		x *int;
	}
	Nil(pi, t);
	pi.x = new(int);
	NotNil(pi, t);

	var si struct {
		x []int;
	}
	Nil(si, t);
	si.x = make([]int, 10);
	NotNil(si, t);

	var ci struct {
		x chan int;
	}
	Nil(ci, t);
	ci.x = make(chan int);
	NotNil(ci, t);

	var mi struct {
		x map[int]int;
	}
	Nil(mi, t);
	mi.x = make(map[int]int);
	NotNil(mi, t);

	var ii struct {
		x interface{};
	}
	Nil(ii, t);
	ii.x = 2;
	NotNil(ii, t);

	var fi struct {
		x func(t *testing.T);
	}
	Nil(fi, t);
	fi.x = TestIsNil;
	NotNil(fi, t);
}

func TestInterfaceExtraction(t *testing.T) {
	var s struct {
		w io.Writer;
	}

	s.w = os.Stdout;
	v := Indirect(NewValue(&s)).(*StructValue).Field(0).Interface();
	if v != s.w.(interface{}) {
		t.Error("Interface() on interface: ", v, s.w);
	}
}

func TestInterfaceEditing(t *testing.T) {
	// strings are bigger than one word,
	// so the interface conversion allocates
	// memory to hold a string and puts that
	// pointer in the interface.
	var i interface{} = "hello";

	// if i pass the interface value by value
	// to NewValue, i should get a fresh copy
	// of the value.
	v := NewValue(i);

	// and setting that copy to "bye" should
	// not change the value stored in i.
	v.(*StringValue).Set("bye");
	if i.(string) != "hello" {
		t.Errorf(`Set("bye") changed i to %s`, i.(string));
	}

	// the same should be true of smaller items.
	i = 123;
	v = NewValue(i);
	v.(*IntValue).Set(234);
	if i.(int) != 123 {
		t.Errorf("Set(234) changed i to %d", i.(int));
	}
}

func TestNilPtrValueSub(t *testing.T) {
	var pi *int;
	if pv := NewValue(pi).(*PtrValue); pv.Elem() != nil {
		t.Error("NewValue((*int)(nil)).(*PtrValue).Elem() != nil");
	}
}

func TestMap(t *testing.T) {
	m := map[string]int{"a": 1, "b": 2};
	mv := NewValue(m).(*MapValue);
	if n := mv.Len(); n != len(m) {
		t.Errorf("Len = %d, want %d", n, len(m));
	}
	keys := mv.Keys();
	i := 0;
	newmap := MakeMap(mv.Type().(*MapType));
	for k, v := range m {
		// Check that returned Keys match keys in range.
		// These aren't required to be in the same order,
		// but they are in this implementation, which makes
		// the test easier.
		if i >= len(keys) {
			t.Errorf("Missing key #%d %q", i, k);
		} else if kv := keys[i].(*StringValue); kv.Get() != k {
			t.Errorf("Keys[%d] = %q, want %q", i, kv.Get(), k);
		}
		i++;

		// Check that value lookup is correct.
		vv := mv.Elem(NewValue(k));
		if vi := vv.(*IntValue).Get(); vi != v {
			t.Errorf("Key %q: have value %d, want %d", vi, v);
		}

		// Copy into new map.
		newmap.SetElem(NewValue(k), NewValue(v));
	}
	vv := mv.Elem(NewValue("not-present"));
	if vv != nil {
		t.Errorf("Invalid key: got non-nil value %s", valueToString(vv));
	}

	newm := newmap.Interface().(map[string]int);
	if len(newm) != len(m) {
		t.Errorf("length after copy: newm=%d, m=%d", newm, m);
	}

	for k, v := range newm {
		mv, ok := m[k];
		if mv != v {
			t.Errorf("newm[%q] = %d, but m[%q] = %d, %v", k, v, k, mv, ok);
		}
	}

	newmap.SetElem(NewValue("a"), nil);
	v, ok := newm["a"];
	if ok {
		t.Errorf("newm[\"a\"] = %d after delete", v);
	}
}

func TestChan(t *testing.T) {
	for loop := 0; loop < 2; loop++ {
		var c chan int;
		var cv *ChanValue;

		// check both ways to allocate channels
		switch loop {
		case 1:
			c = make(chan int, 1);
			cv = NewValue(c).(*ChanValue);
		case 0:
			cv = MakeChan(Typeof(c).(*ChanType), 1);
			c = cv.Interface().(chan int);
		}

		// Send
		cv.Send(NewValue(2));
		if i := <-c; i != 2 {
			t.Errorf("reflect Send 2, native recv %d", i);
		}

		// Recv
		c <- 3;
		if i := cv.Recv().(*IntValue).Get(); i != 3 {
			t.Errorf("native send 3, reflect Recv %d", i);
		}

		// TryRecv fail
		val := cv.TryRecv();
		if val != nil {
			t.Errorf("TryRecv on empty chan: %s", valueToString(val));
		}

		// TryRecv success
		c <- 4;
		val = cv.TryRecv();
		if val == nil {
			t.Errorf("TryRecv on ready chan got nil");
		} else if i := val.(*IntValue).Get(); i != 4 {
			t.Errorf("native send 4, TryRecv %d", i);
		}

		// TrySend fail
		c <- 100;
		ok := cv.TrySend(NewValue(5));
		i := <-c;
		if ok {
			t.Errorf("TrySend on full chan succeeded: value %d", i);
		}

		// TrySend success
		ok = cv.TrySend(NewValue(6));
		if !ok {
			t.Errorf("TrySend on empty chan failed");
		} else {
			if i = <-c; i != 6 {
				t.Errorf("TrySend 6, recv %d", i);
			}
		}

		// Close
		c <- 123;
		cv.Close();
		if cv.Closed() {
			t.Errorf("closed too soon - 1");
		}
		if i := cv.Recv().(*IntValue).Get(); i != 123 {
			t.Errorf("send 123 then close; Recv %d", i);
		}
		if cv.Closed() {
			t.Errorf("closed too soon - 2");
		}
		if i := cv.Recv().(*IntValue).Get(); i != 0 {
			t.Errorf("after close Recv %d", i);
		}
		if !cv.Closed() {
			t.Errorf("not closed");
		}
	}

	// check creation of unbuffered channel
	var c chan int;
	cv := MakeChan(Typeof(c).(*ChanType), 0);
	c = cv.Interface().(chan int);
	if cv.TrySend(NewValue(7)) {
		t.Errorf("TrySend on sync chan succeeded");
	}
	if cv.TryRecv() != nil {
		t.Errorf("TryRecv on sync chan succeeded");
	}

	// len/cap
	cv = MakeChan(Typeof(c).(*ChanType), 10);
	c = cv.Interface().(chan int);
	for i := 0; i < 3; i++ {
		c <- i;
	}
	if l, m := cv.Len(), cv.Cap(); l != len(c) || m != cap(c) {
		t.Errorf("Len/Cap = %d/%d want %d/%d", l, m, len(c), cap(c));
	}

}

// Difficult test for function call because of
// implicit padding between arguments.
func dummy(b byte, c int, d byte) (i byte, j int, k byte) {
	return b, c, d;
}

func TestFunc(t *testing.T) {
	ret := NewValue(dummy).(*FuncValue).Call([]Value{NewValue(byte(10)), NewValue(20), NewValue(byte(30))});
	if len(ret) != 3 {
		t.Fatalf("Call returned %d values, want 3", len(ret));
	}

	i := ret[0].(*Uint8Value).Get();
	j := ret[1].(*IntValue).Get();
	k := ret[2].(*Uint8Value).Get();
	if i != 10 || j != 20 || k != 30 {
		t.Errorf("Call returned %d, %d, %d; want 10, 20, 30", i, j, k);
	}
}

type Point struct {
	x, y int;
}

func (p Point) Dist(scale int) int {
	return p.x * p.x * scale + p.y * p.y * scale;
}

func TestMethod(t *testing.T) {
	// Non-curried method of type.
	p := Point{3, 4};
	i := Typeof(p).Method(0).Func.Call([]Value{NewValue(p), NewValue(10)})[0].(*IntValue).Get();
	if i != 250 {
		t.Errorf("Type Method returned %d; want 250", i);
	}

	// Curried method of value.
	i = NewValue(p).Method(0).Call([]Value{NewValue(10)})[0].(*IntValue).Get();
	if i != 250 {
		t.Errorf("Value Method returned %d; want 250", i);
	}

	// Curried method of interface value.
	// Have to wrap interface value in a struct to get at it.
	// Passing it to NewValue directly would
	// access the underlying Point, not the interface.
	var s = struct {
		x interface {
			Dist(int) int;
		};
	}{p};
	pv := NewValue(s).(*StructValue).Field(0);
	i = pv.Method(0).Call([]Value{NewValue(10)})[0].(*IntValue).Get();
	if i != 250 {
		t.Errorf("Interface Method returned %d; want 250", i);
	}
}

func TestInterfaceSet(t *testing.T) {
	p := &Point{3, 4};

	var s struct {
		I	interface{};
		P	interface {
			Dist(int) int;
		};
	}
	sv := NewValue(&s).(*PtrValue).Elem().(*StructValue);
	sv.Field(0).(*InterfaceValue).Set(NewValue(p));
	if q := s.I.(*Point); q != p {
		t.Errorf("i: have %p want %p", q, p);
	}

	pv := sv.Field(1).(*InterfaceValue);
	pv.Set(NewValue(p));
	if q := s.P.(*Point); q != p {
		t.Errorf("i: have %p want %p", q, p);
	}

	i := pv.Method(0).Call([]Value{NewValue(10)})[0].(*IntValue).Get();
	if i != 250 {
		t.Errorf("Interface Method returned %d; want 250", i);
	}
}

type T1 struct {
	a	string;
	int;
}

func TestAnonymousFields(t *testing.T) {
	var field StructField;
	var ok bool;
	var t1 T1;
	type1 := Typeof(t1).(*StructType);
	if field, ok = type1.FieldByName("int"); !ok {
		t.Error("no field 'int'");
	}
	if field.Index[0] != 1 {
		t.Error("field index should be 1; is", field.Index);
	}
}

type FTest struct {
	s	interface{};
	name	string;
	index	[]int;
	value	int;
}

type D1 struct {
	d int;
}
type D2 struct {
	d int;
}

type S0 struct {
	a, b, c	int;
	D1;
	D2;
}

type S1 struct {
	b	int;
	S0;
}

type S2 struct {
	a	int;
	*S1;
}

type S1x struct {
	S1;
}

type S1y struct {
	S1;
}

type S3 struct {
	S1x;
	S2;
	d, e	int;
	*S1y;
}

type S4 struct {
	*S4;
	a	int;
}

var fieldTests = []FTest{
	FTest{struct{}{}, "", nil, 0},
	FTest{struct{}{}, "foo", nil, 0},
	FTest{S0{a: 'a'}, "a", []int{0}, 'a'},
	FTest{S0{}, "d", nil, 0},
	FTest{S1{S0: S0{a: 'a'}}, "a", []int{1, 0}, 'a'},
	FTest{S1{b: 'b'}, "b", []int{0}, 'b'},
	FTest{S1{}, "S0", []int{1}, 0},
	FTest{S1{S0: S0{c: 'c'}}, "c", []int{1, 2}, 'c'},
	FTest{S2{a: 'a'}, "a", []int{0}, 'a'},
	FTest{S2{}, "S1", []int{1}, 0},
	FTest{S2{S1: &S1{b: 'b'}}, "b", []int{1, 0}, 'b'},
	FTest{S2{S1: &S1{S0: S0{c: 'c'}}}, "c", []int{1, 1, 2}, 'c'},
	FTest{S2{}, "d", nil, 0},
	FTest{S3{}, "S1", nil, 0},
	FTest{S3{S2: S2{a: 'a'}}, "a", []int{1, 0}, 'a'},
	FTest{S3{}, "b", nil, 0},
	FTest{S3{d: 'd'}, "d", []int{2}, 0},
	FTest{S3{e: 'e'}, "e", []int{3}, 'e'},
	FTest{S4{a: 'a'}, "a", []int{1}, 'a'},
	FTest{S4{}, "b", nil, 0},
}

func TestFieldByIndex(t *testing.T) {
	for _, test := range fieldTests {
		s := Typeof(test.s).(*StructType);
		f := s.FieldByIndex(test.index);
		if f.Name != "" {
			if test.index != nil {
				if f.Name != test.name {
					t.Errorf("%s.%s found; want %s", s.Name(), f.Name, test.name);
				}
			} else {
				t.Errorf("%s.%s found", s.Name(), f.Name);
			}
		} else if len(test.index) > 0 {
			t.Errorf("%s.%s not found", s.Name(), test.name);
		}

		if test.value != 0 {
			v := NewValue(test.s).(*StructValue).FieldByIndex(test.index);
			if v != nil {
				if x, ok := v.Interface().(int); ok {
					if x != test.value {
						t.Errorf("%s%v is %d; want %d", s.Name(), test.index, x, test.value);
					}
				} else {
					t.Errorf("%s%v value not an int", s.Name(), test.index);
				}
			} else {
				t.Errorf("%s%v value not found", s.Name(), test.index);
			}
		}
	}
}

func TestFieldByName(t *testing.T) {
	for _, test := range fieldTests {
		s := Typeof(test.s).(*StructType);
		f, found := s.FieldByName(test.name);
		if found {
			if test.index != nil {
				// Verify field depth and index.
				if len(f.Index) != len(test.index) {
					t.Errorf("%s.%s depth %d; want %d", s.Name(), test.name, len(f.Index), len(test.index));
				} else {
					for i, x := range f.Index {
						if x != test.index[i] {
							t.Errorf("%s.%s.Index[%d] is %d; want %d", s.Name(), test.name, i, x, test.index[i]);
						}
					}
				}
			} else {
				t.Errorf("%s.%s found", s.Name(), f.Name);
			}
		} else if len(test.index) > 0 {
			t.Errorf("%s.%s not found", s.Name(), test.name);
		}

		if test.value != 0 {
			v := NewValue(test.s).(*StructValue).FieldByName(test.name);
			if v != nil {
				if x, ok := v.Interface().(int); ok {
					if x != test.value {
						t.Errorf("%s.%s is %d; want %d", s.Name(), test.name, x, test.value);
					}
				} else {
					t.Errorf("%s.%s value not an int", s.Name(), test.name);
				}
			} else {
				t.Errorf("%s.%s value not found", s.Name(), test.name);
			}
		}
	}
}
