sprint
Version:
Complex sprintf() implementation
180 lines (177 loc) • 5.86 kB
text/coffeescript
assert = require 'assert'
{sprint} = require '../lib/sprint'
i = 0
test = (args..., expect, message) ->
try
assert.equal sprint(args...), expect, message
catch e
console.log "Expected: #{expect}"
console.log "Got: #{sprint args...}"
throw e
console.log sprint '%04.3d: OK %s', ++i, message
test 'Message', 'Message',
'sprintf() without arguments'
test '%$s %6. 6s %6.6 s', '%$s %6. 6s %6.6 s',
'Invalid % values should be ignored by RegExp'
test '%s', '%s', '%s',
'%s as value shouldn\'t be affected by sprintf()'
test '%s', '',
'Not found values should be replaced with nothing.'
test 'undefined',
'undefined should be undefined'
test '%.2s', 'string', 'st',
'String precision'
test '%%%%', '%%',
'%% should be changed to %'
test '%s %s', ['a', 'b'], 'a b',
'Array with sprint()'
test '%r', ['a', 'b'], '["a","b"]',
'Representation'
test '<%r>', a: 'b', '<{"a":"b"}>',
'Object representation'
test '%d', 404, '404',
'%d format'
test '%2$d %1$d', 1, 2, '2 1',
'Numbered parameters'
test '%3$d %s %2$d %s %s', 1, 2, 3, '3 1 2 2 3',
'Numbered paramters with normal parameters'
test '%+d %+d', 1, -2, '+1 -2',
'%+ modifier'
test '<% d> % d', 3, -4, '< 3> -4',
'<% > modifier (space)'
test '%+ d % +d', 2, 3.14, '+2 +3',
'<% > and %+ modifier at once.'
test '%d', 123456.789, '123456',
"%d format shouldn't round"
test '%d', -0, '0',
"%d shouldn't represent negative 0"
test '%-03.2d', 1, '01 ',
'Left align + length + precision'
test '%+.*d', 0, 0, '+',
'+ with 0'
test '%u %u', 3, -3, '3 4294967293',
'%u should be unsigned'
test '%03.2u', 1, ' 01',
'%u modifier with width and precision'
test '%i', 3.14, '3',
'%i alias for %d format'
test '%5s', 'test', ' test',
'Padding'
test '%-5s', 'test', 'test ',
'Padding left'
test '%5d', 1234, ' 1234',
'Padding numbers'
test '%05d', 1234, '01234',
'Padding using "0" characters'
test '%-05d %-05s', 1234, 'abc', '1234 abc ',
'Padding left using "0" characters'
test '%*.*f', 6, 1, 12.34, ' 12.3',
'Star (*) operator'
test '%3$0*1$.*2$f', 8, 2, 3.123, '00003.12',
'Star (*) operator with argument number'
test '%3s', 'test', 'test',
'Length smaller than string'
test '%4s', 'test', 'test',
'Length equal to string length'
test '%I32d %hhd %hhd %hhd', [42, 257, 128, 129], '42 1 -128 -127',
'Type argument'
test '%f', 3.14, '3.140000',
'Floats'
test '%.0f', 0, '0',
'Floats and 0'
test '%.0f', Math.pow(2, 38), '274877906944',
'Very big floats'
test '%.1f', 3.14, '3.1',
'Accuracy'
test '%.1f', 3.16, '3.2',
'Rounding'
test '%4.1f %.0f %.0f', 4.123, 0.6, -0.6, ' 4.1 1 -1',
'Width and accuracy together'
test '%#.0f %.0f', 4.1, 4.1, '4. 4',
'Force floating dot'
test '%f %#.0f', -4.2, -4.3, '-4.200000 -4.',
'Negative numbers'
test '%#.0f', Infinity, 'infinity',
'Infinity constant'
test '%e %E', 1, 2.14, '1.000000e+000 2.140000E+000',
'Exponential notation'
test '%.0e', 1000, '1e+003',
'1000 > 1e+003'
test '%.3e', 3.1234, '3.123e+000',
'Exponential accuracy'
test '%.0e %#.0e', 3.55, 3.55, '4e+000 4.e+000',
'Exponential floating dot'
test '%#e', NaN, 'nan',
'NaN constant in exponential notation.'
test '%e', 0.1234567e-101, '1.234567e-102',
'Very small numbers.'
test '%g %g', 3, 3.14, '3 3.14',
'%g format'
test '%g %.1g', 0.0000001, 10, '1e-007 1e+001',
'%g modifier with exponential notation'
test '%g %g', NaN, Infinity, 'nan infinity',
'NaN and Infinity with %g modifier.'
test '%#.1g %#g', 3.01, 3, '3. 3.',
'%g with force floating dot'
test '%g', 0, '0',
'Positive 0'
test '%g', -0, '-0',
'Negative 0'
test '%G %G', NaN, Infinity, 'NAN INFINITY',
'Uppercase NaN and Infinity'
test '%G', 0.0000001, '1E-007',
'Uppercase exponential notation'
test '%x %X', 0xA, 0xFF, 'a FF',
'Hexadecimal numbers'
test '%#x %#X', 0xABCD, 0xDEF004242, '0xabcd 0XDEF004242',
'Hexadecimal numbers with prefixes'
test '%0#6.3x', 18, ' 0x012',
'Precision + prefix with 0'
test '%.3X', 11, '00B',
'Hex 0-padded'
test '%X', -1, 'FFFFFFFF',
'Negative numbers'
# Octal is intentionally used in those two tests
test '%o %O', 0o755, 0o312, '755 312',
'Octal numbers'
test '%#o %#O', 0o123, 0o12345671234567, '0123 012345671234567',
'Octal numbers with prefixes'
test '%4o %4.3o', 0o22, 0o22, ' 22 022',
'Octal precision'
# End of intentional octal numbers
test '%b %B', 255, 256, '11111111 100000000',
'Binary numbers'
test '%#b %#B', 12, 18, '0b1100 0B10010',
'Binary numbers with prefixes'
test '%06.5b', 12, ' 01100',
'0 flag with precision should round to precision.'
test '%.5b', 12, '01100',
'Binary numbers with precision bigger than length'
test '%.0b %+.0b % .0b %-.0b', 0, 0, 0, 0, ' + ',
'0 with 0 precision'
test '%#3.0b %#3.4b', 1, 1, '0b1 0b0001',
'Precision and prefix at once.'
test '%c', 0x21, '!',
'%c format'
test '%c', "\x00",
'%c format without argument'
test '%1$3c %1$03c', 65, ' A 00A',
'%c format with width specified'
test '%vd %vd', "AB\u0100", "\x01\x02\x03", '65.66.256 1.2.3',
'Vector flag'
test '%*vX', ':', "\x42\x42", '42:42',
'Custom separator character'
test '%2$*1$vd', ':', "\x7F\x00\x00\x01", '127:0:0:1',
'Vector flag with custom separator on specified position'
test '%#v.8b', "\x61\x00\x62", '0b01100001.00000000.0b01100010',
'Binary vectors'
test '%v.0o', "\x01\x00\x02\x00", '1..2.',
'Octal vectors'
test '%#v.0o', "\x01\x00\x02\x00", '01.0.02.0',
'Octal vectors with prefix'
test '%vs', 'Hello', '72.101.108.108.111',
'Octal strings'
test '%vc', 'Hello', 'H.e.l.l.o',
'Octal characters'
test '%*2147483647$v2d', '', '',
'Invalid octal parameter'