package main

import (
	"sync"
	"testing"
)

func TestFence(t *testing.T) {
	r := Resource{}
	if r.Write(42, "B") != nil || r.Write(41, "A") == nil || r.Value != "B" {
		t.Fatal(r.Fence, r.Value)
	}
	if r.Write(42, "B2") != nil {
		t.Fatal("same owner rejected")
	}
}
func TestIDs(t *testing.T) {
	s := Snowflake{last: -1, node: 1}
	seen := map[uint64]bool{}
	for range 4096 {
		id, e := s.Next(100)
		if e != nil || seen[id] {
			t.Fatal(id, e)
		}
		seen[id] = true
	}
	if _, e := s.Next(100); e == nil {
		t.Fatal("sequence overflow")
	}
	if _, e := s.Next(99); e == nil {
		t.Fatal("clock rollback")
	}
	if _, e := s.Next(101); e != nil {
		t.Fatal(e)
	}
}
func TestJobReplay(t *testing.T) {
	j := JobLedger{done: map[string]bool{}}
	var wg sync.WaitGroup
	for range 20 {
		wg.Add(1)
		go func() { defer wg.Done(); j.Run("job@slot") }()
	}
	wg.Wait()
	if j.Effects != 1 {
		t.Fatal(j.Effects)
	}
}
