121 lines
2.5 KiB
Python
121 lines
2.5 KiB
Python
"""Tests for conditional rendering (if statements)."""
|
|
|
|
import pytest
|
|
from ritz.parser import parse_component
|
|
|
|
|
|
def test_if_statement():
|
|
"""Test parsing if statement for conditional rendering."""
|
|
source = """
|
|
from ritz.syntax import *
|
|
|
|
@component
|
|
def Toggle():
|
|
visible = signal(True)
|
|
|
|
if visible:
|
|
with P():
|
|
yield "I am visible!"
|
|
"""
|
|
ir = parse_component(source)
|
|
|
|
# Find the if statement
|
|
if_stmt = None
|
|
for stmt in ir["body"]:
|
|
if stmt["type"] == "if":
|
|
if_stmt = stmt
|
|
break
|
|
|
|
assert if_stmt is not None
|
|
assert if_stmt["test"]["type"] == "name"
|
|
assert if_stmt["test"]["id"] == "visible"
|
|
assert len(if_stmt["body"]) == 1
|
|
assert if_stmt["body"][0]["type"] == "with"
|
|
|
|
|
|
def test_if_else_statement():
|
|
"""Test parsing if/else for conditional rendering."""
|
|
source = """
|
|
from ritz.syntax import *
|
|
|
|
@component
|
|
def Toggle():
|
|
visible = signal(True)
|
|
|
|
if visible:
|
|
with P():
|
|
yield "Shown"
|
|
else:
|
|
with P():
|
|
yield "Hidden"
|
|
"""
|
|
ir = parse_component(source)
|
|
|
|
# Find the if statement
|
|
if_stmt = None
|
|
for stmt in ir["body"]:
|
|
if stmt["type"] == "if":
|
|
if_stmt = stmt
|
|
break
|
|
|
|
assert if_stmt is not None
|
|
assert len(if_stmt["body"]) == 1
|
|
assert len(if_stmt["orelse"]) == 1
|
|
assert if_stmt["body"][0]["element"]["tag"] == "P"
|
|
assert if_stmt["orelse"][0]["element"]["tag"] == "P"
|
|
|
|
|
|
def test_if_comparison():
|
|
"""Test parsing if statement with comparison."""
|
|
source = """
|
|
from ritz.syntax import *
|
|
|
|
@component
|
|
def Counter():
|
|
count = signal(0)
|
|
|
|
if count > 5:
|
|
with P():
|
|
yield "High count!"
|
|
"""
|
|
ir = parse_component(source)
|
|
|
|
# Find the if statement
|
|
if_stmt = None
|
|
for stmt in ir["body"]:
|
|
if stmt["type"] == "if":
|
|
if_stmt = stmt
|
|
break
|
|
|
|
assert if_stmt is not None
|
|
assert if_stmt["test"]["type"] == "compare"
|
|
assert if_stmt["test"]["op"] == "Gt"
|
|
|
|
|
|
def test_nested_if():
|
|
"""Test parsing nested if statements."""
|
|
source = """
|
|
from ritz.syntax import *
|
|
|
|
@component
|
|
def Nested():
|
|
a = signal(True)
|
|
b = signal(False)
|
|
|
|
if a:
|
|
if b:
|
|
with P():
|
|
yield "Both true"
|
|
"""
|
|
ir = parse_component(source)
|
|
|
|
# Find outer if
|
|
outer_if = None
|
|
for stmt in ir["body"]:
|
|
if stmt["type"] == "if":
|
|
outer_if = stmt
|
|
break
|
|
|
|
assert outer_if is not None
|
|
assert outer_if["body"][0]["type"] == "if"
|