package oonimkall

import "testing"

func TestTaskEmitterUsingChan(t *testing.T) {
	t.Run("ordinary emit", func(t *testing.T) {
		out := make(chan *event)
		emitter := newTaskEmitterUsingChan(out)
		go func() {
			emitter.Emit("foo", nil)
		}()
		ev := <-out
		if ev.Key != "foo" {
			t.Fatal("invalid key")
		}
		if ev.Value != nil {
			t.Fatal("invalid value")
		}
	})

	t.Run("emit after close", func(t *testing.T) {
		out := make(chan *event)
		emitter := newTaskEmitterUsingChan(out)
		emitter.Close()
		done := make(chan interface{})
		go func() {
			emitter.Emit("foo", nil)
			close(done)
		}()
		<-done
		select {
		case <-out:
			t.Fatal("should not receive event here")
		default:
		}
	})

	t.Run("close is idempotent", func(t *testing.T) {
		out := make(chan *event)
		emitter := newTaskEmitterUsingChan(out)
		for i := 0; i < 4; i++ {
			emitter.Close()
		}
	})
}

func TestTaskEmitterWrapper(t *testing.T) {
	t.Run("emit failureStartup", func(t *testing.T) {
		expect := "antani"
		collector := &CollectorTaskEmitter{}
		emitter := &taskEmitterWrapper{collector}
		emitter.EmitFailureStartup(expect)
		events := collector.Collect()
		if len(events) != 1 {
			t.Fatal("invalid number of events")
		}
		ev := events[0]
		if ev.Key != eventTypeFailureStartup {
			t.Fatal("invalid key")
		}
		value := ev.Value.(eventFailure)
		if value.Failure != expect {
			t.Fatal("invalid failure value")
		}
	})

	t.Run("emit failureGeneric", func(t *testing.T) {
		expectName := "mascetti"
		expectFailure := "antani"
		collector := &CollectorTaskEmitter{}
		emitter := &taskEmitterWrapper{collector}
		emitter.EmitFailureGeneric(expectName, expectFailure)
		events := collector.Collect()
		if len(events) != 1 {
			t.Fatal("invalid number of events")
		}
		ev := events[0]
		if ev.Key != expectName {
			t.Fatal("invalid key")
		}
		value := ev.Value.(eventFailure)
		if value.Failure != expectFailure {
			t.Fatal("invalid failure value")
		}
	})

	t.Run("emit statusProgress", func(t *testing.T) {
		percentage := 0.66
		message := "mascetti"
		collector := &CollectorTaskEmitter{}
		emitter := &taskEmitterWrapper{collector}
		emitter.EmitStatusProgress(percentage, message)
		events := collector.Collect()
		if len(events) != 1 {
			t.Fatal("invalid number of events")
		}
		ev := events[0]
		if ev.Key != eventTypeStatusProgress {
			t.Fatal("invalid key")
		}
		value := ev.Value.(eventStatusProgress)
		if value.Percentage != percentage {
			t.Fatal("invalid percentage value")
		}
		if value.Message != message {
			t.Fatal("invalid message value")
		}
	})
}