github.com/liquid-dev/text@v0.3.3-liquid/number/number_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 "strings" 9 "testing" 10 11 "github.com/liquid-dev/text/language" 12 "github.com/liquid-dev/text/message" 13 ) 14 15 func TestFormatter(t *testing.T) { 16 overrides := map[string]string{ 17 "en": "*e#######0", 18 "nl": "*n#######0", 19 } 20 testCases := []struct { 21 desc string 22 tag string 23 f Formatter 24 want string 25 }{{ 26 desc: "decimal", 27 f: Decimal(3), 28 want: "3", 29 }, { 30 desc: "decimal fraction", 31 f: Decimal(0.123), 32 want: "0.123", 33 }, { 34 desc: "separators", 35 f: Decimal(1234.567), 36 want: "1,234.567", 37 }, { 38 desc: "no separators", 39 f: Decimal(1234.567, NoSeparator()), 40 want: "1234.567", 41 }, { 42 desc: "max integer", 43 f: Decimal(1973, MaxIntegerDigits(2)), 44 want: "73", 45 }, { 46 desc: "max integer overflow", 47 f: Decimal(1973, MaxIntegerDigits(1000)), 48 want: "1,973", 49 }, { 50 desc: "min integer", 51 f: Decimal(12, MinIntegerDigits(5)), 52 want: "00,012", 53 }, { 54 desc: "max fraction zero", 55 f: Decimal(0.12345, MaxFractionDigits(0)), 56 want: "0", 57 }, { 58 desc: "max fraction 2", 59 f: Decimal(0.12, MaxFractionDigits(2)), 60 want: "0.12", 61 }, { 62 desc: "min fraction 2", 63 f: Decimal(0.12, MaxFractionDigits(2)), 64 want: "0.12", 65 }, { 66 desc: "max fraction overflow", 67 f: Decimal(0.125, MaxFractionDigits(1e6)), 68 want: "0.125", 69 }, { 70 desc: "min integer overflow", 71 f: Decimal(0, MinIntegerDigits(1e6)), 72 want: strings.Repeat("000,", 255/3-1) + "000", 73 }, { 74 desc: "min fraction overflow", 75 f: Decimal(0, MinFractionDigits(1e6)), 76 want: "0." + strings.Repeat("0", 255), // TODO: fraction separators 77 }, { 78 desc: "format width", 79 f: Decimal(123, FormatWidth(10)), 80 want: " 123", 81 }, { 82 desc: "format width pad option before", 83 f: Decimal(123, Pad('*'), FormatWidth(10)), 84 want: "*******123", 85 }, { 86 desc: "format width pad option after", 87 f: Decimal(123, FormatWidth(10), Pad('*')), 88 want: "*******123", 89 }, { 90 desc: "format width illegal", 91 f: Decimal(123, FormatWidth(-1)), 92 want: "123", 93 }, { 94 desc: "increment", 95 f: Decimal(10.33, IncrementString("0.5")), 96 want: "10.5", 97 }, { 98 desc: "increment", 99 f: Decimal(10, IncrementString("ppp")), 100 want: "10", 101 }, { 102 desc: "increment and scale", 103 f: Decimal(10.33, IncrementString("0.5"), Scale(2)), 104 want: "10.50", 105 }, { 106 desc: "pattern overrides en", 107 tag: "en", 108 f: Decimal(101, PatternOverrides(overrides)), 109 want: "eeeee101", 110 }, { 111 desc: "pattern overrides nl", 112 tag: "nl", 113 f: Decimal(101, PatternOverrides(overrides)), 114 want: "nnnnn101", 115 }, { 116 desc: "pattern overrides de", 117 tag: "de", 118 f: Decimal(101, PatternOverrides(overrides)), 119 want: "101", 120 }, { 121 desc: "language selection", 122 tag: "bn", 123 f: Decimal(123456.78, Scale(2)), 124 want: "১,২৩,৪৫৬.৭৮", 125 }, { 126 desc: "scale", 127 f: Decimal(1234.567, Scale(2)), 128 want: "1,234.57", 129 }, { 130 desc: "scientific", 131 f: Scientific(3.00), 132 want: "3\u202f×\u202f10⁰", 133 }, { 134 desc: "scientific", 135 f: Scientific(1234), 136 want: "1.234\u202f×\u202f10³", 137 }, { 138 desc: "scientific", 139 f: Scientific(1234, Scale(2)), 140 want: "1.23\u202f×\u202f10³", 141 }, { 142 desc: "engineering", 143 f: Engineering(12345), 144 want: "12.345\u202f×\u202f10³", 145 }, { 146 desc: "engineering scale", 147 f: Engineering(12345, Scale(2)), 148 want: "12.34\u202f×\u202f10³", 149 }, { 150 desc: "engineering precision(4)", 151 f: Engineering(12345, Precision(4)), 152 want: "12.34\u202f×\u202f10³", 153 }, { 154 desc: "engineering precision(2)", 155 f: Engineering(1234.5, Precision(2)), 156 want: "1.2\u202f×\u202f10³", 157 }, { 158 desc: "percent", 159 f: Percent(0.12), 160 want: "12%", 161 }, { 162 desc: "permille", 163 f: PerMille(0.123), 164 want: "123‰", 165 }, { 166 desc: "percent rounding", 167 f: PerMille(0.12345), 168 want: "123‰", 169 }, { 170 desc: "percent fraction", 171 f: PerMille(0.12345, Scale(2)), 172 want: "123.45‰", 173 }, { 174 desc: "percent fraction", 175 f: PerMille(0.12344, Scale(1)), 176 want: "123.4‰", 177 }} 178 for _, tc := range testCases { 179 t.Run(tc.desc, func(t *testing.T) { 180 tag := language.Und 181 if tc.tag != "" { 182 tag = language.MustParse(tc.tag) 183 } 184 got := message.NewPrinter(tag).Sprint(tc.f) 185 if got != tc.want { 186 t.Errorf("got %q; want %q", got, tc.want) 187 } 188 }) 189 } 190 }