diff --git a/Aikido.Zen.Core/Helpers/ReflectionHelper.cs b/Aikido.Zen.Core/Helpers/ReflectionHelper.cs index 818eb324..763f1a80 100644 --- a/Aikido.Zen.Core/Helpers/ReflectionHelper.cs +++ b/Aikido.Zen.Core/Helpers/ReflectionHelper.cs @@ -49,7 +49,7 @@ public static MethodInfo GetMethodFromAssembly(string assemblyName, string typeN var typeKey = $"{assemblyName}.{typeName}"; if (!_types.TryGetValue(typeKey, out var type)) { - type = assembly.ExportedTypes.FirstOrDefault(t => t.Name == typeName); + type = assembly.ExportedTypes.FirstOrDefault(t => t.Name == typeName || t.FullName == typeName); if (type == null) return null; _types[typeKey] = type; } diff --git a/Aikido.Zen.Test/ReflectionHelperTests.cs b/Aikido.Zen.Test/ReflectionHelperTests.cs new file mode 100644 index 00000000..79d99619 --- /dev/null +++ b/Aikido.Zen.Test/ReflectionHelperTests.cs @@ -0,0 +1,106 @@ +using Aikido.Zen.Core.Helpers; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace Aikido.Zen.Test +{ + /// + /// Tests for the ReflectionHelper class. + /// + public class ReflectionHelperTests + { + [SetUp] + public void SetUp() + { + // Clear the cache before each test to ensure a clean state + ReflectionHelper.ClearCache(); + } + + [Test] + public void GetMethodFromAssembly_ValidMethod_ReturnsMethodInfo() + { + // Arrange + var assemblyName = "System.Private.CoreLib"; + var typeName = "System.String"; + var methodName = "Contains"; + var parameterTypeNames = new[] { "System.String" }; + + // Act + var methodInfo = ReflectionHelper.GetMethodFromAssembly(assemblyName, typeName, methodName, parameterTypeNames); + + // Assert + Assert.That(methodInfo, Is.Not.Null); + Assert.That(methodInfo.Name, Is.EqualTo(methodName)); + } + + [Test] + public void GetMethodFromAssembly_InvalidAssembly_ReturnsNull() + { + // Arrange + var assemblyName = "NonExistentAssembly"; + var typeName = "System.String"; + var methodName = "Contains"; + var parameterTypeNames = new[] { "System.String" }; + + // Act + var methodInfo = ReflectionHelper.GetMethodFromAssembly(assemblyName, typeName, methodName, parameterTypeNames); + + // Assert + Assert.That(methodInfo, Is.Null); + } + + [Test] + public void GetMethodFromAssembly_InvalidType_ReturnsNull() + { + // Arrange + var assemblyName = "System.Private.CoreLib"; + var typeName = "NonExistentType"; + var methodName = "Contains"; + var parameterTypeNames = new[] { "System.String" }; + + // Act + var methodInfo = ReflectionHelper.GetMethodFromAssembly(assemblyName, typeName, methodName, parameterTypeNames); + + // Assert + Assert.That(methodInfo, Is.Null); + } + + [Test] + public void GetMethodFromAssembly_InvalidMethod_ReturnsNull() + { + // Arrange + var assemblyName = "System.Private.CoreLib"; + var typeName = "System.String"; + var methodName = "NonExistentMethod"; + var parameterTypeNames = new[] { "System.String" }; + + // Act + var methodInfo = ReflectionHelper.GetMethodFromAssembly(assemblyName, typeName, methodName, parameterTypeNames); + + // Assert + Assert.That(methodInfo, Is.Null); + } + + [Test] + public void ClearCache_ClearsAllCachedData() + { + // Arrange + var assemblyName = "System.Private.CoreLib"; + var typeName = "System.String"; + var methodName = "Contains"; + var parameterTypeNames = new[] { "System.String" }; + + // Act + var methodInfo = ReflectionHelper.GetMethodFromAssembly(assemblyName, typeName, methodName, parameterTypeNames); + ReflectionHelper.ClearCache(); + var methodInfoAfterClear = ReflectionHelper.GetMethodFromAssembly(assemblyName, typeName, methodName, parameterTypeNames); + + // Assert + Assert.That(methodInfo, Is.Not.Null); + Assert.That(methodInfoAfterClear, Is.Not.Null); + Assert.That(methodInfo, Is.EqualTo(methodInfoAfterClear)); + } + } +}