github.com/go-xe2/third@v1.0.3/golang.org/x/text/internal/number/format_test.go (about)

     1  // Copyright 2017 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 number
     6  
     7  import (
     8  	"fmt"
     9  	"log"
    10  	"testing"
    11  
    12  	"github.com/go-xe2/third/golang.org/x/text/language"
    13  )
    14  
    15  func TestAppendDecimal(t *testing.T) {
    16  	type pairs map[string]string // alternates with decimal input and result
    17  
    18  	testCases := []struct {
    19  		pattern string
    20  		// We want to be able to test some forms of patterns that cannot be
    21  		// represented as a string.
    22  		pat *Pattern
    23  
    24  		test pairs
    25  	}{{
    26  		pattern: "0",
    27  		test: pairs{
    28  			"0":    "0",
    29  			"1":    "1",
    30  			"-1":   "-1",
    31  			".00":  "0",
    32  			"10.":  "10",
    33  			"12":   "12",
    34  			"1.2":  "1",
    35  			"NaN":  "NaN",
    36  			"-Inf": "-∞",
    37  		},
    38  	}, {
    39  		pattern: "+0;+0",
    40  		test: pairs{
    41  			"0":    "+0",
    42  			"1":    "+1",
    43  			"-1":   "-1",
    44  			".00":  "+0",
    45  			"10.":  "+10",
    46  			"12":   "+12",
    47  			"1.2":  "+1",
    48  			"NaN":  "NaN",
    49  			"-Inf": "-∞",
    50  			"Inf":  "+∞",
    51  		},
    52  	}, {
    53  		pattern: "0 +;0 +",
    54  		test: pairs{
    55  			"0":   "0 +",
    56  			"1":   "1 +",
    57  			"-1":  "1 -",
    58  			".00": "0 +",
    59  		},
    60  	}, {
    61  		pattern: "0;0-",
    62  		test: pairs{
    63  			"-1":   "1-",
    64  			"NaN":  "NaN",
    65  			"-Inf": "∞-",
    66  			"Inf":  "∞",
    67  		},
    68  	}, {
    69  		pattern: "0000",
    70  		test: pairs{
    71  			"0":     "0000",
    72  			"1":     "0001",
    73  			"12":    "0012",
    74  			"12345": "12345",
    75  		},
    76  	}, {
    77  		pattern: ".0",
    78  		test: pairs{
    79  			"0":      ".0",
    80  			"1":      "1.0",
    81  			"1.2":    "1.2",
    82  			"1.2345": "1.2",
    83  		},
    84  	}, {
    85  		pattern: "#.0",
    86  		test: pairs{
    87  			"0": ".0",
    88  		},
    89  	}, {
    90  		pattern: "#.0#",
    91  		test: pairs{
    92  			"0": ".0",
    93  			"1": "1.0",
    94  		},
    95  	}, {
    96  		pattern: "0.0#",
    97  		test: pairs{
    98  			"0": "0.0",
    99  		},
   100  	}, {
   101  		pattern: "#0.###",
   102  		test: pairs{
   103  			"0":        "0",
   104  			"1":        "1",
   105  			"1.2":      "1.2",
   106  			"1.2345":   "1.234", // rounding should have been done earlier
   107  			"1234.5":   "1234.5",
   108  			"1234.567": "1234.567",
   109  		},
   110  	}, {
   111  		pattern: "#0.######",
   112  		test: pairs{
   113  			"0":           "0",
   114  			"1234.5678":   "1234.5678",
   115  			"0.123456789": "0.123457",
   116  			"NaN":         "NaN",
   117  			"Inf":         "∞",
   118  		},
   119  
   120  		// Test separators.
   121  	}, {
   122  		pattern: "#,#.00",
   123  		test: pairs{
   124  			"100": "1,0,0.00",
   125  		},
   126  	}, {
   127  		pattern: "#,0.##",
   128  		test: pairs{
   129  			"10": "1,0",
   130  		},
   131  	}, {
   132  		pattern: "#,0",
   133  		test: pairs{
   134  			"10": "1,0",
   135  		},
   136  	}, {
   137  		pattern: "#,##,#.00",
   138  		test: pairs{
   139  			"1000": "1,00,0.00",
   140  		},
   141  	}, {
   142  		pattern: "#,##0.###",
   143  		test: pairs{
   144  			"0":           "0",
   145  			"1234.5678":   "1,234.568",
   146  			"0.123456789": "0.123",
   147  		},
   148  	}, {
   149  		pattern: "#,##,##0.###",
   150  		test: pairs{
   151  			"0":            "0",
   152  			"123456789012": "1,23,45,67,89,012",
   153  			"0.123456789":  "0.123",
   154  		},
   155  	}, {
   156  		pattern: "0,00,000.###",
   157  		test: pairs{
   158  			"0":            "0,00,000",
   159  			"123456789012": "1,23,45,67,89,012",
   160  			"12.3456789":   "0,00,012.346",
   161  			"0.123456789":  "0,00,000.123",
   162  		},
   163  
   164  		// Support for ill-formed patterns.
   165  	}, {
   166  		pattern: "#",
   167  		test: pairs{
   168  			".00": "", // This is the behavior of fmt.
   169  			"0":   "", // This is the behavior of fmt.
   170  			"1":   "1",
   171  			"10.": "10",
   172  		},
   173  	}, {
   174  		pattern: ".#",
   175  		test: pairs{
   176  			"0":      "", // This is the behavior of fmt.
   177  			"1":      "1",
   178  			"1.2":    "1.2",
   179  			"1.2345": "1.2",
   180  		},
   181  	}, {
   182  		pattern: "#,#.##",
   183  		test: pairs{
   184  			"10": "1,0",
   185  		},
   186  	}, {
   187  		pattern: "#,#",
   188  		test: pairs{
   189  			"10": "1,0",
   190  		},
   191  
   192  		// Special patterns
   193  	}, {
   194  		pattern: "#,max_int=2",
   195  		pat: &Pattern{
   196  			RoundingContext: RoundingContext{
   197  				MaxIntegerDigits: 2,
   198  			},
   199  		},
   200  		test: pairs{
   201  			"2017": "17",
   202  		},
   203  	}, {
   204  		pattern: "0,max_int=2",
   205  		pat: &Pattern{
   206  			RoundingContext: RoundingContext{
   207  				MaxIntegerDigits: 2,
   208  				MinIntegerDigits: 1,
   209  			},
   210  		},
   211  		test: pairs{
   212  			"2000": "0",
   213  			"2001": "1",
   214  			"2017": "17",
   215  		},
   216  	}, {
   217  		pattern: "00,max_int=2",
   218  		pat: &Pattern{
   219  			RoundingContext: RoundingContext{
   220  				MaxIntegerDigits: 2,
   221  				MinIntegerDigits: 2,
   222  			},
   223  		},
   224  		test: pairs{
   225  			"2000": "00",
   226  			"2001": "01",
   227  			"2017": "17",
   228  		},
   229  	}, {
   230  		pattern: "@@@@,max_int=2",
   231  		pat: &Pattern{
   232  			RoundingContext: RoundingContext{
   233  				MaxIntegerDigits:     2,
   234  				MinSignificantDigits: 4,
   235  			},
   236  		},
   237  		test: pairs{
   238  			"2017": "17.00",
   239  			"2000": "0.000",
   240  			"2001": "1.000",
   241  		},
   242  
   243  		// Significant digits
   244  	}, {
   245  		pattern: "@@##",
   246  		test: pairs{
   247  			"1":     "1.0",
   248  			"0.1":   "0.10", // leading zero does not count as significant digit
   249  			"123":   "123",
   250  			"1234":  "1234",
   251  			"12345": "12340",
   252  		},
   253  	}, {
   254  		pattern: "@@@@",
   255  		test: pairs{
   256  			"1":     "1.000",
   257  			".1":    "0.1000",
   258  			".001":  "0.001000",
   259  			"123":   "123.0",
   260  			"1234":  "1234",
   261  			"12345": "12340", // rounding down
   262  			"NaN":   "NaN",
   263  			"-Inf":  "-∞",
   264  		},
   265  
   266  		// TODO: rounding
   267  		// {"@@@@": "23456": "23460"}, // rounding up
   268  		// TODO: padding
   269  
   270  		// Scientific and Engineering notation
   271  	}, {
   272  		pattern: "#E0",
   273  		test: pairs{
   274  			"0":       "0\u202f×\u202f10⁰",
   275  			"1":       "1\u202f×\u202f10⁰",
   276  			"123.456": "1\u202f×\u202f10²",
   277  		},
   278  	}, {
   279  		pattern: "#E+0",
   280  		test: pairs{
   281  			"0":      "0\u202f×\u202f10⁺⁰",
   282  			"1000":   "1\u202f×\u202f10⁺³",
   283  			"1E100":  "1\u202f×\u202f10⁺¹⁰⁰",
   284  			"1E-100": "1\u202f×\u202f10⁻¹⁰⁰",
   285  			"NaN":    "NaN",
   286  			"-Inf":   "-∞",
   287  		},
   288  	}, {
   289  		pattern: "##0E00",
   290  		test: pairs{
   291  			"100":     "100\u202f×\u202f10⁰⁰",
   292  			"12345":   "12\u202f×\u202f10⁰³",
   293  			"123.456": "123\u202f×\u202f10⁰⁰",
   294  		},
   295  	}, {
   296  		pattern: "##0.###E00",
   297  		test: pairs{
   298  			"100":      "100\u202f×\u202f10⁰⁰",
   299  			"12345":    "12.345\u202f×\u202f10⁰³",
   300  			"123456":   "123.456\u202f×\u202f10⁰³",
   301  			"123.456":  "123.456\u202f×\u202f10⁰⁰",
   302  			"123.4567": "123.457\u202f×\u202f10⁰⁰",
   303  		},
   304  	}, {
   305  		pattern: "##0.000E00",
   306  		test: pairs{
   307  			"100":     "100.000\u202f×\u202f10⁰⁰",
   308  			"12345":   "12.345\u202f×\u202f10⁰³",
   309  			"123.456": "123.456\u202f×\u202f10⁰⁰",
   310  			"12.3456": "12.346\u202f×\u202f10⁰⁰",
   311  		},
   312  	}, {
   313  		pattern: "@@E0",
   314  		test: pairs{
   315  			"0":    "0.0\u202f×\u202f10⁰",
   316  			"99":   "9.9\u202f×\u202f10¹",
   317  			"0.99": "9.9\u202f×\u202f10⁻¹",
   318  		},
   319  	}, {
   320  		pattern: "@###E00",
   321  		test: pairs{
   322  			"0":     "0\u202f×\u202f10⁰⁰",
   323  			"1":     "1\u202f×\u202f10⁰⁰",
   324  			"11":    "1.1\u202f×\u202f10⁰¹",
   325  			"111":   "1.11\u202f×\u202f10⁰²",
   326  			"1111":  "1.111\u202f×\u202f10⁰³",
   327  			"11111": "1.111\u202f×\u202f10⁰⁴",
   328  			"0.1":   "1\u202f×\u202f10⁻⁰¹",
   329  			"0.11":  "1.1\u202f×\u202f10⁻⁰¹",
   330  			"0.001": "1\u202f×\u202f10⁻⁰³",
   331  		},
   332  	}, {
   333  		pattern: "*x##0",
   334  		test: pairs{
   335  			"0":    "xx0",
   336  			"10":   "x10",
   337  			"100":  "100",
   338  			"1000": "1000",
   339  		},
   340  	}, {
   341  		pattern: "##0*x",
   342  		test: pairs{
   343  			"0":    "0xx",
   344  			"10":   "10x",
   345  			"100":  "100",
   346  			"1000": "1000",
   347  		},
   348  	}, {
   349  		pattern: "* ###0.000",
   350  		test: pairs{
   351  			"0":        "   0.000",
   352  			"123":      " 123.000",
   353  			"123.456":  " 123.456",
   354  			"1234.567": "1234.567",
   355  		},
   356  	}, {
   357  		pattern: "**0.0#######E00",
   358  		test: pairs{
   359  			"0":     "***0.0\u202f×\u202f10⁰⁰",
   360  			"10":    "***1.0\u202f×\u202f10⁰¹",
   361  			"11":    "***1.1\u202f×\u202f10⁰¹",
   362  			"111":   "**1.11\u202f×\u202f10⁰²",
   363  			"1111":  "*1.111\u202f×\u202f10⁰³",
   364  			"11111": "1.1111\u202f×\u202f10⁰⁴",
   365  			"11110": "*1.111\u202f×\u202f10⁰⁴",
   366  			"11100": "**1.11\u202f×\u202f10⁰⁴",
   367  			"11000": "***1.1\u202f×\u202f10⁰⁴",
   368  			"10000": "***1.0\u202f×\u202f10⁰⁴",
   369  		},
   370  	}, {
   371  		pattern: "*xpre0suf",
   372  		test: pairs{
   373  			"0":  "pre0suf",
   374  			"10": "pre10suf",
   375  		},
   376  	}, {
   377  		pattern: "*∞ pre ###0 suf",
   378  		test: pairs{
   379  			"0":    "∞∞∞ pre 0 suf",
   380  			"10":   "∞∞ pre 10 suf",
   381  			"100":  "∞ pre 100 suf",
   382  			"1000": " pre 1000 suf",
   383  		},
   384  	}, {
   385  		pattern: "pre *∞###0 suf",
   386  		test: pairs{
   387  			"0":    "pre ∞∞∞0 suf",
   388  			"10":   "pre ∞∞10 suf",
   389  			"100":  "pre ∞100 suf",
   390  			"1000": "pre 1000 suf",
   391  		},
   392  	}, {
   393  		pattern: "pre ###0*∞ suf",
   394  		test: pairs{
   395  			"0":    "pre 0∞∞∞ suf",
   396  			"10":   "pre 10∞∞ suf",
   397  			"100":  "pre 100∞ suf",
   398  			"1000": "pre 1000 suf",
   399  		},
   400  	}, {
   401  		pattern: "pre ###0 suf *∞",
   402  		test: pairs{
   403  			"0":    "pre 0 suf ∞∞∞",
   404  			"10":   "pre 10 suf ∞∞",
   405  			"100":  "pre 100 suf ∞",
   406  			"1000": "pre 1000 suf ",
   407  		},
   408  	}, {
   409  		// Take width of positive pattern.
   410  		pattern: "**###0;**-#####0x",
   411  		test: pairs{
   412  			"0":  "***0",
   413  			"-1": "*-1x",
   414  		},
   415  	}, {
   416  		pattern: "0.00%",
   417  		test: pairs{
   418  			"0.1": "10.00%",
   419  		},
   420  	}, {
   421  		pattern: "0.##%",
   422  		test: pairs{
   423  			"0.1":     "10%",
   424  			"0.11":    "11%",
   425  			"0.111":   "11.1%",
   426  			"0.1111":  "11.11%",
   427  			"0.11111": "11.11%",
   428  		},
   429  	}, {
   430  		pattern: "‰ 0.0#",
   431  		test: pairs{
   432  			"0.1":      "‰ 100.0",
   433  			"0.11":     "‰ 110.0",
   434  			"0.111":    "‰ 111.0",
   435  			"0.1111":   "‰ 111.1",
   436  			"0.11111":  "‰ 111.11",
   437  			"0.111111": "‰ 111.11",
   438  		},
   439  	}}
   440  
   441  	// TODO:
   442  	// 	"#,##0.00¤",
   443  	// 	"#,##0.00 ¤;(#,##0.00 ¤)",
   444  
   445  	for _, tc := range testCases {
   446  		pat := tc.pat
   447  		if pat == nil {
   448  			var err error
   449  			if pat, err = ParsePattern(tc.pattern); err != nil {
   450  				log.Fatal(err)
   451  			}
   452  		}
   453  		var f Formatter
   454  		f.InitPattern(language.English, pat)
   455  		for num, want := range tc.test {
   456  			buf := make([]byte, 100)
   457  			t.Run(tc.pattern+"/"+num, func(t *testing.T) {
   458  				var d Decimal
   459  				d.Convert(f.RoundingContext, dec(num))
   460  				buf = f.Format(buf[:0], &d)
   461  				if got := string(buf); got != want {
   462  					t.Errorf("\n got %[1]q (%[1]s)\nwant %[2]q (%[2]s)", got, want)
   463  				}
   464  			})
   465  		}
   466  	}
   467  }
   468  
   469  func TestLocales(t *testing.T) {
   470  	testCases := []struct {
   471  		tag  language.Tag
   472  		num  string
   473  		want string
   474  	}{
   475  		{language.Make("en"), "123456.78", "123,456.78"},
   476  		{language.Make("de"), "123456.78", "123.456,78"},
   477  		{language.Make("de-CH"), "123456.78", "123’456.78"},
   478  		{language.Make("fr"), "123456.78", "123 456,78"},
   479  		{language.Make("bn"), "123456.78", "১,২৩,৪৫৬.৭৮"},
   480  	}
   481  	for _, tc := range testCases {
   482  		t.Run(fmt.Sprint(tc.tag, "/", tc.num), func(t *testing.T) {
   483  			var f Formatter
   484  			f.InitDecimal(tc.tag)
   485  			var d Decimal
   486  			d.Convert(f.RoundingContext, dec(tc.num))
   487  			b := f.Format(nil, &d)
   488  			if got := string(b); got != tc.want {
   489  				t.Errorf("got %[1]q (%[1]s); want %[2]q (%[2]s)", got, tc.want)
   490  			}
   491  		})
   492  	}
   493  }
   494  
   495  func TestFormatters(t *testing.T) {
   496  	var f Formatter
   497  	testCases := []struct {
   498  		init func(t language.Tag)
   499  		num  string
   500  		want string
   501  	}{
   502  		{f.InitDecimal, "123456.78", "123,456.78"},
   503  		{f.InitScientific, "123456.78", "1.23\u202f×\u202f10⁵"},
   504  		{f.InitEngineering, "123456.78", "123.46\u202f×\u202f10³"},
   505  		{f.InitEngineering, "1234", "1.23\u202f×\u202f10³"},
   506  
   507  		{f.InitPercent, "0.1234", "12.34%"},
   508  		{f.InitPerMille, "0.1234", "123.40‰"},
   509  	}
   510  	for i, tc := range testCases {
   511  		t.Run(fmt.Sprint(i, "/", tc.num), func(t *testing.T) {
   512  			tc.init(language.English)
   513  			f.SetScale(2)
   514  			var d Decimal
   515  			d.Convert(f.RoundingContext, dec(tc.num))
   516  			b := f.Format(nil, &d)
   517  			if got := string(b); got != tc.want {
   518  				t.Errorf("got %[1]q (%[1]s); want %[2]q (%[2]s)", got, tc.want)
   519  			}
   520  		})
   521  	}
   522  }