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

     1  package loc
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"regexp"
     7  	"testing"
     8  	"unsafe"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestFmt(t *testing.T) {
    14  	t.Logf("[%d]", 1000)
    15  	t.Logf("[%6d]", 1000)
    16  	t.Logf("[%-6d]", 1000)
    17  
    18  	t.Logf("%v", Caller(0))
    19  }
    20  
    21  func TestLocationFormat(t *testing.T) {
    22  	l := PC(0x1234cd)
    23  
    24  	//	name, file, line := l.nameFileLine()
    25  	//	t.Logf("location: %v %v %v", name, file, line)
    26  
    27  	SetCache(l, "github.com/nikandfor/loc.Caller", "github.com/nikandfor/loc/location.go", 26)
    28  
    29  	var b bytes.Buffer
    30  
    31  	fmt.Fprintf(&b, "%v", l)
    32  	assert.Equal(t, "location.go:26", b.String())
    33  
    34  	b.Reset()
    35  
    36  	fmt.Fprintf(&b, "%.3v", l)
    37  	assert.Equal(t, "location.go: 26", b.String())
    38  
    39  	b.Reset()
    40  
    41  	fmt.Fprintf(&b, "%18.3v", l)
    42  	assert.Equal(t, "location.go   : 26", b.String())
    43  
    44  	b.Reset()
    45  
    46  	fmt.Fprintf(&b, "%18.30v", l)
    47  	assert.Len(t, b.String(), 18)
    48  
    49  	b.Reset()
    50  
    51  	fmt.Fprintf(&b, "%10.1v", l)
    52  	assert.Equal(t, "locatio:26", b.String())
    53  
    54  	b.Reset()
    55  
    56  	fmt.Fprintf(&b, "%18.1v", l)
    57  	assert.Len(t, b.String(), 18)
    58  
    59  	b.Reset()
    60  
    61  	fmt.Fprintf(&b, "%-18.3v", l)
    62  	assert.Equal(t, "   location.go: 26", b.String())
    63  
    64  	b.Reset()
    65  
    66  	fmt.Fprintf(&b, "%+v", l)
    67  	assert.True(t, regexp.MustCompile(`[\w./-]*location.go:26`).MatchString(b.String()), "got %v", b.String())
    68  
    69  	b.Reset()
    70  
    71  	fmt.Fprintf(&b, "%n", l)
    72  	assert.Equal(t, "loc.Caller", b.String())
    73  
    74  	b.Reset()
    75  
    76  	fmt.Fprintf(&b, "%12n", l)
    77  	assert.Equal(t, "loc.Caller  ", b.String())
    78  
    79  	b.Reset()
    80  
    81  	fmt.Fprintf(&b, "%-12s", l)
    82  	assert.Equal(t, "  loc.Caller", b.String())
    83  
    84  	b.Reset()
    85  
    86  	fmt.Fprintf(&b, "%f", l)
    87  	assert.Equal(t, "location.go", b.String())
    88  
    89  	b.Reset()
    90  
    91  	fmt.Fprintf(&b, "%12f", l)
    92  	assert.Equal(t, "location.go ", b.String())
    93  
    94  	b.Reset()
    95  
    96  	fmt.Fprintf(&b, "%d", l)
    97  	assert.Equal(t, "26", b.String())
    98  
    99  	b.Reset()
   100  
   101  	fmt.Fprintf(&b, "%0100d", l)
   102  	assert.Len(t, b.String(), 20)
   103  
   104  	b.Reset()
   105  
   106  	fmt.Fprintf(&b, "%4l", l)
   107  	assert.Equal(t, "  26", b.String())
   108  
   109  	b.Reset()
   110  
   111  	fmt.Fprintf(&b, "%x", l)
   112  	assert.Equal(t, "0x1234cd", b.String())
   113  
   114  	b.Reset()
   115  
   116  	fmt.Fprintf(&b, "%8x", l)
   117  	assert.Equal(t, "  0x1234cd", b.String())
   118  
   119  	b.Reset()
   120  
   121  	fmt.Fprintf(&b, "%010X", l)
   122  	assert.Equal(t, "0x00001234CD", b.String())
   123  
   124  	b.Reset()
   125  
   126  	fmt.Fprintf(&b, "%010x", l)
   127  	assert.Equal(t, fmt.Sprintf("%010p", unsafe.Pointer(uintptr(l))), b.String())
   128  
   129  	b.Reset()
   130  
   131  	fmt.Fprintf(&b, "%100x", l)
   132  	assert.Len(t, b.String(), 20)
   133  }
   134  
   135  func BenchmarkLocationString(b *testing.B) {
   136  	b.ReportAllocs()
   137  
   138  	l := Caller(0)
   139  
   140  	for i := 0; i < b.N; i++ {
   141  		_ = l.String()
   142  	}
   143  }
   144  
   145  func BenchmarkLocationFormat(b *testing.B) {
   146  	b.ReportAllocs()
   147  
   148  	var s formatter
   149  	s.flags['+'] = true
   150  
   151  	l := Caller(0)
   152  
   153  	for i := 0; i < b.N; i++ {
   154  		s.Reset()
   155  
   156  		l.Format(&s, 'v')
   157  	}
   158  }
   159  
   160  type formatter struct {
   161  	bytes.Buffer
   162  	flags   [128]bool
   163  	prec    int
   164  	width   int
   165  	precok  bool
   166  	widthok bool
   167  }
   168  
   169  func (f *formatter) Flag(c int) bool {
   170  	return f.flags[c]
   171  }
   172  
   173  func (f *formatter) Precision() (int, bool) {
   174  	return f.prec, f.precok
   175  }
   176  
   177  func (f *formatter) Width() (int, bool) {
   178  	return f.width, f.widthok
   179  }