1
2
3
4
5 package reflectlite_test
6
7 import (
8 "bytes"
9 "go/ast"
10 "go/token"
11 . "internal/reflectlite"
12 "io"
13 "testing"
14 )
15
16 func TestImplicitSetConversion(t *testing.T) {
17
18
19 var r io.Reader
20 b := new(bytes.Buffer)
21 rv := ValueOf(&r).Elem()
22 rv.Set(ValueOf(b))
23 if r != b {
24 t.Errorf("after Set: r=%T(%v)", r, r)
25 }
26 }
27
28 var implementsTests = []struct {
29 x any
30 t any
31 b bool
32 }{
33 {new(*bytes.Buffer), new(io.Reader), true},
34 {new(bytes.Buffer), new(io.Reader), false},
35 {new(*bytes.Buffer), new(io.ReaderAt), false},
36 {new(*ast.Ident), new(ast.Expr), true},
37 {new(*notAnExpr), new(ast.Expr), false},
38 {new(*ast.Ident), new(notASTExpr), false},
39 {new(notASTExpr), new(ast.Expr), false},
40 {new(ast.Expr), new(notASTExpr), false},
41 {new(*notAnExpr), new(notASTExpr), true},
42 {new(mapError), new(error), true},
43 {new(*mapError), new(error), true},
44 }
45
46 type notAnExpr struct{}
47
48 func (notAnExpr) Pos() token.Pos { return token.NoPos }
49 func (notAnExpr) End() token.Pos { return token.NoPos }
50 func (notAnExpr) exprNode() {}
51
52 type notASTExpr interface {
53 Pos() token.Pos
54 End() token.Pos
55 exprNode()
56 }
57
58 type mapError map[string]string
59
60 func (mapError) Error() string { return "mapError" }
61
62
63
64 var _ error = mapError{}
65 var _ error = new(mapError)
66
67 func TestImplements(t *testing.T) {
68 for _, tt := range implementsTests {
69 xv := TypeOf(tt.x).Elem()
70 xt := TypeOf(tt.t).Elem()
71 if b := xv.Implements(xt); b != tt.b {
72 t.Errorf("(%s).Implements(%s) = %v, want %v", TypeString(xv), TypeString(xt), b, tt.b)
73 }
74 }
75 }
76
77 var assignableTests = []struct {
78 x any
79 t any
80 b bool
81 }{
82 {new(chan int), new(<-chan int), true},
83 {new(<-chan int), new(chan int), false},
84 {new(*int), new(IntPtr), true},
85 {new(IntPtr), new(*int), true},
86 {new(IntPtr), new(IntPtr1), false},
87 {new(Ch), new(<-chan any), true},
88
89 }
90
91 type IntPtr *int
92 type IntPtr1 *int
93 type Ch <-chan any
94
95 func TestAssignableTo(t *testing.T) {
96 for i, tt := range append(assignableTests, implementsTests...) {
97 xv := TypeOf(tt.x).Elem()
98 xt := TypeOf(tt.t).Elem()
99 if b := xv.AssignableTo(xt); b != tt.b {
100 t.Errorf("%d:AssignableTo: got %v, want %v", i, b, tt.b)
101 }
102 }
103 }
104
View as plain text