@@ -11,5 +11,115 @@ def test_parse
1111 parser = Racc ::GrammarFileParser . new ( debug_flags )
1212 parser . parse ( File . read ( file ) , File . basename ( file ) )
1313 end
14+
15+ def parse_grammar ( grammar_source )
16+ debug_flags = Racc ::DebugFlags . parse_option_string ( '' )
17+ parser = Racc ::GrammarFileParser . new ( debug_flags )
18+ parser . parse ( grammar_source , 'test.y' )
19+ end
20+
21+ def test_no_result_var_with_many_operator
22+ grammar_source = <<~GRAMMAR
23+ class TestParser
24+ options no_result_var
25+
26+ rule
27+ root
28+ : 'a' 'b'*
29+ GRAMMAR
30+
31+ result = parse_grammar ( grammar_source )
32+
33+ assert_equal false , result . params . result_var?
34+
35+ actions = result . grammar . each_rule . filter_map { |rule | rule . action . source &.text }
36+ actions . each do |action |
37+ refute_match ( /\A result\s *=/ , action , "Action should not start with 'result =' when no_result_var is set" )
38+ end
39+ end
40+
41+ def test_no_result_var_with_many1_operator
42+ grammar_source = <<~GRAMMAR
43+ class TestParser
44+ options no_result_var
45+
46+ rule
47+ root
48+ : 'a' 'b'+
49+ GRAMMAR
50+
51+ result = parse_grammar ( grammar_source )
52+
53+ assert_equal false , result . params . result_var?
54+
55+ actions = result . grammar . each_rule . filter_map { |rule | rule . action . source &.text }
56+ actions . each do |action |
57+ refute_match ( /\A result\s *=/ , action , "Action should not start with 'result =' when no_result_var is set" )
58+ end
59+ end
60+
61+ def test_no_result_var_with_group_operator
62+ grammar_source = <<~GRAMMAR
63+ class TestParser
64+ options no_result_var
65+
66+ rule
67+ root
68+ : ('a' | 'b')
69+ GRAMMAR
70+
71+ result = parse_grammar ( grammar_source )
72+
73+ assert_equal false , result . params . result_var?
74+
75+ actions = result . grammar . each_rule . filter_map { |rule | rule . action . source &.text }
76+ actions . each do |action |
77+ refute_match ( /\A result\s *=/ , action , "Action should not start with 'result =' when no_result_var is set" )
78+ end
79+ end
80+
81+ def test_result_var_with_many_operator
82+ grammar_source = <<~GRAMMAR
83+ class TestParser
84+
85+ rule
86+ root
87+ : 'a' 'b'*
88+ GRAMMAR
89+
90+ result = parse_grammar ( grammar_source )
91+
92+ assert_equal true , result . params . result_var?
93+
94+ actions = result . grammar . each_rule . filter_map { |rule | rule . action . source &.text } . reject ( &:empty? )
95+ assert actions . any? { |action | action . match? ( /\A result\s *=/ ) } , "Action should start with 'result =' when result_var is enabled"
96+ end
97+
98+ def test_no_result_var_no_warnings
99+ grammar_file = Tempfile . new ( [ 'test_no_result_var' , '.y' ] )
100+ grammar_file . write ( <<~GRAMMAR )
101+ class TestParser
102+ options no_result_var
103+
104+ rule
105+ root
106+ : 'a' 'b'*
107+ | 'c' 'd'+
108+ | ('e' | 'f')
109+ GRAMMAR
110+ grammar_file . close
111+
112+ output_file = Tempfile . new ( [ 'test_no_result_var' , '.rb' ] )
113+ output_file . close
114+
115+ system ( "ruby" , "-I#{ LIB_DIR } " , "-S" , RACC , "-o" , output_file . path , grammar_file . path )
116+ assert $?. success? , "racc command failed"
117+
118+ warnings = `ruby -W #{ output_file . path } 2>&1`
119+ assert_equal "" , warnings , "Expected no warnings but got: #{ warnings } "
120+ ensure
121+ grammar_file &.unlink
122+ output_file &.unlink
123+ end
14124 end
15125end
0 commit comments