// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package zapbenchmarks

import (
	"testing"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	slogbench "golang.org/x/exp/slog/benchmarks"
)

// Keep in sync (same names and behavior) as the
// benchmarks in the parent directory.

func BenchmarkAttrs(b *testing.B) {
	for _, logger := range []struct {
		name string
		l    *zap.Logger
	}{
		{
			"async discard",
			zap.New(&asyncCore{}),
		},
		{
			"fastText discard",
			zap.New(zapcore.NewCore(
				&fastTextEncoder{},
				&discarder{},
				zap.DebugLevel)),
		},
	} {
		l := logger.l
		b.Run(logger.name, func(b *testing.B) {
			for _, call := range []struct {
				name string
				f    func()
			}{
				{
					"5 args",
					func() {
						l.Info(slogbench.TestMessage,
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError))
					},
				},
				{
					"10 args",
					func() {
						l.Info(slogbench.TestMessage,
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError))
					},
				},
				{
					"40 args",
					func() {
						l.Info(slogbench.TestMessage,
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError),
							zap.String("string", slogbench.TestString),
							zap.Int("status", slogbench.TestInt),
							zap.Duration("duration", slogbench.TestDuration),
							zap.Time("time", slogbench.TestTime),
							zap.Any("error", slogbench.TestError))
					},
				},
			} {
				b.Run(call.name, func(b *testing.B) {
					b.ReportAllocs()
					b.RunParallel(func(pb *testing.PB) {
						for pb.Next() {
							call.f()
						}
					})
				})
			}
		})
	}
}
