示例#1
0
        /// <summary>
        /// Adds the specified node to this instance.
        /// </summary>
        /// <param name="nodes">The nodes to add.</param>
        /// <param name="index">The starting index of the first node to add.</param>
        /// <param name="value">The value to associate with the route.</param>
        public void Add(IReadOnlyList <IMatchNode> nodes, int index, T value)
        {
            IMatchNode    matcher = nodes[index];
            RouteNode <T> node    = null;

            if (this.children != null)
            {
                node = this.children.FirstOrDefault(n => n.matcher.Equals(matcher));
            }

            if (node == null)
            {
                node = new RouteNode <T>(matcher);
                this.AddChild(node);
            }

            index++;
            if (index == nodes.Count)
            {
                node.Value = value;
            }
            else
            {
                node.Add(nodes, index, value);
            }
        }
示例#2
0
        /// <inheritdoc />
        public bool Equals(IMatchNode other)
        {
            var node = other as GenericCaptureNode;

            if (node == null)
            {
                return(false);
            }

            return(string.Equals(this.property, node.property, StringComparison.Ordinal) &&
                   (this.converter.GetType() == node.converter.GetType()));
        }
示例#3
0
        public void MatchShouldInvokeHigherPriorityNodesFirst()
        {
            this.matcher.Priority.Returns(100);
            IMatchNode important = Substitute.For <IMatchNode>();

            important.Priority.Returns(200);
            important.Match(default(StringSegment))
            .ReturnsForAnyArgs(new NodeMatchResult(null, null));
            this.node.Add(new[] { important }, 0, null);

            this.node.Match("/route");

            important.ReceivedWithAnyArgs().Match(default(StringSegment));
            this.matcher.DidNotReceiveWithAnyArgs().Match(default(StringSegment));
        }
示例#4
0
        public void AddShouldCombineMatchers()
        {
            // We need the child node so we can insert the value somewhere,
            // otherwise it will try to overwrite the value in this.matcher,
            // which isn't allowed
            IMatchNode duplicate = Substitute.For <IMatchNode>();
            IMatchNode child     = Substitute.For <IMatchNode>();

            this.matcher.Equals(duplicate).Returns(true);

            this.node.Add(new[] { duplicate, child }, 0, null);
            this.node.Match("/route");

            this.matcher.ReceivedWithAnyArgs().Match(default(StringSegment));
            duplicate.DidNotReceiveWithAnyArgs().Match(default(StringSegment));
        }
示例#5
0
        private static void AppendNodeString(StringBuilder buffer, IMatchNode node)
        {
            var literal = node as LiteralNode;

            if (literal != null)
            {
                buffer.Append(literal.Literal);
            }
            else
            {
                // We allow multiple captures as long as they don't have the
                // same priority (i.e. {100} and {200} are OK as we'll try to
                // match the 200 first)
                buffer.Append('{')
                .Append(node.Priority)
                .Append('}');
            }
        }
示例#6
0
        public void EqualsShouldReturnFalseForNonStringCaptureNodes()
        {
            IMatchNode other = Substitute.For <IMatchNode>();

            Assert.That(this.node.Equals(other), Is.False);
        }
示例#7
0
        /// <inheritdoc />
        public bool Equals(IMatchNode other)
        {
            var node = other as StringCaptureNode;

            return(string.Equals(this.property, node?.property, StringComparison.Ordinal));
        }
示例#8
0
        /// <inheritdoc />
        public bool Equals(IMatchNode other)
        {
            var node = other as LiteralNode;

            return(string.Equals(this.Literal, node?.Literal, StringComparison.OrdinalIgnoreCase));
        }
示例#9
0
 public void SetUp()
 {
     this.matcher = Substitute.For <IMatchNode>();
     this.node    = new RouteNode <string>(null);
     this.node.Add(new[] { this.matcher }, 0, MatcherValue);
 }
示例#10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="RouteNode{T}"/> class.
 /// </summary>
 /// <param name="matcher">Used to match the part of the route.</param>
 public RouteNode(IMatchNode matcher)
 {
     this.matcher = matcher;
 }