...

Source file src/golang.org/x/text/currency/currency_test.go

Documentation: golang.org/x/text/currency

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package currency
     6  
     7  import (
     8  	"fmt"
     9  	"testing"
    10  
    11  	"golang.org/x/text/internal/testtext"
    12  	"golang.org/x/text/language"
    13  )
    14  
    15  var (
    16  	cup = MustParseISO("CUP")
    17  	czk = MustParseISO("CZK")
    18  	xcd = MustParseISO("XCD")
    19  	zwr = MustParseISO("ZWR")
    20  )
    21  
    22  func TestParseISO(t *testing.T) {
    23  	testCases := []struct {
    24  		in  string
    25  		out Unit
    26  		ok  bool
    27  	}{
    28  		{"USD", USD, true},
    29  		{"xxx", XXX, true},
    30  		{"xts", XTS, true},
    31  		{"XX", XXX, false},
    32  		{"XXXX", XXX, false},
    33  		{"", XXX, false},       // not well-formed
    34  		{"UUU", XXX, false},    // unknown
    35  		{"\u22A9", XXX, false}, // non-ASCII, printable
    36  
    37  		{"aaa", XXX, false},
    38  		{"zzz", XXX, false},
    39  		{"000", XXX, false},
    40  		{"999", XXX, false},
    41  		{"---", XXX, false},
    42  		{"\x00\x00\x00", XXX, false},
    43  		{"\xff\xff\xff", XXX, false},
    44  	}
    45  	for i, tc := range testCases {
    46  		if x, err := ParseISO(tc.in); x != tc.out || err == nil != tc.ok {
    47  			t.Errorf("%d:%s: was %s, %v; want %s, %v", i, tc.in, x, err == nil, tc.out, tc.ok)
    48  		}
    49  	}
    50  }
    51  
    52  func TestFromRegion(t *testing.T) {
    53  	testCases := []struct {
    54  		region   string
    55  		currency Unit
    56  		ok       bool
    57  	}{
    58  		{"NL", EUR, true},
    59  		{"BE", EUR, true},
    60  		{"AG", xcd, true},
    61  		{"CH", CHF, true},
    62  		{"CU", cup, true},   // first of multiple
    63  		{"DG", USD, true},   // does not have M49 code
    64  		{"150", XXX, false}, // implicit false
    65  		{"CP", XXX, false},  // explicit false in CLDR
    66  		{"CS", XXX, false},  // all expired
    67  		{"ZZ", XXX, false},  // none match
    68  	}
    69  	for _, tc := range testCases {
    70  		cur, ok := FromRegion(language.MustParseRegion(tc.region))
    71  		if cur != tc.currency || ok != tc.ok {
    72  			t.Errorf("%s: got %v, %v; want %v, %v", tc.region, cur, ok, tc.currency, tc.ok)
    73  		}
    74  	}
    75  }
    76  
    77  func TestFromTag(t *testing.T) {
    78  	testCases := []struct {
    79  		tag      string
    80  		currency Unit
    81  		conf     language.Confidence
    82  	}{
    83  		{"nl", EUR, language.Low},      // nl also spoken outside Euro land.
    84  		{"nl-BE", EUR, language.Exact}, // region is known
    85  		{"pt", BRL, language.Low},
    86  		{"en", USD, language.Low},
    87  		{"en-u-cu-eur", EUR, language.Exact},
    88  		{"tlh", XXX, language.No}, // Klingon has no country.
    89  		{"es-419", XXX, language.No},
    90  		{"und", USD, language.Low},
    91  	}
    92  	for _, tc := range testCases {
    93  		cur, conf := FromTag(language.MustParse(tc.tag))
    94  		if cur != tc.currency || conf != tc.conf {
    95  			t.Errorf("%s: got %v, %v; want %v, %v", tc.tag, cur, conf, tc.currency, tc.conf)
    96  		}
    97  	}
    98  }
    99  
   100  func TestTable(t *testing.T) {
   101  	for i := 4; i < len(currency); i += 4 {
   102  		if a, b := currency[i-4:i-1], currency[i:i+3]; a >= b {
   103  			t.Errorf("currency unordered at element %d: %s >= %s", i, a, b)
   104  		}
   105  	}
   106  	// First currency has index 1, last is numCurrencies.
   107  	if c := currency.Elem(1)[:3]; c != "ADP" {
   108  		t.Errorf("first was %q; want ADP", c)
   109  	}
   110  	if c := currency.Elem(numCurrencies)[:3]; c != "ZWR" {
   111  		t.Errorf("last was %q; want ZWR", c)
   112  	}
   113  }
   114  
   115  func TestKindRounding(t *testing.T) {
   116  	testCases := []struct {
   117  		kind  Kind
   118  		cur   Unit
   119  		scale int
   120  		inc   int
   121  	}{
   122  		{Standard, USD, 2, 1},
   123  		{Standard, CHF, 2, 1},
   124  		{Cash, CHF, 2, 5},
   125  		{Standard, TWD, 2, 1},
   126  		{Cash, TWD, 0, 1},
   127  		{Standard, czk, 2, 1},
   128  		{Cash, czk, 0, 1},
   129  		{Standard, zwr, 2, 1},
   130  		{Cash, zwr, 0, 1},
   131  		{Standard, KRW, 0, 1},
   132  		{Cash, KRW, 0, 1}, // Cash defaults to standard.
   133  	}
   134  	for i, tc := range testCases {
   135  		if scale, inc := tc.kind.Rounding(tc.cur); scale != tc.scale && inc != tc.inc {
   136  			t.Errorf("%d: got %d, %d; want %d, %d", i, scale, inc, tc.scale, tc.inc)
   137  		}
   138  	}
   139  }
   140  
   141  const body = `package main
   142  import (
   143  	"fmt"
   144  	"golang.org/x/text/currency"
   145  )
   146  func main() {
   147  	%s
   148  }
   149  `
   150  
   151  func TestLinking(t *testing.T) {
   152  	t.Skip("skipping flaky test; see golang.org/issue/17538")
   153  	base := getSize(t, `fmt.Print(currency.CLDRVersion)`)
   154  	symbols := getSize(t, `fmt.Print(currency.Symbol(currency.USD))`)
   155  	if d := symbols - base; d < 2*1024 {
   156  		t.Errorf("size(symbols)-size(base) was %d; want > 2K", d)
   157  	}
   158  }
   159  
   160  func getSize(t *testing.T, main string) int {
   161  	size, err := testtext.CodeSize(fmt.Sprintf(body, main))
   162  	if err != nil {
   163  		t.Skipf("skipping link size test; binary size could not be determined: %v", err)
   164  	}
   165  	return size
   166  }
   167  
   168  func BenchmarkString(b *testing.B) {
   169  	for i := 0; i < b.N; i++ {
   170  		USD.String()
   171  	}
   172  }
   173  

View as plain text