tlog.app/go/loc@v0.6.2-0.20231112073106-b6382a0ac518/location_stack_test.go (about)

     1  package loc
     2  
     3  import (
     4  	"fmt"
     5  	"path"
     6  	"regexp"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestLocationFillCallers(t *testing.T) {
    14  	st := make(PCs, 1)
    15  
    16  	st = CallersFill(0, st)
    17  
    18  	assert.Len(t, st, 1)
    19  	assert.Equal(t, "location_stack_test.go:16", st[0].String())
    20  }
    21  
    22  func testLocationsInside() (st PCs) {
    23  	func() {
    24  		func() {
    25  			st = Callers(1, 3)
    26  		}()
    27  	}()
    28  
    29  	return
    30  }
    31  
    32  func TestLocationPCsString(t *testing.T) {
    33  	var st PCs
    34  	func() {
    35  		func() {
    36  			st = testLocationsInside()
    37  		}()
    38  	}()
    39  
    40  	assert.Len(t, st, 3)
    41  	assert.Equal(t, "location_stack_test.go:26", st[0].String())
    42  	assert.Equal(t, "location_stack_test.go:27", st[1].String())
    43  	assert.Equal(t, "location_stack_test.go:36", st[2].String())
    44  
    45  	re := `location_stack_test.go:26 at location_stack_test.go:27 at location_stack_test.go:36`
    46  
    47  	assert.Equal(t, re, st.String())
    48  }
    49  
    50  func TestLocationPCsFormat(t *testing.T) {
    51  	var st PCs
    52  	func() {
    53  		func() {
    54  			st = testLocationsInside()
    55  		}()
    56  	}()
    57  
    58  	assert.Equal(t, "location_stack_test.go:26 at location_stack_test.go:27 at location_stack_test.go:54", st.String())
    59  
    60  	addAllSubs := innerFuncName(Caller(0), 2)
    61  	t.Logf("go version: %q: %q", gover(), addAllSubs)
    62  
    63  	assert.Equal(t, "loc.testLocationsInside.func1:26 at loc.testLocationsInside:27 at loc.TestLocationPCsFormat"+addAllSubs+":54", fmt.Sprintf("%#v", st))
    64  
    65  	re := `at [\w.-/]*location_stack_test.go:26
    66  at [\w.-/]*location_stack_test.go:27
    67  at [\w.-/]*location_stack_test.go:54
    68  `
    69  	v := fmt.Sprintf("%+v", st)
    70  	assert.True(t, regexp.MustCompile(re).MatchString(v), "expected:\n%vgot:\n%v", re, v)
    71  }
    72  
    73  func TestLocationPCsFormatString(t *testing.T) {
    74  	var st PCs
    75  	func() {
    76  		func() {
    77  			st = testLocationsInside()
    78  		}()
    79  	}()
    80  
    81  	assert.Equal(t, "location_stack_test.go:26 at location_stack_test.go:27 at location_stack_test.go:77", st.FormatString(""))
    82  
    83  	addAllSubs := innerFuncName(Caller(0), 2)
    84  	t.Logf("all sub funs suffix (go ver %q): %q", gover(), addAllSubs)
    85  
    86  	assert.Equal(t, "loc.testLocationsInside.func1:26 at loc.testLocationsInside:27 at loc.TestLocationPCsFormatString"+addAllSubs+":77", st.FormatString("#"))
    87  
    88  	re := `at [\w.-/]*location_stack_test.go:26
    89  at [\w.-/]*location_stack_test.go:27
    90  at [\w.-/]*location_stack_test.go:77
    91  `
    92  
    93  	v := st.FormatString("+")
    94  	assert.True(t, regexp.MustCompile(re).MatchString(v), "expected:\n%vgot:\n%v", re, v)
    95  }
    96  
    97  func innerFuncName(fn PC, n int) string {
    98  	var s string
    99  
   100  	switch {
   101  	//	case regexp.MustCompile("go1.16.*").MatchString(gover()):
   102  	//		return ".func1"
   103  	case regexp.MustCompile("go1.21.*").MatchString(gover()):
   104  		name, _, _ := fn.NameFileLine()
   105  		name = path.Base(name)
   106  		name = name[strings.IndexByte(name, '.')+1:]
   107  
   108  		s = "." + name
   109  
   110  		for i := 0; i < n; i++ {
   111  			s += fmt.Sprintf(".func%v", i+1)
   112  		}
   113  	default:
   114  		s = ".func"
   115  
   116  		for i := 0; i < n; i++ {
   117  			if i != 0 {
   118  				s += "."
   119  			}
   120  
   121  			s += "1"
   122  		}
   123  	}
   124  
   125  	return s
   126  }