I have created a fluent API which works as expected. Now I would like to enforce some rules to make sure everything is built correct:
1: First method called should be BuildTestPlan
, nothing else should be listed in intellisense (==> now all is available --> Solved: see update)
2: After BuildTestPlan
only AddTestSequence
should be available (==> this is ok)
3: After AddTestSequence
only AddTest
should be available (==> this is ok)
4: After AddTest
there should be 3 options available: AddTest
( ==> this is ok), AddTestSequence
(==> here I'm stuck) and GetResult
(==> this is ok)
Code:
public class FluentTestPlanBuilderWithRules : ITestPlanBuilder, ITestSequenceBuilder, ITestBuilder
{
public ITestSequenceBuilder BuildTestPlan()
{
// Do stuff
return this;
}
public ITestBuilder AddTestSequence()
{
// Do stuff
return this;
}
public ITestBuilder AddTest()
{
// Do stuff
return this;
}
public TestPlan GetResult()
{
// Return built TestPlan
}
}
public interface ITestPlanBuilder
{
ITestSequenceBuilder BuildTestPlan();
}
public interface ITestSequenceBuilder
{
ITestBuilder AddTestSequence();
}
public interface ITestBuilder
{
ITestBuilder AddTest();
TestPlan GetResult();
}
Usage:
var builder = new EnforcedFluentTestPlanBuilder();
var o = builder.BuildTestPlan()
.AddTestSequence()
.AddTest()
.AddTest()
.AddTest()
.AddTestSequence()
.AddTest()
.AddTest()
.AddTestSequence()
.AddTest()
.GetResult();
I'm afraid there is no way to enforce nr 1 since they are all public methods.
But is it possible to have AddTestSequence
both after AddTest
and after BuildTestPlan
?
UPDATE: Found a solution for nr 1 here