Project

General

Profile

Bug #8865 » optparse.rb.accept.2.patch

drbrain (Eric Hodel), 09/05/2013 09:20 AM

View differences:

lib/optparse.rb (working copy)
decimal = '\d+(?:_\d+)*'
binary = 'b[01]+(?:_[01]+)*'
hex = 'x[\da-f]+(?:_[\da-f]+)*'
octal = "0(?:[0-7]*(?:_[0-7]+)*|#{binary}|#{hex})"
octal = "0(?:[0-7]+(?:_[0-7]+)*|#{binary}|#{hex})?"
integer = "#{octal}|#{decimal}"
accept(Integer, %r"\A[-+]?(?:#{integer})"io) {|s,| Integer(s) if s}
#
......
#
# Decimal integer format, to be converted to Integer.
#
DecimalInteger = /\A[-+]?#{decimal}/io
accept(DecimalInteger) {|s,| s.to_i if s}
DecimalInteger = /\A([-+]?#{decimal})/io
accept(DecimalInteger, DecimalInteger) {|s,d|
begin
Integer(d)
rescue ArgumentError
raise OptionParser::InvalidArgument, s
end
}
#
# Ruby/C like octal/hexadecimal/binary integer format, to be converted to
# Integer.
#
OctalInteger = /\A[-+]?(?:[0-7]+(?:_[0-7]+)*|0(?:#{binary}|#{hex}))/io
accept(OctalInteger) {|s,| s.oct if s}
accept(OctalInteger, OctalInteger) {|s,| s.oct if s}
#
# Decimal integer/float number format, to be converted to Integer for
# integer format, Float for float format.
#
DecimalNumeric = floatpat # decimal integer is allowed as float also.
accept(DecimalNumeric) {|s,| eval(s) if s}
accept(DecimalNumeric, floatpat) {|s,|
begin
eval(s)
rescue SyntaxError
raise OptionParser::InvalidArgument, s
end if s
}
#
# Boolean switch, which means whether it is present or not, whether it is
test/optparse/test_acceptable.rb (working copy)
require_relative 'test_optparse'
class TestOptionParser::Acceptable < TestOptionParser
def setup
super
@opt.def_option("--integer VAL", Integer) { |v| @integer = v }
@opt.def_option("--float VAL", Float) { |v| @float = v }
@opt.def_option("--numeric VAL", Numeric) { |v| @numeric = v }
@opt.def_option("--decimal-integer VAL",
OptionParser::DecimalInteger) { |i| @decimal_integer = i }
@opt.def_option("--octal-integer VAL",
OptionParser::OctalInteger) { |i| @octal_integer = i }
@opt.def_option("--decimal-numeric VAL",
OptionParser::DecimalNumeric) { |i| @decimal_numeric = i }
end
def test_integer
assert_equal(%w"", no_error {@opt.parse!(%w"--integer 0")})
assert_equal(0, @integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--integer 0b10")})
assert_equal(2, @integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--integer 077")})
assert_equal(63, @integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--integer 10")})
assert_equal(10, @integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--integer 0x3")})
assert_equal(3, @integer)
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--integer 0b")
end
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--integer 09")
end
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--integer 0x")
end
end
def test_float
assert_equal(%w"", no_error {@opt.parse!(%w"--float 0")})
assert_in_epsilon(0.0, @float)
assert_equal(%w"", no_error {@opt.parse!(%w"--float 0.0")})
assert_in_epsilon(0.0, @float)
assert_equal(%w"", no_error {@opt.parse!(%w"--float 1.2")})
assert_in_epsilon(1.2, @float)
assert_equal(%w"", no_error {@opt.parse!(%w"--float 1E2")})
assert_in_epsilon(100, @float)
assert_equal(%w"", no_error {@opt.parse!(%w"--float 1E-2")})
assert_in_epsilon(0.01, @float)
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--float 0e")
end
end
def test_numeric
assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 0")})
assert_equal(0, @numeric)
assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 0/1")})
assert_equal(0, @numeric)
assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 1/2")})
assert_equal(Rational(1, 2), @numeric)
assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 1.2/2.3")})
assert_equal(Rational(12, 23), @numeric)
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--numeric 1/")
end
end
def test_decimal_integer
assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-integer 0")})
assert_equal(0, @decimal_integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-integer 10")})
assert_equal(10, @decimal_integer)
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--decimal-integer 0b1")
end
e = assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--decimal-integer 09")
end
assert_equal("invalid argument: --decimal-integer 09", e.message)
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--decimal-integer x")
end
end
def test_octal_integer
assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 0")})
assert_equal(0, @octal_integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 6")})
assert_equal(6, @octal_integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 07")})
assert_equal(7, @octal_integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 10")})
assert_equal(8, @octal_integer)
assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 011")})
assert_equal(9, @octal_integer)
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--octal-integer 09")
end
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--octal-integer 0b1")
end
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--octal-integer x")
end
end
def test_decimal_numeric
assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 0")})
assert_equal(0, @decimal_numeric)
assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 01")})
assert_equal(1, @decimal_numeric)
assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 1.2")})
assert_in_delta(1.2, @decimal_numeric)
assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 1E2")})
assert_in_delta(100.0, @decimal_numeric)
assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--decimal-numeric 0b1")
end
e = assert_raises(OptionParser::InvalidArgument) do
@opt.parse!(%w"--decimal-numeric 09")
end
assert_equal("invalid argument: --decimal-numeric 09", e.message)
end
end
(2-2/3)