package timecache

import (
	"testing"
	"time"
)

func TestTime(t *testing.T) {
	t.Parallel()
	tc := (&Cache{}).Now()
	if tc.IsZero() {
		t.Fatalf("time is zero")
	}
}

func TestRounding(t *testing.T) {
	t.Parallel()
	ti := New(Options{}.Round(time.Minute * 5)).Now()

	if ti.Minute()%5 != 0 {
		t.Fatalf("time is not a 5 multiple")
	}
}

func TestResolution(t *testing.T) {
	t.Parallel()
	const magicNumber = 3
	const rounds = 700
	ti := New(Options{}.Round(time.Millisecond * magicNumber))

	unique := 0
	old := ti.Now().UnixMilli()
	for i := 0; i < rounds; i++ {
		new := ti.Now().UnixMilli()
		if new > old {
			unique++
			old = new
		}

		if div := new % magicNumber; div != 0 {
			t.Fatalf("not a multiple of %d: %d", magicNumber, div)
		}
		time.Sleep(time.Millisecond * 1)
	}

	if unique < rounds/magicNumber-1 {
		t.Fatalf("not enough resolution rounds %d", unique)
	}
}
