Browse Source

Tests: Reuse decompiler roundtrip assertion code

This contains no functional changes, except that
it will ignore blank lines when comparing code.

This reduces duplicate code, and will make it
easier to add assertions for Roslyn compilers
pull/514/head
Schabse Laks 11 years ago committed by SLaks
parent
commit
9c23972074
  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