github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/test/testdata/assert_test.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Tests type assertion expressions and statements 6 7 package main 8 9 import ( 10 "runtime" 11 "testing" 12 ) 13 14 type ( 15 S struct{} 16 U struct{} 17 18 I interface { 19 F() 20 } 21 ) 22 23 var ( 24 s *S 25 u *U 26 ) 27 28 func (s *S) F() {} 29 func (u *U) F() {} 30 31 func e2t_ssa(e interface{}) *U { 32 return e.(*U) 33 } 34 35 func i2t_ssa(i I) *U { 36 return i.(*U) 37 } 38 39 func testAssertE2TOk(t *testing.T) { 40 if got := e2t_ssa(u); got != u { 41 t.Errorf("e2t_ssa(u)=%v want %v", got, u) 42 } 43 } 44 45 func testAssertE2TPanic(t *testing.T) { 46 var got *U 47 defer func() { 48 if got != nil { 49 t.Errorf("e2t_ssa(s)=%v want nil", got) 50 } 51 e := recover() 52 err, ok := e.(*runtime.TypeAssertionError) 53 if !ok { 54 t.Errorf("e2t_ssa(s) panic type %T", e) 55 } 56 want := "interface conversion: interface {} is *main.S, not *main.U" 57 if err.Error() != want { 58 t.Errorf("e2t_ssa(s) wrong error, want '%s', got '%s'", want, err.Error()) 59 } 60 }() 61 got = e2t_ssa(s) 62 t.Errorf("e2t_ssa(s) should panic") 63 64 } 65 66 func testAssertI2TOk(t *testing.T) { 67 if got := i2t_ssa(u); got != u { 68 t.Errorf("i2t_ssa(u)=%v want %v", got, u) 69 } 70 } 71 72 func testAssertI2TPanic(t *testing.T) { 73 var got *U 74 defer func() { 75 if got != nil { 76 t.Errorf("i2t_ssa(s)=%v want nil", got) 77 } 78 e := recover() 79 err, ok := e.(*runtime.TypeAssertionError) 80 if !ok { 81 t.Errorf("i2t_ssa(s) panic type %T", e) 82 } 83 want := "interface conversion: main.I is *main.S, not *main.U" 84 if err.Error() != want { 85 t.Errorf("i2t_ssa(s) wrong error, want '%s', got '%s'", want, err.Error()) 86 } 87 }() 88 got = i2t_ssa(s) 89 t.Errorf("i2t_ssa(s) should panic") 90 } 91 92 func e2t2_ssa(e interface{}) (*U, bool) { 93 u, ok := e.(*U) 94 return u, ok 95 } 96 97 func i2t2_ssa(i I) (*U, bool) { 98 u, ok := i.(*U) 99 return u, ok 100 } 101 102 func testAssertE2T2(t *testing.T) { 103 if got, ok := e2t2_ssa(u); !ok || got != u { 104 t.Errorf("e2t2_ssa(u)=(%v, %v) want (%v, %v)", got, ok, u, true) 105 } 106 if got, ok := e2t2_ssa(s); ok || got != nil { 107 t.Errorf("e2t2_ssa(s)=(%v, %v) want (%v, %v)", got, ok, nil, false) 108 } 109 } 110 111 func testAssertI2T2(t *testing.T) { 112 if got, ok := i2t2_ssa(u); !ok || got != u { 113 t.Errorf("i2t2_ssa(u)=(%v, %v) want (%v, %v)", got, ok, u, true) 114 } 115 if got, ok := i2t2_ssa(s); ok || got != nil { 116 t.Errorf("i2t2_ssa(s)=(%v, %v) want (%v, %v)", got, ok, nil, false) 117 } 118 } 119 120 // TestTypeAssertion tests type assertions. 121 func TestTypeAssertion(t *testing.T) { 122 testAssertE2TOk(t) 123 testAssertE2TPanic(t) 124 testAssertI2TOk(t) 125 testAssertI2TPanic(t) 126 testAssertE2T2(t) 127 testAssertI2T2(t) 128 }