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 @@ -35,10 +35,8 @@ namespace ICSharpCode.Decompiler.Tests
{
protected static void ValidateFileRoundtrip(string samplesFileName)
{
var lines = File.ReadAllLines(Path.Combine(@"..\..\Tests", samplesFileName));
var testCode = RemoveIgnorableLines(lines);
var decompiledTestCode = RoundtripCode(testCode);
CodeAssert.AreEqual(testCode, decompiledTestCode);
var fullPath = Path.Combine(@"..\..\Tests", samplesFileName);
AssertRoundtripCode(fullPath);
}
static string RemoveIgnorableLines(IEnumerable<string> lines)
@ -46,28 +44,25 @@ namespace ICSharpCode.Decompiler.Tests @@ -46,28 +44,25 @@ namespace ICSharpCode.Decompiler.Tests
return CodeSampleFileParser.ConcatLines(lines.Where(l => !CodeSampleFileParser.IsCommentOrBlank(l)));
}
/// <summary>
/// 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)
protected static void AssertRoundtripCode(string fileName, bool optimize = false, bool useDebug = false)
{
DecompilerSettings settings = new DecompilerSettings();
settings.FullyQualifyAmbiguousTypeNames = false;
AssemblyDefinition assembly = Compile(code);
AstBuilder decompiler = new AstBuilder(new DecompilerContext(assembly.MainModule) { Settings = settings });
var code = RemoveIgnorableLines(File.ReadLines(fileName));
AssemblyDefinition assembly = CompileLegacy(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));
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" } });
CompilerParameters options = new CompilerParameters();
options.CompilerOptions = "/unsafe /o" + (optimize ? "+" : "-") + (useDebug ? " /debug" : "");
options.ReferencedAssemblies.Add("System.Core.dll");
CompilerResults results = provider.CompileAssemblyFromSource(options, code);
try

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

@ -104,7 +104,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers @@ -104,7 +104,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers
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; @@ -32,7 +32,7 @@ using NUnit.Framework;
namespace ICSharpCode.Decompiler.Tests
{
[TestFixture]
public class TestRunner
public class TestRunner : DecompilerTestBase
{
[Test]
public void Async()
@ -67,7 +67,8 @@ namespace ICSharpCode.Decompiler.Tests @@ -67,7 +67,8 @@ namespace ICSharpCode.Decompiler.Tests
[Test]
public void ExceptionHandling()
{
TestFile(@"..\..\Tests\ExceptionHandling.cs", optimize: false);
AssertRoundtripCode(@"..\..\Tests\ExceptionHandling.cs", optimize: false);
AssertRoundtripCode(@"..\..\Tests\ExceptionHandling.cs", optimize: false);
}
[Test]
@ -85,7 +86,8 @@ namespace ICSharpCode.Decompiler.Tests @@ -85,7 +86,8 @@ namespace ICSharpCode.Decompiler.Tests
[Test]
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]
@ -180,42 +182,10 @@ namespace ICSharpCode.Decompiler.Tests @@ -180,42 +182,10 @@ namespace ICSharpCode.Decompiler.Tests
static void TestFile(string fileName, bool useDebug = false)
{
TestFile(fileName, false, useDebug);
TestFile(fileName, true, 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();
}
AssertRoundtripCode(fileName, optimize: false, useDebug: useDebug);
AssertRoundtripCode(fileName, optimize: true, useDebug: useDebug);
AssertRoundtripCode(fileName, optimize: false, useDebug: useDebug);
AssertRoundtripCode(fileName, optimize: true, useDebug: useDebug);
}
}
}

Loading…
Cancel
Save