package logger

import (
	"bytes"
	"log"
	"testing"

	"go.uber.org/zap"
	"go.uber.org/zap/buffer"
	"go.uber.org/zap/zapcore"
)

func TestLogVsLogLn(t *testing.T) {
	defer func() { logger = nil }()

	var buf bytes.Buffer
	testLogEqual := func(want string) {
		s := buf.String()
		if s != want {
			t.Errorf("got %s, want %s", s, want)
		}
		buf.Reset()
	}

	core := zapcore.NewCore(
		onlyMessage{},
		zapcore.AddSync(&buf),
		zapcore.DebugLevel,
	)
	l := zap.New(core)
	logger = l.Sugar()

	// logger.[Level] 系列的函数，因为受到底层 fmt.Sprint 的影响
	// 在处理 string 时不会添加默认的空格
	logger.Info(1, "2", 3)
	testLogEqual("123")

	// 而 logger.[Level]ln 系列的函数，因为底层使用的是 fmt.Sprintln
	// 所以会正常输出空格
	logger.Infoln(1, "2", 3)
	testLogEqual("1 2 3")

	stdLog := log.New(&buf, "", 0)

	// 标准库的 log 包的行为同样如此
	// 末尾的换行符是 log 包自动添加的
	stdLog.Print(1, "2", 3)
	testLogEqual("123\n")

	stdLog.Println(1, "2", 3)
	testLogEqual("1 2 3\n")
}

// 调试用，只重写了 EncodeEntry 方法。
// 调用其他方法就 panic
type onlyMessage struct{ zapcore.Encoder }

var pool = buffer.NewPool()

func (onlyMessage) EncodeEntry(e zapcore.Entry, _ []zapcore.Field) (*buffer.Buffer, error) {
	b := pool.Get()
	b.AppendString(e.Message)
	return b, nil
}
