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 }