diff --git a/pkgs/mruby/.rubocop.yml b/pkgs/mruby/.rubocop.yml index 2edecbf..47331f5 100644 --- a/pkgs/mruby/.rubocop.yml +++ b/pkgs/mruby/.rubocop.yml @@ -25,6 +25,10 @@ Metrics/BlockLength: - 'Rakefile' - 'test/**/*.rb' +Security/YAMLLoad: + Exclude: + - 'test/**/*.rb' + Style/AndOr: EnforcedStyle: conditionals diff --git a/pkgs/mruby/mrbgem.rake b/pkgs/mruby/mrbgem.rake index a1dd9c4..59150f6 100644 --- a/pkgs/mruby/mrbgem.rake +++ b/pkgs/mruby/mrbgem.rake @@ -11,7 +11,9 @@ MRuby::Gem::Specification.new 'mruby-kernaux' do |spec| Binding to libkernaux - auxiliary library for kernel development. DESCRIPTION + spec.add_test_dependency 'mruby-io' spec.add_test_dependency 'mruby-random' + spec.add_test_dependency 'mruby-yaml' spec.linker.libraries << 'kernaux' end diff --git a/pkgs/mruby/mrblib/kernaux.rb b/pkgs/mruby/mrblib/kernaux.rb index ce043f7..3b057e3 100644 --- a/pkgs/mruby/mrblib/kernaux.rb +++ b/pkgs/mruby/mrblib/kernaux.rb @@ -1,8 +1,32 @@ +## +# Binding to [libkernaux](https://github.com/tailix/libkernaux) - auxiliary +# library for kernel development. +# module KernAux DEFAULT_ASSERT_CB = @assert_cb = lambda { |file, line, msg| raise AssertError, "#{file}:#{line}:#{msg}" } + SPRINTF1_BUFFER_SIZE = 10_000 + + def self.sprintf(*args) + args.map do |arg| + if arg.is_a? Array + sprintf1(*arg) + else + arg + end + end.join.freeze + end + + def self.sprintf1(format, *args) + snprintf1(SPRINTF1_BUFFER_SIZE, format, *args).first + end + + def self.snprintf1(_buffer_size, _format, ...) + ['', 0] + end + class Error < RuntimeError; end class AssertError < Error; end end diff --git a/pkgs/mruby/test/sprintf.rb b/pkgs/mruby/test/sprintf.rb new file mode 100644 index 0000000..94da79b --- /dev/null +++ b/pkgs/mruby/test/sprintf.rb @@ -0,0 +1,25 @@ +# TODO: implement this +# rubocop:disable Style/BlockComments +=begin +assert 'KernAux.sprintf' do + [ + ['', 'using regular tests'], + ['_orig', 'using original tests'], + ].each do |(suffix, description)| + assert description do + printf_yml = + File.expand_path("../../../../tests/printf#{suffix}.yml", __FILE__) + + YAML.load(File.read(printf_yml)).each do |test| + expected = test['result'] + args = test['args'] + + assert "transforms #{args.inspect} to #{expected.inspect}" do + assert_equal expected, KernAux.sprintf(*args) + end + end + end + end +end +=end +# rubocop:enable Style/BlockComments diff --git a/pkgs/ruby/lib/kernaux.rb b/pkgs/ruby/lib/kernaux.rb index 7a82f0c..69f64f4 100644 --- a/pkgs/ruby/lib/kernaux.rb +++ b/pkgs/ruby/lib/kernaux.rb @@ -65,7 +65,7 @@ module KernAux ## # Typical `printf`. # - # @param args [Array>] + # @param args [Array, Array<(String, Integer, Object)>>] # @return [String] formatted output # # @example @@ -107,7 +107,7 @@ module KernAux # @param buffer_size [Integer] buffer size (including terminating null # character) # @param format [String] formatting string - # @return [String] formatted output + # @return [Array<(String, Integer)>] formatted output and it's size # # @see .sprintf1 Automatic buffer size ##