/*
 *  @Author : huangzj
 *  @Time : 2020/12/16 9:32
 *  @Description：
 */

package snowflake

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

var wg sync.WaitGroup

func TestSnowflake(t *testing.T) {
	w := NewWorker(5, 5)

	ch := make(chan uint64, 10000)
	count := 10000
	wg.Add(count)
	defer close(ch)
	//并发 count个goroutine 进行 snowFlake ID 生成
	for i := 0; i < count; i++ {
		go func() {
			defer wg.Done()
			id, _ := w.NextID()
			ch <- id
		}()
	}
	wg.Wait()
	m := make(map[uint64]int)
	for i := 0; i < count; i++ {
		id := <-ch
		// 如果 map 中存在为 id 的 key, 说明生成的 snowflake ID 有重复
		_, ok := m[id]
		if ok {
			fmt.Printf("repeat id %d\n", id)
			return
		} else {
			fmt.Printf("id: %d", id)
		}
		// 将 id 作为 key 存入 map
		m[id] = i
	}
	// 成功生成 snowflake ID
	fmt.Println("All", len(m), "snowflake ID Get successed!")
}
