using System; using System.Collections.Generic; using System.Linq; using System.Text; using Mono.Cecil; using System.IO; using Decompiler; using Microsoft.CSharp; using System.CodeDom.Compiler; using NUnit.Framework; namespace ICSharpCode.Decompiler.Tests { public abstract class DecompilerTestBase { protected static void ValidateFileRoundtrip(string samplesFileName) { var lines = File.ReadAllLines(Path.Combine(@"..\..\Tests", samplesFileName)); var testCode = RemoveIgnorableLines(lines); var decompiledTestCode = RoundtripCode(testCode); Assert.AreEqual(testCode, decompiledTestCode); } static string RemoveIgnorableLines(IEnumerable lines) { return CodeSampleFileParser.ConcatLines(lines.Where(l => !CodeSampleFileParser.IsCommentOrBlank(l))); } /// /// Compiles and decompiles a source code. /// /// The source code to copile. /// The decompilation result of compiled source code. static string RoundtripCode(string code) { AssemblyDefinition assembly = Compile(code); AstBuilder decompiler = new AstBuilder(new DecompilerContext()); decompiler.AddAssembly(assembly); decompiler.Transform(new Helpers.RemoveCompilerAttribute()); StringWriter output = new StringWriter(); decompiler.GenerateCode(new PlainTextOutput(output)); return output.ToString(); } static AssemblyDefinition Compile(string code) { CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary { { "CompilerVersion", "v4.0" } }); CompilerParameters options = new CompilerParameters(); options.ReferencedAssemblies.Add("System.Core.dll"); CompilerResults results = provider.CompileAssemblyFromSource(options, code); try { if (results.Errors.Count > 0) { StringBuilder b = new StringBuilder("Compiler error:"); foreach (var error in results.Errors) { b.AppendLine(error.ToString()); } throw new Exception(b.ToString()); } return AssemblyDefinition.ReadAssembly(results.PathToAssembly); } finally { File.Delete(results.PathToAssembly); results.TempFiles.Delete(); } } } }