예제 #1
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }