/// <summary> /// Calculates the spans. /// </summary> static void CalculateSpans(Scope scope) { var lineCount = scope.Get(Keys.LineCount); var getTextAtLine = scope.Get(Keys.GetTextAtLine); var currentLineIndex = scope.Get(Keys.CurrentLineIndex); var addTagSpan = scope.Get(Keys.AddTagSpan); var textSnapshotLines = scope.Get(Keys.TextSnapshotLines); var responseAssignmentLine = scope.Get(ResponseAssignmentLine); var responseValueAssignmentToAnotherVariable = VariableAssignmentLine.Parse(getTextAtLine(scope.Get(Cursor))); if (responseValueAssignmentToAnotherVariable != null && VariableAssignmentLine.IsResponseValueMatch(responseAssignmentLine, responseValueAssignmentToAnotherVariable)) { var sb = new StringBuilder(); if (responseValueAssignmentToAnotherVariable.VariableTypeName != null) { sb.Append(responseValueAssignmentToAnotherVariable.VariableTypeName); sb.Append(" "); } sb.Append(responseValueAssignmentToAnotherVariable.VariableName); sb.Append(" = "); sb.Append(responseAssignmentLine.AssignedValue); sb.Append(";"); var span = new SnapshotSpan(textSnapshotLines[currentLineIndex].Start.SkipChars(' '), textSnapshotLines[scope.Get(Cursor)].End); var tag = new TagData { Text = sb.ToString(), Span = span }; addTagSpan(new TagSpan <TagData>(span, tag)); scope.Update(Keys.CurrentLineIndex, scope.Get(Cursor) + 1); scope.Update(Keys.IsAnyValueProcessed, true); return; } MoveBackCursor(scope); { var start = textSnapshotLines[currentLineIndex].Start.SkipChars(' '); var end = textSnapshotLines[scope.Get(Cursor)].End; var span = new SnapshotSpan(start, end); var tag = new TagData { Text = responseAssignmentLine.AssignedValue + ";", Span = span }; addTagSpan(new TagSpan <TagData>(span, tag)); } scope.Update(Keys.CurrentLineIndex, scope.Get(Cursor) + 1); scope.Update(Keys.IsAnyValueProcessed, true); }
/// <summary> /// Determines whether [is response value match] [the specified current line as assignment line]. /// </summary> public static bool IsResponseValueMatch(VariableAssignmentLine currentLineAsAssignmentLine, VariableAssignmentLine responseValueAssignmentToAnotherVariable) { var variableName = currentLineAsAssignmentLine.VariableName + ".Value"; var assignedValue = responseValueAssignmentToAnotherVariable.AssignedValue; if (variableName == assignedValue) { return(true); } if (HasExtra(assignedValue, variableName)) { var extraExtension = assignedValue.RemoveFromStart(variableName); if (!currentLineAsAssignmentLine.AssignedValue.EndsWith(extraExtension)) { currentLineAsAssignmentLine.AssignedValue += extraExtension; } return(true); } var multipleAssignments = assignedValue.Split(' ', '=', ' ').Where(x => string.IsNullOrWhiteSpace(x) == false).ToList(); if (multipleAssignments.Count > 0) { assignedValue = multipleAssignments.Last(); if (variableName == assignedValue || HasExtra(assignedValue, variableName)) { var extraExtension = assignedValue.RemoveFromStart(variableName); if (!currentLineAsAssignmentLine.AssignedValue.EndsWith(extraExtension)) { currentLineAsAssignmentLine.AssignedValue += extraExtension; } multipleAssignments.RemoveAt(multipleAssignments.Count - 1); responseValueAssignmentToAnotherVariable.VariableName += " = " + string.Join(" = ", multipleAssignments); return(true); } } return(false); }
/// <summary> /// Shoulds the be response check. /// </summary> static void ShouldBeResponseCheck(Scope scope) { var lineCount = scope.Get(Keys.LineCount); var getTextAtLine = scope.Get(Keys.GetTextAtLine); var cursor = scope.Get(Cursor); var line = getTextAtLine(cursor); if (line == null) { scope.Update(IsParseFailed, true); return; } line = line.Replace(" ", Empty); if (line.StartsWith("if(!") && line.EndsWith(".Success)")) { var responseVariableName = line.RemoveFromStart("if(!"); responseVariableName = responseVariableName.RemoveFromEnd(".Success)"); var responseAssignmentLine = VariableAssignmentLine.Parse(getTextAtLine(scope.Get(Keys.CurrentLineIndex))); if (responseAssignmentLine == null) { scope.Update(IsParseFailed, true); return; } if (responseAssignmentLine.VariableName != responseVariableName) { scope.Update(IsParseFailed, true); return; } scope.Update(ResponseAssignmentLine, responseAssignmentLine); return; } scope.Update(IsParseFailed, true); }
/// <summary> /// Parses the specified line. /// </summary> public static VariableAssignmentLine Parse(string line) { if (line == null) { return(null); } var arr = line.Split('='); if (arr.Length < 2) { return(null); } if (arr.Length > 2) { arr = new[] { arr[0], string.Join("=", arr.Skip(1).Take(arr.Length - 1)) }; } var namePart = arr[0]?.Trim().Split(' ').Where(x => !string.IsNullOrWhiteSpace(x)).ToArray(); VariableAssignmentLine variableAssignmentLine = null; if (namePart?.Length == 1) { variableAssignmentLine = new VariableAssignmentLine { VariableName = namePart[0] }; } else if (namePart?.Length == 2) { variableAssignmentLine = new VariableAssignmentLine { VariableName = namePart[1], VariableTypeName = namePart[0] }; } else { return(null); } var items = new List <string>(); for (var i = 1; i < arr.Length; i++) { items.Add(arr[i].Trim()); } var valuePart = string.Join(" = ", items).Trim(); if (string.IsNullOrWhiteSpace(valuePart)) { return(null); } if (valuePart.EndsWith(";") == false) { return(null); } variableAssignmentLine.AssignedValue = valuePart.Substring(0, valuePart.Length - 1); return(variableAssignmentLine); }