public void A_Step_Table_Is_Formatted() { var mockStyle = new MockStylist { StepFormat = "Keyword: {0} Step: {1}" }; var step = new Step() { NativeKeyword = "Natkey ", Name = "I am a step" }; var stepTable = new Table(); stepTable.HeaderRow = new TableRow(new[] { "Col1", "Col2" }); stepTable.DataRows = new System.Collections.Generic.List <ObjectModel.TableRow>(); stepTable.DataRows.Add(new TableRow(new[] { "Col1Row1", "Col2Row1" })); stepTable.DataRows.Add(new TableRow(new[] { "Col1Row2", "Col2Row2" })); step.TableArgument = stepTable; var stepBlock = new StepBlock(step, mockStyle); var actualString = stepBlock.ToString().Split(new string[] { Environment.NewLine }, StringSplitOptions.None); Assert.AreEqual("Keyword: Natkey Step: I am a step", actualString[0]); Assert.AreEqual(">", actualString[1]); Assert.AreEqual("> | Col1 | Col2 |", actualString[2]); Assert.AreEqual("> | --- | --- |", actualString[3]); Assert.AreEqual("> | Col1Row1 | Col2Row1 |", actualString[4]); Assert.AreEqual("> | Col1Row2 | Col2Row2 |", actualString[5]); Assert.AreEqual(7, actualString.Length); }
public void The_Step_Is_Formatted() { var mockStyle = new MockStylist { StepFormat = "Keyword: {0} Step: {1}" }; var step = new Step() { NativeKeyword = "Natkey ", Name = "I am a step" }; var stepBlock = new StepBlock(step, mockStyle); var actualString = stepBlock.ToString().Split(new string[] { Environment.NewLine }, StringSplitOptions.None); Assert.AreEqual("Keyword: Natkey Step: I am a step", actualString[0]); Assert.AreEqual(2, actualString.Length); }
private Exception ExecuteStep(StepDefinition instance, StepBlock stepBlock, Step step) { var attribute = Attributes[stepBlock]; var methodAndParameters = instance.GetType().GetMethods() .Select(m => { var attr = (BddAttribute)m.GetCustomAttribute(attribute); if (attr == null) { return(null); } var match = Regex.Match(step.Text, attr.Message); if (!match.Success) { return(null); } var parameters = new List <object>(); for (var i = 1; i < match.Groups.Count; i++) { parameters.Add(match.Groups[i].Value); } if (step.Argument is DocString) { parameters.Add(((DocString)step.Argument).Content); } else if (step.Argument != null) { parameters.Add(step.Argument); } var methodParameters = m.GetParameters(); for (var i = parameters.Count; i < methodParameters.Length; i++) { // Try to complete with default parameter values var paramInfo = methodParameters[i]; if (!paramInfo.HasDefaultValue) { break; } parameters.Add(paramInfo.DefaultValue); } if (methodParameters.Length != parameters.Count) { return(null); } return(Tuple.Create(m, parameters.ToArray())); }) .FirstOrDefault(t => t != null); if (methodAndParameters == null) { throw new InvalidOperationException( $"There is no step definition method for {stepBlock} '{step.Text}'"); } try { var method = methodAndParameters.Item1; var parameters = methodAndParameters.Item2; var parameterInfos = method.GetParameters(); for (var i = 0; i < parameterInfos.Length; i++) { var paramInfo = parameterInfos[i]; // Do some minimal conversion => regex capturing groups to int if (paramInfo.ParameterType == typeof(int)) { parameters[i] = Convert.ToInt32(parameters[i]); } } method.Invoke(instance, parameters); } catch (TargetInvocationException ex) { // Exceptions should not be thrown // Should be captured for result return(ex.InnerException); } catch (Exception ex) { return(ex); } // Success return(null); }