// Package stdlogging implements sklogimpl.Logger and logs to either stderr or stdout.
package stdlogging

import (
	"os"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/loggingsyncbuffer"
	"go.skia.org/infra/go/sklog/sklogimpl"
)

func testLogAtSeverity(t *testing.T, prefix, contains string, severity sklogimpl.Severity, fmt string, args ...interface{}) {
	t.Helper()
	sb := loggingsyncbuffer.New()
	sklogimpl.SetLogger(New(sb))
	t.Cleanup(func() {
		sklogimpl.SetLogger(New(os.Stderr))
	})

	sklogimpl.Log(1, severity, fmt, args...)

	// Don't do an exact match because log lines contain varying info like time.
	require.Contains(t, sb.String(), contains)
	require.Equal(t, prefix, sb.String()[:1])
}

func TestLog_Debugf(t *testing.T) {
	testLogAtSeverity(t, "D", "] Hello World 2!\n", sklogimpl.Debug, "Hello World %d!", 2)
}

func TestLog_Debug(t *testing.T) {
	testLogAtSeverity(t, "D", "] 2\n", sklogimpl.Debug, "", 2) // sklog.Debug because fmt is the empty string.
}

func TestLog_Infof(t *testing.T) {
	testLogAtSeverity(t, "I", "] Hello World 2!\n", sklogimpl.Info, "Hello World %d!", 2)
}

func TestLog_Info(t *testing.T) {
	testLogAtSeverity(t, "I", "] 2\n", sklogimpl.Info, "", 2) // sklog.Info because fmt is the empty string.
}

func TestLog_Warningf(t *testing.T) {
	testLogAtSeverity(t, "W", "] Hello World 2!\n", sklogimpl.Warning, "Hello World %d!", 2)
}

func TestLog_Warning(t *testing.T) {
	testLogAtSeverity(t, "W", "] 2\n", sklogimpl.Warning, "", 2)
}

func TestLog_Errorf(t *testing.T) {
	testLogAtSeverity(t, "E", "] Hello World 2!\n", sklogimpl.Error, "Hello World %d!", 2)
}

func TestLog_Error(t *testing.T) {
	testLogAtSeverity(t, "E", "] 2\n", sklogimpl.Error, "", 2)
}
