/Mono.Cecil/symbols/pdb/Test/Mono.Cecil.Tests/PdbTests.cs

http://github.com/icsharpcode/ILSpy · C# · 175 lines · 141 code · 34 blank · 0 comment · 3 complexity · 22840e6df8ce21c0ab336c9d7bbaa540 MD5 · raw file

  1. using System.IO;
  2. using System.Linq;
  3. using Mono.Cecil.Cil;
  4. using Mono.Cecil.Pdb;
  5. using NUnit.Framework;
  6. namespace Mono.Cecil.Tests {
  7. [TestFixture]
  8. public class PdbTests : BaseTestFixture {
  9. [TestModule ("test.exe", SymbolReaderProvider = typeof (PdbReaderProvider), SymbolWriterProvider = typeof (PdbWriterProvider))]
  10. public void Main (ModuleDefinition module)
  11. {
  12. var type = module.GetType ("Program");
  13. var main = type.GetMethod ("Main");
  14. AssertCode (@"
  15. .locals init (System.Int32 i, System.Int32 CS$1$0000, System.Boolean CS$4$0001)
  16. .line 6,6:2,3 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  17. IL_0000: nop
  18. .line 7,7:8,18 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  19. IL_0001: ldc.i4.0
  20. IL_0002: stloc.0
  21. .line 16707566,16707566:0,0 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  22. IL_0003: br.s IL_0012
  23. .line 8,8:4,21 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  24. IL_0005: ldarg.0
  25. IL_0006: ldloc.0
  26. IL_0007: ldelem.ref
  27. IL_0008: call System.Void Program::Print(System.String)
  28. IL_000d: nop
  29. .line 7,7:36,39 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  30. IL_000e: ldloc.0
  31. IL_000f: ldc.i4.1
  32. IL_0010: add
  33. IL_0011: stloc.0
  34. .line 7,7:19,34 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  35. IL_0012: ldloc.0
  36. IL_0013: ldarg.0
  37. IL_0014: ldlen
  38. IL_0015: conv.i4
  39. IL_0016: clt
  40. IL_0018: stloc.2
  41. .line 16707566,16707566:0,0 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  42. IL_0019: ldloc.2
  43. IL_001a: brtrue.s IL_0005
  44. .line 10,10:3,12 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  45. IL_001c: ldc.i4.0
  46. IL_001d: stloc.1
  47. IL_001e: br.s IL_0020
  48. .line 11,11:2,3 'c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs'
  49. IL_0020: ldloc.1
  50. IL_0021: ret
  51. ", main);
  52. }
  53. [TestModule ("test.exe", SymbolReaderProvider = typeof (PdbReaderProvider), SymbolWriterProvider = typeof (PdbWriterProvider))]
  54. public void Document (ModuleDefinition module)
  55. {
  56. var type = module.GetType ("Program");
  57. var method = type.GetMethod ("Main");
  58. var sequence_point = method.Body.Instructions.Where (i => i.SequencePoint != null).First ().SequencePoint;
  59. var document = sequence_point.Document;
  60. Assert.IsNotNull (document);
  61. Assert.AreEqual (@"c:\sources\cecil\symbols\Mono.Cecil.Pdb\Test\Resources\assemblies\test.cs", document.Url);
  62. Assert.AreEqual (DocumentType.Text, document.Type);
  63. Assert.AreEqual (DocumentHashAlgorithm.None, document.HashAlgorithm);
  64. Assert.AreEqual (DocumentLanguage.CSharp, document.Language);
  65. Assert.AreEqual (DocumentLanguageVendor.Microsoft, document.LanguageVendor);
  66. }
  67. [TestModule ("VBConsApp.exe", SymbolReaderProvider = typeof (PdbReaderProvider), SymbolWriterProvider = typeof (PdbWriterProvider))]
  68. public void BasicDocument (ModuleDefinition module)
  69. {
  70. var type = module.GetType ("VBConsApp.Program");
  71. var method = type.GetMethod ("Main");
  72. var sequence_point = method.Body.Instructions.Where (i => i.SequencePoint != null).First ().SequencePoint;
  73. var document = sequence_point.Document;
  74. Assert.IsNotNull (document);
  75. Assert.AreEqual (@"c:\tmp\VBConsApp\Program.vb", document.Url);
  76. Assert.AreEqual (DocumentType.Text, document.Type);
  77. Assert.AreEqual (DocumentHashAlgorithm.None, document.HashAlgorithm);
  78. Assert.AreEqual (DocumentLanguage.Basic, document.Language);
  79. Assert.AreEqual (DocumentLanguageVendor.Microsoft, document.LanguageVendor);
  80. }
  81. [TestModule ("fsapp.exe", SymbolReaderProvider = typeof (PdbReaderProvider), SymbolWriterProvider = typeof (PdbWriterProvider))]
  82. public void FSharpDocument (ModuleDefinition module)
  83. {
  84. var type = module.GetType ("Program");
  85. var method = type.GetMethod ("fact");
  86. var sequence_point = method.Body.Instructions.Where (i => i.SequencePoint != null).First ().SequencePoint;
  87. var document = sequence_point.Document;
  88. Assert.IsNotNull (document);
  89. Assert.AreEqual (@"c:\tmp\fsapp\Program.fs", document.Url);
  90. Assert.AreEqual (DocumentType.Text, document.Type);
  91. Assert.AreEqual (DocumentHashAlgorithm.None, document.HashAlgorithm);
  92. Assert.AreEqual (DocumentLanguage.FSharp, document.Language);
  93. Assert.AreEqual (DocumentLanguageVendor.Microsoft, document.LanguageVendor);
  94. }
  95. [Test]
  96. public void CreateMethodFromScratch ()
  97. {
  98. var module = ModuleDefinition.CreateModule ("Pan", ModuleKind.Dll);
  99. var type = new TypeDefinition ("Pin", "Pon", TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed, module.Import (typeof (object)));
  100. module.Types.Add (type);
  101. var method = new MethodDefinition ("Pang", MethodAttributes.Public | MethodAttributes.Static, module.Import (typeof (string)));
  102. type.Methods.Add (method);
  103. var body = method.Body;
  104. body.InitLocals = true;
  105. var il = body.GetILProcessor ();
  106. var temp = new VariableDefinition ("temp", module.Import (typeof (string)));
  107. body.Variables.Add (temp);
  108. il.Emit (OpCodes.Nop);
  109. il.Emit (OpCodes.Ldstr, "hello");
  110. il.Emit (OpCodes.Stloc, temp);
  111. il.Emit (OpCodes.Ldloc, temp);
  112. il.Emit (OpCodes.Ret);
  113. body.Instructions [0].SequencePoint = new SequencePoint (new Document (@"C:\test.cs")) {
  114. StartLine = 0,
  115. StartColumn = 0,
  116. EndLine = 0,
  117. EndColumn = 4,
  118. };
  119. var file = Path.Combine (Path.GetTempPath (), "Pan.dll");
  120. module.Write (file, new WriterParameters {
  121. SymbolWriterProvider = new PdbWriterProvider (),
  122. });
  123. module = ModuleDefinition.ReadModule (file, new ReaderParameters {
  124. SymbolReaderProvider = new PdbReaderProvider (),
  125. });
  126. method = module.GetType ("Pin.Pon").GetMethod ("Pang");
  127. Assert.AreEqual ("temp", method.Body.Variables [0].Name);
  128. }
  129. static void AssertCode (string expected, MethodDefinition method)
  130. {
  131. Assert.IsTrue (method.HasBody);
  132. Assert.IsNotNull (method.Body);
  133. System.Console.WriteLine (Formatter.FormatMethodBody (method));
  134. Assert.AreEqual (Normalize (expected), Normalize (Formatter.FormatMethodBody (method)));
  135. }
  136. static string Normalize (string str)
  137. {
  138. return str.Trim ().Replace ("\r\n", "\n");
  139. }
  140. }
  141. }