// 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.

// This file implements the perf test results schema.
//
// See https://fuchsia.dev/fuchsia-src/development/performance/fuchsiaperf_format
// for more details.

package benchmarking

import (
	"encoding/json"
	"io"
)

// Unit represents the units of a test's measured values.
type Unit string

// The set of valid Unit constants.
//
// This should be kept in sync with the list of supported units in the results schema docs
// linked at the top of this file.
const (
	// Time-based units.
	Nanoseconds  Unit = "nanoseconds"
	Milliseconds      = "milliseconds"

	// Size-based units.
	Bytes          = "bytes"
	BytesPerSecond = "bytes/second"

	// Frequency-based units.
	FramesPerSecond = "frames/second"

	// Percentage-based units.
	Percent = "percent"

	// Count-based units.
	CountSmallerIsBetter = "count_smallerIsBetter"
)

// TestCaseResults represents the results for a single test case.
//
// See the link at the top of this file for documentation.
type TestCaseResults struct {
	Label     string    `json:"label"`
	TestSuite string    `json:"test_suite"`
	Unit      Unit      `json:"unit"`
	Values    []float64 `json:"values"`
}

// TestResultsFile represents the results produced by individual benchmarks.
//
// Example usage:
//
//	results := new(TestResultsFile)
//	results.Add(&TestCaseResults{
//	    Label: "test case",
//	    TestSuite: "test suite",
//	    Unit:  Nanoseconds,
//	    Values: []float64{100, 200, 300},
//	})
//
//	_ := results.Encode(outputFile)
type TestResultsFile []*TestCaseResults

// Add a TestCaseResults entry to the file.
func (f *TestResultsFile) Add(results *TestCaseResults) {
	*f = append(*f, results)
}

// Encode writes the results file as JSON to the given io.Writer.
func (f *TestResultsFile) Encode(w io.Writer) error {
	encoder := json.NewEncoder(w)
	encoder.SetIndent("", "  ")
	return encoder.Encode(f)
}

// DecodeTestResultsFile parses a TestResultsFile from the input.
func DecodeTestResultsFile(js []byte) (*TestResultsFile, error) {
	file := new(TestResultsFile)
	err := json.Unmarshal(js, file)
	return file, err
}
