From b30a98d9b33bd0f6c0702253fccc9dbb80c8ce90 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Fri, 21 Jan 2022 19:38:22 +0500 Subject: [PATCH] Ruby: Add method KernAux.sprintf1 --- pkgs/ruby/lib/kernaux.rb | 16 ++++++++++--- pkgs/ruby/spec/lib/kernaux/sprintf1_spec.rb | 26 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 pkgs/ruby/spec/lib/kernaux/sprintf1_spec.rb diff --git a/pkgs/ruby/lib/kernaux.rb b/pkgs/ruby/lib/kernaux.rb index c02e491..472ce5e 100644 --- a/pkgs/ruby/lib/kernaux.rb +++ b/pkgs/ruby/lib/kernaux.rb @@ -6,18 +6,28 @@ require_relative 'kernaux/version' # Auxiliary library for kernel development. # module KernAux - # Default callback for assertions - DEFAULT_ASSERT_CB = lambda { |file, line, str| + # Default callback for assertions ({.assert_cb}) + DEFAULT_ASSERT_CB = @assert_cb = lambda { |file, line, str| raise AssertError, "#{file}:#{line}:#{str}" } - @assert_cb = DEFAULT_ASSERT_CB + # Buffer size for {.sprintf1} + # @todo make it dynamic + SPRINTF1_BUFFER_SIZE = 10_000 def self.panic(msg) file, line = caller(1..1).first.split(':')[0..1] assert_do file, Integer(line), msg end + def self.sprintf1(format, arg = nil) + if arg.nil? + snprintf1(SPRINTF1_BUFFER_SIZE, format).first + else + snprintf1(SPRINTF1_BUFFER_SIZE, format, arg).first + end + end + ## # Our base class for runtime errors. # diff --git a/pkgs/ruby/spec/lib/kernaux/sprintf1_spec.rb b/pkgs/ruby/spec/lib/kernaux/sprintf1_spec.rb new file mode 100644 index 0000000..13d32f6 --- /dev/null +++ b/pkgs/ruby/spec/lib/kernaux/sprintf1_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe KernAux, '.sprintf1' do + context 'with 1 argument' do + subject(:sprintf1) { described_class.sprintf1 format } + + let(:format) { '%%' } + + it { is_expected.to be_instance_of String } + it { is_expected.to be_frozen } + it { is_expected.to eq described_class.snprintf1(1000, format).first } + end + + context 'with 2 argument' do + subject(:sprintf1) { described_class.sprintf1 format, arg } + + let(:format) { '%s' } + let(:arg) { 'Hello, World!' } + + it { is_expected.to be_instance_of String } + it { is_expected.to be_frozen } + it { is_expected.to eq described_class.snprintf1(1000, format, arg).first } + end +end