package util

import “testing”

// fzf events const (

EvtReadNew EventType = iota
EvtReadFin
EvtSearchNew
EvtSearchProgress
EvtSearchFin
EvtClose

)

func TestEventBox(t *testing.T) {

eb := NewEventBox()

// Wait should return immediately
ch := make(chan bool)

go func() {
        eb.Set(EvtReadNew, 10)
        ch <- true
        <-ch
        eb.Set(EvtSearchNew, 10)
        eb.Set(EvtSearchNew, 15)
        eb.Set(EvtSearchNew, 20)
        eb.Set(EvtSearchProgress, 30)
        ch <- true
        <-ch
        eb.Set(EvtSearchFin, 40)
        ch <- true
        <-ch
}()

count := 0
sum := 0
looping := true
for looping {
        <-ch
        eb.Wait(func(events *Events) {
                for _, value := range *events {
                        switch val := value.(type) {
                        case int:
                                sum += val
                                looping = sum < 100
                        }
                }
                events.Clear()
        })
        ch <- true
        count++
}

if count != 3 {
        t.Error("Invalid number of events", count)
}
if sum != 100 {
        t.Error("Invalid sum", sum)
}

}