using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Linq; [assembly: DoNotParallelize] namespace MarketAlly.AIPlugin.Refactoring.Plugins { public interface IParameterExtractor { T GetParameter(IReadOnlyDictionary parameters, string key, T defaultValue = default); T GetParameter(IReadOnlyDictionary parameters, string[] keys, T defaultValue = default); List GetListParameter(IReadOnlyDictionary parameters, params string[] keys); int GetIntParameter(IReadOnlyDictionary parameters, string key, int defaultValue = 0); double GetDoubleParameter(IReadOnlyDictionary parameters, string key, double defaultValue = 0.0); bool GetBoolParameter(IReadOnlyDictionary parameters, string key, bool defaultValue = false); } public class ParameterExtractor : IParameterExtractor { public T GetParameter(IReadOnlyDictionary parameters, string key, T defaultValue = default) { return GetParameter(parameters, new[] { key }, defaultValue); } public T GetParameter(IReadOnlyDictionary parameters, string[] keys, T defaultValue = default) { if (parameters == null) return defaultValue; foreach (var key in keys) { if (parameters.TryGetValue(key, out var value) && value != null) { try { if (value is T directValue) return directValue; // Try conversion for common types if (typeof(T) == typeof(string)) return (T)(object)value.ToString(); if (typeof(T) == typeof(int) && int.TryParse(value.ToString(), out var intValue)) return (T)(object)intValue; if (typeof(T) == typeof(double) && double.TryParse(value.ToString(), out var doubleValue)) return (T)(object)doubleValue; if (typeof(T) == typeof(bool) && bool.TryParse(value.ToString(), out var boolValue)) return (T)(object)boolValue; // Generic conversion attempt return (T)Convert.ChangeType(value, typeof(T)); } catch { // Conversion failed, continue to next key continue; } } } return defaultValue; } public List GetListParameter(IReadOnlyDictionary parameters, params string[] keys) { if (parameters == null) return new List(); foreach (var key in keys) { if (parameters.TryGetValue(key, out var value) && value != null) { try { if (value is List directList) return directList; if (value is IEnumerable enumerable) { var result = new List(); foreach (var item in enumerable) { if (item is T directItem) result.Add(directItem); else if (item != null) { try { var convertedItem = (T)Convert.ChangeType(item, typeof(T)); result.Add(convertedItem); } catch { // Skip items that can't be converted } } } return result; } // Try to convert single value to list if (value is T singleValue) return new List { singleValue }; } catch { // Conversion failed, continue to next key continue; } } } return new List(); } public int GetIntParameter(IReadOnlyDictionary parameters, string key, int defaultValue = 0) { return GetParameter(parameters, key, defaultValue); } public double GetDoubleParameter(IReadOnlyDictionary parameters, string key, double defaultValue = 0.0) { return GetParameter(parameters, key, defaultValue); } public bool GetBoolParameter(IReadOnlyDictionary parameters, string key, bool defaultValue = false) { return GetParameter(parameters, key, defaultValue); } } // Common result types public static class PluginResultHelpers { public static AIPluginResult Success(object data, string message = "Operation completed successfully") { return new AIPluginResult(data, message); } public static AIPluginResult Error(string message, Exception exception = null) { return new AIPluginResult(exception ?? new InvalidOperationException(message), message); } public static AIPluginResult ValidationError(string parameterName, string validationMessage) { return new AIPluginResult(new ArgumentException(validationMessage, parameterName), $"Validation failed for {parameterName}: {validationMessage}"); } public static AIPluginResult FileNotFound(string filePath) { return new AIPluginResult(new FileNotFoundException($"File not found: {filePath}"), $"File not found: {filePath}"); } public static AIPluginResult InvalidOperation(string operation, string reason) { return new AIPluginResult(new InvalidOperationException(reason), $"Invalid operation '{operation}': {reason}"); } } // Common constants public static class PluginConstants { public const int DefaultMaxFileSize = 10 * 1024 * 1024; // 10MB public const int DefaultTimeout = 30000; // 30 seconds public const double DefaultSimilarityThreshold = 0.7; public const int DefaultMaxResults = 100; // Common parameter names public static class ParameterNames { public const string FilePath = "filePath"; public const string ProjectPath = "projectPath"; public const string ApplyChanges = "applyChanges"; public const string CreateBackup = "createBackup"; public const string MaxResults = "maxResults"; public const string Timeout = "timeout"; } // Common file extensions public static readonly HashSet CSharpFileExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) { ".cs", ".csx" }; public static readonly HashSet ProjectFileExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) { ".csproj", ".sln", ".props", ".targets" }; } }