77from multilingualprogramming .codegen .ui_lowering import lower_to_ui
88
99
10- def test_memory_game_html_has_required_structure ():
11- """Generated HTML has all required structural elements ."""
10+ def _load_memory_game_ui ():
11+ """Compile the memory game example and return the UI lowering result ."""
1212 game_file = Path ("examples/memory_game_en.multi" )
13- source = game_file .read_text ()
13+ source = game_file .read_text (encoding = "utf-8" )
1414 lexer = Lexer (source , lang = "en" )
1515 tokens = lexer .tokenize ()
1616 parser = Parser (tokens , lang = "en" )
1717 program = parser .parse ()
1818 ir_program = lower_to_semantic_ir (program , lang = "en" )
19- ui_result = lower_to_ui (ir_program )
19+ return lower_to_ui (ir_program )
20+
21+
22+ def test_memory_game_html_has_required_structure ():
23+ """Generated HTML has all required structural elements."""
24+ ui_result = _load_memory_game_ui ()
2025 html = ui_result .emit_html ()
2126
2227 # Check doctype
@@ -38,14 +43,7 @@ def test_memory_game_html_has_required_structure():
3843
3944def test_memory_game_html_has_css_styling ():
4045 """Generated HTML includes CSS for game styling."""
41- game_file = Path ("examples/memory_game_en.multi" )
42- source = game_file .read_text ()
43- lexer = Lexer (source , lang = "en" )
44- tokens = lexer .tokenize ()
45- parser = Parser (tokens , lang = "en" )
46- program = parser .parse ()
47- ir_program = lower_to_semantic_ir (program , lang = "en" )
48- ui_result = lower_to_ui (ir_program )
46+ ui_result = _load_memory_game_ui ()
4947 html = ui_result .emit_html ()
5048
5149 # Check for stylesheet
@@ -66,14 +64,7 @@ def test_memory_game_html_has_css_styling():
6664
6765def test_memory_game_js_has_required_functions ():
6866 """Generated JS has all required signal and function declarations."""
69- game_file = Path ("examples/memory_game_en.multi" )
70- source = game_file .read_text ()
71- lexer = Lexer (source , lang = "en" )
72- tokens = lexer .tokenize ()
73- parser = Parser (tokens , lang = "en" )
74- program = parser .parse ()
75- ir_program = lower_to_semantic_ir (program , lang = "en" )
76- ui_result = lower_to_ui (ir_program )
67+ ui_result = _load_memory_game_ui ()
7768 js = ui_result .emit_js ()
7869
7970 # Check for signal declarations
@@ -91,14 +82,7 @@ def test_memory_game_js_has_required_functions():
9182
9283def test_memory_game_js_no_undefined_calls ():
9384 """Generated JS does not contain calls to undefined functions."""
94- game_file = Path ("examples/memory_game_en.multi" )
95- source = game_file .read_text ()
96- lexer = Lexer (source , lang = "en" )
97- tokens = lexer .tokenize ()
98- parser = Parser (tokens , lang = "en" )
99- program = parser .parse ()
100- ir_program = lower_to_semantic_ir (program , lang = "en" )
101- ui_result = lower_to_ui (ir_program )
85+ ui_result = _load_memory_game_ui ()
10286 js = ui_result .emit_js ()
10387
10488 # Should not call memory_game() as a function (it's not in JS context)
@@ -110,14 +94,7 @@ def test_memory_game_js_no_undefined_calls():
11094
11195def test_memory_game_js_has_render_initialization ():
11296 """Generated JS initializes render on page load."""
113- game_file = Path ("examples/memory_game_en.multi" )
114- source = game_file .read_text ()
115- lexer = Lexer (source , lang = "en" )
116- tokens = lexer .tokenize ()
117- parser = Parser (tokens , lang = "en" )
118- program = parser .parse ()
119- ir_program = lower_to_semantic_ir (program , lang = "en" )
120- ui_result = lower_to_ui (ir_program )
97+ ui_result = _load_memory_game_ui ()
12198 js = ui_result .emit_js ()
12299
123100 # Check for initialization
@@ -126,14 +103,7 @@ def test_memory_game_js_has_render_initialization():
126103
127104def test_memory_game_js_signal_change_bindings ():
128105 """Generated JS binds signal changes to re-render."""
129- game_file = Path ("examples/memory_game_en.multi" )
130- source = game_file .read_text ()
131- lexer = Lexer (source , lang = "en" )
132- tokens = lexer .tokenize ()
133- parser = Parser (tokens , lang = "en" )
134- program = parser .parse ()
135- ir_program = lower_to_semantic_ir (program , lang = "en" )
136- ui_result = lower_to_ui (ir_program )
106+ ui_result = _load_memory_game_ui ()
137107 js = ui_result .emit_js ()
138108
139109 # Check that signals are wired to re-render
@@ -143,14 +113,7 @@ def test_memory_game_js_signal_change_bindings():
143113
144114def test_memory_game_js_has_reactive_runtime ():
145115 """Generated JS includes ReactiveSignal and ReactiveList classes."""
146- game_file = Path ("examples/memory_game_en.multi" )
147- source = game_file .read_text ()
148- lexer = Lexer (source , lang = "en" )
149- tokens = lexer .tokenize ()
150- parser = Parser (tokens , lang = "en" )
151- program = parser .parse ()
152- ir_program = lower_to_semantic_ir (program , lang = "en" )
153- ui_result = lower_to_ui (ir_program )
116+ ui_result = _load_memory_game_ui ()
154117 js = ui_result .emit_js ()
155118
156119 # Check for reactive runtime
@@ -162,14 +125,7 @@ def test_memory_game_js_has_reactive_runtime():
162125
163126def test_memory_game_js_for_loop_structure ():
164127 """Generated JS has correct for-loop structure for game board."""
165- game_file = Path ("examples/memory_game_en.multi" )
166- source = game_file .read_text ()
167- lexer = Lexer (source , lang = "en" )
168- tokens = lexer .tokenize ()
169- parser = Parser (tokens , lang = "en" )
170- program = parser .parse ()
171- ir_program = lower_to_semantic_ir (program , lang = "en" )
172- ui_result = lower_to_ui (ir_program )
128+ ui_result = _load_memory_game_ui ()
173129 js = ui_result .emit_js ()
174130
175131 # Check for loop iterations 0-7
@@ -192,21 +148,16 @@ def test_memory_game_js_for_loop_structure():
192148 if 'className = \' reset-btn\' ' in line :
193149 reset_button_line = i
194150
195- if for_loop_line and status_div_line :
196- # Status div should be after for loop
151+ if for_loop_line is not None and status_div_line is not None :
152+ # Status div and reset button should be after the card loop.
197153 assert status_div_line > for_loop_line
154+ if for_loop_line is not None and reset_button_line is not None :
155+ assert reset_button_line > for_loop_line
198156
199157
200158def test_memory_game_html_valid_utf8 ():
201159 """Generated HTML is valid UTF-8 and encodes properly."""
202- game_file = Path ("examples/memory_game_en.multi" )
203- source = game_file .read_text ()
204- lexer = Lexer (source , lang = "en" )
205- tokens = lexer .tokenize ()
206- parser = Parser (tokens , lang = "en" )
207- program = parser .parse ()
208- ir_program = lower_to_semantic_ir (program , lang = "en" )
209- ui_result = lower_to_ui (ir_program )
160+ ui_result = _load_memory_game_ui ()
210161 html = ui_result .emit_html ()
211162
212163 # Should be valid UTF-8 and encodable without errors
@@ -218,14 +169,7 @@ def test_memory_game_html_valid_utf8():
218169
219170def test_memory_game_js_event_handlers ():
220171 """Generated JS has event handlers for card clicks."""
221- game_file = Path ("examples/memory_game_en.multi" )
222- source = game_file .read_text ()
223- lexer = Lexer (source , lang = "en" )
224- tokens = lexer .tokenize ()
225- parser = Parser (tokens , lang = "en" )
226- program = parser .parse ()
227- ir_program = lower_to_semantic_ir (program , lang = "en" )
228- ui_result = lower_to_ui (ir_program )
172+ ui_result = _load_memory_game_ui ()
229173 js = ui_result .emit_js ()
230174
231175 # Check for event handler attachment
0 commit comments