@@ -9,7 +9,8 @@ describe StringScanner do
99 s.scan(' ' ).should eq(" " )
1010 s.scan(" is " ).should eq(" is " )
1111 s.scan(/\w +\s / ).should eq(" a " )
12- s.scan(/\w +/ ).should eq(" string" )
12+ s.scan(2 ).should eq(" st" )
13+ s.scan(/\w +/ ).should eq(" ring" )
1314 end
1415
1516 it " returns nil if it can't match from the offset" do
@@ -18,8 +19,28 @@ describe StringScanner do
1819 s.scan(/\w +/ ).should be_nil
1920 s.scan('s' ).should be_nil
2021 s.scan(" string" ).should be_nil
21- s.scan(/\s\w +/ ).should_not be_nil # => " string"
22- s.scan(/.*/ ).should_not be_nil # => ""
22+ s.scan(/\s\w\w / ).should_not be_nil # => " string"
23+ s.scan(4 ).should eq(" ring" )
24+ s.scan(/.*/ ).should_not be_nil # => ""
25+ s.scan(1 ).should be_nil
26+ end
27+
28+ it " errors on negative ints" do
29+ s = StringScanner .new(" testy mctesterson" )
30+ s.scan(10 )
31+ expect_raises(ArgumentError , " Negative lookahead count: -10" ) { s.scan(-10 ) }
32+ end
33+
34+ it " works on multi-byte strings" do
35+ s = StringScanner .new(" テストの文字列" )
36+ s.scan(/\w\w\w / ).should eq(" テスト" )
37+ s.scan(/[a-z] +/ ).should be_nil
38+ s.scan('ト' ).should be_nil
39+ s.scan('の' ).should eq(" の" )
40+ s.scan(10 ).should be_nil
41+ s.scan(2 ).should eq(" 文字" )
42+ s.scan(" 不在" ).should be_nil
43+ s.scan(" 列" ).should eq(" 列" )
2344 end
2445 end
2546
@@ -44,27 +65,79 @@ describe StringScanner do
4465 end
4566
4667 describe " #skip" do
47- it " advances the offset but does not returns the string matched" do
48- s = StringScanner .new(" this is a string" )
68+ describe " with single byte strings" do
69+ it " advances the offset but does not return the string matched" do
70+ s = StringScanner .new(" this is a string" )
71+
72+ s.skip(/\w +\s / ).should eq(5 )
73+ s.offset.should eq(5 )
74+ s[0 ]?.should eq(" this " )
75+
76+ s.skip(/\d +/ ).should be_nil
77+ s.offset.should eq(5 )
78+ s[0 ]?.should be_nil
79+
80+ s.skip('i' ).should eq(1 )
81+ s.offset.should eq(6 )
82+ s[0 ]?.should eq(" i" )
83+
84+ s.skip(" s " ).should eq(2 )
85+ s.offset.should eq(8 )
86+ s[0 ]?.should eq(" s " )
87+
88+ s.skip(/\w +\s / ).should eq(2 )
89+ s.offset.should eq(10 )
90+ s[0 ]?.should eq(" a " )
91+
92+ s.skip(5 ).should eq(5 )
93+ s.offset.should eq(15 )
94+ s[0 ]?.should eq(" strin" )
95+
96+ s.skip(100 ).should be_nil
97+ s.skip(2 ).should be_nil
98+ s.skip(1 ).should eq(1 )
99+ s.skip(1 ).should be_nil
100+ s.skip(0 ).should eq(0 )
101+ end
102+ end
49103
50- s.skip( / \w + \s / ).should eq( 5 )
51- s. offset.should eq( 5 )
52- s[ 0 ]?.should_not be_nil
104+ describe " with multibyte strings " do
105+ it " advances the offset but does not return the string matched " do
106+ s = StringScanner .new( " これは文字列である " )
53107
54- s.skip(/\d +/ ).should be_nil
55- s.offset.should eq(5 )
108+ s.skip(/\w\w\w / ).should eq(3 )
109+ s.offset.should eq(3 )
110+ s[0 ]?.should eq(" これは" )
56111
57- s.skip('i' ).should eq( 1 )
58- s.offset.should eq(6 )
112+ s.skip(/ \d +/ ).should be_nil
113+ s.offset.should eq(3 )
59114
60- s.skip(" s " ).should eq(2 )
61- s.offset.should eq(8 )
115+ s.skip(100 ).should be_nil
62116
63- s.skip(/\w +\s / ).should eq(2 )
64- s.offset.should eq(10 )
117+ s.skip(" 文字" ).should eq(2 )
118+ s.offset.should eq(5 )
119+ s[0 ]?.should eq(" 文字" )
65120
66- s.skip(/\w +/ ).should eq(6 )
67- s.offset.should eq(16 )
121+ s.skip('列' ).should eq(1 )
122+ s.offset.should eq(6 )
123+ s[0 ]?.should eq(" 列" )
124+
125+ s.skip(2 ).should eq(2 )
126+ s.offset.should eq(8 )
127+ s[0 ]?.should eq(" であ" )
128+
129+ s.skip(2 ).should be_nil
130+ s.skip(0 ).should eq(0 )
131+ s[0 ]?.should eq(" " )
132+
133+ s.skip(1 ).should eq(1 )
134+ s[0 ]?.should eq(" る" )
135+
136+ s.eos?.should be_true
137+ s.skip(1 ).should be_nil
138+ s.skip(0 ).should eq(0 )
139+ s[0 ]?.should eq(" " )
140+ end
68141 end
69142 end
70143
@@ -106,19 +179,35 @@ describe StringScanner do
106179
107180 s.check(/\w +\s / ).should eq(" is " )
108181 s.offset.should eq(5 )
182+ s[0 ].should eq(" is " )
183+
109184 s.check(/\w +\s / ).should eq(" is " )
110185 s.offset.should eq(5 )
186+ s[0 ].should eq(" is " )
187+
111188 s.check('i' ).should eq(" i" )
112189 s.offset.should eq(5 )
113- s.check(" is " ).should eq(" is " )
190+ s[0 ].should eq(" i" )
191+
192+ s.check(" is a str" ).should eq(" is a str" )
193+ s.offset.should eq(5 )
194+ s[0 ].should eq(" is a str" )
195+
196+ s.check(4 ).should eq(" is a" )
114197 s.offset.should eq(5 )
198+ s[0 ].should eq(" is a" )
199+
200+ s.check(100 ).should be_nil
201+ s.offset.should eq(5 )
202+ s[0 ]?.should be_nil
115203 end
116204
117205 it " returns nil if it can't match from the offset" do
118206 s = StringScanner .new(" test string" )
119207 s.check(/\d +/ ).should be_nil
120208 s.check('0' ).should be_nil
121209 s.check(" 01" ).should be_nil
210+ s.check(100 ).should be_nil
122211 end
123212 end
124213
0 commit comments