123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- // 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 number
- import (
- "reflect"
- "testing"
- "unsafe"
- )
- var testCases = []struct {
- pat string
- want *Pattern
- }{{
- "#",
- &Pattern{
- FormatWidth: 1,
- // TODO: Should MinIntegerDigits be 1?
- },
- }, {
- "0",
- &Pattern{
- FormatWidth: 1,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- },
- },
- }, {
- "+0",
- &Pattern{
- Affix: "\x01+\x00",
- FormatWidth: 2,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- },
- },
- }, {
- "0+",
- &Pattern{
- Affix: "\x00\x01+",
- FormatWidth: 2,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- },
- },
- }, {
- "0000",
- &Pattern{
- FormatWidth: 4,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 4,
- },
- },
- }, {
- ".#",
- &Pattern{
- FormatWidth: 2,
- RoundingContext: RoundingContext{
- MaxFractionDigits: 1,
- },
- },
- }, {
- "#0.###",
- &Pattern{
- FormatWidth: 6,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxFractionDigits: 3,
- },
- },
- }, {
- "#0.######",
- &Pattern{
- FormatWidth: 9,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxFractionDigits: 6,
- },
- },
- }, {
- "#,0",
- &Pattern{
- FormatWidth: 3,
- GroupingSize: [2]uint8{1, 0},
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- },
- },
- }, {
- "#,0.00",
- &Pattern{
- FormatWidth: 6,
- GroupingSize: [2]uint8{1, 0},
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MinFractionDigits: 2,
- MaxFractionDigits: 2,
- },
- },
- }, {
- "#,##0.###",
- &Pattern{
- FormatWidth: 9,
- GroupingSize: [2]uint8{3, 0},
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxFractionDigits: 3,
- },
- },
- }, {
- "#,##,##0.###",
- &Pattern{
- FormatWidth: 12,
- GroupingSize: [2]uint8{3, 2},
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxFractionDigits: 3,
- },
- },
- }, {
- // Ignore additional separators.
- "#,####,##,##0.###",
- &Pattern{
- FormatWidth: 17,
- GroupingSize: [2]uint8{3, 2},
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxFractionDigits: 3,
- },
- },
- }, {
- "#E0",
- &Pattern{
- FormatWidth: 3,
- RoundingContext: RoundingContext{
- MaxIntegerDigits: 1,
- MinExponentDigits: 1,
- },
- },
- }, {
- // At least one exponent digit is required. As long as this is true, one can
- // determine that scientific rendering is needed if MinExponentDigits > 0.
- "#E#",
- nil,
- }, {
- "0E0",
- &Pattern{
- FormatWidth: 3,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MinExponentDigits: 1,
- },
- },
- }, {
- "##0.###E00",
- &Pattern{
- FormatWidth: 10,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxIntegerDigits: 3,
- MaxFractionDigits: 3,
- MinExponentDigits: 2,
- },
- },
- }, {
- "##00.0#E0",
- &Pattern{
- FormatWidth: 9,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 2,
- MaxIntegerDigits: 4,
- MinFractionDigits: 1,
- MaxFractionDigits: 2,
- MinExponentDigits: 1,
- },
- },
- }, {
- "#00.0E+0",
- &Pattern{
- FormatWidth: 8,
- Flags: AlwaysExpSign,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 2,
- MaxIntegerDigits: 3,
- MinFractionDigits: 1,
- MaxFractionDigits: 1,
- MinExponentDigits: 1,
- },
- },
- }, {
- "0.0E++0",
- nil,
- }, {
- "#0E+",
- nil,
- }, {
- // significant digits
- "@",
- &Pattern{
- FormatWidth: 1,
- RoundingContext: RoundingContext{
- MinSignificantDigits: 1,
- MaxSignificantDigits: 1,
- MaxFractionDigits: -1,
- },
- },
- }, {
- // significant digits
- "@@@@",
- &Pattern{
- FormatWidth: 4,
- RoundingContext: RoundingContext{
- MinSignificantDigits: 4,
- MaxSignificantDigits: 4,
- MaxFractionDigits: -1,
- },
- },
- }, {
- "@###",
- &Pattern{
- FormatWidth: 4,
- RoundingContext: RoundingContext{
- MinSignificantDigits: 1,
- MaxSignificantDigits: 4,
- MaxFractionDigits: -1,
- },
- },
- }, {
- // Exponents in significant digits mode gets normalized.
- "@@E0",
- &Pattern{
- FormatWidth: 4,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxIntegerDigits: 1,
- MinFractionDigits: 1,
- MaxFractionDigits: 1,
- MinExponentDigits: 1,
- },
- },
- }, {
- "@###E00",
- &Pattern{
- FormatWidth: 7,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxIntegerDigits: 1,
- MinFractionDigits: 0,
- MaxFractionDigits: 3,
- MinExponentDigits: 2,
- },
- },
- }, {
- // The significant digits mode does not allow fractions.
- "@###.#E0",
- nil,
- }, {
- //alternative negative pattern
- "#0.###;(#0.###)",
- &Pattern{
- Affix: "\x00\x00\x01(\x01)",
- NegOffset: 2,
- FormatWidth: 6,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MaxFractionDigits: 3,
- },
- },
- }, {
- // Rounding increment
- "1.05",
- &Pattern{
- FormatWidth: 4,
- RoundingContext: RoundingContext{
- Increment: 105,
- IncrementScale: 2,
- MinIntegerDigits: 1,
- MinFractionDigits: 2,
- MaxFractionDigits: 2,
- },
- },
- }, {
- // Rounding increment with grouping
- "1,05",
- &Pattern{
- FormatWidth: 4,
- GroupingSize: [2]uint8{2, 0},
- RoundingContext: RoundingContext{
- Increment: 105,
- IncrementScale: 0,
- MinIntegerDigits: 3,
- MinFractionDigits: 0,
- MaxFractionDigits: 0,
- },
- },
- }, {
- "0.0%",
- &Pattern{
- Affix: "\x00\x01%",
- FormatWidth: 4,
- RoundingContext: RoundingContext{
- DigitShift: 2,
- MinIntegerDigits: 1,
- MinFractionDigits: 1,
- MaxFractionDigits: 1,
- },
- },
- }, {
- "0.0‰",
- &Pattern{
- Affix: "\x00\x03‰",
- FormatWidth: 4,
- RoundingContext: RoundingContext{
- DigitShift: 3,
- MinIntegerDigits: 1,
- MinFractionDigits: 1,
- MaxFractionDigits: 1,
- },
- },
- }, {
- "#,##0.00¤",
- &Pattern{
- Affix: "\x00\x02¤",
- FormatWidth: 9,
- GroupingSize: [2]uint8{3, 0},
- RoundingContext: RoundingContext{
- MinIntegerDigits: 1,
- MinFractionDigits: 2,
- MaxFractionDigits: 2,
- },
- },
- }, {
- "#,##0.00 ¤;(#,##0.00 ¤)",
- &Pattern{Affix: "\x00\x04\u00a0¤\x01(\x05\u00a0¤)",
- NegOffset: 6,
- FormatWidth: 10,
- GroupingSize: [2]uint8{3, 0},
- RoundingContext: RoundingContext{
- DigitShift: 0,
- MinIntegerDigits: 1,
- MinFractionDigits: 2,
- MaxFractionDigits: 2,
- },
- },
- }, {
- // padding
- "*x#",
- &Pattern{
- PadRune: 'x',
- FormatWidth: 1,
- },
- }, {
- // padding
- "#*x",
- &Pattern{
- PadRune: 'x',
- FormatWidth: 1,
- Flags: PadBeforeSuffix,
- },
- }, {
- "*xpre#suf",
- &Pattern{
- Affix: "\x03pre\x03suf",
- PadRune: 'x',
- FormatWidth: 7,
- },
- }, {
- "pre*x#suf",
- &Pattern{
- Affix: "\x03pre\x03suf",
- PadRune: 'x',
- FormatWidth: 7,
- Flags: PadAfterPrefix,
- },
- }, {
- "pre#*xsuf",
- &Pattern{
- Affix: "\x03pre\x03suf",
- PadRune: 'x',
- FormatWidth: 7,
- Flags: PadBeforeSuffix,
- },
- }, {
- "pre#suf*x",
- &Pattern{
- Affix: "\x03pre\x03suf",
- PadRune: 'x',
- FormatWidth: 7,
- Flags: PadAfterSuffix,
- },
- }, {
- `* #0 o''clock`,
- &Pattern{Affix: "\x00\x09 o\\'clock",
- FormatWidth: 10,
- PadRune: 32,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 0x1,
- },
- },
- }, {
- `'123'* #0'456'`,
- &Pattern{Affix: "\x05'123'\x05'456'",
- FormatWidth: 8,
- PadRune: 32,
- RoundingContext: RoundingContext{
- MinIntegerDigits: 0x1,
- },
- Flags: PadAfterPrefix},
- }, {
- // no duplicate padding
- "*xpre#suf*x", nil,
- }, {
- // no duplicate padding
- "*xpre#suf*x", nil,
- }}
- func TestParsePattern(t *testing.T) {
- for i, tc := range testCases {
- t.Run(tc.pat, func(t *testing.T) {
- f, err := ParsePattern(tc.pat)
- if !reflect.DeepEqual(f, tc.want) {
- t.Errorf("%d:%s:\ngot %#v;\nwant %#v", i, tc.pat, f, tc.want)
- }
- if got, want := err != nil, tc.want == nil; got != want {
- t.Errorf("%d:%s:error: got %v; want %v", i, tc.pat, err, want)
- }
- })
- }
- }
- func TestPatternSize(t *testing.T) {
- if sz := unsafe.Sizeof(Pattern{}); sz > 56 {
- t.Errorf("got %d; want <= 56", sz)
- }
- }
|