| // Copyright 2011 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 reflectlite_test |
| |
| import ( |
| "bytes" |
| "go/ast" |
| "go/token" |
| . "internal/reflectlite" |
| "io" |
| "testing" |
| ) |
| |
| func TestImplicitSetConversion(t *testing.T) { |
| // Assume TestImplicitMapConversion covered the basics. |
| // Just make sure conversions are being applied at all. |
| var r io.Reader |
| b := new(bytes.Buffer) |
| rv := ValueOf(&r).Elem() |
| rv.Set(ValueOf(b)) |
| if r != b { |
| t.Errorf("after Set: r=%T(%v)", r, r) |
| } |
| } |
| |
| var implementsTests = []struct { |
| x any |
| t any |
| b bool |
| }{ |
| {new(*bytes.Buffer), new(io.Reader), true}, |
| {new(bytes.Buffer), new(io.Reader), false}, |
| {new(*bytes.Buffer), new(io.ReaderAt), false}, |
| {new(*ast.Ident), new(ast.Expr), true}, |
| {new(*notAnExpr), new(ast.Expr), false}, |
| {new(*ast.Ident), new(notASTExpr), false}, |
| {new(notASTExpr), new(ast.Expr), false}, |
| {new(ast.Expr), new(notASTExpr), false}, |
| {new(*notAnExpr), new(notASTExpr), true}, |
| {new(mapError), new(error), true}, |
| {new(*mapError), new(error), true}, |
| } |
| |
| type notAnExpr struct{} |
| |
| func (notAnExpr) Pos() token.Pos { return token.NoPos } |
| func (notAnExpr) End() token.Pos { return token.NoPos } |
| func (notAnExpr) exprNode() {} |
| |
| type notASTExpr interface { |
| Pos() token.Pos |
| End() token.Pos |
| exprNode() |
| } |
| |
| type mapError map[string]string |
| |
| func (mapError) Error() string { return "mapError" } |
| |
| var _ error = mapError{} |
| var _ error = new(mapError) |
| |
| func TestImplements(t *testing.T) { |
| for _, tt := range implementsTests { |
| xv := TypeOf(tt.x).Elem() |
| xt := TypeOf(tt.t).Elem() |
| if b := xv.Implements(xt); b != tt.b { |
| t.Errorf("(%s).Implements(%s) = %v, want %v", TypeString(xv), TypeString(xt), b, tt.b) |
| } |
| } |
| } |
| |
| var assignableTests = []struct { |
| x any |
| t any |
| b bool |
| }{ |
| {new(chan int), new(<-chan int), true}, |
| {new(<-chan int), new(chan int), false}, |
| {new(*int), new(IntPtr), true}, |
| {new(IntPtr), new(*int), true}, |
| {new(IntPtr), new(IntPtr1), false}, |
| {new(Ch), new(<-chan any), true}, |
| // test runs implementsTests too |
| } |
| |
| type IntPtr *int |
| type IntPtr1 *int |
| type Ch <-chan any |
| |
| func TestAssignableTo(t *testing.T) { |
| for i, tt := range append(assignableTests, implementsTests...) { |
| xv := TypeOf(tt.x).Elem() |
| xt := TypeOf(tt.t).Elem() |
| if b := xv.AssignableTo(xt); b != tt.b { |
| t.Errorf("%d:AssignableTo: got %v, want %v", i, b, tt.b) |
| } |
| } |
| } |