// 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 (
	"reflect"
	"testing"

	"fuchsia.googlesource.com/testing/catapult"
	"github.com/kr/pretty"
)

func TestAddHistogram(t *testing.T) {
	t.Run("When the HistogramSet is empty", func(t *testing.T) {
		histogramSet := catapult.HistogramSet{}
		histogram := catapult.Histogram{Name: "test_histogram"}

		expectedJSON := []interface{}{histogram}
		histogramSet.AddHistogram(histogram)

		if !reflect.DeepEqual(histogramSet.ToJSON(), expectedJSON) {
			t.Errorf("Invalid HistogramSet. Got %+v. Expected %+v",
				pretty.Sprint(histogramSet.ToJSON()),
				pretty.Sprint(expectedJSON),
			)
		}
	})

	t.Run("When the HistogramSet contains other Histograms", func(t *testing.T) {
		histogramSet := catapult.HistogramSet{}
		histogram1 := catapult.Histogram{Name: "test_histogram_1"}
		histogram2 := catapult.Histogram{Name: "test_histogram_2"}

		expectedJSON := []interface{}{histogram1, histogram2}

		histogramSet.AddHistogram(histogram1)
		histogramSet.AddHistogram(histogram2)
		if !reflect.DeepEqual(histogramSet.ToJSON(), expectedJSON) {
			t.Errorf("Invalid HistogramSet. Got %+v. Expected %+v",
				pretty.Sprint(histogramSet.ToJSON()),
				pretty.Sprint(expectedJSON),
			)
		}
	})

	t.Run("When the HistogramSet contains other Diagnostics", func(t *testing.T) {
		histogramSet := catapult.HistogramSet{}
		histogram := catapult.Histogram{
			Name:        "test_histogram",
			Diagnostics: make(map[string]string),
		}
		diagnostic := &catapult.GenericSetDiagnostic{
			Type:   catapult.DiagnosticTypeGenericSet,
			Values: []string{"test_value"},
			GUID:   "test_guid",
		}

		// Should return an error without modifying the HistogramSet
		// because all Histograms must be added before any Diagnotics
		// are added.
		expectedJSON := []interface{}{diagnostic}
		histogramSet.AddSharedDiagnostic("test_diagnostic", diagnostic)
		if histogramSet.AddHistogram(histogram) == nil {
			t.Errorf("expected an error when adding a Histogram after a Diagnostic")
		}

		if !reflect.DeepEqual(histogramSet.ToJSON(), expectedJSON) {
			t.Errorf("Invalid HistogramSet. Got %+v. Expected %+v",
				pretty.Sprint(histogramSet.ToJSON()),
				pretty.Sprint(expectedJSON),
			)
		}
	})
}

func TestAddSharedDiagnostic(t *testing.T) {
	t.Run("When there are no Histograms in the set", func(t *testing.T) {
		diagnostic := &catapult.GenericSetDiagnostic{
			Type:   catapult.DiagnosticTypeGenericSet,
			GUID:   "test_guid",
			Values: []string{"test_value"},
		}
		histogramSet := catapult.HistogramSet{}
		histogramSet.AddSharedDiagnostic("test_diagnostic", diagnostic)

		expectedJSON := []interface{}{diagnostic}
		if !reflect.DeepEqual(histogramSet.ToJSON(), expectedJSON) {
			t.Errorf("Invalid HistogramSet. Got: %+v\nExpected: %+v",
				pretty.Sprint(histogramSet.ToJSON()),
				pretty.Sprint(expectedJSON))
		}

	})

	t.Run("When there are existing Histograms in the set", func(t *testing.T) {
		diagnostic := &catapult.GenericSetDiagnostic{
			Type:   catapult.DiagnosticTypeGenericSet,
			GUID:   "test_guid",
			Values: []string{"test_value"},
		}

		histogramSet := catapult.HistogramSet{}
		histogramSet.AddHistogram(catapult.Histogram{
			Name:        "test_histogram_1",
			Diagnostics: make(map[string]string),
		})
		histogramSet.AddHistogram(catapult.Histogram{
			Name:        "test_histogram_2",
			Diagnostics: make(map[string]string),
		})
		histogramSet.AddSharedDiagnostic("test_diagnostic", diagnostic)

		// Each histogram in the set should have a reference to the diagnostic in its
		// Diagnostics map.
		expectedJSON := []interface{}{
			catapult.Histogram{
				Name:        "test_histogram_1",
				Diagnostics: map[string]string{"test_diagnostic": "test_guid"},
			},
			catapult.Histogram{
				Name:        "test_histogram_2",
				Diagnostics: map[string]string{"test_diagnostic": "test_guid"},
			},
			diagnostic,
		}

		if !reflect.DeepEqual(histogramSet.ToJSON(), expectedJSON) {
			t.Errorf("Invalid HistogramSet. Got: %+v\nExpected: %+v",
				pretty.Sprint(histogramSet.ToJSON()),
				pretty.Sprint(expectedJSON))
		}
	})
}
