// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package histogram_test

import (
	"testing"

	"v.io/x/ref/lib/stats/histogram"
)

func TestHistogram(t *testing.T) {
	// This creates a histogram with the following buckets:
	//  [1, 2)
	//  [2, 4)
	//  [4, 8)
	//  [8, 16)
	//  [16, Inf)
	opts := histogram.Options{
		NumBuckets:         5,
		GrowthFactor:       1.0,
		SmallestBucketSize: 1.0,
		MinValue:           1.0,
	}
	h := histogram.New(opts)
	// Trying to add a value that's less than MinValue, should return an error.
	if err := h.Add(0); err == nil {
		t.Errorf("unexpected return value for Add(0.0). Want != nil, got nil")
	}
	// Adding good values. Expect no errors.
	for i := 1; i <= 50; i++ {
		if err := h.Add(int64(i)); err != nil {
			t.Errorf("unexpected return value for Add(%d). Want nil, got %v", i, err)
		}
	}
	expectedCount := []int64{1, 2, 4, 8, 35}
	buckets := h.Value().Buckets
	for i := 0; i < opts.NumBuckets; i++ {
		if buckets[i].Count != expectedCount[i] {
			t.Errorf("unexpected count for bucket[%d]. Want %d, got %v", i, expectedCount[i], buckets[i].Count)
		}
	}

	v := h.Value()
	if expected, got := int64(50), v.Count; got != expected {
		t.Errorf("unexpected count in histogram value. Want %d, got %v", expected, got)
	}
	if expected, got := int64(50*(1+50)/2), v.Sum; got != expected {
		t.Errorf("unexpected sum in histogram value. Want %d, got %v", expected, got)
	}
	if expected, got := int64(1), v.Min; got != expected {
		t.Errorf("unexpected min in histogram value. Want %d, got %v", expected, got)
	}
	if expected, got := int64(50), v.Max; got != expected {
		t.Errorf("unexpected max in histogram value. Want %d, got %v", expected, got)
	}
}

func BenchmarkHistogram(b *testing.B) {
	opts := histogram.Options{
		NumBuckets:         30,
		GrowthFactor:       1.0,
		SmallestBucketSize: 1.0,
		MinValue:           1.0,
	}
	h := histogram.New(opts)

	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		h.Add(int64(i))
	}
}
