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 @@ -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