// Code generated by "go generate gonum.org/v1/gonum/unit; DO NOT EDIT.

// Copyright ©2019 The Gonum 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 unit

import (
	"fmt"
	"testing"
)

func TestTemperature(t *testing.T) {
	t.Parallel()
	for _, value := range []float64{-1, 0, 1} {
		var got Temperature
		err := got.From(Temperature(value).Unit())
		if err != nil {
			t.Errorf("unexpected error for %T conversion: %v", got, err)
		}
		if got != Temperature(value) {
			t.Errorf("unexpected result from round trip of %T(%v): got: %v want: %v", got, float64(value), got, value)
		}
		if got != got.Temperature() {
			t.Errorf("unexpected result from self interface method call: got: %#v want: %#v", got, value)
		}
		err = got.From(ether(1))
		if err == nil {
			t.Errorf("expected error for ether to %T conversion", got)
		}
	}
}

func TestTemperatureFormat(t *testing.T) {
	t.Parallel()
	for _, test := range []struct {
		value  Temperature
		format string
		want   string
	}{
		{1.23456789, "%v", "1.23456789 K"},
		{1.23456789, "%.1v", "1 K"},
		{1.23456789, "%20.1v", "                 1 K"},
		{1.23456789, "%20v", "        1.23456789 K"},
		{1.23456789, "%1v", "1.23456789 K"},
		{1.23456789, "%#v", "unit.Temperature(1.23456789)"},
		{1.23456789, "%s", "%!s(unit.Temperature=1.23456789 K)"},
	} {
		got := fmt.Sprintf(test.format, test.value)
		if got != test.want {
			t.Errorf("Format %q %v: got: %q want: %q", test.format, float64(test.value), got, test.want)
		}
	}
}
