// Copyright 2018 The Fuchsia 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 catapult_test

import (
	"encoding/json"
	"testing"

	"reflect"

	. "fuchsia.googlesource.com/testing/catapult"
	schema "fuchsia.googlesource.com/testing/perf/schema/v1"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/suite"
)

type HistogramTestSuite struct {
	suite.Suite
}

func TestHistogram(t *testing.T) {
	suite.Run(t, new(HistogramTestSuite))
}

// TODO(kjharland): After writing this test the team decided we shouldn't use
//  assertion libraries. Remove `assert.*` references in a later change.
func (s *HistogramTestSuite) TestConvertVariantsToHistograms() {
	var perfTestOutput = []byte(`{
			"variants": [{
				"finish_time": 1234567,
				"variant_desc": "example_variant",
				"boot_args": "example_boot_arg1",
				"fbenchmarks_data": [{
					"label": "example_benchmark_data",
					"unit": "ns",
					"samples": [{
						"label": "example_sample",
						"values": [10, 20, 30, 40, 50]
					}]
				}]
			}]
		}
		`)

	var variants struct {
		Variants []schema.Variant
	}

	json.Unmarshal(perfTestOutput, &variants)
	histograms := ConvertVariantsToHistograms(variants.Variants)

	assert.Equal(s.T(), len(histograms), 1)

	histogram := histograms[0]
	assert.Equal(s.T(), histogram.Name, "example_variant, example_benchmark_data")
	assert.Len(s.T(), histogram.GUID, 36)
	assert.Equal(s.T(), histogram.Unit, "ms_smallerIsBetter")
	assert.Empty(s.T(), histogram.Description)
	assert.Empty(s.T(), histogram.Diagnostics)
	assert.ElementsMatch(s.T(), histogram.SampleValues, []float64{
		1e-5,
		2e-5,
		3e-5,
		4e-5,
		5e-5,
	})
	assert.Equal(s.T(), histogram.MaxNumSampleValues, 5)
	assert.Equal(s.T(), histogram.NumNans, 0)
	assert.ElementsMatch(s.T(), histogram.Running, []float64{
		5,     // count
		5e-05, // max
		0,     // meanlogs
		3.0000000000000004e-05, //mean
		1e-5, // min
		1.5000000000000001e-4, //sum
		2.5e-10,               // variance
	})
}

func (s *HistogramTestSuite) TestHistogram_AddDiagnostic() {
	var testName, testGUID string
	var histogram Histogram

	setUp := func() {
		testName = "test-name"
		testGUID = "test-guid"
		histogram = Histogram{}
		histogram.AddDiagnostic(testName, testGUID)
	}

	s.T().Run("should do nothing if adding an identical name-guid pair", func(t *testing.T) {
		setUp()
		expectedDiagnostics := map[string]string{testName: testGUID}

		histogram.AddDiagnostic(testName, testGUID)

		if !reflect.DeepEqual(expectedDiagnostics, histogram.Diagnostics) {
			s.T().Errorf("invalid diagnostics map. Expected %v. Got %v",
				expectedDiagnostics, histogram.Diagnostics)
		}
	})

	s.T().Run("should add a new name-guid pair when given a unique name.", func(t *testing.T) {
		setUp()
		expectedDiagnostics := map[string]string{
			testName:         testGUID,
			"different-name": testGUID,
		}

		histogram.AddDiagnostic("different-name", testGUID)

		if !reflect.DeepEqual(expectedDiagnostics, histogram.Diagnostics) {
			s.T().Errorf("invalid diagnostics map. Expected %v. Got %v",
				expectedDiagnostics, histogram.Diagnostics)
		}
	})

	s.T().Run("should overwrite an existing name-guid pair", func(t *testing.T) {
		setUp()
		expectedDiagnostics := map[string]string{
			testName: "different-guid",
		}

		histogram.AddDiagnostic(testName, "different-guid")
		if !reflect.DeepEqual(expectedDiagnostics, histogram.Diagnostics) {
			s.T().Errorf("Diagnostics map was modified. Expected %v. Got %v",
				expectedDiagnostics, histogram.Diagnostics)
		}
	})
}
