1require_relative 'test_optparse'
2
3class TestOptionParser::Acceptable < TestOptionParser
4
5  def setup
6    super
7    @opt.def_option("--integer VAL", Integer) { |v| @integer = v }
8    @opt.def_option("--float VAL",   Float)   { |v| @float   = v }
9    @opt.def_option("--numeric VAL", Numeric) { |v| @numeric = v }
10
11    @opt.def_option("--decimal-integer VAL",
12                    OptionParser::DecimalInteger) { |i| @decimal_integer = i }
13    @opt.def_option("--octal-integer VAL",
14                    OptionParser::OctalInteger)   { |i| @octal_integer   = i }
15    @opt.def_option("--decimal-numeric VAL",
16                    OptionParser::DecimalNumeric) { |i| @decimal_numeric = i }
17  end
18
19  def test_integer
20    assert_equal(%w"", no_error {@opt.parse!(%w"--integer 0")})
21    assert_equal(0, @integer)
22
23    assert_equal(%w"", no_error {@opt.parse!(%w"--integer 0b10")})
24    assert_equal(2, @integer)
25
26    assert_equal(%w"", no_error {@opt.parse!(%w"--integer 077")})
27    assert_equal(63, @integer)
28
29    assert_equal(%w"", no_error {@opt.parse!(%w"--integer 10")})
30    assert_equal(10, @integer)
31
32    assert_equal(%w"", no_error {@opt.parse!(%w"--integer 0x3")})
33    assert_equal(3, @integer)
34
35    assert_raises(OptionParser::InvalidArgument) do
36      @opt.parse!(%w"--integer 0b")
37    end
38
39    assert_raises(OptionParser::InvalidArgument) do
40      @opt.parse!(%w"--integer 09")
41    end
42
43    assert_raises(OptionParser::InvalidArgument) do
44      @opt.parse!(%w"--integer 0x")
45    end
46
47    assert_raises(OptionParser::InvalidArgument) do
48      @opt.parse!(%w"--integer 1234xyz")
49    end
50  end
51
52  def test_float
53    assert_equal(%w"", no_error {@opt.parse!(%w"--float 0")})
54    assert_in_epsilon(0.0, @float)
55
56    assert_equal(%w"", no_error {@opt.parse!(%w"--float 0.0")})
57    assert_in_epsilon(0.0, @float)
58
59    assert_equal(%w"", no_error {@opt.parse!(%w"--float 1.2")})
60    assert_in_epsilon(1.2, @float)
61
62    assert_equal(%w"", no_error {@opt.parse!(%w"--float 1E2")})
63    assert_in_epsilon(100, @float)
64
65    assert_equal(%w"", no_error {@opt.parse!(%w"--float 1E-2")})
66    assert_in_epsilon(0.01, @float)
67
68    assert_raises(OptionParser::InvalidArgument) do
69      @opt.parse!(%w"--float 0e")
70    end
71
72    assert_raises(OptionParser::InvalidArgument) do
73      @opt.parse!(%w"--float 1.234xyz")
74    end
75  end
76
77  def test_numeric
78    assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 0")})
79    assert_equal(0, @numeric)
80
81    assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 0/1")})
82    assert_equal(0, @numeric)
83
84    assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 1/2")})
85    assert_equal(Rational(1, 2), @numeric)
86
87    assert_equal(%w"", no_error {@opt.parse!(%w"--numeric 1.2/2.3")})
88    assert_equal(Rational(12, 23), @numeric)
89
90    assert_raises(OptionParser::InvalidArgument) do
91      @opt.parse!(%w"--numeric 1/")
92    end
93
94    assert_raises(OptionParser::InvalidArgument) do
95      @opt.parse!(%w"--numeric 12/34xyz")
96    end
97
98    assert_raises(OptionParser::InvalidArgument) do
99      @opt.parse!(%w"--numeric 12x/34yz")
100    end
101  end
102
103  def test_decimal_integer
104    assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-integer 0")})
105    assert_equal(0, @decimal_integer)
106
107    assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-integer 10")})
108    assert_equal(10, @decimal_integer)
109
110    assert_raises(OptionParser::InvalidArgument) do
111      @opt.parse!(%w"--decimal-integer 0b1")
112    end
113
114    e = assert_raises(OptionParser::InvalidArgument) do
115      @opt.parse!(%w"--decimal-integer 09")
116    end
117
118    assert_equal("invalid argument: --decimal-integer 09", e.message)
119
120    assert_raises(OptionParser::InvalidArgument) do
121      @opt.parse!(%w"--decimal-integer x")
122    end
123
124    assert_raises(OptionParser::InvalidArgument) do
125      @opt.parse!(%w"--decimal-integer 1234xyz")
126    end
127  end
128
129  def test_octal_integer
130    assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 0")})
131    assert_equal(0, @octal_integer)
132
133    assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 6")})
134    assert_equal(6, @octal_integer)
135
136    assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 07")})
137    assert_equal(7, @octal_integer)
138
139    assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 10")})
140    assert_equal(8, @octal_integer)
141
142    assert_equal(%w"", no_error {@opt.parse!(%w"--octal-integer 011")})
143    assert_equal(9, @octal_integer)
144
145    assert_raises(OptionParser::InvalidArgument) do
146      @opt.parse!(%w"--octal-integer 09")
147    end
148
149    assert_raises(OptionParser::InvalidArgument) do
150      @opt.parse!(%w"--octal-integer 0b1")
151    end
152
153    assert_raises(OptionParser::InvalidArgument) do
154      @opt.parse!(%w"--octal-integer x")
155    end
156
157    assert_raises(OptionParser::InvalidArgument) do
158      @opt.parse!(%w"--octal-integer 01234xyz")
159    end
160  end
161
162  def test_decimal_numeric
163    assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 0")})
164    assert_equal(0, @decimal_numeric)
165
166    assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 01")})
167    assert_equal(1, @decimal_numeric)
168
169    assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 1.2")})
170    assert_in_delta(1.2, @decimal_numeric)
171
172    assert_equal(%w"", no_error {@opt.parse!(%w"--decimal-numeric 1E2")})
173    assert_in_delta(100.0, @decimal_numeric)
174
175    assert_raises(OptionParser::InvalidArgument) do
176      @opt.parse!(%w"--decimal-numeric 0b1")
177    end
178
179    e = assert_raises(OptionParser::InvalidArgument) do
180      @opt.parse!(%w"--decimal-numeric 09")
181    end
182
183    assert_equal("invalid argument: --decimal-numeric 09", e.message)
184
185    assert_raises(OptionParser::InvalidArgument) do
186      @opt.parse!(%w"--decimal-integer 1234xyz")
187    end
188
189    assert_raises(OptionParser::InvalidArgument) do
190      @opt.parse!(%w"--decimal-integer 12.34xyz")
191    end
192  end
193
194end
195
196