Skip to content

Commit ac0d8bf

Browse files
authored
Merge pull request #2968 from ksss/test-strscan-signatures
Add stdlib tests for updated StringScanner signatures
2 parents 1abe17d + 340e1f2 commit ac0d8bf

1 file changed

Lines changed: 382 additions & 0 deletions

File tree

test/stdlib/StringScanner_test.rb

Lines changed: 382 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,382 @@
1+
require_relative "test_helper"
2+
require "strscan"
3+
4+
class StringScannerSingletonTest < Test::Unit::TestCase
5+
include TestHelper
6+
7+
library "strscan"
8+
testing "singleton(::StringScanner)"
9+
10+
def test_new
11+
assert_send_type "(::String) -> ::StringScanner",
12+
StringScanner, :new, "foo"
13+
assert_send_type "(::String, fixed_anchor: bool) -> ::StringScanner",
14+
StringScanner, :new, "foo", fixed_anchor: true
15+
end
16+
17+
def test_must_C_version
18+
assert_send_type "() -> singleton(::StringScanner)",
19+
StringScanner, :must_C_version
20+
end
21+
end
22+
23+
class StringScannerTest < Test::Unit::TestCase
24+
include TestHelper
25+
26+
library "strscan"
27+
testing "::StringScanner"
28+
29+
# A scanner that has already matched a named-capture regexp; every capture
30+
# produced a non-nil String. Use this when you want the "all matched" branch.
31+
def matched_named_scanner
32+
s = StringScanner.new("Fri Dec 12 1975 14:39")
33+
s.scan(/(?<wday>\w+) (?<month>\w+) (?<day>\d+) /)
34+
s
35+
end
36+
37+
# A scanner where a named-capture regexp matched, but some captures were
38+
# optional and resolved to nil. Use this when you want String? value cells.
39+
def partial_named_scanner
40+
s = StringScanner.new("Fri")
41+
s.scan(/(?<wday>\w+)(?<month> \w+)?/)
42+
s
43+
end
44+
45+
# A fresh scanner that has not attempted any match yet.
46+
def unmatched_scanner
47+
StringScanner.new("Fri Dec 12 1975 14:39")
48+
end
49+
50+
def test_inspect
51+
assert_send_type "() -> ::String",
52+
StringScanner.new("foo"), :inspect
53+
end
54+
55+
def test_initialize_copy
56+
assert_send_type "(::StringScanner) -> void",
57+
StringScanner.new("foo"), :initialize_copy, StringScanner.new("bar")
58+
end
59+
60+
def test_left_shift
61+
assert_send_type "(::String) -> ::StringScanner",
62+
StringScanner.new("foo"), :<<, "bar"
63+
end
64+
65+
def test_square_bracket
66+
s = matched_named_scanner
67+
assert_send_type "(::Integer) -> ::String",
68+
s, :[], 0
69+
assert_send_type "(::String) -> ::String",
70+
s, :[], "wday"
71+
assert_send_type "(::Symbol) -> ::String",
72+
s, :[], :wday
73+
assert_send_type "(::Integer) -> nil",
74+
unmatched_scanner, :[], 0
75+
end
76+
77+
def test_beginning_of_line?
78+
assert_send_type "() -> bool",
79+
StringScanner.new("foo"), :beginning_of_line?
80+
end
81+
82+
def test_bol?
83+
assert_send_type "() -> bool",
84+
StringScanner.new("foo"), :bol?
85+
end
86+
87+
def test_captures
88+
assert_send_type "() -> ::Array[::String]",
89+
matched_named_scanner, :captures
90+
assert_send_type "() -> nil",
91+
unmatched_scanner, :captures
92+
end
93+
94+
def test_charpos
95+
assert_send_type "() -> ::Integer",
96+
StringScanner.new("foo"), :charpos
97+
end
98+
99+
def test_check
100+
assert_send_type "(::Regexp) -> ::String",
101+
StringScanner.new("foo"), :check, /foo/
102+
assert_send_type "(::String) -> ::String",
103+
StringScanner.new("foo"), :check, "foo"
104+
assert_send_type "(::Regexp) -> nil",
105+
StringScanner.new("foo"), :check, /nope/
106+
end
107+
108+
def test_check_until
109+
assert_send_type "(::Regexp) -> ::String",
110+
StringScanner.new("foobar"), :check_until, /bar/
111+
assert_send_type "(::String) -> ::String",
112+
StringScanner.new("foobar"), :check_until, "bar"
113+
assert_send_type "(::Regexp) -> nil",
114+
StringScanner.new("foobar"), :check_until, /nope/
115+
end
116+
117+
def test_concat
118+
assert_send_type "(::String) -> ::StringScanner",
119+
StringScanner.new("foo"), :concat, "bar"
120+
end
121+
122+
def test_eos?
123+
assert_send_type "() -> bool",
124+
StringScanner.new("foo"), :eos?
125+
end
126+
127+
def test_exist?
128+
assert_send_type "(::Regexp) -> ::Integer",
129+
StringScanner.new("foobar"), :exist?, /bar/
130+
assert_send_type "(::String) -> ::Integer",
131+
StringScanner.new("foobar"), :exist?, "bar"
132+
assert_send_type "(::Regexp) -> nil",
133+
StringScanner.new("foobar"), :exist?, /nope/
134+
end
135+
136+
def test_fixed_anchor?
137+
assert_send_type "() -> bool",
138+
StringScanner.new("foo"), :fixed_anchor?
139+
end
140+
141+
def test_get_byte
142+
assert_send_type "() -> ::String",
143+
StringScanner.new("foo"), :get_byte
144+
assert_send_type "() -> nil",
145+
StringScanner.new(""), :get_byte
146+
end
147+
148+
def test_getch
149+
assert_send_type "() -> ::String",
150+
StringScanner.new("foo"), :getch
151+
assert_send_type "() -> nil",
152+
StringScanner.new(""), :getch
153+
end
154+
155+
def test_match?
156+
assert_send_type "(::Regexp) -> ::Integer",
157+
StringScanner.new("foo"), :match?, /foo/
158+
assert_send_type "(::String) -> ::Integer",
159+
StringScanner.new("foo"), :match?, "foo"
160+
assert_send_type "(::Regexp) -> nil",
161+
StringScanner.new("foo"), :match?, /nope/
162+
end
163+
164+
def test_matched
165+
assert_send_type "() -> ::String",
166+
matched_named_scanner, :matched
167+
assert_send_type "() -> nil",
168+
unmatched_scanner, :matched
169+
end
170+
171+
def test_matched?
172+
assert_send_type "() -> bool",
173+
matched_named_scanner, :matched?
174+
assert_send_type "() -> bool",
175+
unmatched_scanner, :matched?
176+
end
177+
178+
def test_matched_size
179+
assert_send_type "() -> ::Integer",
180+
matched_named_scanner, :matched_size
181+
assert_send_type "() -> nil",
182+
unmatched_scanner, :matched_size
183+
end
184+
185+
def test_named_captures
186+
assert_send_type "() -> ::Hash[::String, ::String]",
187+
matched_named_scanner, :named_captures
188+
assert_send_type "() -> ::Hash[::String, ::String?]",
189+
partial_named_scanner, :named_captures
190+
end
191+
192+
def test_peek
193+
assert_send_type "(::Integer) -> ::String",
194+
StringScanner.new("foo"), :peek, 3
195+
end
196+
197+
def test_peek_byte
198+
assert_send_type "() -> ::Integer",
199+
StringScanner.new("foo"), :peek_byte
200+
assert_send_type "() -> nil",
201+
StringScanner.new(""), :peek_byte
202+
end
203+
204+
def test_pointer
205+
assert_send_type "() -> ::Integer",
206+
StringScanner.new("foo"), :pointer
207+
end
208+
209+
def test_pointer=
210+
assert_send_type "(::Integer) -> ::Integer",
211+
StringScanner.new("foo"), :pointer=, 0
212+
end
213+
214+
def test_pos
215+
assert_send_type "() -> ::Integer",
216+
StringScanner.new("foo"), :pos
217+
end
218+
219+
def test_pos=
220+
assert_send_type "(::Integer) -> ::Integer",
221+
StringScanner.new("foo"), :pos=, 0
222+
end
223+
224+
def test_post_match
225+
assert_send_type "() -> ::String",
226+
matched_named_scanner, :post_match
227+
assert_send_type "() -> nil",
228+
unmatched_scanner, :post_match
229+
end
230+
231+
def test_pre_match
232+
assert_send_type "() -> ::String",
233+
matched_named_scanner, :pre_match
234+
assert_send_type "() -> nil",
235+
unmatched_scanner, :pre_match
236+
end
237+
238+
def test_reset
239+
assert_send_type "() -> ::StringScanner",
240+
StringScanner.new("foo"), :reset
241+
end
242+
243+
def test_rest
244+
assert_send_type "() -> ::String",
245+
StringScanner.new("foo"), :rest
246+
end
247+
248+
def test_rest?
249+
assert_send_type "() -> bool",
250+
StringScanner.new("foo"), :rest?
251+
end
252+
253+
def test_rest_size
254+
assert_send_type "() -> ::Integer",
255+
StringScanner.new("foo"), :rest_size
256+
end
257+
258+
def test_scan
259+
assert_send_type "(::Regexp) -> ::String",
260+
StringScanner.new("foo"), :scan, /foo/
261+
assert_send_type "(::String) -> ::String",
262+
StringScanner.new("foo"), :scan, "foo"
263+
assert_send_type "(::Regexp) -> nil",
264+
StringScanner.new("foo"), :scan, /nope/
265+
end
266+
267+
def test_scan_byte
268+
assert_send_type "() -> ::Integer",
269+
StringScanner.new("foo"), :scan_byte
270+
assert_send_type "() -> nil",
271+
StringScanner.new(""), :scan_byte
272+
end
273+
274+
def test_scan_full
275+
assert_send_type "(::Regexp, bool, true) -> ::String",
276+
StringScanner.new("foo"), :scan_full, /foo/, true, true
277+
assert_send_type "(::String, bool, true) -> ::String",
278+
StringScanner.new("foo"), :scan_full, "foo", false, true
279+
assert_send_type "(::Regexp, bool, true) -> nil",
280+
StringScanner.new("foo"), :scan_full, /nope/, true, true
281+
assert_send_type "(::Regexp, bool, false) -> ::Integer",
282+
StringScanner.new("foo"), :scan_full, /foo/, true, false
283+
assert_send_type "(::String, bool, false) -> ::Integer",
284+
StringScanner.new("foo"), :scan_full, "foo", false, false
285+
assert_send_type "(::Regexp, bool, false) -> nil",
286+
StringScanner.new("foo"), :scan_full, /nope/, true, false
287+
end
288+
289+
def test_scan_integer
290+
assert_send_type "() -> ::Integer",
291+
StringScanner.new("123abc"), :scan_integer
292+
assert_send_type "(base: ::Integer) -> ::Integer",
293+
StringScanner.new("0xff"), :scan_integer, base: 16
294+
assert_send_type "() -> nil",
295+
StringScanner.new("abc"), :scan_integer
296+
end
297+
298+
def test_scan_until
299+
assert_send_type "(::Regexp) -> ::String",
300+
StringScanner.new("foobar"), :scan_until, /bar/
301+
assert_send_type "(::String) -> ::String",
302+
StringScanner.new("foobar"), :scan_until, "bar"
303+
assert_send_type "(::Regexp) -> nil",
304+
StringScanner.new("foobar"), :scan_until, /nope/
305+
end
306+
307+
def test_search_full
308+
assert_send_type "(::Regexp, bool, true) -> ::String",
309+
StringScanner.new("foobar"), :search_full, /bar/, true, true
310+
assert_send_type "(::String, bool, true) -> ::String",
311+
StringScanner.new("foobar"), :search_full, "bar", false, true
312+
assert_send_type "(::Regexp, bool, true) -> nil",
313+
StringScanner.new("foobar"), :search_full, /nope/, true, true
314+
assert_send_type "(::Regexp, bool, false) -> ::Integer",
315+
StringScanner.new("foobar"), :search_full, /bar/, true, false
316+
assert_send_type "(::String, bool, false) -> ::Integer",
317+
StringScanner.new("foobar"), :search_full, "bar", false, false
318+
assert_send_type "(::Regexp, bool, false) -> nil",
319+
StringScanner.new("foobar"), :search_full, /nope/, true, false
320+
end
321+
322+
def test_size
323+
assert_send_type "() -> ::Integer",
324+
matched_named_scanner, :size
325+
assert_send_type "() -> nil",
326+
unmatched_scanner, :size
327+
end
328+
329+
def test_skip
330+
assert_send_type "(::Regexp) -> ::Integer",
331+
StringScanner.new("foo"), :skip, /foo/
332+
assert_send_type "(::String) -> ::Integer",
333+
StringScanner.new("foo"), :skip, "foo"
334+
assert_send_type "(::Regexp) -> nil",
335+
StringScanner.new("foo"), :skip, /nope/
336+
end
337+
338+
def test_skip_until
339+
assert_send_type "(::Regexp) -> ::Integer",
340+
StringScanner.new("foobar"), :skip_until, /bar/
341+
assert_send_type "(::String) -> ::Integer",
342+
StringScanner.new("foobar"), :skip_until, "bar"
343+
assert_send_type "(::Regexp) -> nil",
344+
StringScanner.new("foobar"), :skip_until, /nope/
345+
end
346+
347+
def test_string
348+
assert_send_type "() -> ::String",
349+
StringScanner.new("foo"), :string
350+
end
351+
352+
def test_string=
353+
assert_send_type "(::String) -> ::String",
354+
StringScanner.new("foo"), :string=, "bar"
355+
end
356+
357+
def test_terminate
358+
assert_send_type "() -> ::StringScanner",
359+
StringScanner.new("foo"), :terminate
360+
end
361+
362+
def test_unscan
363+
# unscan raises StringScanner::Error unless there was a prior match,
364+
# so we have to scan something first.
365+
s = StringScanner.new("foo")
366+
s.scan(/foo/)
367+
assert_send_type "() -> ::StringScanner",
368+
s, :unscan
369+
end
370+
371+
def test_values_at
372+
s = matched_named_scanner
373+
assert_send_type "(::Integer) -> ::Array[::String]",
374+
s, :values_at, 0
375+
assert_send_type "(::String) -> ::Array[::String]",
376+
s, :values_at, "wday"
377+
assert_send_type "(::Symbol) -> ::Array[::String]",
378+
s, :values_at, :wday
379+
assert_send_type "(::Integer) -> nil",
380+
unmatched_scanner, :values_at, 0
381+
end
382+
end

0 commit comments

Comments
 (0)