// 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/benchmarking/results_schema.md
// 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.
	Count = "count"
)

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