mcilspy/tests/test_models.py
Ryan Malloy 7d784af17c refactor: address major code review findings
- Use importlib.metadata for dynamic version (single source in pyproject.toml)
- Clean up duplicate `import re` statements across modules
- Add missing type hints to all public methods
- Fix PATH auto-discovery for ilspycmd (~/.dotnet/tools)
- Add pytest test suite with 35 tests covering models, metadata reader, wrapper
- Bump version to 0.2.0, add CHANGELOG.md
2026-02-07 02:05:57 -07:00

117 lines
4.1 KiB
Python

"""Tests for mcilspy.models module."""
import pytest
from mcilspy.models import (
EntityType,
LanguageVersion,
DecompileRequest,
ListTypesRequest,
TypeInfo,
)
class TestEntityType:
"""Tests for EntityType enum."""
def test_from_string_full_names(self):
"""Test parsing full entity type names."""
assert EntityType.from_string("class") == EntityType.CLASS
assert EntityType.from_string("interface") == EntityType.INTERFACE
assert EntityType.from_string("struct") == EntityType.STRUCT
assert EntityType.from_string("delegate") == EntityType.DELEGATE
assert EntityType.from_string("enum") == EntityType.ENUM
def test_from_string_short_names(self):
"""Test parsing short (single letter) entity type names."""
assert EntityType.from_string("c") == EntityType.CLASS
assert EntityType.from_string("i") == EntityType.INTERFACE
assert EntityType.from_string("s") == EntityType.STRUCT
assert EntityType.from_string("d") == EntityType.DELEGATE
assert EntityType.from_string("e") == EntityType.ENUM
def test_from_string_case_insensitive(self):
"""Test that parsing is case insensitive."""
assert EntityType.from_string("CLASS") == EntityType.CLASS
assert EntityType.from_string("Class") == EntityType.CLASS
assert EntityType.from_string("C") == EntityType.CLASS
def test_from_string_invalid(self):
"""Test that invalid strings raise ValueError."""
with pytest.raises(ValueError):
EntityType.from_string("invalid")
with pytest.raises(ValueError):
EntityType.from_string("x")
class TestLanguageVersion:
"""Tests for LanguageVersion enum."""
def test_common_versions(self):
"""Test common C# version values."""
assert LanguageVersion.LATEST.value == "Latest"
assert LanguageVersion.PREVIEW.value == "Preview"
assert LanguageVersion.CSHARP12_0.value == "CSharp12_0"
def test_version_count(self):
"""Ensure we have all expected versions."""
# Should have CSharp1 through CSharp12, plus Latest and Preview
assert len(LanguageVersion) >= 14
class TestDecompileRequest:
"""Tests for DecompileRequest model."""
def test_minimal_request(self):
"""Test creating request with only required fields."""
request = DecompileRequest(assembly_path="/path/to/assembly.dll")
assert request.assembly_path == "/path/to/assembly.dll"
assert request.language_version == LanguageVersion.LATEST
assert request.type_name is None
assert request.output_dir is None
def test_full_request(self):
"""Test creating request with all fields."""
request = DecompileRequest(
assembly_path="/path/to/assembly.dll",
language_version=LanguageVersion.CSHARP10_0,
type_name="MyNamespace.MyClass",
output_dir="/output",
create_project=True,
show_il_code=True,
)
assert request.language_version == LanguageVersion.CSHARP10_0
assert request.type_name == "MyNamespace.MyClass"
assert request.create_project is True
class TestListTypesRequest:
"""Tests for ListTypesRequest model."""
def test_default_entity_types(self):
"""Test that default entity types include common types."""
request = ListTypesRequest(assembly_path="/path/to/assembly.dll")
# Should have some default entity types
assert len(request.entity_types) > 0
assert EntityType.CLASS in request.entity_types
class TestTypeInfo:
"""Tests for TypeInfo model."""
def test_type_info_creation(self):
"""Test creating TypeInfo objects."""
info = TypeInfo(
name="MyClass",
full_name="MyNamespace.MyClass",
kind="Class",
namespace="MyNamespace",
)
assert info.name == "MyClass"
assert info.namespace == "MyNamespace"
def test_type_info_no_namespace(self):
"""Test TypeInfo with no namespace."""
info = TypeInfo(name="MyClass", full_name="MyClass", kind="Class")
assert info.namespace is None