// 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.googlesource.com/fuchsia/+/master/docs/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"`
	SplitFirst bool      `json:"split_first"`
}

// 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},
//         SplitFirst: true,
//     })
//
//     _ := 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
}
