OSDN Git Service

libgo: Update to weekly.2011-11-18.
[pf3gnuchains/gcc-fork.git] / libgo / go / reflect / all_test.go
index b8c609a..cf31d1b 100644 (file)
@@ -6,16 +6,23 @@ package reflect_test
 
 import (
        "bytes"
-       "container/vector"
+       "encoding/base64"
        "fmt"
        "io"
        "os"
        . "reflect"
-/*     "runtime" */
+       /*      "runtime" */
        "testing"
        "unsafe"
 )
 
+func TestBool(t *testing.T) {
+       v := ValueOf(true)
+       if v.Bool() != true {
+               t.Fatal("ValueOf(true).Bool() = false")
+       }
+}
+
 type integer int
 type T struct {
        a int
@@ -215,7 +222,8 @@ func TestTypes(t *testing.T) {
 
 func TestSet(t *testing.T) {
        for i, tt := range valueTests {
-               v := ValueOf(tt.i).Elem()
+               v := ValueOf(tt.i)
+               v = v.Elem()
                switch v.Kind() {
                case Int:
                        v.SetInt(132)
@@ -434,7 +442,7 @@ func TestInterfaceGet(t *testing.T) {
        inter.E = 123.456
        v1 := ValueOf(&inter)
        v2 := v1.Elem().Field(0)
-       assert(t, v2.Type().String(), "interface { }")
+       assert(t, v2.Type().String(), "interface {}")
        i2 := v2.Interface()
        v3 := ValueOf(i2)
        assert(t, v3.Type().String(), "float64")
@@ -447,7 +455,7 @@ func TestInterfaceValue(t *testing.T) {
        inter.E = 123.456
        v1 := ValueOf(&inter)
        v2 := v1.Elem().Field(0)
-       assert(t, v2.Type().String(), "interface { }")
+       assert(t, v2.Type().String(), "interface {}")
        v3 := v2.Elem()
        assert(t, v3.Type().String(), "float64")
 
@@ -631,7 +639,7 @@ var deepEqualTests = []DeepEqualTest{
        {make([]int, 10), make([]int, 10), true},
        {&[3]int{1, 2, 3}, &[3]int{1, 2, 3}, true},
        {Basic{1, 0.5}, Basic{1, 0.5}, true},
-       {os.Error(nil), os.Error(nil), true},
+       {error(nil), error(nil), true},
        {map[int]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, true},
 
        // Inequalities
@@ -651,6 +659,14 @@ var deepEqualTests = []DeepEqualTest{
        {nil, 1, false},
        {1, nil, false},
 
+       // Nil vs empty: not the same.
+       {[]int{}, []int(nil), false},
+       {[]int{}, []int{}, true},
+       {[]int(nil), []int(nil), true},
+       {map[int]int{}, map[int]int(nil), false},
+       {map[int]int{}, map[int]int{}, true},
+       {map[int]int(nil), map[int]int(nil), true},
+
        // Mismatched types
        {1, 1.0, false},
        {int32(1), int64(1), false},
@@ -853,13 +869,13 @@ func TestIsNil(t *testing.T) {
 
 func TestInterfaceExtraction(t *testing.T) {
        var s struct {
-               w io.Writer
+               W io.Writer
        }
 
-       s.w = os.Stdout
+       s.W = os.Stdout
        v := Indirect(ValueOf(&s)).Field(0).Interface()
-       if v != s.w.(interface{}) {
-               t.Error("Interface() on interface: ", v, s.w)
+       if v != s.W.(interface{}) {
+               t.Error("Interface() on interface: ", v, s.W)
        }
 }
 
@@ -877,19 +893,20 @@ func TestMap(t *testing.T) {
                t.Errorf("Len = %d, want %d", n, len(m))
        }
        keys := mv.MapKeys()
-       i := 0
        newmap := MakeMap(mv.Type())
        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]; kv.String() != k {
-                       t.Errorf("Keys[%q] = %d, want %d", i, kv.Int(), k)
+               // These aren't required to be in the same order.
+               seen := false
+               for _, kv := range keys {
+                       if kv.String() == k {
+                               seen = true
+                               break
+                       }
+               }
+               if !seen {
+                       t.Errorf("Missing key %q", k)
                }
-               i++
 
                // Check that value lookup is correct.
                vv := mv.MapIndex(ValueOf(k))
@@ -1091,21 +1108,38 @@ func TestMethod(t *testing.T) {
        }
 
        // Curried method of value.
-       i = ValueOf(p).Method(1).Call([]Value{ValueOf(10)})[0].Int()
+       tfunc := TypeOf(func(int) int(nil))
+       v := ValueOf(p).Method(1)
+       if tt := v.Type(); tt != tfunc {
+               t.Errorf("Value Method Type is %s; want %s", tt, tfunc)
+       }
+       i = v.Call([]Value{ValueOf(10)})[0].Int()
        if i != 250 {
                t.Errorf("Value Method returned %d; want 250", i)
        }
-       i = ValueOf(p).MethodByName("Dist").Call([]Value{ValueOf(10)})[0].Int()
+       v = ValueOf(p).MethodByName("Dist")
+       if tt := v.Type(); tt != tfunc {
+               t.Errorf("Value MethodByName Type is %s; want %s", tt, tfunc)
+       }
+       i = v.Call([]Value{ValueOf(10)})[0].Int()
        if i != 250 {
                t.Errorf("Value MethodByName returned %d; want 250", i)
        }
 
        // Curried method of pointer.
-       i = ValueOf(&p).Method(1).Call([]Value{ValueOf(10)})[0].Int()
+       v = ValueOf(&p).Method(1)
+       if tt := v.Type(); tt != tfunc {
+               t.Errorf("Pointer Value Method Type is %s; want %s", tt, tfunc)
+       }
+       i = v.Call([]Value{ValueOf(10)})[0].Int()
        if i != 250 {
                t.Errorf("Pointer Value Method returned %d; want 250", i)
        }
-       i = ValueOf(&p).MethodByName("Dist").Call([]Value{ValueOf(10)})[0].Int()
+       v = ValueOf(&p).MethodByName("Dist")
+       if tt := v.Type(); tt != tfunc {
+               t.Errorf("Pointer Value MethodByName Type is %s; want %s", tt, tfunc)
+       }
+       i = v.Call([]Value{ValueOf(10)})[0].Int()
        if i != 250 {
                t.Errorf("Pointer Value MethodByName returned %d; want 250", i)
        }
@@ -1120,11 +1154,19 @@ func TestMethod(t *testing.T) {
                }
        }{p}
        pv := ValueOf(s).Field(0)
-       i = pv.Method(0).Call([]Value{ValueOf(10)})[0].Int()
+       v = pv.Method(0)
+       if tt := v.Type(); tt != tfunc {
+               t.Errorf("Interface Method Type is %s; want %s", tt, tfunc)
+       }
+       i = v.Call([]Value{ValueOf(10)})[0].Int()
        if i != 250 {
                t.Errorf("Interface Method returned %d; want 250", i)
        }
-       i = pv.MethodByName("Dist").Call([]Value{ValueOf(10)})[0].Int()
+       v = pv.MethodByName("Dist")
+       if tt := v.Type(); tt != tfunc {
+               t.Errorf("Interface MethodByName Type is %s; want %s", tt, tfunc)
+       }
+       i = v.Call([]Value{ValueOf(10)})[0].Int()
        if i != 250 {
                t.Errorf("Interface MethodByName returned %d; want 250", i)
        }
@@ -1190,18 +1232,18 @@ type D2 struct {
 }
 
 type S0 struct {
-       a, b, c int
+       A, B, C int
        D1
        D2
 }
 
 type S1 struct {
-       b int
+       B int
        S0
 }
 
 type S2 struct {
-       a int
+       A int
        *S1
 }
 
@@ -1216,36 +1258,36 @@ type S1y struct {
 type S3 struct {
        S1x
        S2
-       d, e int
+       D, E int
        *S1y
 }
 
 type S4 struct {
        *S4
-       a int
+       A int
 }
 
 var fieldTests = []FTest{
        {struct{}{}, "", nil, 0},
-       {struct{}{}, "foo", nil, 0},
-       {S0{a: 'a'}, "a", []int{0}, 'a'},
-       {S0{}, "d", nil, 0},
-       {S1{S0: S0{a: 'a'}}, "a", []int{1, 0}, 'a'},
-       {S1{b: 'b'}, "b", []int{0}, 'b'},
+       {struct{}{}, "Foo", nil, 0},
+       {S0{A: 'a'}, "A", []int{0}, 'a'},
+       {S0{}, "D", nil, 0},
+       {S1{S0: S0{A: 'a'}}, "A", []int{1, 0}, 'a'},
+       {S1{B: 'b'}, "B", []int{0}, 'b'},
        {S1{}, "S0", []int{1}, 0},
-       {S1{S0: S0{c: 'c'}}, "c", []int{1, 2}, 'c'},
-       {S2{a: 'a'}, "a", []int{0}, 'a'},
+       {S1{S0: S0{C: 'c'}}, "C", []int{1, 2}, 'c'},
+       {S2{A: 'a'}, "A", []int{0}, 'a'},
        {S2{}, "S1", []int{1}, 0},
-       {S2{S1: &S1{b: 'b'}}, "b", []int{1, 0}, 'b'},
-       {S2{S1: &S1{S0: S0{c: 'c'}}}, "c", []int{1, 1, 2}, 'c'},
-       {S2{}, "d", nil, 0},
+       {S2{S1: &S1{B: 'b'}}, "B", []int{1, 0}, 'b'},
+       {S2{S1: &S1{S0: S0{C: 'c'}}}, "C", []int{1, 1, 2}, 'c'},
+       {S2{}, "D", nil, 0},
        {S3{}, "S1", nil, 0},
-       {S3{S2: S2{a: 'a'}}, "a", []int{1, 0}, 'a'},
-       {S3{}, "b", nil, 0},
-       {S3{d: 'd'}, "d", []int{2}, 0},
-       {S3{e: 'e'}, "e", []int{3}, 'e'},
-       {S4{a: 'a'}, "a", []int{1}, 'a'},
-       {S4{}, "b", nil, 0},
+       {S3{S2: S2{A: 'a'}}, "A", []int{1, 0}, 'a'},
+       {S3{}, "B", nil, 0},
+       {S3{D: 'd'}, "D", []int{2}, 0},
+       {S3{E: 'e'}, "E", []int{3}, 'e'},
+       {S4{A: 'a'}, "A", []int{1}, 'a'},
+       {S4{}, "B", nil, 0},
 }
 
 func TestFieldByIndex(t *testing.T) {
@@ -1322,8 +1364,8 @@ func TestFieldByName(t *testing.T) {
 }
 
 func TestImportPath(t *testing.T) {
-       if path := TypeOf(vector.Vector{}).PkgPath(); path != "libgo_container.vector" {
-               t.Errorf("TypeOf(vector.Vector{}).PkgPath() = %q, want \"libgo_container.vector\"", path)
+       if path := TypeOf(&base64.Encoding{}).Elem().PkgPath(); path != "libgo_encoding.base64" {
+               t.Errorf(`TypeOf(&base64.Encoding{}).Elem().PkgPath() = %q, want "libgo_encoding.base64"`, path)
        }
 }
 
@@ -1566,3 +1608,93 @@ func TestTagGet(t *testing.T) {
                }
        }
 }
+
+func TestBytes(t *testing.T) {
+       type B []byte
+       x := B{1, 2, 3, 4}
+       y := ValueOf(x).Bytes()
+       if !bytes.Equal(x, y) {
+               t.Fatalf("ValueOf(%v).Bytes() = %v", x, y)
+       }
+       if &x[0] != &y[0] {
+               t.Errorf("ValueOf(%p).Bytes() = %p", &x[0], &y[0])
+       }
+}
+
+func TestSetBytes(t *testing.T) {
+       type B []byte
+       var x B
+       y := []byte{1, 2, 3, 4}
+       ValueOf(&x).Elem().SetBytes(y)
+       if !bytes.Equal(x, y) {
+               t.Fatalf("ValueOf(%v).Bytes() = %v", x, y)
+       }
+       if &x[0] != &y[0] {
+               t.Errorf("ValueOf(%p).Bytes() = %p", &x[0], &y[0])
+       }
+}
+
+type Private struct {
+       x int
+       y **int
+}
+
+func (p *Private) m() {
+}
+
+type Public struct {
+       X int
+       Y **int
+}
+
+func (p *Public) M() {
+}
+
+func TestUnexported(t *testing.T) {
+       var pub Public
+       v := ValueOf(&pub)
+       isValid(v.Elem().Field(0))
+       isValid(v.Elem().Field(1))
+       isValid(v.Elem().FieldByName("X"))
+       isValid(v.Elem().FieldByName("Y"))
+       isValid(v.Type().Method(0).Func)
+       isNonNil(v.Elem().Field(0).Interface())
+       isNonNil(v.Elem().Field(1).Interface())
+       isNonNil(v.Elem().FieldByName("X").Interface())
+       isNonNil(v.Elem().FieldByName("Y").Interface())
+       isNonNil(v.Type().Method(0).Func.Interface())
+
+       var priv Private
+       v = ValueOf(&priv)
+       isValid(v.Elem().Field(0))
+       isValid(v.Elem().Field(1))
+       isValid(v.Elem().FieldByName("x"))
+       isValid(v.Elem().FieldByName("y"))
+       isValid(v.Type().Method(0).Func)
+       shouldPanic(func() { v.Elem().Field(0).Interface() })
+       shouldPanic(func() { v.Elem().Field(1).Interface() })
+       shouldPanic(func() { v.Elem().FieldByName("x").Interface() })
+       shouldPanic(func() { v.Elem().FieldByName("y").Interface() })
+       shouldPanic(func() { v.Type().Method(0).Func.Interface() })
+}
+
+func shouldPanic(f func()) {
+       defer func() {
+               if recover() == nil {
+                       panic("did not panic")
+               }
+       }()
+       f()
+}
+
+func isNonNil(x interface{}) {
+       if x == nil {
+               panic("nil interface")
+       }
+}
+
+func isValid(v Value) {
+       if !v.IsValid() {
+               panic("zero Value")
+       }
+}