// 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 TestCharge(t *testing.T) {
	t.Parallel()
	for _, value := range []float64{-1, 0, 1} {
		var got Charge
		err := got.From(Charge(value).Unit())
		if err != nil {
			t.Errorf("unexpected error for %T conversion: %v", got, err)
		}
		if got != Charge(value) {
			t.Errorf("unexpected result from round trip of %T(%v): got: %v want: %v", got, float64(value), got, value)
		}
		if got != got.Charge() {
			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 TestChargeFormat(t *testing.T) {
	t.Parallel()
	for _, test := range []struct {
		value  Charge
		format string
		want   string
	}{
		{1.23456789, "%v", "1.23456789 C"},
		{1.23456789, "%.1v", "1 C"},
		{1.23456789, "%20.1v", "                 1 C"},
		{1.23456789, "%20v", "        1.23456789 C"},
		{1.23456789, "%1v", "1.23456789 C"},
		{1.23456789, "%#v", "unit.Charge(1.23456789)"},
		{1.23456789, "%s", "%!s(unit.Charge=1.23456789 C)"},
	} {
		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)
		}
	}
}
