github.com/nikandfor/loc@v0.5.1/func_test.go (about) 1 package loc 2 3 import ( 4 "reflect" 5 "testing" 6 "unsafe" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 type eface struct { 12 _ unsafe.Pointer 13 _ unsafe.Pointer 14 } 15 16 func TestFuncFunc(t *testing.T) { 17 var f interface{} 18 19 f = TestSetCache 20 r := reflect.ValueOf(f) 21 t.Logf("reflect: %v %v %v %x", r.Kind(), r.Type(), r, *(*eface)(unsafe.Pointer(&f))) 22 23 f = TestFuncFunc 24 r = reflect.ValueOf(f) 25 t.Logf("reflect: %v %v %v %x", r.Kind(), r.Type(), r, *(*eface)(unsafe.Pointer(&f))) 26 27 pc := FuncEntryFromFunc(TestFuncFunc) 28 29 name, file, line := pc.NameFileLine() 30 t.Logf("pc: %v %v %v", name, file, line) 31 32 assert.Equal(t, FuncEntry(0), pc) 33 34 assert.Equal(t, FuncEntry(0), PC(reflect.ValueOf(TestFuncFunc).Pointer())) 35 36 name, file, line = FuncEntryFromFunc(nil).NameFileLine() 37 t.Logf("pc: %v %v %v", name, file, line) 38 39 var q func() 40 41 name, file, line = FuncEntryFromFunc(q).NameFileLine() 42 t.Logf("pc: %v %v %v", name, file, line) 43 44 var e PC 45 q = func() { 46 t.Logf("closure func") 47 48 e = FuncEntry(0) 49 } 50 51 q() 52 53 rt := reflect.ValueOf(q).Type() 54 for i := 0; i < rt.NumIn(); i++ { 55 t.Logf("q in %v", rt.In(i)) 56 } 57 for i := 0; i < rt.NumOut(); i++ { 58 t.Logf("q out %v", rt.Out(i)) 59 } 60 61 pc = FuncEntryFromFunc(q) 62 63 name, file, line = pc.NameFileLine() 64 t.Logf("pc: %v %v %v", name, file, line) 65 66 assert.Equal(t, e, pc) 67 68 assert.Panics(t, func() { 69 pc = FuncEntryFromFunc(3) 70 }) 71 }