mirror of
https://github.com/tailix/libkernaux.git
synced 2025-07-07 18:51:58 -04:00
Improve printf bindings for Ruby & mruby (#145)
This commit is contained in:
parent
be761bd9f7
commit
18f3c70c1b
13 changed files with 404 additions and 813 deletions
113
bindings/mruby/test/sprintf.rb
Normal file
113
bindings/mruby/test/sprintf.rb
Normal file
|
@ -0,0 +1,113 @@
|
|||
if KernAux::Version.with_printf?
|
||||
assert 'KernAux.sprintf' do
|
||||
assert 'integers' do
|
||||
assert_equal 'i:0', KernAux.sprintf('i:%i', 0)
|
||||
assert_equal 'u:0', KernAux.sprintf('u:%u', 0)
|
||||
assert_equal 'i:1', KernAux.sprintf('i:%i', 1)
|
||||
assert_equal 'u:1', KernAux.sprintf('u:%u', 1)
|
||||
assert_equal 'i:10', KernAux.sprintf('i:%i', 10)
|
||||
assert_equal 'u:10', KernAux.sprintf('u:%u', 10)
|
||||
assert_equal 'i:100', KernAux.sprintf('i:%i', 100)
|
||||
assert_equal 'u:100', KernAux.sprintf('u:%u', 100)
|
||||
assert_equal 'i:1000', KernAux.sprintf('i:%i', 1000)
|
||||
assert_equal 'u:1000', KernAux.sprintf('u:%u', 1000)
|
||||
assert_equal 'i:10000', KernAux.sprintf('i:%i', 10_000)
|
||||
assert_equal 'u:10000', KernAux.sprintf('u:%u', 10_000)
|
||||
assert_equal 'i:100000', KernAux.sprintf('i:%i', 100_000)
|
||||
assert_equal 'u:100000', KernAux.sprintf('u:%u', 100_000)
|
||||
assert_equal 'i:1000000', KernAux.sprintf('i:%i', 1_000_000)
|
||||
assert_equal 'u:1000000', KernAux.sprintf('u:%u', 1_000_000)
|
||||
assert_equal 'i:10000000', KernAux.sprintf('i:%i', 10_000_000)
|
||||
assert_equal 'u:10000000', KernAux.sprintf('u:%u', 10_000_000)
|
||||
assert_equal 'i:100000000', KernAux.sprintf('i:%i', 10**8)
|
||||
assert_equal 'u:100000000', KernAux.sprintf('u:%u', 10**8)
|
||||
assert_equal 'i:1000000000', KernAux.sprintf('i:%i', 10**9)
|
||||
assert_equal 'u:1000000000', KernAux.sprintf('u:%u', 10**9)
|
||||
assert_equal 'i:2147483647', KernAux.sprintf('i:%i', 2**31 - 1)
|
||||
assert_equal 'u:2147483647', KernAux.sprintf('u:%u', 2**31 - 1)
|
||||
end
|
||||
|
||||
# TODO: test with different boxing
|
||||
# assert 'integer overflows' do
|
||||
# assert_equal 'i:-2147483648', KernAux.sprintf('i:%i', 2**31)
|
||||
# assert_equal 'u: 2147483648', KernAux.sprintf('u: %u', 2**31)
|
||||
# assert_equal 'i:-2147483647', KernAux.sprintf('i:%i', 2**31 + 1)
|
||||
# assert_equal 'u: 2147483649', KernAux.sprintf('u: %u', 2**31 + 1)
|
||||
# assert_equal 'i:-1', KernAux.sprintf('i:%i', 2**32 - 1)
|
||||
# assert_equal 'u: 4294967295', KernAux.sprintf('u: %u', 2**32 - 1)
|
||||
# assert_equal 'i: 0', KernAux.sprintf('i: %i', 2**32)
|
||||
# assert_equal 'u: 0', KernAux.sprintf('u: %u', 2**32)
|
||||
# end
|
||||
|
||||
assert 'when there are too many arguments' do
|
||||
[
|
||||
['Hello!', 'World!'],
|
||||
['Hello, %s!', 'World', 'Alex'],
|
||||
].each do |args|
|
||||
assert_raise ArgumentError, 'too many arguments' do
|
||||
KernAux.sprintf(*args)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assert 'when there are too few arguments' do
|
||||
[
|
||||
[],
|
||||
['Hello, %s!'],
|
||||
['Hello, %*s!', 20],
|
||||
['Hello, %.*s!', 20],
|
||||
['Hello, %*.*s!', 20, 20],
|
||||
].each do |args|
|
||||
assert_raise ArgumentError, 'too few arguments' do
|
||||
KernAux.sprintf(*args)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
[
|
||||
['', 'using regular tests'],
|
||||
['_orig', 'using original tests'],
|
||||
].each do |(suffix, description)|
|
||||
assert description do
|
||||
printf_yml =
|
||||
File.expand_path("../../../../common/printf#{suffix}.yml", __FILE__)
|
||||
|
||||
YAML.load(File.read(printf_yml)).each do |test|
|
||||
expected = test['result']
|
||||
|
||||
format = ''
|
||||
args = []
|
||||
|
||||
test['args'].each do |arg|
|
||||
if arg.is_a? String
|
||||
format += arg
|
||||
else
|
||||
format += arg[0]
|
||||
is_int_format = %w[i d u x X o b].any? { |s| arg[0].include? s }
|
||||
arg[1..].each do |item|
|
||||
if item.is_a? Array
|
||||
if item.length == 1
|
||||
args << item[0]
|
||||
elsif item[0] == 'long long'
|
||||
args << item[1]
|
||||
else
|
||||
raise "Unknown format: #{args.inspect}"
|
||||
end
|
||||
elsif is_int_format && item.is_a?(Float)
|
||||
args << item.round
|
||||
else
|
||||
args << item
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assert "transforms (#{format.inspect}, #{args.inspect[1...-1]}) " \
|
||||
"to #{expected.inspect}" do
|
||||
assert_equal expected, KernAux.sprintf(format, *args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue