88 var steps = new[]
99 {
1010 //StepName, reports, executionOrder, asserts
11- Tuple.Create("Given", "true", "ExecutionOrder.SetupState", "false", "TScenario", "testObject"),
12- Tuple.Create("Given", "true", "ExecutionOrder.SetupState", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
13- Tuple.Create("When", "true", "ExecutionOrder.Transition", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
14- Tuple.Create("Then", "true", "ExecutionOrder.Assertion", "true", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
15- Tuple.Create("And", "true", "ExecutionOrder.ConsecutiveStep", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
16- Tuple.Create("But", "true", "ExecutionOrder.ConsecutiveStep", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
17- Tuple.Create("TearDownWith", "false", "ExecutionOrder.TearDown", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject")
11+ Tuple.Create("Given", "true", "ExecutionOrder.SetupState", "false"),
12+ Tuple.Create("When", "true", "ExecutionOrder.Transition", "false"),
13+ Tuple.Create("Then", "true", "ExecutionOrder.Assertion", "true"),
14+ Tuple.Create("And", "true", "ExecutionOrder.ConsecutiveStep", "false"),
15+ Tuple.Create("But", "true", "ExecutionOrder.ConsecutiveStep", "false"),
16+ Tuple.Create("TearDownWith", "false", "ExecutionOrder.TearDown", "false")
1817 };
1918#>
2019using System;
@@ -28,80 +27,171 @@ namespace TestStack.BDDfy
2827{
2928 public static class FluentStepScannerExtensions
3029 {
31- static FluentScanner<TScenario> Scan<TScenario>(this TScenario testObject) where TScenario : class
32- {
33- var existingContext = TestContext.GetContext(testObject);
34- if (existingContext.FluentScanner == null)
35- existingContext.FluentScanner = new FluentScanner<TScenario>(testObject);
36-
37- return (FluentScanner<TScenario>) existingContext.FluentScanner;
38- }
39-
40- <#
41- foreach (var stepType in steps)
42- {
43- #>
44- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step, string stepTextTemplate)
30+ public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Expression<Action<TScenario>> step, string stepTextTemplate)
4531 where TScenario: class
4632 {
47- <#=stepType.Item6#>.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
48- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
33+ return new FluentTestBuilder<TScenario>(testObject).Given(step, stepTextTemplate);
4934 }
5035
51- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
36+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
5237 where TScenario: class
5338 {
54- <#=stepType.Item6#>.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
55- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
39+ return new FluentTestBuilder<TScenario>(testObject).Given(step, includeInputsInStepTitle);
5640 }
5741
58- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step)
42+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, Expression<Action<TScenario>> step)
5943 where TScenario: class
6044 {
61- <#=stepType.Item6#>.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
62- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
45+ return new FluentTestBuilder<TScenario>(testObject).Given(step);
6346 }
6447
65- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step, string stepTextTemplate)
48+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step, string stepTextTemplate)
6649 where TScenario: class
6750 {
68- <#=stepType.Item6#>.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
69- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
51+ return new FluentTestBuilder<TScenario>(testObject).Given(step, stepTextTemplate);
7052 }
7153
72- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
54+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
7355 where TScenario: class
7456 {
75- <#=stepType.Item6#>.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
76- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
57+ return new FluentTestBuilder<TScenario>(testObject).Given(step, includeInputsInStepTitle);
7758 }
7859
79- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step)
60+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step)
8061 where TScenario: class
8162 {
82- <#=stepType.Item6#>.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
83- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
63+ return new FluentTestBuilder<TScenario>(testObject).Given(step);
8464 }
8565
86- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, Action step, string title)
66+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, Action step, string title)
8767 where TScenario : class
8868 {
89- <#=stepType.Item6#>.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
90- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
69+ return new FluentTestBuilder<TScenario>(testObject).Given(step, title);
9170 }
9271
93- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, Func<Task> step, string title)
72+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, Func<Task> step, string title)
9473 where TScenario : class
9574 {
96- <#=stepType.Item6#>.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
97- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
75+ return new FluentTestBuilder<TScenario>(testObject).Given(step, title);
9876 }
9977
100- public static IFluentTestBuilder<TScenario> <#=stepType.Item1#>< TScenario>(this <#=stepType.Item5#> testObject, string title)
78+ public static IFluentTestBuilder<TScenario> Given< TScenario>(this TScenario testObject, string title)
10179 where TScenario : class
10280 {
103- <#=stepType.Item6#>.Scan().AddStep(() => { }, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
104- return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
81+ return new FluentTestBuilder<TScenario>(testObject).Given(title);
82+ }
83+ }
84+
85+ public interface IFluentTestBuilder<TScenario> where TScenario: class
86+ {
87+ TScenario TestObject { get; }
88+ <#
89+ foreach (var stepType in steps)
90+ {
91+ #>
92+
93+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, string stepTextTemplate);
94+
95+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, bool includeInputsInStepTitle);
96+
97+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step);
98+
99+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, string stepTextTemplate);
100+
101+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle);
102+
103+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step);
104+
105+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Action step, string title);
106+
107+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Func<Task> step, string title);
108+
109+ IFluentTestBuilder<TScenario> <#=stepType.Item1#>(string title);
110+ <#
111+ }
112+ #>
113+ }
114+
115+ interface IFluentTestBuilder
116+ {
117+ object TestObject { get; }
118+ }
119+
120+ public class FluentTestBuilder<TScenario> : IFluentTestBuilder<TScenario>, IFluentTestBuilder
121+ where TScenario : class
122+ {
123+ readonly FluentScanner<TScenario> scanner;
124+
125+ public FluentTestBuilder(TScenario testObject)
126+ {
127+ TestObject = testObject;
128+ var existingContext = TestContext.GetContext(TestObject);
129+ if (existingContext.FluentScanner == null)
130+ existingContext.FluentScanner = new FluentScanner<TScenario>(testObject);
131+
132+ scanner = (FluentScanner<TScenario>) existingContext.FluentScanner;
133+ }
134+
135+ public TScenario TestObject { get; private set; }
136+
137+ object IFluentTestBuilder.TestObject { get { return TestObject; } }
138+
139+ <#
140+ foreach (var stepType in steps)
141+ {
142+ #>
143+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, string stepTextTemplate)
144+ {
145+ scanner.AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
146+ return this;
147+ }
148+
149+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
150+ {
151+ scanner.AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
152+ return this;
153+ }
154+
155+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step)
156+ {
157+ scanner.AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
158+ return this;
159+ }
160+
161+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, string stepTextTemplate)
162+ {
163+ scanner.AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
164+ return this;
165+ }
166+
167+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
168+ {
169+ scanner.AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
170+ return this;
171+ }
172+
173+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step)
174+ {
175+ scanner.AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
176+ return this;
177+ }
178+
179+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Action step, string title)
180+ {
181+ scanner.AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
182+ return this;
183+ }
184+
185+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Func<Task> step, string title)
186+ {
187+ scanner.AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
188+ return this;
189+ }
190+
191+ public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(string title)
192+ {
193+ scanner.AddStep(() => { }, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
194+ return this;
105195 }
106196<#
107197 }
0 commit comments