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