PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/src/DevCode/MoqaLate.Tests/Unit/InterfaceParserTest.cs

http://moqalate.codeplex.com
C# | 391 lines | 248 code | 141 blank | 2 comment | 0 complexity | 0da72ce4e639b3d3ee3ee9e45aac4720 MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using AutoMoq;
  4. using FluentAssertions;
  5. using MoqaLate.CodeModel;
  6. using MoqaLate.InterfaceTextParsing;
  7. using NUnit.Framework;
  8. namespace MoqaLate.Tests.Unit
  9. {
  10. [TestFixture]
  11. public class InterfaceParserTest
  12. {
  13. private List<string> _interfaceLines;
  14. private InterfaceLineTextLineTextParser _sut;
  15. private List<string> _genericInterfaceLines;
  16. private List<string> _privateInterfaceLines;
  17. [SetUp]
  18. public void Setup()
  19. {
  20. CreateTestInterfaceText();
  21. CreateGenericTestInterfaceText();
  22. CreatePrivateInterfaceText();
  23. var mocker = new AutoMoqer();
  24. _sut = mocker.Resolve<InterfaceLineTextLineTextParser>();
  25. }
  26. [Test]
  27. public void ShouldRecognisePublicInterfaces()
  28. {
  29. var output = _sut.GenerateClass(CreateSimpleInterface("public"));
  30. output.IsPublic.Should().Be(true);
  31. output.IsValid.Should().Be(true);
  32. }
  33. [Test]
  34. public void ShouldRecogniseInternalInterfaces()
  35. {
  36. var output = _sut.GenerateClass(CreateSimpleInterface("internal"));
  37. output.IsPublic.Should().Be(false);
  38. output.IsValid.Should().Be(true);
  39. }
  40. [Test]
  41. public void ShouldParseNamespace()
  42. {
  43. var output = _sut.GenerateClass(_interfaceLines);
  44. output.OriginalInterfaceNamespace.Should().Be("Awesome.Namespace");
  45. }
  46. [Test]
  47. public void ShouldParseClassName()
  48. {
  49. var output = _sut.GenerateClass(_interfaceLines);
  50. output.ClassName.Should().Be("TestInterfaceMoqaLate");
  51. }
  52. [Test]
  53. public void ShouldParseGenericClassName()
  54. {
  55. var output = _sut.GenerateClass(_genericInterfaceLines);
  56. output.ClassName.Should().Be("TestInterfaceMoqaLate");
  57. }
  58. [Test]
  59. public void ShouldParseInterfaceGenericTypes()
  60. {
  61. var output = _sut.GenerateClass(_genericInterfaceLines);
  62. output.ClassName.Should().Be("TestInterfaceMoqaLate");
  63. output.InterfaceGenericTypes.Should().Be("<T,K>");
  64. }
  65. [Test]
  66. public void ShouldParseOriginalInterfaceName()
  67. {
  68. var output = _sut.GenerateClass(_interfaceLines);
  69. output.OriginalInterfaceName.Should().Be("ITestInterface");
  70. }
  71. [Test]
  72. public void ShouldParseAllNamespaces()
  73. {
  74. var output = _sut.GenerateClass(_interfaceLines);
  75. output.Usings.Should().Contain("System.Collections.Generic");
  76. output.Usings.Should().Contain("FluentAssertions");
  77. output.Usings.Should().Contain("NUnit.Framework");
  78. }
  79. #region "Properties"
  80. [Test]
  81. public void ShouldParseGetSetProperties()
  82. {
  83. var output = _sut.GenerateClass(_interfaceLines);
  84. output.Properties[0].Name.Should().Be("PropGetSet");
  85. output.Properties[0].Type.Should().Be("string");
  86. output.Properties[0].Accessor.Should().Be(PropertyAccessor.GetAndSet);
  87. }
  88. [Test]
  89. public void ShouldParseGetProperties()
  90. {
  91. var output = _sut.GenerateClass(_interfaceLines);
  92. output.Properties[1].Name.Should().Be("PropGet");
  93. output.Properties[1].Type.Should().Be("List<string>");
  94. output.Properties[1].Accessor.Should().Be(PropertyAccessor.GetOny);
  95. }
  96. [Test]
  97. public void ShouldParseSetProperties()
  98. {
  99. var output = _sut.GenerateClass(_interfaceLines);
  100. output.Properties[2].Name.Should().Be("PropSet");
  101. output.Properties[2].Type.Should().Be("int");
  102. output.Properties[2].Accessor.Should().Be(PropertyAccessor.SetOny);
  103. }
  104. #endregion
  105. #region "methods"
  106. [Test]
  107. public void ShouldParseVoidMethodWithNoParams()
  108. {
  109. var output = _sut.GenerateClass(_interfaceLines);
  110. output.Methods[0].Name.Should().Be("DoStuff");
  111. output.Methods[0].Parameters.Should().BeEmpty(string.Empty);
  112. output.Methods[0].ReturnType.Should().Be("void");
  113. }
  114. [Test]
  115. public void ShouldParseStringMethodWithNoParams()
  116. {
  117. var output = _sut.GenerateClass(_interfaceLines);
  118. output.Methods[1].Name.Should().Be("DoStuff2");
  119. output.Methods[1].Parameters.Should().BeEmpty(string.Empty);
  120. output.Methods[1].ReturnType.Should().Be("string");
  121. }
  122. [Test]
  123. public void ShouldParseMethodWithMultipleParams()
  124. {
  125. var output = _sut.GenerateClass(_interfaceLines);
  126. output.Methods[2].Name.Should().Be("DoStuff3");
  127. output.Methods[2].Parameters[0].Type.Should().Be("Func<bool, int>");
  128. output.Methods[2].Parameters[0].Name.Should().Be("p1");
  129. output.Methods[2].Parameters[1].Type.Should().Be("string");
  130. output.Methods[2].Parameters[1].Name.Should().Be("p2");
  131. output.Methods[2].ReturnType.Should().Be("List<List<int>>");
  132. }
  133. [Test]
  134. public void ShouldParseGenericWithinGenericMethodWithMultipleParams()
  135. {
  136. var output = _sut.GenerateClass(_interfaceLines);
  137. output.Methods[3].Name.Should().Be("DoStuff4");
  138. output.Methods[3].Parameters[0].Type.Should().Be("Func<bool, int>");
  139. output.Methods[3].Parameters[0].Name.Should().Be("p1");
  140. output.Methods[3].ReturnType.Should().Be("Func<bool, int>");
  141. }
  142. [Test]
  143. public void ShouldParseVoidWithComplexParams()
  144. {
  145. var output = _sut.GenerateClass(_interfaceLines);
  146. output.Methods[4].Name.Should().Be("LetsDoIt");
  147. output.Methods[4].Parameters[0].Type.Should().Be("Func<bool, int>");
  148. output.Methods[4].Parameters[0].Name.Should().Be("p1");
  149. output.Methods[4].Parameters[1].Type.Should().Be("string");
  150. output.Methods[4].Parameters[1].Name.Should().Be("p2");
  151. output.Methods[4].ReturnType.Should().Be("void");
  152. }
  153. [Test]
  154. public void ShouldParseGenericMethod()
  155. {
  156. Assert.Inconclusive("void DoIt<T>(T p1)...");
  157. }
  158. #endregion
  159. #region "Events"
  160. [Test]
  161. public void ShouldParseEvent()
  162. {
  163. var output = _sut.GenerateClass(_interfaceLines);
  164. output.Events[0].Name.Should().Be("E1");
  165. output.Events[0].Type.Should().Be("EventHandler");
  166. }
  167. [Test]
  168. public void ShouldParseEventWithActionType()
  169. {
  170. var output = _sut.GenerateClass(_interfaceLines);
  171. output.Events[1].Name.Should().Be("E2");
  172. output.Events[1].Type.Should().Be("Action<int>");
  173. }
  174. [Test]
  175. public void ShouldParseEventWithComplexActionType()
  176. {
  177. var output = _sut.GenerateClass(_interfaceLines);
  178. output.Events[2].Name.Should().Be("E3");
  179. output.Events[2].Type.Should().Be("Action<int,string>");
  180. }
  181. #endregion
  182. private void CreateTestInterfaceText()
  183. {
  184. _interfaceLines = new List<string>();
  185. _interfaceLines.Add("using System.Collections.Generic;");
  186. _interfaceLines.Add("using FluentAssertions;");
  187. _interfaceLines.Add("using NUnit.Framework;");
  188. _interfaceLines.Add("namespace Awesome.Namespace");
  189. _interfaceLines.Add("{");
  190. _interfaceLines.Add("public interface ITestInterface");
  191. _interfaceLines.Add("{");
  192. // some random attributes
  193. _interfaceLines.Add("[ComVisible(true)]");
  194. _interfaceLines.Add(@" [Guid(""496B0ABE-CDEE-11d3-88E8-00902754C43A"")]");
  195. _interfaceLines.Add(" string PropGetSet { get; set; }");
  196. _interfaceLines.Add(" List<string> PropGet { get; }");
  197. _interfaceLines.Add(" int PropSet { set; }");
  198. _interfaceLines.Add(" void DoStuff();");
  199. _interfaceLines.Add(" string DoStuff2();");
  200. _interfaceLines.Add(" List<List<int>> DoStuff3(Func<bool, int> p1, string p2);");
  201. _interfaceLines.Add(" Func<bool, int> DoStuff4(Func<bool, int> p1);");
  202. _interfaceLines.Add(" void LetsDoIt(Func<bool, int> p1, string p2);");
  203. _interfaceLines.Add(" void LetsDoIt2(int p1 = 1, string p2 = null)");
  204. _interfaceLines.Add(" event EventHandler E1;");
  205. _interfaceLines.Add(" event Action<int> E2;");
  206. _interfaceLines.Add(" event Action<int,string> E3;");
  207. _interfaceLines.Add(@" // this is a comment and should be ignored");
  208. _interfaceLines.Add("}"); // class
  209. _interfaceLines.Add("}"); // namespace
  210. }
  211. private void CreateGenericTestInterfaceText()
  212. {
  213. _genericInterfaceLines = new List<string>();
  214. _genericInterfaceLines.Add("namespace Awesome.Namespace");
  215. _genericInterfaceLines.Add("{");
  216. _genericInterfaceLines.Add("public interface ITestInterface<T,K>");
  217. _genericInterfaceLines.Add("{");
  218. _genericInterfaceLines.Add(" T PropGetSet { get; set; }");
  219. _genericInterfaceLines.Add(" K PropGet { get; }");
  220. _genericInterfaceLines.Add("}"); // class
  221. _genericInterfaceLines.Add("}"); // namespace
  222. }
  223. private void CreatePrivateInterfaceText()
  224. {
  225. _privateInterfaceLines = new List<string>();
  226. _privateInterfaceLines.Add("namespace Awesome.Namespace");
  227. _privateInterfaceLines.Add("{");
  228. _privateInterfaceLines.Add("private interface ITestInterface<T,K>");
  229. _privateInterfaceLines.Add("{");
  230. _privateInterfaceLines.Add(" T PropGetSet { get; set; }");
  231. _privateInterfaceLines.Add(" K PropGet { get; }");
  232. _privateInterfaceLines.Add("}"); // class
  233. _privateInterfaceLines.Add("}"); // namespace
  234. }
  235. private List<string> CreateSimpleInterface(string accessModifier)
  236. {
  237. var lines = new List<string>();
  238. lines.Add("namespace Awesome.Namespace");
  239. lines.Add("{");
  240. lines.Add(accessModifier + " interface ITestInterface<T,K>");
  241. lines.Add("{");
  242. lines.Add(" T PropGetSet { get; set; }");
  243. lines.Add(" K PropGet { get; }");
  244. lines.Add("}"); // class
  245. lines.Add("}"); // namespace
  246. return lines;
  247. }
  248. }
  249. // TODO: delegate ??
  250. }