- 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
117 lines
4.1 KiB
Python
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
|