// Copyright 2020 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.

// +build !race

package event_test

import (
	"context"
	"testing"

	"golang.org/x/exp/event"
)

func TestCommon(t *testing.T) {
	h := &catchHandler{}
	ctx := event.WithExporter(context.Background(), event.NewExporter(h))

	const simple = "simple message"
	const trace = "a trace"

	event.To(ctx).Log(simple)
	checkFind(t, h, "Log", event.Message, true, simple)
	checkFind(t, h, "Log", event.Trace, false, "")

	event.To(ctx).Metric()
	checkFind(t, h, "Metric", event.Message, false, "")
	checkFind(t, h, "Metric", event.Trace, false, "")

	event.To(ctx).Annotate()
	checkFind(t, h, "Annotate", event.Message, false, "")
	checkFind(t, h, "Annotate", event.Trace, false, "")

	_, end := event.To(ctx).Start(trace)
	checkFind(t, h, "Start", event.Message, false, "")
	checkFind(t, h, "Start", event.Trace, true, trace)

	end()
	checkFind(t, h, "End", event.Message, false, "")
	checkFind(t, h, "End", event.Trace, false, "")
}

type finder interface {
	Find(*event.Event) (string, bool)
}

func checkFind(t *testing.T, h *catchHandler, method string, key finder, match bool, text string) {
	m, ok := key.Find(&h.ev)
	if ok && !match {
		t.Errorf("%s produced an event with a %v", method, key)
	}
	if !ok && match {
		t.Errorf("%s did not produce an event with a %v", method, key)
	}
	if m != text {
		t.Errorf("Expected event with %v %q from %s got %q", key, text, method, m)
	}
}

type catchHandler struct {
	ev event.Event
}

func (h *catchHandler) Log(ctx context.Context, ev *event.Event) {
	h.event(ctx, ev)
}

func (h *catchHandler) Metric(ctx context.Context, ev *event.Event) {
	h.event(ctx, ev)
}

func (h *catchHandler) Annotate(ctx context.Context, ev *event.Event) {
	h.event(ctx, ev)
}

func (h *catchHandler) Start(ctx context.Context, ev *event.Event) context.Context {
	h.event(ctx, ev)
	return ctx
}

func (h *catchHandler) End(ctx context.Context, ev *event.Event) {
	h.event(ctx, ev)
}

func (h *catchHandler) event(ctx context.Context, ev *event.Event) {
	h.ev = *ev
	h.ev.Labels = make([]event.Label, len(ev.Labels))
	copy(h.ev.Labels, ev.Labels)
}
