PageRenderTime 29ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/main/OpenCover.Test/Framework/Model/InstrumentationModelBuilderTests.cs

http://github.com/sawilde/opencover
C# | 391 lines | 273 code | 73 blank | 45 comment | 0 complexity | 99ed64754baf6b991b89963734ded6bb MD5 | raw file
Possible License(s): Apache-2.0
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using Mono.Cecil;
  5. using Moq;
  6. using NUnit.Framework;
  7. using OpenCover.Framework;
  8. using OpenCover.Framework.Model;
  9. using OpenCover.Framework.Symbols;
  10. using OpenCover.Test.MoqFramework;
  11. using File = OpenCover.Framework.Model.File;
  12. namespace OpenCover.Test.Framework.Model
  13. {
  14. [TestFixture]
  15. internal class InstrumentationModelBuilderTests :
  16. UnityAutoMockContainerBase<IInstrumentationModelBuilder, InstrumentationModelBuilder>
  17. {
  18. [Test]
  19. public void BuildModuleModel_Gets_ModulePath_From_SymbolReader()
  20. {
  21. // arrange
  22. Container.GetMock<ISymbolManager>()
  23. .SetupGet(x => x.ModulePath)
  24. .Returns("ModulePath");
  25. Container.GetMock<IFilter>()
  26. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  27. .Returns(true);
  28. // act
  29. var module = Instance.BuildModuleModel(false);
  30. // assert
  31. Assert.IsNotNull(module);
  32. Assert.AreEqual("ModulePath", module.ModulePath);
  33. Assert.AreEqual("ModulePath", module.Aliases[0]);
  34. }
  35. [Test]
  36. public void BuildModuleModel_Gets_ModuleName_From_SymbolReader()
  37. {
  38. // arrange
  39. Container.GetMock<ISymbolManager>()
  40. .SetupGet(x => x.ModuleName)
  41. .Returns("ModuleName");
  42. Container.GetMock<IFilter>()
  43. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  44. .Returns(true);
  45. // act
  46. var module = Instance.BuildModuleModel(false);
  47. // assert
  48. Assert.IsNotNull(module);
  49. Assert.AreEqual("ModuleName", module.ModuleName);
  50. }
  51. [Test]
  52. public void BuildModuleModel_GetsClasses_From_SymbolReader()
  53. {
  54. // arrange
  55. var @class = new Class();
  56. Container.GetMock<ISymbolManager>()
  57. .Setup(x => x.GetInstrumentableTypes())
  58. .Returns(new[] {@class});
  59. Container.GetMock<IFilter>()
  60. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  61. .Returns(true);
  62. // act
  63. var module = Instance.BuildModuleModel(true);
  64. // assert
  65. Assert.AreEqual(1, module.Classes.GetLength(0));
  66. Assert.AreSame(@class, module.Classes[0]);
  67. Container.GetMock<ISymbolManager>()
  68. .Verify(x => x.GetMethodsForType(It.IsAny<Class>(), It.IsAny<File[]>()), Times.Once());
  69. }
  70. [Test]
  71. public void BuildModuleModel_DoesNotGetMethods_For_SkippedClasses()
  72. {
  73. // arrange
  74. var @class = new Class();
  75. @class.MarkAsSkipped(SkippedMethod.File);
  76. Container.GetMock<ISymbolManager>()
  77. .Setup(x => x.GetInstrumentableTypes())
  78. .Returns(new[] { @class });
  79. Container.GetMock<IFilter>()
  80. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  81. .Returns(true);
  82. // act
  83. var module = Instance.BuildModuleModel(true);
  84. // assert
  85. Assert.AreEqual(1, module.Classes.GetLength(0));
  86. Container.GetMock<ISymbolManager>()
  87. .Verify(x => x.GetMethodsForType(It.IsAny<Class>(), It.IsAny<File[]>()), Times.Never());
  88. }
  89. [Test]
  90. public void BuildModuleModel_Gets_DeclaredMethods_From_SymbolReader()
  91. {
  92. // arrange
  93. var @class = new Class();
  94. var @method = new Method();
  95. Container.GetMock<ISymbolManager>()
  96. .Setup(x => x.GetInstrumentableTypes())
  97. .Returns(new[] { @class });
  98. Container.GetMock<ISymbolManager>()
  99. .Setup(x => x.GetMethodsForType(@class, It.IsAny<File[]>()))
  100. .Returns(new[] { @method });
  101. Container.GetMock<ISymbolManager>()
  102. .Setup(x => x.GetSequencePointsForToken(It.IsAny<int>()))
  103. .Returns(new[] { new SequencePoint() });
  104. Container.GetMock<IFilter>()
  105. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  106. .Returns(true);
  107. // act
  108. var module = Instance.BuildModuleModel(true);
  109. // assert
  110. Assert.AreEqual(1, module.Classes[0].Methods.GetLength(0));
  111. Assert.AreSame(@method, module.Classes[0].Methods[0]);
  112. }
  113. [Test]
  114. public void BuildModuleModel_Gets_SequencePoints_From_SymbolReader()
  115. {
  116. // arrange
  117. var @class = new Class();
  118. var method = new Method{MetadataToken = 101};
  119. var seqPoint = new SequencePoint();
  120. Container.GetMock<ISymbolManager>()
  121. .Setup(x => x.GetInstrumentableTypes())
  122. .Returns(new[] { @class });
  123. Container.GetMock<ISymbolManager>()
  124. .Setup(x => x.GetMethodsForType(@class, It.IsAny<File[]>()))
  125. .Returns(new[] { method });
  126. Container.GetMock<ISymbolManager>()
  127. .Setup(x => x.GetSequencePointsForToken(101))
  128. .Returns(new[] { seqPoint });
  129. Container.GetMock<IFilter>()
  130. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  131. .Returns(true);
  132. // act
  133. var module = Instance.BuildModuleModel(true);
  134. // assert
  135. Assert.AreEqual(1, module.Classes[0].Methods[0].SequencePoints.GetLength(0));
  136. Assert.AreSame(seqPoint, module.Classes[0].Methods[0].SequencePoints[0]);
  137. }
  138. [Test]
  139. public void CanInstrument_If_AssemblyFound()
  140. {
  141. // arrange
  142. var mockDef = AssemblyDefinition.CreateAssembly(
  143. new AssemblyNameDefinition("temp", new Version()), "temp", ModuleKind.Dll);
  144. Container.GetMock<ISymbolManager>()
  145. .SetupGet(x => x.SourceAssembly)
  146. .Returns(mockDef);
  147. // act
  148. var canInstrument = Instance.CanInstrument;
  149. // assert
  150. Assert.IsTrue(canInstrument);
  151. }
  152. [Test]
  153. public void CanGetDefinition_If_AssemblyFound()
  154. {
  155. // arrange
  156. var mockDef = AssemblyDefinition.CreateAssembly(
  157. new AssemblyNameDefinition("temp", new Version()), "temp", ModuleKind.Dll);
  158. Container.GetMock<ISymbolManager>()
  159. .SetupGet(x => x.SourceAssembly)
  160. .Returns(mockDef);
  161. // act
  162. var definition = Instance.GetAssemblyDefinition;
  163. // assert
  164. Assert.AreSame(mockDef, definition);
  165. }
  166. [Test]
  167. public void CanBuildModelOf_RealAssembly()
  168. {
  169. // arrange
  170. var assemblyPath = Path.GetDirectoryName(GetType().Assembly.Location);
  171. Assert.IsNotNull(assemblyPath);
  172. Container.GetMock<ISymbolManager>()
  173. .SetupGet(x => x.ModulePath)
  174. .Returns(Path.Combine(assemblyPath, "OpenCover.Test.dll"));
  175. Container.GetMock<IFilter>()
  176. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  177. .Returns(true);
  178. // act
  179. var module = Instance.BuildModuleModel(true);
  180. // assert
  181. Assert.IsFalse(string.IsNullOrEmpty(module.ModuleHash));
  182. }
  183. [Test]
  184. public void BuildModuleTestModel_GetsTrackedMethods_From_SymbolReader()
  185. {
  186. // arrange
  187. Container.GetMock<ISymbolManager>()
  188. .Setup(x => x.GetTrackedMethods())
  189. .Returns(new TrackedMethod[0]);
  190. // act
  191. var module = Instance.BuildModuleTestModel(null, true);
  192. // assert
  193. Assert.NotNull(module);
  194. Assert.AreEqual(0, module.TrackedMethods.GetLength(0));
  195. Container.GetMock<ISymbolManager>().Verify(x=>x.GetTrackedMethods(), Times.Once());
  196. }
  197. [Test]
  198. public void BuildModuleTestModel_GetsTrackedMethods_From_SymbolReader_UpdatesSuppliedModel()
  199. {
  200. // arrange
  201. Container.GetMock<ISymbolManager>()
  202. .Setup(x => x.GetTrackedMethods())
  203. .Returns(new TrackedMethod[0]);
  204. // act
  205. var origModule = new Module();
  206. var module = Instance.BuildModuleTestModel(origModule, true);
  207. // assert
  208. Assert.NotNull(module);
  209. Assert.AreSame(origModule, module);
  210. Assert.AreEqual(0, module.TrackedMethods.GetLength(0));
  211. Container.GetMock<ISymbolManager>().Verify(x => x.GetTrackedMethods(), Times.Once());
  212. }
  213. [Test]
  214. public void BuildModuleModel_MethodPoint_WhenOffsetZero()
  215. {
  216. // arrange
  217. var @class = new Class();
  218. var method = new Method { MetadataToken = 101 };
  219. var seqPoint = new SequencePoint();
  220. Container.GetMock<ISymbolManager>()
  221. .Setup(x => x.GetInstrumentableTypes())
  222. .Returns(new[] { @class });
  223. Container.GetMock<ISymbolManager>()
  224. .Setup(x => x.GetMethodsForType(@class, It.IsAny<File[]>()))
  225. .Returns(new[] { method });
  226. Container.GetMock<ISymbolManager>()
  227. .Setup(x => x.GetSequencePointsForToken(101))
  228. .Returns(new[] { seqPoint });
  229. Container.GetMock<IFilter>()
  230. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  231. .Returns(true);
  232. // act
  233. var module = Instance.BuildModuleModel(true);
  234. // assert
  235. Assert.AreSame(seqPoint, module.Classes[0].Methods[0].SequencePoints[0]);
  236. Assert.AreSame(seqPoint, module.Classes[0].Methods[0].MethodPoint);
  237. }
  238. [Test]
  239. public void BuildModuleModel_MethodPoint_WhenOffsetGreaterThanZero()
  240. {
  241. // arrange
  242. var @class = new Class();
  243. var method = new Method { MetadataToken = 101 };
  244. var seqPoint = new SequencePoint {Offset = 1};
  245. Container.GetMock<ISymbolManager>()
  246. .Setup(x => x.GetInstrumentableTypes())
  247. .Returns(new[] { @class });
  248. Container.GetMock<ISymbolManager>()
  249. .Setup(x => x.GetMethodsForType(@class, It.IsAny<File[]>()))
  250. .Returns(new[] { method });
  251. Container.GetMock<ISymbolManager>()
  252. .Setup(x => x.GetSequencePointsForToken(101))
  253. .Returns(new[] { seqPoint });
  254. Container.GetMock<IFilter>()
  255. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  256. .Returns(true);
  257. // act
  258. var module = Instance.BuildModuleModel(true);
  259. // assert
  260. Assert.AreSame(seqPoint, module.Classes[0].Methods[0].SequencePoints[0]);
  261. Assert.AreNotSame(seqPoint, module.Classes[0].Methods[0].MethodPoint);
  262. }
  263. [Test]
  264. public void BuildModuleModel_Gets_BranchPoints_WhenHaveSequencePoints()
  265. {
  266. // arrange
  267. var @class = new Class();
  268. var @method = new Method { MetadataToken = 101 };
  269. var seqPoint = new SequencePoint();
  270. var brPoint = new BranchPoint();
  271. Container.GetMock<ISymbolManager>()
  272. .Setup(x => x.GetInstrumentableTypes())
  273. .Returns(new[] { @class });
  274. Container.GetMock<ISymbolManager>()
  275. .Setup(x => x.GetMethodsForType(@class, It.IsAny<File[]>()))
  276. .Returns(new[] { @method });
  277. Container.GetMock<ISymbolManager>()
  278. .Setup(x => x.GetSequencePointsForToken(101))
  279. .Returns(new[] { seqPoint });
  280. Container.GetMock<ISymbolManager>()
  281. .Setup(x => x.GetBranchPointsForToken(101))
  282. .Returns(new[] { brPoint });
  283. Container.GetMock<IFilter>()
  284. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  285. .Returns(true);
  286. // act
  287. var module = Instance.BuildModuleModel(true);
  288. // assert
  289. Assert.AreSame(seqPoint, module.Classes[0].Methods[0].SequencePoints[0]);
  290. Assert.AreSame(brPoint, module.Classes[0].Methods[0].BranchPoints[0]);
  291. }
  292. [Test]
  293. public void BuildModuleModel_Gets_NoBranchPoints_WhenNoSequencePoints()
  294. {
  295. // arrange
  296. var @class = new Class();
  297. var @method = new Method { MetadataToken = 101 };
  298. var brPoint = new BranchPoint();
  299. Container.GetMock<ISymbolManager>()
  300. .Setup(x => x.GetInstrumentableTypes())
  301. .Returns(new[] { @class });
  302. Container.GetMock<ISymbolManager>()
  303. .Setup(x => x.GetMethodsForType(@class, It.IsAny<File[]>()))
  304. .Returns(new[] { @method });
  305. Container.GetMock<ISymbolManager>()
  306. .Setup(x => x.GetBranchPointsForToken(101))
  307. .Returns(new[] { brPoint });
  308. Container.GetMock<IFilter>()
  309. .Setup(x => x.UseAssembly(It.IsAny<string>(), It.IsAny<string>()))
  310. .Returns(true);
  311. // act
  312. var module = Instance.BuildModuleModel(true);
  313. // assert
  314. Assert.IsFalse(module.Classes[0].Methods[0].SequencePoints.Any());
  315. Assert.IsFalse(module.Classes[0].Methods[0].BranchPoints.Any());
  316. }
  317. }
  318. }