public void StartNewElement(GherkinLineType newState) { var valid = false; switch (this._currentParsingLineType) { case GherkinLineType.None: valid = newState == GherkinLineType.FeatureHeader; break; case GherkinLineType.FeatureHeader: valid = (newState == GherkinLineType.ScenarioHeader) || (newState == GherkinLineType.None); break; case GherkinLineType.ScenarioHeader: valid = (newState == GherkinLineType.Given) || (newState == GherkinLineType.When) || (newState == GherkinLineType.Then); break; case GherkinLineType.Given: valid = (newState == GherkinLineType.When) || (newState == GherkinLineType.Then) || (newState == GherkinLineType.But) || (newState == GherkinLineType.None); break; case GherkinLineType.When: valid = (newState == GherkinLineType.Then) || (newState == GherkinLineType.But) || (newState == GherkinLineType.None); break; case GherkinLineType.Then: valid = (newState == GherkinLineType.But) || (newState == GherkinLineType.None) || (newState == GherkinLineType.ScenarioHeader); break; default: throw new Exception("Current state of Gherkin object unexpected."); } if (!valid) {throw new InvalidOperationException (String.Format("Cannot create {0} element after {1} element.", newState, _currentParsingLineType));} if (!(GherkinLineType.None | GherkinLineType.But).HasFlag(newState)) { this._currentParsingLineType = newState; } }
private void TestStartingNewElement(Gherkin gherkin, GherkinLineType type, bool expectedValid) { try { gherkin.StartNewElement(type); Assert.That(expectedValid, Is.EqualTo(true), String.Format("No exceptions thrown for state transition to {0} - expected the state transition to be not valid.", type)); } catch (Exception ex) { Assert.That(expectedValid, Is.EqualTo(false), string.Format("Exception thrown on state transition to {0} - {1}", type, ex.StackTrace)); } }
public Gherkin() { _scenarios = new List<GherkinScenario>(); _currentParsingLineType = GherkinLineType.None; }