// Copyright 2015 The Go 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 currency

import (
	"testing"

	"golang.org/x/text/language"
	"golang.org/x/text/message"
)

var (
	en    = language.English
	fr    = language.French
	en_US = language.AmericanEnglish
	en_AU = language.MustParse("en-AU")
	und   = language.Und
)

func TestFormatting(t *testing.T) {
	testCases := []struct {
		tag    language.Tag
		value  interface{}
		format Formatter
		want   string
	}{
		0: {en, USD.Value(0.1), nil, "USD 0.10"},
		1: {en, XPT.Value(1.0), Symbol, "XPT 1.00"},

		2: {en, USD.Value(2.0), ISO, "USD 2.00"},
		3: {und, USD.Value(3.0), Symbol, "US$ 3.00"},
		4: {en, USD.Value(4.0), Symbol, "$ 4.00"},

		5: {en, USD.Value(5.20), NarrowSymbol, "$ 5.20"},
		6: {en, AUD.Value(6.20), Symbol, "A$ 6.20"},

		7: {en_AU, AUD.Value(7.20), Symbol, "$ 7.20"},
		8: {en_AU, USD.Value(8.20), Symbol, "US$ 8.20"},

		9:  {en, 9.0, Symbol.Default(EUR), "€ 9.00"},
		10: {en, 10.123, Symbol.Default(KRW), "₩ 10"},
		11: {fr, 11.52, Symbol.Default(TWD), "TWD 11.52"},
		12: {en, 12.123, Symbol.Default(czk), "CZK 12.12"},
		13: {en, 13.123, Symbol.Default(czk).Kind(Cash), "CZK 13"},
		14: {en, 14.12345, ISO.Default(MustParseISO("CLF")), "CLF 14.1235"},
		15: {en, USD.Value(15.00), ISO.Default(TWD), "USD 15.00"},

		// TODO: support integers as well.

		16: {en, USD, nil, "USD"},
		17: {en, USD, ISO, "USD"},
		18: {en, USD, Symbol, "$"},
		19: {en_AU, USD, Symbol, "US$"},
		20: {en_AU, USD, NarrowSymbol, "$"},
	}
	for i, tc := range testCases {
		p := message.NewPrinter(tc.tag)
		v := tc.value
		if tc.format != nil {
			v = tc.format(v)
		}
		if got := p.Sprint(v); got != tc.want {
			t.Errorf("%d: got %q; want %q", i, got, tc.want)
		}
	}
}
