import inspect
import os
import sys
from enum import Enum
from pathlib import Path
from typing import Dict, Type, Tuple
sys.path.insert(0, str(Path(__file__).parent.parent))
from nomy_data_models.py_to_rust import (
get_all_models,
generate_rust_model,
generate_rust_enum,
generate_rust_models,
)
from nomy_data_models import models
def test_get_all_models() -> Dict[str, Type]:
print("Testing get_all_models...")
all_models = get_all_models()
print(f"Found {len(all_models)} models:")
for name in all_models:
print(f" - {name}")
return all_models
def test_generate_rust_model(model_name: str, model_class: Type) -> str:
print(f"\nTesting generate_rust_model for {model_name}...")
rust_code = generate_rust_model(model_class)
print(f"Generated {len(rust_code.splitlines())} lines of Rust code")
print("First 10 lines:")
for line in rust_code.splitlines()[:10]:
print(f" {line}")
return rust_code
def test_generate_rust_enum() -> Dict[str, Type[Enum]]:
print("\nTesting generate_rust_enum...")
enums = {}
for name in dir(models):
item = getattr(models, name)
if (
inspect.isclass(item)
and issubclass(item, Enum)
and item != Enum
and item.__module__.startswith("nomy_data_models.models")
):
enums[name] = item
print(f"Found {len(enums)} enums:")
for name in enums:
print(f" - {name}")
if enums:
name, enum_class = next(iter(enums.items()))
rust_code = generate_rust_enum(enum_class)
print(f"\nGenerated Rust code for {name}:")
for line in rust_code.splitlines()[:10]:
print(f" {line}")
return enums
def test_generate_rust_models() -> Path:
print("\nTesting generate_rust_models...")
output_dir = Path(__file__).parent / "test_output" / "models"
os.makedirs(output_dir, exist_ok=True)
generate_rust_models(str(output_dir))
print(f"Generated Rust models in {output_dir}")
files = list(output_dir.glob("*.rs"))
print(f"Found {len(files)} Rust files:")
for file in files:
print(f" - {file.name}")
mod_file = output_dir / "mod.rs"
if mod_file.exists():
print("\nContents of mod.rs:")
with open(mod_file, "r") as f:
for line in f.readlines()[:10]:
print(f" {line.strip()}")
return output_dir
def main() -> None:
print("Testing Python to Rust conversion...\n")
all_models = test_get_all_models()
for model_name, model_class in all_models.items():
test_generate_rust_model(model_name, model_class)
test_generate_rust_enum()
test_generate_rust_models()
print("\nAll tests completed successfully!")
if __name__ == "__main__":
main()