// Copyright 2017 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 number import ( "strings" "testing" "golang.org/x/text/language" "golang.org/x/text/message" ) func TestFormatter(t *testing.T) { overrides := map[string]string{ "en": "*e#######0", "nl": "*n#######0", } testCases := []struct { desc string tag string f Formatter want string }{{ desc: "decimal", f: Decimal(3), want: "3", }, { desc: "decimal fraction", f: Decimal(0.123), want: "0.123", }, { desc: "separators", f: Decimal(1234.567), want: "1,234.567", }, { desc: "no separators", f: Decimal(1234.567, NoSeparator()), want: "1234.567", }, { desc: "max integer", f: Decimal(1973, MaxIntegerDigits(2)), want: "73", }, { desc: "max integer overflow", f: Decimal(1973, MaxIntegerDigits(1000)), want: "1,973", }, { desc: "min integer", f: Decimal(12, MinIntegerDigits(5)), want: "00,012", }, { desc: "max fraction zero", f: Decimal(0.12345, MaxFractionDigits(0)), want: "0", }, { desc: "max fraction 2", f: Decimal(0.12, MaxFractionDigits(2)), want: "0.12", }, { desc: "min fraction 2", f: Decimal(0.12, MaxFractionDigits(2)), want: "0.12", }, { desc: "max fraction overflow", f: Decimal(0.125, MaxFractionDigits(1e6)), want: "0.125", }, { desc: "min integer overflow", f: Decimal(0, MinIntegerDigits(1e6)), want: strings.Repeat("000,", 255/3-1) + "000", }, { desc: "min fraction overflow", f: Decimal(0, MinFractionDigits(1e6)), want: "0." + strings.Repeat("0", 255), // TODO: fraction separators }, { desc: "format width", f: Decimal(123, FormatWidth(10)), want: " 123", }, { desc: "format width pad option before", f: Decimal(123, Pad('*'), FormatWidth(10)), want: "*******123", }, { desc: "format width pad option after", f: Decimal(123, FormatWidth(10), Pad('*')), want: "*******123", }, { desc: "format width illegal", f: Decimal(123, FormatWidth(-1)), want: "123", }, { desc: "increment", f: Decimal(10.33, IncrementString("0.5")), want: "10.5", }, { desc: "increment", f: Decimal(10, IncrementString("ppp")), want: "10", }, { desc: "increment and scale", f: Decimal(10.33, IncrementString("0.5"), Scale(2)), want: "10.50", }, { desc: "pattern overrides en", tag: "en", f: Decimal(101, PatternOverrides(overrides)), want: "eeeee101", }, { desc: "pattern overrides nl", tag: "nl", f: Decimal(101, PatternOverrides(overrides)), want: "nnnnn101", }, { desc: "pattern overrides de", tag: "de", f: Decimal(101, PatternOverrides(overrides)), want: "101", }, { desc: "language selection", tag: "bn", f: Decimal(123456.78, Scale(2)), want: "১,২৩,৪৫৬.৭৮", }, { desc: "scale", f: Decimal(1234.567, Scale(2)), want: "1,234.57", }, { desc: "scientific", f: Scientific(3.00), want: "3\u202f×\u202f10⁰", }, { desc: "scientific", f: Scientific(1234), want: "1.234\u202f×\u202f10³", }, { desc: "scientific", f: Scientific(1234, Scale(2)), want: "1.23\u202f×\u202f10³", }, { desc: "engineering", f: Engineering(12345), want: "12.345\u202f×\u202f10³", }, { desc: "engineering scale", f: Engineering(12345, Scale(2)), want: "12.34\u202f×\u202f10³", }, { desc: "engineering precision(4)", f: Engineering(12345, Precision(4)), want: "12.34\u202f×\u202f10³", }, { desc: "engineering precision(2)", f: Engineering(1234.5, Precision(2)), want: "1.2\u202f×\u202f10³", }, { desc: "percent", f: Percent(0.12), want: "12%", }, { desc: "permille", f: PerMille(0.123), want: "123‰", }, { desc: "percent rounding", f: PerMille(0.12345), want: "123‰", }, { desc: "percent fraction", f: PerMille(0.12345, Scale(2)), want: "123.45‰", }, { desc: "percent fraction", f: PerMille(0.12344, Scale(1)), want: "123.4‰", }} for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { tag := language.Und if tc.tag != "" { tag = language.MustParse(tc.tag) } got := message.NewPrinter(tag).Sprint(tc.f) if got != tc.want { t.Errorf("got %q; want %q", got, tc.want) } }) } }