PageRenderTime 36ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/CSharpFactoryVS2010/CSharpTreeBuilderTest/Orphan.cs

#
C# | 264 lines | 163 code | 29 blank | 72 comment | 0 complexity | fbda4c6f748f62a87362964cee0c113a MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using CSharpTreeBuilder.CSharpSemanticGraph;
  6. using CSharpTreeBuilder.CSharpSemanticGraphBuilder;
  7. using CSharpTreeBuilder.ProjectContent;
  8. using Microsoft.VisualStudio.TestTools.UnitTesting;
  9. using SoftwareApproach.TestingExtensions;
  10. namespace CSharpTreeBuilderTest
  11. {
  12. class Orphan : ParserTestBed
  13. {
  14. // ----------------------------------------------------------------------------------------------
  15. /// <summary>
  16. /// Error CS0101: The namespace 'A' already contains a definition for 'B' (namespace and class)
  17. /// </summary>
  18. // ----------------------------------------------------------------------------------------------
  19. //[TestMethod]
  20. public void CS0101_ClassAndNamespaceSameName()
  21. {
  22. var project = new CSharpProject(WorkingFolder);
  23. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0101_ClassAndNamespaceSameName.cs");
  24. InvokeParser(project, true, false).ShouldBeTrue();
  25. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  26. project.SyntaxTree.AcceptVisitor(visitor);
  27. project.Errors.Count.ShouldEqual(1);
  28. project.Errors[0].Code.ShouldEqual("CS0101");
  29. }
  30. // ----------------------------------------------------------------------------------------------
  31. /// <summary>
  32. /// Error CS0101: The namespace 'A' already contains a definition for 'B' (class and struct)
  33. /// </summary>
  34. // ----------------------------------------------------------------------------------------------
  35. //[TestMethod]
  36. public void CS0101_ClassAndStructSameName()
  37. {
  38. var project = new CSharpProject(WorkingFolder);
  39. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0101_ClassAndStructSameName.cs");
  40. InvokeParser(project, true, false).ShouldBeTrue();
  41. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  42. project.SyntaxTree.AcceptVisitor(visitor);
  43. project.Errors.Count.ShouldEqual(1);
  44. project.Errors[0].Code.ShouldEqual("CS0101");
  45. }
  46. // ----------------------------------------------------------------------------------------------
  47. /// <summary>
  48. /// Error CS0101: The namespace 'A' already contains a definition for 'B' (class and class - no partial)
  49. /// </summary>
  50. // ----------------------------------------------------------------------------------------------
  51. //[TestMethod]
  52. public void CS0101_ClassAndClassSameName()
  53. {
  54. var project = new CSharpProject(WorkingFolder);
  55. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0101_ClassAndClassSameName.cs");
  56. InvokeParser(project, true, false).ShouldBeTrue();
  57. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  58. project.SyntaxTree.AcceptVisitor(visitor);
  59. project.Errors.Count.ShouldEqual(1);
  60. project.Errors[0].Code.ShouldEqual("CS0101");
  61. }
  62. // ----------------------------------------------------------------------------------------------
  63. /// <summary>
  64. /// Error CS0102: The type 'A' already contains a definition for 'a1'
  65. /// </summary>
  66. // ----------------------------------------------------------------------------------------------
  67. //[TestMethod]
  68. public void CS0102_TypeAlreadyContainsADefinition()
  69. {
  70. var project = new CSharpProject(WorkingFolder);
  71. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0102_TypeAlreadyContainsADefinition.cs");
  72. InvokeParser(project, true, false).ShouldBeTrue();
  73. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  74. project.SyntaxTree.AcceptVisitor(visitor);
  75. project.Errors.Count.ShouldEqual(1);
  76. project.Errors[0].Code.ShouldEqual("CS0102");
  77. }
  78. // ----------------------------------------------------------------------------------------------
  79. /// <summary>
  80. /// Error CS0260: Missing partial modifier on declaration (missing partial on 1st declaration)
  81. /// </summary>
  82. // ----------------------------------------------------------------------------------------------
  83. //[TestMethod]
  84. public void CS0260_MissingPartialOnClass1()
  85. {
  86. var project = new CSharpProject(WorkingFolder);
  87. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0260_MissingPartialOnClass1.cs");
  88. InvokeParser(project, true, false).ShouldBeTrue();
  89. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  90. project.SyntaxTree.AcceptVisitor(visitor);
  91. project.Errors.Count.ShouldEqual(1);
  92. project.Errors[0].Code.ShouldEqual("CS0260");
  93. }
  94. // ----------------------------------------------------------------------------------------------
  95. /// <summary>
  96. /// Error CS0260: Missing partial modifier on declaration (missing partial on 2nd declaration)
  97. /// </summary>
  98. // ----------------------------------------------------------------------------------------------
  99. //[TestMethod]
  100. public void CS0260_MissingPartialOnClass2()
  101. {
  102. var project = new CSharpProject(WorkingFolder);
  103. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0260_MissingPartialOnClass2.cs");
  104. InvokeParser(project, true, false).ShouldBeTrue();
  105. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  106. project.SyntaxTree.AcceptVisitor(visitor);
  107. project.Errors.Count.ShouldEqual(1);
  108. project.Errors[0].Code.ShouldEqual("CS0260");
  109. }
  110. // ----------------------------------------------------------------------------------------------
  111. /// <summary>
  112. /// error CS0542: 'A': member names cannot be the same as their enclosing type
  113. /// </summary>
  114. // ----------------------------------------------------------------------------------------------
  115. //[TestMethod]
  116. public void CS0542_ClassOrStructAndMemberName()
  117. {
  118. var project = new CSharpProject(WorkingFolder);
  119. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0542_ClassOrStructAndMemberName.cs");
  120. InvokeParser(project, true, false).ShouldBeTrue();
  121. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  122. project.SyntaxTree.AcceptVisitor(visitor);
  123. project.Errors.Count.ShouldEqual(6);
  124. foreach (var error in project.Errors)
  125. {
  126. error.Code.ShouldEqual("CS0542");
  127. }
  128. }
  129. // ----------------------------------------------------------------------------------------------
  130. /// <summary>
  131. /// error CS0752: A partial method cannot have out parameters
  132. /// </summary>
  133. // ----------------------------------------------------------------------------------------------
  134. //[TestMethod]
  135. public void CS0752_PartialMethodCannotHaveOutParameter()
  136. {
  137. var project = new CSharpProject(WorkingFolder);
  138. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\CS0752_PartialMethodCannotHaveOutParameter.cs");
  139. InvokeParser(project, true, false).ShouldBeTrue();
  140. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  141. project.SyntaxTree.AcceptVisitor(visitor);
  142. project.Errors.Count.ShouldEqual(1);
  143. project.Errors[0].Code.ShouldEqual("CS0752");
  144. }
  145. // ----------------------------------------------------------------------------------------------
  146. /// <summary>
  147. /// Tests the building of partial methods
  148. /// </summary>
  149. // ----------------------------------------------------------------------------------------------
  150. //[TestMethod]
  151. public void PartialMethod()
  152. {
  153. var project = new CSharpProject(WorkingFolder);
  154. project.AddFile(@"EntityBuilderSyntaxNodeVisitor\PartialMethod.cs");
  155. InvokeParser(project, true, false).ShouldBeTrue();
  156. var visitor = new EntityBuilderSyntaxNodeVisitor(project);
  157. project.SyntaxTree.AcceptVisitor(visitor);
  158. var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A1");
  159. {
  160. var method = classEntity.OwnMembers.ToList()[0] as MethodEntity;
  161. method.IsPartial.ShouldBeTrue();
  162. method.IsAbstract.ShouldBeTrue();
  163. method.IsGeneric.ShouldBeTrue();
  164. method.OwnTypeParameterCount.ShouldEqual(1);
  165. method.GetOwnTypeParameterByName("T1").ShouldNotBeNull();
  166. var parameters = method.Parameters.ToList();
  167. parameters.Count.ShouldEqual(1);
  168. parameters[0].Name.ShouldEqual("a");
  169. var typeref = parameters[0].TypeReference as TypeNodeToTypeEntityResolver;
  170. typeref.SyntaxNode.TypeName.TypeTags[0].Identifier.ShouldEqual("T1");
  171. }
  172. {
  173. var method = classEntity.OwnMembers.ToList()[1] as MethodEntity;
  174. method.IsPartial.ShouldBeTrue();
  175. method.IsAbstract.ShouldBeFalse();
  176. method.IsGeneric.ShouldBeTrue();
  177. method.OwnTypeParameterCount.ShouldEqual(1);
  178. method.GetOwnTypeParameterByName("T2").ShouldNotBeNull();
  179. var parameters = method.Parameters.ToList();
  180. parameters.Count.ShouldEqual(1);
  181. parameters[0].Name.ShouldEqual("b");
  182. var typeref = parameters[0].TypeReference as TypeNodeToTypeEntityResolver;
  183. typeref.SyntaxNode.TypeName.TypeTags[0].Identifier.ShouldEqual("T2");
  184. }
  185. }
  186. // ----------------------------------------------------------------------------------------------
  187. /// <summary>
  188. /// Partial class: if the base type is specified multiple times then only one instance is kept.
  189. /// </summary>
  190. // ----------------------------------------------------------------------------------------------
  191. //[TestMethod]
  192. public void PartialClassDuplicateBaseTypes()
  193. {
  194. var project = new CSharpProject(WorkingFolder);
  195. project.AddFile(@"TypeResolution\PartialClassDuplicateBaseTypes.cs");
  196. InvokeParser(project).ShouldBeTrue();
  197. var classEntity = project.SemanticGraph.GlobalNamespace.ChildTypes.ToList()[0] as ClassEntity;
  198. var baseTypeRefs = classEntity.BaseTypeReferences.ToList();
  199. baseTypeRefs.Count.ShouldEqual(1);
  200. classEntity.BaseClass.FullyQualifiedName.ShouldEqual("B");
  201. }
  202. // ----------------------------------------------------------------------------------------------
  203. /// <summary>
  204. /// Partial class: if a base interface is specified multiple times then only one instance is kept.
  205. /// </summary>
  206. // ----------------------------------------------------------------------------------------------
  207. //[TestMethod]
  208. public void PartialClassDuplicateBaseInterfaces()
  209. {
  210. var project = new CSharpProject(WorkingFolder);
  211. project.AddFile(@"TypeResolution\PartialClassDuplicateBaseInterfaces.cs");
  212. InvokeParser(project).ShouldBeTrue();
  213. var classEntity = project.SemanticGraph.GlobalNamespace.ChildTypes.ToList()[0] as ClassEntity;
  214. classEntity.BaseInterfaces.Count.ShouldEqual(3);
  215. classEntity.BaseInterfaces[0].FullyQualifiedName.ShouldEqual("I1");
  216. classEntity.BaseInterfaces[1].FullyQualifiedName.ShouldEqual("I2");
  217. classEntity.BaseInterfaces[2].FullyQualifiedName.ShouldEqual("I3");
  218. }
  219. // ----------------------------------------------------------------------------------------------
  220. /// <summary>
  221. /// error CS0263: Partial declarations of 'A' must not specify different base classes
  222. /// </summary>
  223. // ----------------------------------------------------------------------------------------------
  224. //[TestMethod]
  225. public void CS0263_PartialClassConflictingBaseTypes()
  226. {
  227. var project = new CSharpProject(WorkingFolder);
  228. project.AddFile(@"TypeResolution\CS0263_PartialClassConflictingBaseTypes.cs");
  229. InvokeParser(project).ShouldBeFalse();
  230. project.Errors.Count.ShouldEqual(1);
  231. project.Errors[0].Code.ShouldEqual("CS0263");
  232. project.Warnings.Count.ShouldEqual(0);
  233. }
  234. }
  235. }