172 lines
4.1 KiB
Go
172 lines
4.1 KiB
Go
|
// 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 (
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
|
||
|
"golang.org/x/text/internal/testtext"
|
||
|
"golang.org/x/text/language"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
cup = MustParseISO("CUP")
|
||
|
czk = MustParseISO("CZK")
|
||
|
xcd = MustParseISO("XCD")
|
||
|
zwr = MustParseISO("ZWR")
|
||
|
)
|
||
|
|
||
|
func TestParseISO(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
in string
|
||
|
out Unit
|
||
|
ok bool
|
||
|
}{
|
||
|
{"USD", USD, true},
|
||
|
{"xxx", XXX, true},
|
||
|
{"xts", XTS, true},
|
||
|
{"XX", XXX, false},
|
||
|
{"XXXX", XXX, false},
|
||
|
{"", XXX, false}, // not well-formed
|
||
|
{"UUU", XXX, false}, // unknown
|
||
|
{"\u22A9", XXX, false}, // non-ASCII, printable
|
||
|
|
||
|
{"aaa", XXX, false},
|
||
|
{"zzz", XXX, false},
|
||
|
{"000", XXX, false},
|
||
|
{"999", XXX, false},
|
||
|
{"---", XXX, false},
|
||
|
{"\x00\x00\x00", XXX, false},
|
||
|
{"\xff\xff\xff", XXX, false},
|
||
|
}
|
||
|
for i, tc := range testCases {
|
||
|
if x, err := ParseISO(tc.in); x != tc.out || err == nil != tc.ok {
|
||
|
t.Errorf("%d:%s: was %s, %v; want %s, %v", i, tc.in, x, err == nil, tc.out, tc.ok)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFromRegion(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
region string
|
||
|
currency Unit
|
||
|
ok bool
|
||
|
}{
|
||
|
{"NL", EUR, true},
|
||
|
{"BE", EUR, true},
|
||
|
{"AG", xcd, true},
|
||
|
{"CH", CHF, true},
|
||
|
{"CU", cup, true}, // first of multiple
|
||
|
{"DG", USD, true}, // does not have M49 code
|
||
|
{"150", XXX, false}, // implicit false
|
||
|
{"CP", XXX, false}, // explicit false in CLDR
|
||
|
{"CS", XXX, false}, // all expired
|
||
|
{"ZZ", XXX, false}, // none match
|
||
|
}
|
||
|
for _, tc := range testCases {
|
||
|
cur, ok := FromRegion(language.MustParseRegion(tc.region))
|
||
|
if cur != tc.currency || ok != tc.ok {
|
||
|
t.Errorf("%s: got %v, %v; want %v, %v", tc.region, cur, ok, tc.currency, tc.ok)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFromTag(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
tag string
|
||
|
currency Unit
|
||
|
conf language.Confidence
|
||
|
}{
|
||
|
{"nl", EUR, language.Low}, // nl also spoken outside Euro land.
|
||
|
{"nl-BE", EUR, language.Exact}, // region is known
|
||
|
{"pt", BRL, language.Low},
|
||
|
{"en", USD, language.Low},
|
||
|
{"en-u-cu-eur", EUR, language.Exact},
|
||
|
{"tlh", XXX, language.No}, // Klingon has no country.
|
||
|
{"es-419", XXX, language.No},
|
||
|
{"und", USD, language.Low},
|
||
|
}
|
||
|
for _, tc := range testCases {
|
||
|
cur, conf := FromTag(language.MustParse(tc.tag))
|
||
|
if cur != tc.currency || conf != tc.conf {
|
||
|
t.Errorf("%s: got %v, %v; want %v, %v", tc.tag, cur, conf, tc.currency, tc.conf)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestTable(t *testing.T) {
|
||
|
for i := 4; i < len(currency); i += 4 {
|
||
|
if a, b := currency[i-4:i-1], currency[i:i+3]; a >= b {
|
||
|
t.Errorf("currency unordered at element %d: %s >= %s", i, a, b)
|
||
|
}
|
||
|
}
|
||
|
// First currency has index 1, last is numCurrencies.
|
||
|
if c := currency.Elem(1)[:3]; c != "ADP" {
|
||
|
t.Errorf("first was %q; want ADP", c)
|
||
|
}
|
||
|
if c := currency.Elem(numCurrencies)[:3]; c != "ZWR" {
|
||
|
t.Errorf("last was %q; want ZWR", c)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestKindRounding(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
kind Kind
|
||
|
cur Unit
|
||
|
scale int
|
||
|
inc int
|
||
|
}{
|
||
|
{Standard, USD, 2, 1},
|
||
|
{Standard, CHF, 2, 1},
|
||
|
{Cash, CHF, 2, 5},
|
||
|
{Standard, TWD, 2, 1},
|
||
|
{Cash, TWD, 0, 1},
|
||
|
{Standard, czk, 2, 1},
|
||
|
{Cash, czk, 0, 1},
|
||
|
{Standard, zwr, 2, 1},
|
||
|
{Cash, zwr, 0, 1},
|
||
|
{Standard, KRW, 0, 1},
|
||
|
{Cash, KRW, 0, 1}, // Cash defaults to standard.
|
||
|
}
|
||
|
for i, tc := range testCases {
|
||
|
if scale, inc := tc.kind.Rounding(tc.cur); scale != tc.scale && inc != tc.inc {
|
||
|
t.Errorf("%d: got %d, %d; want %d, %d", i, scale, inc, tc.scale, tc.inc)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const body = `package main
|
||
|
import (
|
||
|
"fmt"
|
||
|
"golang.org/x/text/currency"
|
||
|
)
|
||
|
func main() {
|
||
|
%s
|
||
|
}
|
||
|
`
|
||
|
|
||
|
func TestLinking(t *testing.T) {
|
||
|
base := getSize(t, `fmt.Print(currency.CLDRVersion)`)
|
||
|
symbols := getSize(t, `fmt.Print(currency.Symbol(currency.USD))`)
|
||
|
if d := symbols - base; d < 2*1024 {
|
||
|
t.Errorf("size(symbols)-size(base) was %d; want > 2K", d)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func getSize(t *testing.T, main string) int {
|
||
|
size, err := testtext.CodeSize(fmt.Sprintf(body, main))
|
||
|
if err != nil {
|
||
|
t.Skipf("skipping link size test; binary size could not be determined: %v", err)
|
||
|
}
|
||
|
return size
|
||
|
}
|
||
|
|
||
|
func BenchmarkString(b *testing.B) {
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
USD.String()
|
||
|
}
|
||
|
}
|