package utils

import (
	"fmt"
	"sync"
	"testing"
	"time"
)

func TestNextID(t *testing.T) {
	idSize := 100000
	var wg sync.WaitGroup
	wg.Add(idSize)
	m := make(map[Long]int)

	startTime := time.Now().UnixNano()
	q := make(chan Long, 0)
	go func(m map[Long]int) {
		for {
			select {
			case id := <-q:
				if _, ok := m[id]; ok {
					m[id]++
				} else {
					m[id] = 1
				}
				wg.Done()
			}
		}
	}(m)

	for i := 0; i < idSize; i++ {
		go func() {
			q <- NextId()
		}()
	}

	wg.Wait()
	endTime := time.Now().UnixNano()
	usedTime := time.Duration(endTime - startTime)
	fmt.Printf("Id size: %d\nTotal seconds:%d\nAvg nanos per id:%d\n", len(m), usedTime/time.Second, int64(usedTime)/int64(idSize))

	badSize := 0
	for _, v := range m {
		if v > 1 {
			badSize++
		}
	}

	if badSize > 0 {
		t.Fail()
	}
}