github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/text/internal/format/pattern_test.go (about)

     1  package format
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  	"unsafe"
     7  )
     8  
     9  var testCases = []struct {
    10  	pat  string
    11  	want *NumberFormat
    12  }{{
    13  	"#",
    14  	&NumberFormat{
    15  		FormatWidth: 1,
    16  		// TODO: Should MinIntegerDigits be 1?
    17  	},
    18  }, {
    19  	"0",
    20  	&NumberFormat{
    21  		FormatWidth:      1,
    22  		MinIntegerDigits: 1,
    23  	},
    24  }, {
    25  	"0000",
    26  	&NumberFormat{
    27  		FormatWidth:      4,
    28  		MinIntegerDigits: 4,
    29  	},
    30  }, {
    31  	".#",
    32  	&NumberFormat{
    33  		FormatWidth:       2,
    34  		MaxFractionDigits: 1,
    35  	},
    36  }, {
    37  	"#0.###",
    38  	&NumberFormat{
    39  		FormatWidth:       6,
    40  		MinIntegerDigits:  1,
    41  		MaxFractionDigits: 3,
    42  	},
    43  }, {
    44  	"#0.######",
    45  	&NumberFormat{
    46  		FormatWidth:       9,
    47  		MinIntegerDigits:  1,
    48  		MaxFractionDigits: 6,
    49  	},
    50  }, {
    51  	"#,##0.###",
    52  	&NumberFormat{
    53  		FormatWidth:       9,
    54  		GroupingSize:      [2]uint8{3, 0},
    55  		MinIntegerDigits:  1,
    56  		MaxFractionDigits: 3,
    57  	},
    58  }, {
    59  	"#,##,##0.###",
    60  	&NumberFormat{
    61  		FormatWidth:       12,
    62  		GroupingSize:      [2]uint8{3, 2},
    63  		MinIntegerDigits:  1,
    64  		MaxFractionDigits: 3,
    65  	},
    66  }, {
    67  	// Ignore additional separators.
    68  	"#,####,##,##0.###",
    69  	&NumberFormat{
    70  		FormatWidth:       17,
    71  		GroupingSize:      [2]uint8{3, 2},
    72  		MinIntegerDigits:  1,
    73  		MaxFractionDigits: 3,
    74  	},
    75  }, {
    76  	"#E0",
    77  	&NumberFormat{
    78  		FormatWidth:       3,
    79  		MaxIntegerDigits:  1,
    80  		MinExponentDigits: 1,
    81  	},
    82  }, {
    83  	"0E0",
    84  	&NumberFormat{
    85  		FormatWidth:       3,
    86  		MinIntegerDigits:  1,
    87  		MinExponentDigits: 1,
    88  	},
    89  }, {
    90  	"##00.0#E0",
    91  	&NumberFormat{
    92  		FormatWidth:       9,
    93  		MinIntegerDigits:  2,
    94  		MaxIntegerDigits:  4,
    95  		MinFractionDigits: 1,
    96  		MaxFractionDigits: 2,
    97  		MinExponentDigits: 1,
    98  	},
    99  }, {
   100  	"#00.0E+0",
   101  	&NumberFormat{
   102  		FormatWidth:       8,
   103  		Flags:             AlwaysExpSign,
   104  		MinIntegerDigits:  2,
   105  		MaxIntegerDigits:  3,
   106  		MinFractionDigits: 1,
   107  		MaxFractionDigits: 1,
   108  		MinExponentDigits: 1,
   109  	},
   110  }, {
   111  	"0.0E++0",
   112  	nil,
   113  }, {
   114  	"#0E+",
   115  	nil,
   116  }, {
   117  	// significant digits
   118  	"@",
   119  	&NumberFormat{
   120  		FormatWidth:          1,
   121  		MinSignificantDigits: 1,
   122  		MaxSignificantDigits: 1,
   123  	},
   124  }, {
   125  	// significant digits
   126  	"@@@@",
   127  	&NumberFormat{
   128  		FormatWidth:          4,
   129  		MinSignificantDigits: 4,
   130  		MaxSignificantDigits: 4,
   131  	},
   132  }, {
   133  	"@###",
   134  	&NumberFormat{
   135  		FormatWidth:          4,
   136  		MinSignificantDigits: 1,
   137  		MaxSignificantDigits: 4,
   138  	},
   139  }, {
   140  	// Exponents in significant digits mode gets normalized.
   141  	"@@E0",
   142  	&NumberFormat{
   143  		FormatWidth:       4,
   144  		MinIntegerDigits:  1,
   145  		MaxIntegerDigits:  1,
   146  		MinFractionDigits: 1,
   147  		MaxFractionDigits: 1,
   148  		MinExponentDigits: 1,
   149  	},
   150  }, {
   151  	"@###E00",
   152  	&NumberFormat{
   153  		FormatWidth:       7,
   154  		MinIntegerDigits:  1,
   155  		MaxIntegerDigits:  1,
   156  		MinFractionDigits: 0,
   157  		MaxFractionDigits: 3,
   158  		MinExponentDigits: 2,
   159  	},
   160  }, {
   161  	// The significant digits mode does not allow fractions.
   162  	"@###.#E0",
   163  	nil,
   164  }, {
   165  	//alternative negative pattern
   166  	"#0.###;(#0.###)",
   167  	&NumberFormat{
   168  		Affix:             "\x00\x00\x01(\x01)",
   169  		NegOffset:         2,
   170  		FormatWidth:       6,
   171  		MinIntegerDigits:  1,
   172  		MaxFractionDigits: 3,
   173  	},
   174  }, {
   175  	// Rounding increments
   176  	"1.05",
   177  	&NumberFormat{
   178  		RoundIncrement:    105,
   179  		FormatWidth:       4,
   180  		MinIntegerDigits:  1,
   181  		MinFractionDigits: 2,
   182  		MaxFractionDigits: 2,
   183  	},
   184  }, {
   185  	"0.0%",
   186  	&NumberFormat{
   187  		Affix:             "\x00\x01%",
   188  		Multiplier:        100,
   189  		FormatWidth:       4,
   190  		MinIntegerDigits:  1,
   191  		MinFractionDigits: 1,
   192  		MaxFractionDigits: 1,
   193  	},
   194  }, {
   195  	"0.0‰",
   196  	&NumberFormat{
   197  		Affix:             "\x00\x03‰",
   198  		Multiplier:        1000,
   199  		FormatWidth:       4,
   200  		MinIntegerDigits:  1,
   201  		MinFractionDigits: 1,
   202  		MaxFractionDigits: 1,
   203  	},
   204  }, {
   205  	"#,##0.00¤",
   206  	&NumberFormat{
   207  		Affix:             "\x00\x02¤",
   208  		FormatWidth:       9,
   209  		GroupingSize:      [2]uint8{3, 0},
   210  		MinIntegerDigits:  1,
   211  		MinFractionDigits: 2,
   212  		MaxFractionDigits: 2,
   213  	},
   214  }, {
   215  	"#,##0.00 ¤;(#,##0.00 ¤)",
   216  	&NumberFormat{Affix: "\x00\x04\u00a0¤\x01(\x05\u00a0¤)",
   217  		NegOffset:         6,
   218  		Multiplier:        0,
   219  		FormatWidth:       10,
   220  		GroupingSize:      [2]uint8{3, 0},
   221  		MinIntegerDigits:  1,
   222  		MinFractionDigits: 2,
   223  		MaxFractionDigits: 2,
   224  	},
   225  }, {
   226  	// padding
   227  	"*x#",
   228  	&NumberFormat{
   229  		PadRune:     'x',
   230  		FormatWidth: 1,
   231  	},
   232  }, {
   233  	// padding
   234  	"#*x",
   235  	&NumberFormat{
   236  		PadRune:     'x',
   237  		FormatWidth: 1,
   238  		Flags:       PadBeforeSuffix,
   239  	},
   240  }, {
   241  	"*xpre#suf",
   242  	&NumberFormat{
   243  		Affix:       "\x03pre\x03suf",
   244  		PadRune:     'x',
   245  		FormatWidth: 7,
   246  	},
   247  }, {
   248  	"pre*x#suf",
   249  	&NumberFormat{
   250  		Affix:       "\x03pre\x03suf",
   251  		PadRune:     'x',
   252  		FormatWidth: 7,
   253  		Flags:       PadAfterPrefix,
   254  	},
   255  }, {
   256  	"pre#*xsuf",
   257  	&NumberFormat{
   258  		Affix:       "\x03pre\x03suf",
   259  		PadRune:     'x',
   260  		FormatWidth: 7,
   261  		Flags:       PadBeforeSuffix,
   262  	},
   263  }, {
   264  	"pre#suf*x",
   265  	&NumberFormat{
   266  		Affix:       "\x03pre\x03suf",
   267  		PadRune:     'x',
   268  		FormatWidth: 7,
   269  		Flags:       PadAfterSuffix,
   270  	},
   271  }, {
   272  	// no duplicate padding
   273  	"*xpre#suf*x", nil,
   274  }, {
   275  	// no duplicate padding
   276  	"*xpre#suf*x", nil,
   277  }}
   278  
   279  func TestParseNumberPattern(t *testing.T) {
   280  	for i, tc := range testCases {
   281  		f, err := ParseNumberPattern(tc.pat)
   282  		if !reflect.DeepEqual(f, tc.want) {
   283  			t.Errorf("%d:%s:\ngot %#v;\nwant %#v", i, tc.pat, f, tc.want)
   284  		}
   285  		if got, want := err != nil, tc.want == nil; got != want {
   286  			t.Errorf("%d:%s:error: got %v; want %v", i, tc.pat, err, want)
   287  		}
   288  	}
   289  }
   290  
   291  func TestPatternSize(t *testing.T) {
   292  	if sz := unsafe.Sizeof(NumberFormat{}); sz > 48 {
   293  		t.Errorf("got %d; want 48", sz)
   294  	}
   295  
   296  }