// Copyright 2022 The LevelDB-Go and Pebble 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 base

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"
)

func TestThroughputMetric(t *testing.T) {
	m1 := ThroughputMetric{
		Bytes:        10,
		WorkDuration: time.Millisecond,
		IdleDuration: 9 * time.Millisecond,
	}
	var m2 ThroughputMetric
	m2.Merge(m1)
	require.Equal(t, m1, m2)
	m2.Merge(m1)
	doubleM1 := ThroughputMetric{
		Bytes:        2 * m1.Bytes,
		WorkDuration: 2 * m1.WorkDuration,
		IdleDuration: 2 * m1.IdleDuration,
	}
	require.Equal(t, doubleM1, m2)
	require.EqualValues(t, 10*100, m1.Rate())
	require.EqualValues(t, 10*1000, m1.PeakRate())
}

func TestThroughputMetric_Subtract(t *testing.T) {
	m1 := ThroughputMetric{
		Bytes:        10,
		WorkDuration: time.Millisecond,
		IdleDuration: 9 * time.Millisecond,
	}
	m2 := ThroughputMetric{
		Bytes:        100,
		WorkDuration: time.Millisecond,
		IdleDuration: 90 * time.Millisecond,
	}

	m2.Subtract(m1)
	require.Equal(t, int64(90), m2.Bytes)
	require.Equal(t, 0*time.Millisecond, m2.WorkDuration)
	require.Equal(t, 81*time.Millisecond, m2.IdleDuration)
}

func TestGaugeSampleMetric(t *testing.T) {
	g1 := GaugeSampleMetric{}
	g1.AddSample(10)
	g1.AddSample(20)
	g2 := GaugeSampleMetric{}
	g2.Merge(g1)
	g2.AddSample(60)
	require.EqualValues(t, 30, g2.Mean())
	require.EqualValues(t, 3, g2.count)
	require.EqualValues(t, 15, g1.Mean())
	require.EqualValues(t, 2, g1.count)
}

func TestGaugeSampleMetricSubtract(t *testing.T) {
	g1 := GaugeSampleMetric{}
	g2 := GaugeSampleMetric{}
	g1.AddSample(10)
	g1.AddSample(20)
	g1.AddSample(0)

	g2.AddSample(10)

	g1.Subtract(g2)

	require.Equal(t, int64(20), g1.sampleSum)
	require.Equal(t, int64(2), g1.count)

}