PageRenderTime 28ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/Tests/TechTalk.SpecFlow.GeneratorTests/UnitTestProvider/NUnit3GeneratorProviderTests.cs

http://github.com/techtalk/SpecFlow
C# | 385 lines | 311 code | 57 blank | 17 comment | 49 complexity | 50fed261b44f8a0eaa05a49c711ca11f MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0
  1. using System.CodeDom;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Linq;
  5. using FluentAssertions;
  6. using TechTalk.SpecFlow.Configuration;
  7. using TechTalk.SpecFlow.Generator;
  8. using TechTalk.SpecFlow.Generator.CodeDom;
  9. using TechTalk.SpecFlow.Generator.Interfaces;
  10. using TechTalk.SpecFlow.Generator.UnitTestConverter;
  11. using TechTalk.SpecFlow.Generator.UnitTestProvider;
  12. using TechTalk.SpecFlow.Parser;
  13. using Xunit;
  14. namespace TechTalk.SpecFlow.GeneratorTests.UnitTestProvider
  15. {
  16. public class NUnit3GeneratorProviderTests
  17. {
  18. private const string NUnit3TestCaseAttributeName = @"NUnit.Framework.TestCaseAttribute";
  19. private const string SampleFeatureFile = @"
  20. Feature: Sample feature file
  21. Scenario: Simple scenario
  22. Given there is something
  23. When I do something
  24. Then something should happen";
  25. private const string IgnoredFeatureFile = @"
  26. @ignore
  27. Feature: Ignored feature file";
  28. private const string FeatureFileWithIgnoredScenario = @"
  29. Feature: Feature With Ignored Scenario
  30. @ignore
  31. Scenario: Ignored scenario";
  32. [Fact]
  33. public void NUnit3TestGeneratorProvider_ExampleSetSingleColumn_ShouldSetDescriptionWithVariantNameFromFirstColumn()
  34. {
  35. // ARRANGE
  36. const string sampleFeatureFile = @"
  37. Feature: Sample feature file
  38. Scenario: Simple scenario
  39. Given there is something
  40. When I do something
  41. Then something should happen
  42. @mytag
  43. Scenario Outline: Simple Scenario Outline
  44. Given there is something
  45. """"""
  46. long string
  47. """"""
  48. When I do <what>
  49. | foo | bar |
  50. | 1 | 2 |
  51. Then something should happen
  52. Examples:
  53. | what |
  54. | something |
  55. | something else |
  56. ";
  57. var document = ParseDocumentFromString(sampleFeatureFile);
  58. var sampleTestGeneratorProvider = new NUnit3TestGeneratorProvider(new CodeDomHelper(CodeDomProviderLanguage.CSharp));
  59. var converter = sampleTestGeneratorProvider.CreateUnitTestConverter();
  60. // ACT
  61. var code = converter.GenerateUnitTestFixture(document, "TestClassName", "Target.Namespace");
  62. // ASSERT
  63. var testMethod = code.Class().Members().Single(m => m.Name == "SimpleScenarioOutline");
  64. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "something");
  65. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "something else");
  66. }
  67. [Fact]
  68. public void NUnit3TestGeneratorProvider_ExamplesWithIdenticalFirstColumn_ShouldSetDescriptionCorrectly()
  69. {
  70. // ARRANGE
  71. const string sampleFeatureFileSameFirstColumn = @"
  72. Feature: Sample feature file
  73. Scenario: Simple scenario
  74. Given there is something
  75. When I do something
  76. Then something should happen
  77. @mytag
  78. Scenario Outline: Simple Scenario Outline
  79. Given there is something
  80. """"""
  81. long string
  82. """"""
  83. When I do <what>
  84. | foo | bar |
  85. | 1 | 2 |
  86. Then something should happen
  87. Examples:
  88. | what | what else |
  89. | something | thing |
  90. | something | different thing |
  91. ";
  92. var document = ParseDocumentFromString(sampleFeatureFileSameFirstColumn);
  93. var sampleTestGeneratorProvider = new NUnit3TestGeneratorProvider(new CodeDomHelper(CodeDomProviderLanguage.CSharp));
  94. var converter = sampleTestGeneratorProvider.CreateUnitTestConverter();
  95. // ACT
  96. var code = converter.GenerateUnitTestFixture(document, "TestClassName", "Target.Namespace");
  97. // ASSERT
  98. var testMethod = code.Class().Members().Single(m => m.Name == "SimpleScenarioOutline");
  99. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName
  100. && a.ArgumentValues().OfType<string>().ElementAt(0) == "something"
  101. && a.ArgumentValues().OfType<string>().ElementAt(1) == "thing");
  102. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName
  103. && a.ArgumentValues().OfType<string>().ElementAt(0) == "something"
  104. && a.ArgumentValues().OfType<string>().ElementAt(1) == "different thing");
  105. }
  106. [Fact]
  107. public void NUnit3TestGeneratorProvider_ExamplesFirstColumnIsDifferentAndMultipleColumns_ShouldSetDescriptionCorrectly()
  108. {
  109. // ARRANGE
  110. const string sampleFeatureFileMultipleColumns = @"
  111. Feature: Sample feature file
  112. Scenario: Simple scenario
  113. Given there is something
  114. When I do something
  115. Then something should happen
  116. @mytag
  117. Scenario Outline: Simple Scenario Outline
  118. Given there is something
  119. """"""
  120. long string
  121. """"""
  122. When I do <what>
  123. | foo | bar |
  124. | 1 | 2 |
  125. Then something should happen
  126. Examples:
  127. | what | what else |
  128. | something | thing |
  129. | something else | different thing |
  130. ";
  131. var document = ParseDocumentFromString(sampleFeatureFileMultipleColumns);
  132. var sampleTestGeneratorProvider = new NUnit3TestGeneratorProvider(new CodeDomHelper(CodeDomProviderLanguage.CSharp));
  133. var converter = sampleTestGeneratorProvider.CreateUnitTestConverter();
  134. // ACT
  135. var code = converter.GenerateUnitTestFixture(document, "TestClassName", "Target.Namespace");
  136. // ASSERT
  137. var testMethod = code.Class().Members().Single(m => m.Name == "SimpleScenarioOutline");
  138. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "something");
  139. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "something else");
  140. }
  141. [Fact]
  142. public void NUnit3TestGeneratorProvider_ExampleSetIdentifiers_ShouldSetDescriptionCorrectly()
  143. {
  144. // ARRANGE
  145. const string sampleFeatureFileWithMultipleExampleSets = @"
  146. Feature: Sample feature file
  147. Scenario: Simple scenario
  148. Given there is something
  149. When I do something
  150. Then something should happen
  151. @mytag
  152. Scenario Outline: Simple Scenario Outline
  153. Given there is something
  154. """"""
  155. long string
  156. """"""
  157. When I do <what>
  158. | foo | bar |
  159. | 1 | 2 |
  160. Then something should happen
  161. Examples:
  162. | what |
  163. | something |
  164. | something else |
  165. Examples:
  166. | what |
  167. | another |
  168. | and another |
  169. ";
  170. var document = ParseDocumentFromString(sampleFeatureFileWithMultipleExampleSets);
  171. var sampleTestGeneratorProvider = new NUnit3TestGeneratorProvider(new CodeDomHelper(CodeDomProviderLanguage.CSharp));
  172. var converter = sampleTestGeneratorProvider.CreateUnitTestConverter();
  173. // ACT
  174. var code = converter.GenerateUnitTestFixture(document, "TestClassName", "Target.Namespace");
  175. // ASSERT
  176. var testMethod = code.Class().Members().Single(m => m.Name == "SimpleScenarioOutline");
  177. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "something");
  178. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "something else");
  179. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "another");
  180. testMethod.CustomAttributes().Should().ContainSingle(a => a.Name == NUnit3TestCaseAttributeName && (string)a.ArgumentValues().First() == "and another");
  181. }
  182. [Fact]
  183. public void NUnit3TestGeneratorProvider_ShouldNotGenerateObsoleteTestFixtureSetUpAttribute()
  184. {
  185. var code = GenerateCodeNamespaceFromFeature(SampleFeatureFile);
  186. var featureSetupMethod = code.Class().Members().Single(m => m.Name == "FeatureSetup");
  187. featureSetupMethod.CustomAttributes()
  188. .FirstOrDefault(a => a.Name == "NUnit.Framework.TestFixtureSetUpAttribute")
  189. .Should()
  190. .BeNull();
  191. }
  192. [Fact]
  193. public void NUnit3TestGeneratorProvider_ShouldGenerateNewOneTimeSetUpAttribute()
  194. {
  195. var code = GenerateCodeNamespaceFromFeature(SampleFeatureFile);
  196. var featureSetupMethod = code.Class().Members().Single(m => m.Name == "FeatureSetup");
  197. // Assert that we do use the NUnit3 attribute
  198. featureSetupMethod.CustomAttributes()
  199. .FirstOrDefault(a => a.Name == "NUnit.Framework.OneTimeSetUpAttribute")
  200. .Should()
  201. .NotBeNull();
  202. }
  203. [Fact]
  204. public void NUnit3TestGeneratorProvider_ShouldNotGenerateObsoleteTestFixtureTearDownAttribute()
  205. {
  206. var code = GenerateCodeNamespaceFromFeature(SampleFeatureFile);
  207. var featureSetupMethod = code.Class().Members().Single(m => m.Name == "FeatureTearDown");
  208. featureSetupMethod.CustomAttributes()
  209. .FirstOrDefault(a => a.Name == "NUnit.Framework.TestFixtureTearDownAttribute")
  210. .Should()
  211. .BeNull();
  212. }
  213. [Fact]
  214. public void NUnit3TestGeneratorProvider_ShouldGenerateNewOneTimeTearDownAttribute()
  215. {
  216. var code = GenerateCodeNamespaceFromFeature(SampleFeatureFile);
  217. var featureSetupMethod = code.Class().Members().Single(m => m.Name == "FeatureTearDown");
  218. // Assert that we do use the NUnit3 attribute
  219. featureSetupMethod.CustomAttributes()
  220. .FirstOrDefault(a => a.Name == "NUnit.Framework.OneTimeTearDownAttribute")
  221. .Should()
  222. .NotBeNull();
  223. }
  224. [Fact]
  225. public void NUnit3TestGeneratorProvider_ShouldHaveRowTestsTrait()
  226. {
  227. var nUnit3TestGeneratorProvider = CreateTestGeneratorProvider();
  228. nUnit3TestGeneratorProvider.GetTraits()
  229. .HasFlag(UnitTestGeneratorTraits.RowTests)
  230. .Should()
  231. .BeTrue("trait RowTests was not found");
  232. }
  233. [Fact]
  234. public void NUnit3TestGeneratorProvider_ShouldHaveParallelExecutionTrait()
  235. {
  236. var nUnit3TestGeneratorProvider = CreateTestGeneratorProvider();
  237. nUnit3TestGeneratorProvider.GetTraits()
  238. .HasFlag(UnitTestGeneratorTraits.ParallelExecution)
  239. .Should()
  240. .BeTrue("trait ParallelExecution was not found");
  241. }
  242. [Fact]
  243. public void NUnit3TestGeneratorProvider_ShouldAddParallelizableAttribute()
  244. {
  245. // ARRANGE
  246. const string exampleFeatureFileWithTags = @"
  247. @tag1 @tag2 @tag3
  248. Feature: Sample feature file
  249. Scenario: Simple scenario
  250. Given there is something
  251. When I do something
  252. Then something should happen";
  253. // ACT
  254. var code = GenerateCodeNamespaceFromFeature(exampleFeatureFileWithTags, true);
  255. // ASSERT
  256. var attributes = code.Class().CustomAttributes().ToArray();
  257. attributes.Where(a => a.Name == "NUnit.Framework.ParallelizableAttribute")
  258. .Should().HaveCount(1, "Only one Parallelizable attribute should be set");
  259. }
  260. [Fact]
  261. public void NUnit3TestGeneratorProvider_ShouldAddParallelizableAttributeBecauseThereIsNoMatchingIgnoreTag()
  262. {
  263. var code = GenerateCodeNamespaceFromFeature(SampleFeatureFile, true, new[] { "myOtherexternalDependencies" });
  264. var attributes = code.Class().CustomAttributes().ToArray();
  265. var attribute = attributes.FirstOrDefault(a => a.Name == "NUnit.Framework.ParallelizableAttribute");
  266. attribute.Should().NotBeNull("Parallelizable attribute was not found");
  267. }
  268. [Fact]
  269. public void NUnit3TestGeneratorProvider_ShouldNotAddParallelizableAttribute()
  270. {
  271. const string featureFileWithParallelizeIgnore = @"
  272. @externalDependencies @externalDependencies2
  273. Feature: Parallelized feature file";
  274. var code = GenerateCodeNamespaceFromFeature(featureFileWithParallelizeIgnore, true,new [] { "externalDependencies" });
  275. var attributes = code.Class().CustomAttributes().ToArray();
  276. var attribute = attributes.FirstOrDefault(a => a.Name == "NUnit.Framework.ParallelizableAttribute");
  277. attribute.Should().BeNull("Parallelizable attribute was found");
  278. }
  279. public CodeNamespace GenerateCodeNamespaceFromFeature(string feature, bool parallelCode = false, string[] ignoreParallelTags = null)
  280. {
  281. CodeNamespace code;
  282. using (var reader = new StringReader(feature))
  283. {
  284. var parser = new SpecFlowGherkinParser(new CultureInfo("en-US"));
  285. var document = parser.Parse(reader, "test.feature");
  286. var featureGenerator = CreateFeatureGenerator(parallelCode,ignoreParallelTags);
  287. code = featureGenerator.GenerateUnitTestFixture(document, "TestClassName", "Target.Namespace");
  288. }
  289. return code;
  290. }
  291. public IFeatureGenerator CreateFeatureGenerator(bool parallelCode,string[] ignoreParallelTags)
  292. {
  293. var container = new GeneratorContainerBuilder().CreateContainer(new SpecFlowConfigurationHolder(ConfigSource.Default, null), new ProjectSettings(), Enumerable.Empty<GeneratorPluginInfo>());
  294. var specFlowConfiguration = container.Resolve<SpecFlowConfiguration>();
  295. specFlowConfiguration.MarkFeaturesParallelizable = parallelCode;
  296. specFlowConfiguration.SkipParallelizableMarkerForTags = ignoreParallelTags ??
  297. Enumerable.Empty<string>().ToArray();
  298. container.RegisterInstanceAs(CreateTestGeneratorProvider());
  299. var generator = container.Resolve<UnitTestFeatureGeneratorProvider>().CreateGenerator(ParserHelper.CreateAnyDocument());
  300. return generator;
  301. }
  302. private static NUnit3TestGeneratorProvider CreateTestGeneratorProvider()
  303. {
  304. return new NUnit3TestGeneratorProvider(new CodeDomHelper(CodeDomProviderLanguage.CSharp));
  305. }
  306. public SpecFlowDocument ParseDocumentFromString(string documentSource, CultureInfo parserCultureInfo = null)
  307. {
  308. var parser = new SpecFlowGherkinParser(parserCultureInfo ?? new CultureInfo("en-US"));
  309. using (var reader = new StringReader(documentSource))
  310. {
  311. var document = parser.Parse(reader, null);
  312. document.Should().NotBeNull();
  313. return document;
  314. }
  315. }
  316. }
  317. }