Skip to content

Commit 6174f86

Browse files
committed
Added inline assertion support to fluent api
1 parent 5a36a79 commit 6174f86

11 files changed

Lines changed: 190 additions & 11 deletions

File tree

TestStack.BDDfy.Tests/FluentScanner/BDDfyUsingFluentApi.cs renamed to TestStack.BDDfy.Tests/Scanner/FluentScanner/BDDfyUsingFluentApi.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Reflection;
45
using NUnit.Framework;
5-
using System.Linq;
66
using TestStack.BDDfy.Configuration;
77

8-
namespace TestStack.BDDfy.Tests.FluentScanner
8+
namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
99
{
1010
public enum SomeEnumForTesting
1111
{
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using NUnit.Framework;
2+
3+
namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
4+
{
5+
[TestFixture]
6+
public class InlineAssertions
7+
{
8+
private int _x, _y, _z;
9+
10+
[Test]
11+
public void CanUseInlineAssertions()
12+
{
13+
this.Given(() => { _x = 0; _y = 2; }, "Given x equals 0")
14+
.When(() => { _z = _x*_y; }, "When x and y are multiplied")
15+
.Then(() => Assert.That(_z, Is.EqualTo(0)), "Then the result is 0")
16+
.BDDfy();
17+
}
18+
19+
[Test]
20+
public void CanUseTitleOnlySteps()
21+
{
22+
this.Given("Given x equals 0")
23+
.And("and y equals 0")
24+
.When("When x and y are multiplied")
25+
.And("and set to z")
26+
.Then("Then z equals 0")
27+
.And("and we're all cool")
28+
.BDDfy();
29+
}
30+
31+
[Test]
32+
public void CanMixThemAllIn()
33+
{
34+
this.Given(() => { _x = 0; _y = 2; }, "Given x equals 0")
35+
.And("and y equals 0")
36+
.When(_ => WhenXAndYAreMultiplied())
37+
.And("and set to z")
38+
.Then(() => Assert.That(_z, Is.EqualTo(0)), "Then the result is 0")
39+
.And("and we're all cool")
40+
.BDDfy();
41+
42+
}
43+
44+
void WhenXAndYAreMultiplied()
45+
{
46+
_z = _x*_y;
47+
}
48+
}
49+
}

TestStack.BDDfy.Tests/FluentScanner/ScenarioToBeScannedUsingFluentScanner.cs renamed to TestStack.BDDfy.Tests/Scanner/FluentScanner/ScenarioToBeScannedUsingFluentScanner.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Globalization;
34
using System.Linq;
4-
using System.Collections.Generic;
55

6-
namespace TestStack.BDDfy.Tests.FluentScanner
6+
namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
77
{
88
[Story]
99
class ScenarioToBeScannedUsingFluentScanner

TestStack.BDDfy.Tests/FluentScanner/WhenStepsAreScannedUsingFluentScanner.cs renamed to TestStack.BDDfy.Tests/Scanner/FluentScanner/WhenStepsAreScannedUsingFluentScanner.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using System.Collections.Generic;
2-
using NUnit.Framework;
32
using System.Linq;
3+
using NUnit.Framework;
44

5-
namespace TestStack.BDDfy.Tests.FluentScanner
5+
namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
66
{
77
[TestFixture]
88
public class WhenStepsAreScannedUsingFluentScanner

TestStack.BDDfy.Tests/TestStack.BDDfy.Tests.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
<Compile Include="Reporters\Html\HtmlReportBuilderTests.cs" />
7878
<Compile Include="Reporters\Html\HtmlReporterTests.cs" />
7979
<Compile Include="Reporters\Html\TestableHtmlReporter.cs" />
80+
<Compile Include="Scanner\FluentScanner\InlineAssertions.cs" />
8081
<Compile Include="Scanner\WhenStepScannerFactoryAsyncMethods.cs" />
8182
<Compile Include="Configuration\CustomProcessor.cs" />
8283
<Compile Include="Configuration\BatchProcessorsTests.cs" />
@@ -86,11 +87,11 @@
8687
<Compile Include="Exceptions\ThrowingMethods.cs" />
8788
<Compile Include="Exceptions\WhenAnInconclusiveTestIsRun.cs" />
8889
<Compile Include="Exceptions\ExceptionThrowingTest.cs" />
89-
<Compile Include="FluentScanner\BDDfyUsingFluentApi.cs" />
90-
<Compile Include="FluentScanner\ScenarioToBeScannedUsingFluentScanner.cs">
90+
<Compile Include="Scanner\FluentScanner\BDDfyUsingFluentApi.cs" />
91+
<Compile Include="Scanner\FluentScanner\ScenarioToBeScannedUsingFluentScanner.cs">
9192
<SubType>Code</SubType>
9293
</Compile>
93-
<Compile Include="FluentScanner\WhenStepsAreScannedUsingFluentScanner.cs">
94+
<Compile Include="Scanner\FluentScanner\WhenStepsAreScannedUsingFluentScanner.cs">
9495
<SubType>Code</SubType>
9596
</Compile>
9697
<Compile Include="HumanizerTests.cs" />

TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,18 +213,47 @@ private void AddStep(Expression<Action<TScenario>> stepAction, string stepTextTe
213213
_steps.Add(new Step(StepActionFactory.GetStepAction(action), stepTitle, asserts, executionOrder, reports));
214214
}
215215

216+
private void AddStep(Action stepAction, string title, bool asserts, ExecutionOrder executionOrder, bool reports = true)
217+
{
218+
_steps.Add(new Step(o => stepAction(), title, asserts, executionOrder, reports));
219+
}
220+
216221
public IGiven<TScenario> Given(Expression<Action<TScenario>> givenStep, string stepTextTemplate = null)
217222
{
218223
AddStep(givenStep, stepTextTemplate, false, ExecutionOrder.SetupState);
219224
return this;
220225
}
221226

227+
public IGiven<TScenario> Given(Action givenStep, string title)
228+
{
229+
AddStep(givenStep, title, false, ExecutionOrder.SetupState);
230+
return this;
231+
}
232+
233+
public IGiven<TScenario> Given(string title)
234+
{
235+
AddStep(() => { }, title, false, ExecutionOrder.SetupState);
236+
return this;
237+
}
238+
222239
IWhen<TScenario> IInitialStep<TScenario>.When(Expression<Action<TScenario>> whenStep, string stepTextTemplate)
223240
{
224241
AddStep(whenStep, stepTextTemplate, false, ExecutionOrder.Transition);
225242
return this;
226243
}
227244

245+
IWhen<TScenario> IInitialStep<TScenario>.When(Action whenStep, string title)
246+
{
247+
AddStep(whenStep, title, false, ExecutionOrder.Transition);
248+
return this;
249+
}
250+
251+
IWhen<TScenario> IInitialStep<TScenario>.When(string title)
252+
{
253+
AddStep(() => { }, title, false, ExecutionOrder.Transition);
254+
return this;
255+
}
256+
228257
IGiven<TScenario> IInitialStep<TScenario>.Given(Expression<Action<TScenario>> givenStep, bool includeInputsInStepTitle)
229258
{
230259
AddStep(givenStep, null, false, ExecutionOrder.SetupState, includeInputsInStepTitle: includeInputsInStepTitle);
@@ -267,6 +296,18 @@ IAndGiven<TScenario> IGiven<TScenario>.And(Expression<Action<TScenario>> andGive
267296
return this;
268297
}
269298

299+
IAndGiven<TScenario> IGiven<TScenario>.And(Action andGivenStep, string title)
300+
{
301+
AddStep(andGivenStep, title, false, ExecutionOrder.ConsecutiveSetupState);
302+
return this;
303+
}
304+
305+
IAndGiven<TScenario> IGiven<TScenario>.And(string title)
306+
{
307+
AddStep(() => {}, title, false, ExecutionOrder.ConsecutiveSetupState);
308+
return this;
309+
}
310+
270311
IAndThen<TScenario> IThen<TScenario>.And(Expression<Action<TScenario>> andThenStep, bool includeInputsInStepTitle)
271312
{
272313
AddStep(andThenStep, null, true, ExecutionOrder.ConsecutiveAssertion, includeInputsInStepTitle: includeInputsInStepTitle);
@@ -279,6 +320,18 @@ IThen<TScenario> IWhen<TScenario>.Then(Expression<Action<TScenario>> thenStep, s
279320
return this;
280321
}
281322

323+
IThen<TScenario> IWhen<TScenario>.Then(Action thenStep, string title)
324+
{
325+
AddStep(thenStep, title, true, ExecutionOrder.Assertion);
326+
return this;
327+
}
328+
329+
IThen<TScenario> IWhen<TScenario>.Then(string title)
330+
{
331+
AddStep(() => { }, title, true, ExecutionOrder.Assertion);
332+
return this;
333+
}
334+
282335
IWhen<TScenario> IGiven<TScenario>.When(Expression<Action<TScenario>> whenStep, bool includeInputsInStepTitle)
283336
{
284337
AddStep(whenStep, null, false, ExecutionOrder.Transition, includeInputsInStepTitle: includeInputsInStepTitle);
@@ -309,6 +362,42 @@ IAndThen<TScenario> IThen<TScenario>.And(Expression<Action<TScenario>> andThenSt
309362
return this;
310363
}
311364

365+
IAndWhen<TScenario> IWhen<TScenario>.And(Action andWhenStep, string title)
366+
{
367+
AddStep(andWhenStep, title, false, ExecutionOrder.ConsecutiveTransition);
368+
return this;
369+
}
370+
371+
IAndWhen<TScenario> IWhen<TScenario>.And(string title)
372+
{
373+
AddStep(() => { }, title, false, ExecutionOrder.ConsecutiveTransition);
374+
return this;
375+
}
376+
377+
IWhen<TScenario> IGiven<TScenario>.When(Action whenStep, string title)
378+
{
379+
AddStep(whenStep, title, false, ExecutionOrder.Transition);
380+
return this;
381+
}
382+
383+
IWhen<TScenario> IGiven<TScenario>.When(string title)
384+
{
385+
AddStep(() => { }, title, false, ExecutionOrder.Transition);
386+
return this;
387+
}
388+
389+
IAndThen<TScenario> IThen<TScenario>.And(Action andThenStep, string title)
390+
{
391+
AddStep(andThenStep, title, true, ExecutionOrder.ConsecutiveAssertion);
392+
return this;
393+
}
394+
395+
IAndThen<TScenario> IThen<TScenario>.And(string title)
396+
{
397+
AddStep(() => { }, title, true, ExecutionOrder.ConsecutiveAssertion);
398+
return this;
399+
}
400+
312401
IFluentScanner<TScenario> IFluentScanner<TScenario>.TearDownWith(Expression<Action<TScenario>> tearDownStep)
313402
{
314403
AddStep(tearDownStep, null, false, ExecutionOrder.TearDown, false);

TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScannerExtensions.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,34 @@ public static IGiven<TScenario> Given<TScenario>(this TScenario testObject, Expr
4343
return testObject.Given(givenStep, null);
4444
}
4545

46+
public static IGiven<TScenario> Given<TScenario>(this TScenario testObject, Action givenStep, string title)
47+
where TScenario : class
48+
{
49+
return testObject.Scan().Given(givenStep, title);
50+
}
51+
52+
public static IGiven<TScenario> Given<TScenario>(this TScenario testObject, string title)
53+
where TScenario : class
54+
{
55+
return testObject.Scan().Given(title);
56+
}
57+
4658
public static IWhen<TScenario> When<TScenario>(this TScenario testObject, Expression<Action<TScenario>> whenStep)
4759
where TScenario : class
4860
{
4961
return testObject.When(whenStep, null);
5062
}
63+
64+
public static IWhen<TScenario> When<TScenario>(this TScenario testObject, Action whenStep, string title)
65+
where TScenario : class
66+
{
67+
return testObject.Scan().When(whenStep, title);
68+
}
69+
70+
public static IWhen<TScenario> When<TScenario>(this TScenario testObject, string title)
71+
where TScenario : class
72+
{
73+
return testObject.Scan().When(title);
74+
}
5175
}
5276
}

TestStack.BDDfy/Scanners/StepScanners/Fluent/IGiven.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ namespace TestStack.BDDfy
77
public interface IGiven<TScenario>
88
{
99
IWhen<TScenario> When(Expression<Action<TScenario>> whenStep, bool includeInputsInStepTitle);
10+
IWhen<TScenario> When(Action whenStep, string title);
11+
IWhen<TScenario> When(string title);
12+
1013
IAndGiven<TScenario> And(Expression<Action<TScenario>> andGivenStep, bool includeInputsInStepTitle);
14+
IAndGiven<TScenario> And(Action andGivenStep, string title);
15+
IAndGiven<TScenario> And(string title);
16+
1117
IThen<TScenario> Then(Expression<Action<TScenario>> thenStep, bool includeInputsInStepTitle);
1218

1319
IWhen<TScenario> When(Expression<Action<TScenario>> whenStep, string stepTextTemplate = null);

TestStack.BDDfy/Scanners/StepScanners/Fluent/IInitialStep.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ namespace TestStack.BDDfy
77
public interface IInitialStep<TScenario>
88
{
99
IGiven<TScenario> Given(Expression<Action<TScenario>> givenStep, bool includeInputsInStepTitle);
10+
IGiven<TScenario> Given(Action givenStep, string title);
11+
IGiven<TScenario> Given(string title);
1012
IWhen<TScenario> When(Expression<Action<TScenario>> whenStep, bool includeInputsInStepTitle);
13+
IWhen<TScenario> When(Action whenStep, string title);
14+
IWhen<TScenario> When(string title);
1115

1216
IGiven<TScenario> Given(Expression<Action<TScenario>> givenStep, string stepTextTemplate = null);
1317
IWhen<TScenario> When(Expression<Action<TScenario>> whenStep, string stepTextTemplate = null);
@@ -17,4 +21,4 @@ public interface IInitialStep<TScenario>
1721
IGiven<TScenario> Given(Expression<Func<TScenario, Task>> givenStep, bool includeInputsInStepTitle);
1822
IWhen<TScenario> When(Expression<Func<TScenario, Task>> whenStep, bool includeInputsInStepTitle);
1923
}
20-
}
24+
}

TestStack.BDDfy/Scanners/StepScanners/Fluent/IThen.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ public interface IThen<TScenario> : IFluentScanner<TScenario>
99
IAndThen<TScenario> And(Expression<Action<TScenario>> andThenStep, bool includeInputsInStepTitle);
1010
IAndThen<TScenario> And(Expression<Action<TScenario>> andThenStep, string stepTextTemplate = null);
1111

12+
IAndThen<TScenario> And(Action andThenStep, string title);
13+
IAndThen<TScenario> And(string title);
1214
IAndThen<TScenario> And(Expression<Func<TScenario, Task>> andThenStep, string stepTextTemplate = null);
1315
IAndThen<TScenario> And(Expression<Func<TScenario, Task>> andThenStep, bool includeInputsInStepTitle);
1416
}
15-
}
17+
}

0 commit comments

Comments
 (0)