]> gitweb.factorcode.org Git - factor.git/blob - basis/formatting/formatting-tests.factor
Fixes #2966
[factor.git] / basis / formatting / formatting-tests.factor
1 ! Copyright (C) 2008 John Benediktsson
2 ! See https://factorcode.org/license.txt for BSD license
3 USING: calendar formatting formatting.private kernel literals
4 math math.functions sequences strings system tools.test ;
5 IN: formatting.tests
6
7 {
8     B{ 49 46 53 53 69 43 48 53 }
9 } [
10     155000.0 B{ 0 } -1 3 B{ 69 0 } B{ 67 0 } (format-float)
11 ] unit-test
12
13 {
14     B{ 32 32 32 32 32 32 32 49 46 53 53 69 43 48 53 }
15 } [
16     155000.0 B{ 0 } 15 3 B{ 69 0 } B{ 67 0 } (format-float)
17 ] unit-test
18
19 ! Missing locale
20 { "" } [
21     33.4 "" 4 4 "f" "missing" format-float
22 ] unit-test
23
24 ! Literal byte arrays are mutable, so (format-float) isn't foldable.
25 : trouble ( -- str ba )
26     155000.0 B{ } -1 3 B{ 69 0 } [
27         B{ 67 0 } (format-float) >string
28     ] keep ;
29
30 {
31     "1.55E+05"
32     "1.550e+05"
33 } [
34     trouble CHAR: e 0 rot set-nth trouble drop
35 ] unit-test
36
37 [ "%s" printf ] must-infer
38 [ "%s" sprintf ] must-infer
39
40 { "" } [ "" sprintf ] unit-test
41 { "asdf" } [ "asdf" sprintf ] unit-test
42 { "10" } [ 10 "%d" sprintf ] unit-test
43 { "+10" } [ 10 "%+d" sprintf ] unit-test
44 { "-10" } [ -10 "%d" sprintf ] unit-test
45 { " 23" } [ 23 "% d" sprintf ] unit-test
46 { "-23" } [ -23 "% d" sprintf ] unit-test
47 { "  -10" } [ -10 "%5d" sprintf ] unit-test
48 { "-0010" } [ -10 "%05d" sprintf ] unit-test
49 { "+0010" } [ 10 "%+05d" sprintf ] unit-test
50 { "123.456000" } [ 123.456 "%f" sprintf ] unit-test
51 { "2.44" } [ 2.436 "%.2f" sprintf ] unit-test
52 { "8.950" } [ 8.950179003580072 "%.3f" sprintf ] unit-test
53 { "123.10" } [ 123.1 "%01.2f" sprintf ] unit-test
54 { "1.2346" } [ 1.23456789 "%.4f" sprintf ] unit-test
55 { "100000000000000000.50000" } [ 17 10^ 1/2 + "%20.5f" sprintf ] unit-test
56 { "3.333333" } [ 3+1/3 "%f" sprintf ] unit-test
57 { "3.666667" } [ 3+2/3 "%f" sprintf ] unit-test
58 { "3.7" } [ 3+2/3 "%.1f" sprintf ] unit-test
59 { "-3.7" } [ -3-2/3 "%.1f" sprintf ] unit-test
60 { "-3.666667" } [ -3-2/3 "%f" sprintf ] unit-test
61 { "-3.333333" } [ -3-1/3 "%f" sprintf ] unit-test
62 { "3.14159265358979323846e+00" } [ 2646693125139304345 842468587426513207 / "%.20e" sprintf ] unit-test
63 { "-0.500" } [ -1/2 "%.3f" sprintf ] unit-test
64 { "0.010" } [ 1/100 "%.3f" sprintf ] unit-test
65 { "100000000000000000000000.000000" } [ 23 10^ "%f" sprintf ] unit-test
66 { "1.4" } [ 135/100 "%.1f" sprintf ] unit-test
67 { "4" } [ 7/2 "%.0f" sprintf ] unit-test
68 { "1" } [ 1.0 "%.0f" sprintf ] unit-test
69 { "0.0e+00" } [ 0 "%.1e" sprintf ] unit-test
70 { "  1.23" } [ 1.23456789 "%6.2f" sprintf ] unit-test
71 { "001100" } [ 12 "%06b" sprintf ] unit-test
72 { "==14" } [ 12 "%'=4o" sprintf ] unit-test
73 { "foo: 1 bar: 2" } [ { 1 2 3 } "foo: %d bar: %s" vsprintf ] unit-test
74 { "1.234000e+08" } [ 123400000 "%e" sprintf ] unit-test
75 { "-1.234000e+08" } [ -123400000 "%e" sprintf ] unit-test
76 { "1.234567e+08" } [ 123456700 "%e" sprintf ] unit-test
77 { "3.625e+08" } [ 362525200 "%.3e" sprintf ] unit-test
78 { "2.500000e-03" } [ 0.0025 "%e" sprintf ] unit-test
79 { "2.500000E-03" } [ 0.0025 "%E" sprintf ] unit-test
80 { "   1.0E+01" } [ 10 "%10.1E" sprintf ] unit-test
81 { "  -1.0E+01" } [ -10 "%10.1E" sprintf ] unit-test
82 { "  -1.0E+01" } [ -10 "%+10.1E" sprintf ] unit-test
83 { "  +1.0E+01" } [ 10 "%+10.1E" sprintf ] unit-test
84 { "-001.0E+01" } [ -10 "%+010.1E" sprintf ] unit-test
85 { "+001.0E+01" } [ 10 "%+010.1E" sprintf ] unit-test
86 { "+001.0E-01" } [ 0.1 "%+010.1E" sprintf ] unit-test
87 { " e1" } [ 0xe1 "% x" sprintf ] unit-test
88 { "+e1" } [ 0xe1 "%+x" sprintf ] unit-test
89 { "-e1" } [ -0xe1 "% x" sprintf ] unit-test
90 { "-e1" } [ -0xe1 "%+x" sprintf ] unit-test
91 { "1.00000e+1000" } [ 1000 10^ "%.5e" sprintf ] unit-test
92 { "1.00000e-1000" } [ -1000 10^ "%.5e" sprintf ] unit-test
93 { t } [
94     1000 10^ "%.5f" sprintf
95     "1" ".00000" 1000 CHAR: 0 <string> glue =
96 ] unit-test
97 { t } [
98     -1000 10^ "%.1004f" sprintf
99     "0." "10000" 999 CHAR: 0 <string> glue =
100 ] unit-test
101 { "-1.00000e+1000" } [ 1000 10^ neg "%.5e" sprintf ] unit-test
102 { "-1.00000e-1000" } [ -1000 10^ neg "%.5e" sprintf ] unit-test
103 { t } [
104     1000 10^ neg "%.5f" sprintf
105     "-1" ".00000" 1000 CHAR: 0 <string> glue =
106 ] unit-test
107 { t } [
108     -1000 10^ neg "%.1004f" sprintf
109     "-0." "10000" 999 CHAR: 0 <string> glue =
110 ] unit-test
111 { "9007199254740991.0" } [ 53 2^ 1 - "%.1f" sprintf ] unit-test
112 { "9007199254740992.0" } [ 53 2^ "%.1f" sprintf ] unit-test
113 { "9007199254740993.0" } [ 53 2^ 1 + "%.1f" sprintf ] unit-test
114 { "-9007199254740991.0" } [ 53 2^ 1 - neg "%.1f" sprintf ] unit-test
115 { "-9007199254740992.0" } [ 53 2^ neg "%.1f" sprintf ] unit-test
116 { "-9007199254740993.0" } [ 53 2^ 1 + neg "%.1f" sprintf ] unit-test
117 { "987654321098765432" } [ 987654321098765432 "%d" sprintf ] unit-test
118 { "987654321098765432.0" } [ 987654321098765432 "%.1f" sprintf ] unit-test
119 { "987654321098765432" } [ 987654321098765432 "%.0f" sprintf ] unit-test
120 { "9.8765432109876543200e+417" } [ 987654321098765432 10 400 ^ * "%.19e" sprintf ] unit-test
121 { "9.876543210987654320e+417" } [ 987654321098765432 10 400 ^ * "%.18e" sprintf ] unit-test
122 { "9.87654321098765432e+417" } [ 987654321098765432 10 400 ^ * "%.17e" sprintf ] unit-test
123 { "9.8765432109876543e+417" } [ 987654321098765432 10 400 ^ * "%.16e" sprintf ] unit-test
124 { "9.876543210987654e+417" } [ 987654321098765432 10 400 ^ * "%.15e" sprintf ] unit-test
125 { "9.87654321098765e+417" } [ 987654321098765432 10 400 ^ * "%.14e" sprintf ] unit-test
126 { "9.8765432109877e+417" } [ 987654321098765432 10 400 ^ * "%.13e" sprintf ] unit-test
127 { "9.876543210988e+417" } [ 987654321098765432 10 400 ^ * "%.12e" sprintf ] unit-test
128 { "9.87654321099e+417" } [ 987654321098765432 10 400 ^ * "%.11e" sprintf ] unit-test
129 { "9.8765432110e+417" } [ 987654321098765432 10 400 ^ * "%.10e" sprintf ] unit-test
130 { "9.876543211e+417" } [ 987654321098765432 10 400 ^ * "%.9e" sprintf ] unit-test
131 { "9.87654321e+417" } [ 987654321098765432 10 400 ^ * "%.8e" sprintf ] unit-test
132 { "9.8765432e+417" } [ 987654321098765432 10 400 ^ * "%.7e" sprintf ] unit-test
133 { "9.876543e+417" } [ 987654321098765432 10 400 ^ * "%.6e" sprintf ] unit-test
134 { "9.87654e+417" } [ 987654321098765432 10 400 ^ * "%.5e" sprintf ] unit-test
135 { "9.8765e+417" } [ 987654321098765432 10 400 ^ * "%.4e" sprintf ] unit-test
136 { "9.877e+417" } [ 987654321098765432 10 400 ^ * "%.3e" sprintf ] unit-test
137 { "9.88e+417" } [ 987654321098765432 10 400 ^ * "%.2e" sprintf ] unit-test
138 { "9.9e+417" } [ 987654321098765432 10 400 ^ * "%.1e" sprintf ] unit-test
139 ! This works even on windows (even though %.0e is special on
140 ! windows) because it doesn't use the fast formatter from the
141 ! system
142 { "1e+418" } [ 987654321098765432 10 400 ^ * "%.0e" sprintf ] unit-test
143 { "9e+417" } [ 937654321098765432 10 400 ^ * "%.0e" sprintf ] unit-test
144 { "1.0e+418" } [ 997654321098765432 10 400 ^ * "%.1e" sprintf ] unit-test
145 { "1.00e+418" } [ 999654321098765432 10 400 ^ * "%.2e" sprintf ] unit-test
146
147 { "ff" } [ 0xff "%x" sprintf ] unit-test
148 { "FF" } [ 0xff "%X" sprintf ] unit-test
149 { "0f" } [ 0xf "%02x" sprintf ] unit-test
150 { "0F" } [ 0xf "%02X" sprintf ] unit-test
151 { "2008-09-10" } [ 2008 9 10 "%04d-%02d-%02d" sprintf ] unit-test
152 { "Hello, World!" } [ "Hello, World!" "%s" sprintf ] unit-test
153 { "printf test" } [ "printf test" sprintf ] unit-test
154 { "char a = 'a'" } [ CHAR: a "char %c = 'a'" sprintf ] unit-test
155 { "00" } [ 0x0 "%02x" sprintf ] unit-test
156 { "ff" } [ 0xff "%02x" sprintf ] unit-test
157 { "0 message(s)" } [ 0 "message" "%d %s(s)" sprintf ] unit-test
158 { "0 message(s) with %" } [ 0 "message" "%d %s(s) with %%" sprintf ] unit-test
159 { "justif: \"left      \"" } [ "left" "justif: \"%-10s\"" sprintf ] unit-test
160 { "justif: \"     right\"" } [ "right" "justif: \"%10s\"" sprintf ] unit-test
161 { " 3: 0003 zero padded" } [ 3 " 3: %04d zero padded" sprintf ] unit-test
162 { " 3: 3    left justif" } [ 3 " 3: %-4d left justif" sprintf ] unit-test
163 { " 3:    3 right justif" } [ 3 " 3: %4d right justif" sprintf ] unit-test
164 { " -3: -003 zero padded" } [ -3 " -3: %04d zero padded" sprintf ] unit-test
165 { " -3: -3   left justif" } [ -3 " -3: %-4d left justif" sprintf ] unit-test
166 { " -3:   -3 right justif" } [ -3 " -3: %4d right justif" sprintf ] unit-test
167 { "There are 10 monkeys in the kitchen" } [ 10 "kitchen" "There are %d monkeys in the %s" sprintf ] unit-test
168 { "10" } [ 10 "%d" sprintf ] unit-test
169 { "[monkey]" } [ "monkey" "[%s]" sprintf ] unit-test
170 { "[    monkey]" } [ "monkey" "[%10s]" sprintf ] unit-test
171 { "[monkey    ]" } [ "monkey" "[%-10s]" sprintf ] unit-test
172 { "[0000monkey]" } [ "monkey" "[%010s]" sprintf ] unit-test
173 { "[####monkey]" } [ "monkey" "[%'#10s]" sprintf ] unit-test
174 { "[many monke]" } [ "many monkeys" "[%10.10s]" sprintf ] unit-test
175
176 { "{ 1, 2, 3 }" } [ BV{ 1 2 3 } "%[%d, %]" sprintf ] unit-test
177 { "{ 1, 2, 3 }" } [ { 1 2 3 } "%[%s, %]" sprintf ] unit-test
178 { "{ 1:2, 3:4 }" } [ H{ { 1 2 } { 3 4 } } "%[%s: %s %]" sprintf ] unit-test
179
180
181 [ "%H:%M:%S" strftime ] must-infer
182
183 : testtime ( -- timestamp )
184     2008 10 9 12 3 15 instant <timestamp> ;
185
186 { t } [ "12:03:15" testtime "%H:%M:%S" strftime = ] unit-test
187 { t } [ "12:03:15" testtime "%X" strftime = ] unit-test
188 { t } [ "10/09/2008" testtime "%m/%d/%Y" strftime = ] unit-test
189 { t } [ "10/09/2008" testtime "%x" strftime = ] unit-test
190 { t } [ "10/09/08" testtime "%m/%d/%y" strftime = ] unit-test
191 { t } [ "Thu" testtime "%a" strftime = ] unit-test
192 { t } [ "Thursday" testtime "%A" strftime = ] unit-test
193 { t } [ "Oct" testtime "%b" strftime = ] unit-test
194 { t } [ "October" testtime "%B" strftime = ] unit-test
195 { t } [ "Thu Oct 09 12:03:15 2008" testtime "%c" strftime = ] unit-test
196 { t } [ "PM" testtime "%p" strftime = ] unit-test
197
198 { "1.2" } [ 125/100 "%.1f" sprintf ] unit-test
199 { "2" } [ 5/2 "%.0f" sprintf ] unit-test
200 { "2e+00" } [ 5/2 "%.0e" sprintf ] unit-test
201 { "4e+00" } [ 7/2 "%.0e" sprintf ] unit-test
202 { "1e+00" } [ 1.0 "%.0e" sprintf ] unit-test
203
204 { "00" } [ 2020 1 1 <date> "%U" strftime ] unit-test
205 { "00" } [ 2020 1 1 <date> "%W" strftime ] unit-test
206
207 { "44" } [ 2020 11 6 <date> "%U" strftime ] unit-test
208 { "44" } [ 2020 11 6 <date> "%W" strftime ] unit-test
209
210 { "00" } [ 2022 1 1 <date> "%U" strftime ] unit-test
211 { "01" } [ 2022 1 2 <date> "%U" strftime ] unit-test
212 { "01" } [ 2022 1 3 <date> "%U" strftime ] unit-test
213
214 { "00" } [ 2022 1 1 <date> "%W" strftime ] unit-test
215 { "00" } [ 2022 1 2 <date> "%W" strftime ] unit-test
216 { "01" } [ 2022 1 3 <date> "%W" strftime ] unit-test
217
218 { "34" } [ 2022 8 27 <date> "%U" strftime ] unit-test
219 { "35" } [ 2022 8 28 <date> "%U" strftime ] unit-test
220 { "35" } [ 2022 8 29 <date> "%U" strftime ] unit-test
221
222 { "34" } [ 2022 8 27 <date> "%W" strftime ] unit-test
223 { "34" } [ 2022 8 28 <date> "%W" strftime ] unit-test
224 { "35" } [ 2022 8 29 <date> "%W" strftime ] unit-test