Skip to content

Commit 5d564b6

Browse files
Try re-enabling the formatNumber rounding tests with 64-bit Windows builds (#319)
* Try re-enabling the formatNumber rounding tests with 64-bit Windows builds. * Turn on LDC tests also. * Narrow the set of failing formatNumber tests on Windows. * Update the failing value test. * Remove the failing test from the common set. * Turn off LDC unit tests.
1 parent 8ed24a4 commit 5d564b6

2 files changed

Lines changed: 70 additions & 51 deletions

File tree

.github/workflows/d.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ jobs:
3434
make clean
3535
3636
- name: make unittest
37-
# Currently, only run unit tests on DMD. LDC has failures due to numeric formatting.
37+
# Currently, only run unit tests on DMD. LDC has failures in tsv-sample due
38+
# to minor descrepancies in printed random numbers.
3839
if: ${{ startsWith(matrix.dc, 'dmd') }}
3940
shell: bash
4041
run: |

common/src/tsv_utils/common/numerics.d

Lines changed: 68 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -209,36 +209,45 @@ unittest // formatNumber unit tests
209209
assert(formatNumber(1234567891234.0, 0) == "1234567891234");
210210
assert(formatNumber(1234567891234.0, 1) == "1234567891234");
211211

212-
// Test round off cases
212+
/* Test round off cases. Note: These tests will not pass on Windows 32-bit builds.
213+
* Use the -m64 flag on Windows to get a 64-bit build.
214+
*
215+
* Note: The first test case does not generate the correct result on Windows
216+
* 64-bit builds. The current Windows result is included both for documentation
217+
* and to provide an alert if the correct result starts getting populated. Both
218+
* formatNumber and the underlying format call are included.
219+
*/
213220
version(Windows)
214221
{
215-
/* Round-off cases don't work properly on Windows. They truncate rather than
216-
* round. May be a DMD specific Windows bug, not clear.
217-
*/
222+
// Incorrect
223+
assert(format("%.*f", 0, 0.6) == "0");
224+
assert(formatNumber(0.6, 0) == "0");
218225
}
219226
else
220227
{
228+
assert(format("%.*f", 0, 0.6) == "1");
221229
assert(formatNumber(0.6, 0) == "1");
222-
assert(formatNumber(0.6, 1) == "0.6");
223-
assert(formatNumber(0.06, 0) == "0");
224-
assert(formatNumber(0.06, 1) == "0.1");
225-
assert(formatNumber(0.06, 2) == "0.06");
226-
assert(formatNumber(0.06, 3) == "0.06");
227-
assert(formatNumber(9.49999, 0) == "9");
228-
assert(formatNumber(9.49999, 1) == "9.5");
229-
assert(formatNumber(9.6, 0) == "10");
230-
assert(formatNumber(9.6, 1) == "9.6");
231-
assert(formatNumber(99.99, 0) == "100");
232-
assert(formatNumber(99.99, 1) == "100");
233-
assert(formatNumber(99.99, 2) == "99.99");
234-
assert(formatNumber(9999.9996, 3) == "10000");
235-
assert(formatNumber(9999.9996, 4) == "9999.9996");
236-
assert(formatNumber(99999.99996, 4) == "100000");
237-
assert(formatNumber(99999.99996, 5) == "99999.99996");
238-
assert(formatNumber(999999.999996, 5) == "1000000");
239-
assert(formatNumber(999999.999996, 6) == "999999.999996");
240230
}
241231

232+
assert(formatNumber(0.6, 1) == "0.6");
233+
assert(formatNumber(0.06, 0) == "0");
234+
assert(formatNumber(0.06, 1) == "0.1");
235+
assert(formatNumber(0.06, 2) == "0.06");
236+
assert(formatNumber(0.06, 3) == "0.06");
237+
assert(formatNumber(9.49999, 0) == "9");
238+
assert(formatNumber(9.49999, 1) == "9.5");
239+
assert(formatNumber(9.6, 0) == "10");
240+
assert(formatNumber(9.6, 1) == "9.6");
241+
assert(formatNumber(99.99, 0) == "100");
242+
assert(formatNumber(99.99, 1) == "100");
243+
assert(formatNumber(99.99, 2) == "99.99");
244+
assert(formatNumber(9999.9996, 3) == "10000");
245+
assert(formatNumber(9999.9996, 4) == "9999.9996");
246+
assert(formatNumber(99999.99996, 4) == "100000");
247+
assert(formatNumber(99999.99996, 5) == "99999.99996");
248+
assert(formatNumber(999999.999996, 5) == "1000000");
249+
assert(formatNumber(999999.999996, 6) == "999999.999996");
250+
242251
/* Turn off precision, the 'human readable' style.
243252
* Note: Remains o if both are zero (first test). If it becomes desirable to support
244253
* turning it off when for the precision equal zero case the simple extension is to
@@ -314,42 +323,51 @@ unittest // formatNumber unit tests
314323
assert(formatNumber(-1234567891234.0, 0) == "-1234567891234");
315324
assert(formatNumber(-1234567891234.0, 1) == "-1234567891234");
316325

317-
// Test round off cases
326+
/* Test round off cases with negative numbers. Note: These tests will not pass
327+
* on Windows 32-bit builds. Use the -m64 flag on Windows to get a 64-bit build.
328+
*
329+
* Note: The first test case does not generate the correct result on Windows
330+
* 64-bit builds. The current Windows result is included both for documentation
331+
* and to provide an alert if the correct result starts getting populated. Both
332+
* formatNumber and the underlying format call are included.
333+
*/
318334
version(Windows)
319335
{
320-
/* Round-off cases don't work properly on Windows. They truncate rather than
321-
* round. May be a DMD specific Windows bug, not clear.
322-
*/
336+
// Incorrect
337+
assert(format("%.*f", 0, -0.6) == "-0");
338+
assert(formatNumber(-0.6, 0) == "-0");
323339
}
324340
else
325341
{
342+
assert(format("%.*f", 0, -0.6) == "-1");
326343
assert(formatNumber(-0.6, 0) == "-1");
327-
assert(formatNumber(-0.6, 1) == "-0.6");
328-
assert(formatNumber(-0.06, 0) == "-0");
329-
assert(formatNumber(-0.06, 1) == "-0.1");
330-
assert(formatNumber(-0.06, 2) == "-0.06");
331-
assert(formatNumber(-0.06, 3) == "-0.06");
332-
assert(formatNumber(-9.49999, 0) == "-9");
333-
assert(formatNumber(-9.49999, 1) == "-9.5");
334-
assert(formatNumber(-9.6, 0) == "-10");
335-
assert(formatNumber(-9.6, 1) == "-9.6");
336-
assert(formatNumber(-99.99, 0) == "-100");
337-
assert(formatNumber(-99.99, 1) == "-100");
338-
assert(formatNumber(-99.99, 2) == "-99.99");
339-
assert(formatNumber(-9999.9996, 3) == "-10000");
340-
assert(formatNumber(-9999.9996, 4) == "-9999.9996");
341-
assert(formatNumber(-99999.99996, 4) == "-100000");
342-
assert(formatNumber(-99999.99996, 5) == "-99999.99996");
343-
assert(formatNumber(-999999.999996, 5) == "-1000000");
344-
assert(formatNumber(-999999.999996, 6) == "-999999.999996");
345-
346-
assert(formatNumber!(double, 0)(-999.123412, 0) == "-999");
347-
assert(formatNumber!(double, 0)(-999.123412, 1) == "-1e+03");
348-
assert(formatNumber!(double, 0)(-999.123412, 2) == "-1e+03");
349-
assert(formatNumber!(double, 0)(-999.123412, 3) == "-999");
350-
assert(formatNumber!(double, 0)(-999.123412, 4) == "-999.1");
351344
}
352345

346+
assert(formatNumber(-0.6, 1) == "-0.6");
347+
assert(formatNumber(-0.06, 0) == "-0");
348+
assert(formatNumber(-0.06, 1) == "-0.1");
349+
assert(formatNumber(-0.06, 2) == "-0.06");
350+
assert(formatNumber(-0.06, 3) == "-0.06");
351+
assert(formatNumber(-9.49999, 0) == "-9");
352+
assert(formatNumber(-9.49999, 1) == "-9.5");
353+
assert(formatNumber(-9.6, 0) == "-10");
354+
assert(formatNumber(-9.6, 1) == "-9.6");
355+
assert(formatNumber(-99.99, 0) == "-100");
356+
assert(formatNumber(-99.99, 1) == "-100");
357+
assert(formatNumber(-99.99, 2) == "-99.99");
358+
assert(formatNumber(-9999.9996, 3) == "-10000");
359+
assert(formatNumber(-9999.9996, 4) == "-9999.9996");
360+
assert(formatNumber(-99999.99996, 4) == "-100000");
361+
assert(formatNumber(-99999.99996, 5) == "-99999.99996");
362+
assert(formatNumber(-999999.999996, 5) == "-1000000");
363+
assert(formatNumber(-999999.999996, 6) == "-999999.999996");
364+
365+
assert(formatNumber!(double, 0)(-999.123412, 0) == "-999");
366+
assert(formatNumber!(double, 0)(-999.123412, 1) == "-1e+03");
367+
assert(formatNumber!(double, 0)(-999.123412, 2) == "-1e+03");
368+
assert(formatNumber!(double, 0)(-999.123412, 3) == "-999");
369+
assert(formatNumber!(double, 0)(-999.123412, 4) == "-999.1");
370+
353371
// Default number printing
354372
assert(formatNumber(-1.2) == "-1.2");
355373
assert(formatNumber(-12.3) == "-12.3");

0 commit comments

Comments
 (0)