Browse Source

Merge pull request #514 from SLaks/refactor-tests

Tests: Reuse decompiler roundtrip assertion code
pull/512/head
Siegfried Pammer 11 years ago
parent
commit
053a879400
  1. 27
      ICSharpCode.Decompiler/Tests/DecompilerTestBase.cs
  2. 2
      ICSharpCode.Decompiler/Tests/Helpers/CodeAssert.cs
  3. 48
      ICSharpCode.Decompiler/Tests/TestRunner.cs

27
ICSharpCode.Decompiler/Tests/DecompilerTestBase.cs

@ -35,10 +35,8 @@ namespace ICSharpCode.Decompiler.Tests
{ {
protected static void ValidateFileRoundtrip(string samplesFileName) protected static void ValidateFileRoundtrip(string samplesFileName)
{ {
var lines = File.ReadAllLines(Path.Combine(@"..\..\Tests", samplesFileName)); var fullPath = Path.Combine(@"..\..\Tests", samplesFileName);
var testCode = RemoveIgnorableLines(lines); AssertRoundtripCode(fullPath);
var decompiledTestCode = RoundtripCode(testCode);
CodeAssert.AreEqual(testCode, decompiledTestCode);
} }
static string RemoveIgnorableLines(IEnumerable<string> lines) static string RemoveIgnorableLines(IEnumerable<string> lines)
@ -46,28 +44,25 @@ namespace ICSharpCode.Decompiler.Tests
return CodeSampleFileParser.ConcatLines(lines.Where(l => !CodeSampleFileParser.IsCommentOrBlank(l))); return CodeSampleFileParser.ConcatLines(lines.Where(l => !CodeSampleFileParser.IsCommentOrBlank(l)));
} }
/// <summary> protected static void AssertRoundtripCode(string fileName, bool optimize = false, bool useDebug = false)
/// Compiles and decompiles a source code.
/// </summary>
/// <param name="code">The source code to copile.</param>
/// <returns>The decompilation result of compiled source code.</returns>
static string RoundtripCode(string code)
{ {
DecompilerSettings settings = new DecompilerSettings(); var code = RemoveIgnorableLines(File.ReadLines(fileName));
settings.FullyQualifyAmbiguousTypeNames = false; AssemblyDefinition assembly = CompileLegacy(code, optimize, useDebug);
AssemblyDefinition assembly = Compile(code);
AstBuilder decompiler = new AstBuilder(new DecompilerContext(assembly.MainModule) { Settings = settings }); AstBuilder decompiler = new AstBuilder(new DecompilerContext(assembly.MainModule));
decompiler.AddAssembly(assembly); decompiler.AddAssembly(assembly);
new Helpers.RemoveCompilerAttribute().Run(decompiler.SyntaxTree); new Helpers.RemoveCompilerAttribute().Run(decompiler.SyntaxTree);
StringWriter output = new StringWriter(); StringWriter output = new StringWriter();
decompiler.GenerateCode(new PlainTextOutput(output)); decompiler.GenerateCode(new PlainTextOutput(output));
return output.ToString(); CodeAssert.AreEqual(code, output.ToString());
} }
static AssemblyDefinition Compile(string code) protected static AssemblyDefinition CompileLegacy(string code, bool optimize, bool useDebug)
{ {
CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } }); CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } });
CompilerParameters options = new CompilerParameters(); CompilerParameters options = new CompilerParameters();
options.CompilerOptions = "/unsafe /o" + (optimize ? "+" : "-") + (useDebug ? " /debug" : "");
options.ReferencedAssemblies.Add("System.Core.dll"); options.ReferencedAssemblies.Add("System.Core.dll");
CompilerResults results = provider.CompileAssemblyFromSource(options, code); CompilerResults results = provider.CompileAssemblyFromSource(options, code);
try try

2
ICSharpCode.Decompiler/Tests/Helpers/CodeAssert.cs

@ -104,7 +104,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers
private static IEnumerable<string> NormalizeAndSplitCode(string input) private static IEnumerable<string> NormalizeAndSplitCode(string input)
{ {
return input.Split(new[] { "\r\n", "\n\r", "\n", "\r" }, StringSplitOptions.None); return input.Split(new[] { "\r\n", "\n\r", "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries);
} }
} }
} }

48
ICSharpCode.Decompiler/Tests/TestRunner.cs

@ -32,7 +32,7 @@ using NUnit.Framework;
namespace ICSharpCode.Decompiler.Tests namespace ICSharpCode.Decompiler.Tests
{ {
[TestFixture] [TestFixture]
public class TestRunner public class TestRunner : DecompilerTestBase
{ {
[Test] [Test]
public void Async() public void Async()
@ -67,7 +67,8 @@ namespace ICSharpCode.Decompiler.Tests
[Test] [Test]
public void ExceptionHandling() public void ExceptionHandling()
{ {
TestFile(@"..\..\Tests\ExceptionHandling.cs", optimize: false); AssertRoundtripCode(@"..\..\Tests\ExceptionHandling.cs", optimize: false);
AssertRoundtripCode(@"..\..\Tests\ExceptionHandling.cs", optimize: false);
} }
[Test] [Test]
@ -85,7 +86,8 @@ namespace ICSharpCode.Decompiler.Tests
[Test] [Test]
public void ControlFlowWithDebug() public void ControlFlowWithDebug()
{ {
TestFile(@"..\..\Tests\ControlFlow.cs", optimize: false, useDebug: true); AssertRoundtripCode(@"..\..\Tests\ControlFlow.cs", optimize: false, useDebug: true);
AssertRoundtripCode(@"..\..\Tests\ControlFlow.cs", optimize: false, useDebug: true);
} }
[Test] [Test]
@ -180,42 +182,10 @@ namespace ICSharpCode.Decompiler.Tests
static void TestFile(string fileName, bool useDebug = false) static void TestFile(string fileName, bool useDebug = false)
{ {
TestFile(fileName, false, useDebug); AssertRoundtripCode(fileName, optimize: false, useDebug: useDebug);
TestFile(fileName, true, useDebug); AssertRoundtripCode(fileName, optimize: true, useDebug: useDebug);
} AssertRoundtripCode(fileName, optimize: false, useDebug: useDebug);
AssertRoundtripCode(fileName, optimize: true, useDebug: useDebug);
static void TestFile(string fileName, bool optimize, bool useDebug = false)
{
string code = File.ReadAllText(fileName);
AssemblyDefinition assembly = Compile(code, optimize, useDebug);
AstBuilder decompiler = new AstBuilder(new DecompilerContext(assembly.MainModule));
decompiler.AddAssembly(assembly);
new Helpers.RemoveCompilerAttribute().Run(decompiler.SyntaxTree);
StringWriter output = new StringWriter();
decompiler.GenerateCode(new PlainTextOutput(output));
CodeAssert.AreEqual(code, output.ToString());
}
static AssemblyDefinition Compile(string code, bool optimize, bool useDebug)
{
CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } });
CompilerParameters options = new CompilerParameters();
options.CompilerOptions = "/unsafe /o" + (optimize ? "+" : "-") + (useDebug ? " /debug": "");
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();
}
} }
} }
} }

Loading…
Cancel
Save