Browse Source

Add a unit-test for CreateSequencePoints

pull/1040/head
Kirill Osenkov 7 years ago
parent
commit
5c32fbf9dd
  1. 18
      ICSharpCode.Decompiler.Tests/Helpers/Tester.cs
  2. 1
      ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj
  3. 56
      ICSharpCode.Decompiler.Tests/Util/SequencePointTests.cs

18
ICSharpCode.Decompiler.Tests/Helpers/Tester.cs

@ -238,6 +238,24 @@ namespace ICSharpCode.Decompiler.Tests.Helpers
} }
} }
public static CSharpDecompiler GetDecompilerForSnippet(string csharpText)
{
var syntaxTree = SyntaxFactory.ParseSyntaxTree(csharpText);
var compilation = CSharpCompilation.Create(
"TestAssembly",
new[] { syntaxTree },
defaultReferences.Value,
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
var peStream = new MemoryStream();
var emitResult = compilation.Emit(peStream);
peStream.Position = 0;
var moduleDefinition = ModuleDefinition.ReadModule(peStream);
var decompiler = new CSharpDecompiler(moduleDefinition, new DecompilerSettings());
return decompiler;
}
internal static string GetSuffix(CompilerOptions cscOptions) internal static string GetSuffix(CompilerOptions cscOptions)
{ {
string suffix = ""; string suffix = "";

1
ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj

@ -68,6 +68,7 @@
<Compile Include="TestCases\Pretty\ExpressionTrees.cs" /> <Compile Include="TestCases\Pretty\ExpressionTrees.cs" />
<Compile Include="TestCases\Pretty\VariableNaming.cs" /> <Compile Include="TestCases\Pretty\VariableNaming.cs" />
<Compile Include="TestCases\Pretty\VariableNamingWithoutSymbols.cs" /> <Compile Include="TestCases\Pretty\VariableNamingWithoutSymbols.cs" />
<Compile Include="Util\SequencePointTests.cs" />
<None Include="TestCases\ILPretty\Issue959.cs" /> <None Include="TestCases\ILPretty\Issue959.cs" />
<None Include="TestCases\ILPretty\FSharpLoops_Debug.cs" /> <None Include="TestCases\ILPretty\FSharpLoops_Debug.cs" />
<None Include="TestCases\ILPretty\FSharpLoops_Release.cs" /> <None Include="TestCases\ILPretty\FSharpLoops_Release.cs" />

56
ICSharpCode.Decompiler.Tests/Util/SequencePointTests.cs

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.Decompiler.CSharp.OutputVisitor;
using ICSharpCode.Decompiler.Tests.Helpers;
using ICSharpCode.Decompiler.TypeSystem;
using NUnit.Framework;
namespace ICSharpCode.Decompiler.Tests.Util
{
[TestFixture]
public class SequencePointTests
{
[Test]
public void BasicSequencePoints()
{
TestCreateSequencePoints(@"class C { void M() { int i = 0; int j = 1; } }",
"int num = 0;",
"int num2 = 1;");
}
private void TestCreateSequencePoints(string code, params string[] expectedSequencePoints)
{
var decompiler = Tester.GetDecompilerForSnippet(code);
var firstType = decompiler.TypeSystem.Compilation.GetTopLevelTypeDefinitons().First(t => code.Contains(t.Name));
var tree = decompiler.DecompileType(firstType.FullTypeName);
var output = new StringWriter();
tree.AcceptVisitor(new InsertParenthesesVisitor { InsertParenthesesForReadability = true });
TokenWriter tokenWriter = new TextWriterTokenWriter(output);
tokenWriter = new InsertMissingTokensDecorator(tokenWriter, (ILocatable)tokenWriter);
var formattingOptions = FormattingOptionsFactory.CreateSharpDevelop();
tree.AcceptVisitor(new CSharpOutputVisitor(tokenWriter, formattingOptions));
var functionsWithSequencePoints = decompiler.CreateSequencePoints(tree);
var finalText = output.ToString();
var lines = finalText.Split(new[] { output.NewLine }, StringSplitOptions.None);
var actualSequencePoints = new List<string>();
foreach (var sequencePoint in functionsWithSequencePoints.Values.First()) {
if (sequencePoint.IsHidden) {
continue;
}
var line = lines[sequencePoint.StartLine - 1];
var text = line.Substring(sequencePoint.StartColumn - 1, sequencePoint.EndColumn - sequencePoint.StartColumn);
actualSequencePoints.Add(text);
}
Assert.True(Enumerable.SequenceEqual(expectedSequencePoints, actualSequencePoints));
}
}
}
Loading…
Cancel
Save