123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- // 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) {
- t.Skip("skipping flaky test; see golang.org/issue/17538")
- 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()
- }
- }
|