// Copyright 2021 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 event_test

import (
	"testing"
	"time"

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

func TestOfAs(t *testing.T) {
	const i = 3
	var v event.Value
	v = event.Int64Of(i)
	if got := v.Int64(); got != i {
		t.Errorf("got %v, want %v", got, i)
	}
	v = event.Uint64Of(i)
	if got := v.Uint64(); got != i {
		t.Errorf("got %v, want %v", got, i)
	}
	v = event.Float64Of(i)
	if got := v.Float64(); got != i {
		t.Errorf("got %v, want %v", got, i)
	}
	v = event.BoolOf(true)
	if got := v.Bool(); got != true {
		t.Errorf("got %v, want %v", got, true)
	}
	const s = "foo"
	v = event.StringOf(s)
	if got := v.String(); got != s {
		t.Errorf("got %v, want %v", got, s)
	}
	tm := time.Now()
	v = event.ValueOf(tm)
	if got := v.Interface(); got != tm {
		t.Errorf("got %v, want %v", got, tm)
	}
	var vnil event.Value
	if got := vnil.Interface(); got != nil {
		t.Errorf("got %v, want nil", got)
	}
}

func panics(f func()) (b bool) {
	defer func() {
		if x := recover(); x != nil {
			b = true
		}
	}()
	f()
	return false
}

func TestPanics(t *testing.T) {
	for _, test := range []struct {
		name string
		f    func()
	}{
		{"int64", func() { event.Float64Of(3).Int64() }},
		{"uint64", func() { event.Int64Of(3).Uint64() }},
		{"float64", func() { event.Uint64Of(3).Float64() }},
		{"bool", func() { event.Int64Of(3).Bool() }},
	} {
		if !panics(test.f) {
			t.Errorf("%s: got no panic, want panic", test.name)
		}
	}
}

func TestString(t *testing.T) {
	for _, test := range []struct {
		v    event.Value
		want string
	}{
		{event.Int64Of(-3), "-3"},
		{event.Uint64Of(3), "3"},
		{event.Float64Of(.15), "0.15"},
		{event.BoolOf(true), "true"},
		{event.StringOf("foo"), "foo"},
		{event.ValueOf(time.Duration(3 * time.Second)), "3s"},
	} {
		if got := test.v.String(); got != test.want {
			t.Errorf("%#v: got %q, want %q", test.v, got, test.want)
		}
	}
}

func TestNoAlloc(t *testing.T) {
	// Assign values just to make sure the compiler doesn't optimize away the statements.
	var (
		i int64
		u uint64
		f float64
		b bool
		s string
		x interface{}
		p = &i
	)
	a := int(testing.AllocsPerRun(5, func() {
		i = event.Int64Of(1).Int64()
		u = event.Uint64Of(1).Uint64()
		f = event.Float64Of(1).Float64()
		b = event.BoolOf(true).Bool()
		s = event.StringOf("foo").String()
		x = event.ValueOf(p).Interface()
	}))
	if a != 0 {
		t.Errorf("got %d allocs, want zero", a)
	}
	_ = u
	_ = f
	_ = b
	_ = s
	_ = x
}
