package bits

import (
	"math/big"
	"testing"
)

func TestMaxRange(t *testing.T) {
	start := FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
	end := FromHexP("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
	r := MaxRange()

	if !r.Start.Equals(start) {
		t.Error("max range does not start at the beginning")
	}
	if !r.End.Equals(end) {
		t.Error("max range does not end at the end")
	}
}

func TestRange_IntervalP(t *testing.T) {
	max := MaxRange()

	numIntervals := 97
	expectedAvg := (&big.Int{}).Div(max.IntervalSize(), big.NewInt(int64(numIntervals)))
	maxDiff := big.NewInt(int64(numIntervals))

	var lastEnd Bitmap

	for i := 1; i <= numIntervals; i++ {
		ival := max.IntervalP(i, numIntervals)
		if i == 1 && !ival.Start.Equals(max.Start) {
			t.Error("first interval does not start at 0")
		}
		if i == numIntervals && !ival.End.Equals(max.End) {
			t.Error("last interval does not end at max")
		}
		if i > 1 && !ival.Start.Equals(lastEnd.Add(FromShortHexP("1"))) {
			t.Errorf("interval %d of %d: last end was %s, this start is %s", i, numIntervals, lastEnd.Hex(), ival.Start.Hex())
		}

		if ival.IntervalSize().Cmp((&big.Int{}).Add(expectedAvg, maxDiff)) > 0 || ival.IntervalSize().Cmp((&big.Int{}).Sub(expectedAvg, maxDiff)) < 0 {
			t.Errorf("interval %d of %d: interval size is outside the normal range", i, numIntervals)
		}

		lastEnd = ival.End
	}
}