"""Tests for C code generation from IR.""" def test_codegen_hello_world(): """Test generating C code for simple HelloWorld component.""" from ritz.codegen import generate_c_code ir = { "type": "component", "name": "HelloWorld", "args": [], "body": [ { "type": "with", "element": {"tag": "P", "props": {}}, "body": [ { "type": "yield", "value": {"type": "constant", "value": "Hello World"}, } ], } ], } c_code = generate_c_code(ir) # Verify C code structure assert "#include " in c_code assert "void HelloWorld()" in c_code or "void render_HelloWorld()" in c_code # Should create a P element assert "create_element" in c_code or "createElement" in c_code assert '"p"' in c_code or '"P"' in c_code.lower() # Should create text node assert '"Hello World"' in c_code assert "create_text" in c_code or "createTextNode" in c_code or "set_text_content" in c_code def test_codegen_with_props(): """Test generating C code for element with props.""" from ritz.codegen import generate_c_code ir = { "type": "component", "name": "StyledDiv", "args": [], "body": [ { "type": "with", "element": { "tag": "Div", "props": { "class_": {"type": "constant", "value": "container"}, "id": {"type": "constant", "value": "main"}, }, }, "body": [{"type": "yield", "value": {"type": "constant", "value": "Content"}}], } ], } c_code = generate_c_code(ir) # Should set attributes assert "set_attribute" in c_code or "setAttribute" in c_code assert '"class"' in c_code or '"className"' in c_code assert '"container"' in c_code assert '"id"' in c_code assert '"main"' in c_code def test_codegen_nested_elements(): """Test generating C code for nested elements.""" from ritz.codegen import generate_c_code ir = { "type": "component", "name": "Nested", "args": [], "body": [ { "type": "with", "element": {"tag": "Div", "props": {}}, "body": [ { "type": "with", "element": {"tag": "P", "props": {}}, "body": [ {"type": "yield", "value": {"type": "constant", "value": "Inner"}} ], } ], } ], } c_code = generate_c_code(ir) # Should have append_child calls to build hierarchy assert "append_child" in c_code or "appendChild" in c_code def test_codegen_includes_runtime_functions(): """Test that generated C code includes necessary runtime declarations.""" from ritz.codegen import generate_c_code ir = { "type": "component", "name": "Simple", "args": [], "body": [ { "type": "with", "element": {"tag": "P", "props": {}}, "body": [{"type": "yield", "value": {"type": "constant", "value": "test"}}], } ], } c_code = generate_c_code(ir) # Should include emscripten assert "#include " in c_code # Should have EMSCRIPTEN_KEEPALIVE for exported function assert "EMSCRIPTEN_KEEPALIVE" in c_code