Skip to content

Commit 8a1b5a9

Browse files
committed
Add test for new grammars
1 parent 4449004 commit 8a1b5a9

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

test/test_grammar.rb

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
require 'test/unit'
2+
require 'racc/static'
3+
require 'tempfile'
4+
5+
class TestGrammar < Test::Unit::TestCase
6+
private def with_parser(rule)
7+
parser = Racc::GrammarFileParser.new
8+
result = parser.parse(<<"eom", "foo.y")
9+
class MyParser
10+
rule
11+
#{rule}
12+
end
13+
---- header
14+
require 'strscan'
15+
---- inner
16+
def parse(str)
17+
@ss = StringScanner.new(str)
18+
do_parse
19+
end
20+
def next_token
21+
@ss.skip(/\\s+/)
22+
token = @ss.scan(/\\S+/) and [token, token]
23+
end
24+
eom
25+
states = Racc::States.new(result.grammar).nfa
26+
params = result.params.dup
27+
generator = Racc::ParserFileGenerator.new(states, params)
28+
Tempfile.create(%w[y .tab.rb]) do |f|
29+
generator.generate_parser_file(f.path)
30+
require f.path
31+
parser = MyParser.new
32+
yield parser
33+
end
34+
Object.__send__(:remove_const, :MyParser)
35+
end
36+
37+
def test_optional
38+
with_parser("stmt: 'abc'?") do |parser|
39+
assert_equal "abc", parser.parse("abc")
40+
assert_equal nil, parser.parse("")
41+
end
42+
end
43+
44+
def test_many
45+
with_parser("stmt: 'abc'*") do |parser|
46+
assert_equal [], parser.parse("")
47+
assert_equal ["abc"], parser.parse("abc")
48+
assert_equal ["abc", "abc"], parser.parse("abc abc")
49+
assert_equal ["abc", "abc", "abc"], parser.parse("abc abc abc")
50+
end
51+
end
52+
53+
def test_many1
54+
with_parser("stmt: 'abc'+") do |parser|
55+
assert_raise(Racc::ParseError){ parser.parse("") }
56+
assert_equal ["abc"], parser.parse("abc")
57+
assert_equal ["abc", "abc"], parser.parse("abc abc")
58+
assert_equal ["abc", "abc", "abc"], parser.parse("abc abc abc")
59+
end
60+
end
61+
62+
def test_group
63+
with_parser("stmt: ('a')") do |parser|
64+
assert_raise(Racc::ParseError){ parser.parse("") }
65+
assert_equal ["a"], parser.parse("a")
66+
end
67+
68+
with_parser("stmt: ('a' 'b')") do |parser|
69+
assert_raise(Racc::ParseError){ parser.parse("") }
70+
assert_raise(Racc::ParseError){ parser.parse("a") }
71+
assert_equal ["a", "b"], parser.parse("a b")
72+
end
73+
end
74+
75+
def test_group_or
76+
with_parser("stmt: ('a' | 'b')") do |parser|
77+
assert_raise(Racc::ParseError){ parser.parse("") }
78+
assert_equal ["a"], parser.parse("a")
79+
assert_equal ["b"], parser.parse("b")
80+
end
81+
end
82+
83+
def test_group_many
84+
with_parser("stmt: ('a')*") do |parser|
85+
assert_equal [], parser.parse("")
86+
assert_equal [["a"]], parser.parse("a")
87+
assert_equal [["a"], ["a"]], parser.parse("a a")
88+
end
89+
90+
with_parser("start: stmt\n stmt: ('a' 'b')*") do |parser|
91+
assert_equal [], parser.parse("")
92+
assert_equal [["a", "b"]], parser.parse("a b")
93+
assert_equal [["a", "b"], ["a", "b"]], parser.parse("a b a b")
94+
end
95+
end
96+
97+
def test_group_or_many
98+
with_parser("stmt: ('a' | 'b')*") do |parser|
99+
assert_equal [], parser.parse("")
100+
assert_equal [["a"], ["a"]], parser.parse("a a")
101+
assert_equal [["a"], ["b"]], parser.parse("a b")
102+
assert_equal [["a"], ["b"], ["b"], ["a"]], parser.parse("a b b a")
103+
end
104+
end
105+
end

0 commit comments

Comments
 (0)