public void Contains_LabelAsProvided_ResultAsExpected(String actual, Boolean expected, params String[] labels)
        {
            ArgumentRelations instance = new ArgumentRelations();

            foreach (String label in labels)
            {
                instance.Append(label, null);
            }

            Assert.That(instance.Contains(actual), Is.EqualTo(expected));
        }
        /// <summary>
        /// Assigns the token labels to their corresponding arguments.
        /// </summary>
        /// <remarks>
        /// This method assigns the token labels to their corresponding arguments.
        /// </remarks>
        /// <param name="tokens">
        /// The list of tokens to be processed.
        /// </param>
        /// <param name="arguments">
        /// The list of arguments to be assigned.
        /// </param>
        /// <returns>
        /// An instance of an <see cref="IArgumentRelations"/> derived class to
        /// obtains all assignments from.
        /// </returns>
        public static IArgumentRelations Assign(IEnumerable <BaseToken> tokens, Object[] arguments)
        {
            if (tokens == null)
            {
                return(RelationsAssigner.Default);
            }

            if (arguments == null)
            {
                arguments = new Object[0];
            }

            const String format = "Value{0}";

            ArgumentRelations result = new ArgumentRelations();

            Boolean indexed = tokens.IsAssignAllByIndex();

            foreach (BaseToken token in tokens)
            {
                if (token is TextToken)
                {
                    continue;
                }

                Int32  index = -1;
                String label = null;
                Object value = null;

                if (indexed)
                {
                    // Use index as label if all items are processed "by index".
                    index = token.ToIndex();
                    label = String.Format(format, index);

                    // Skip already assigned relations, if necessary. This may occur
                    // for example in cases like "text {0} is {1}, but same as {0}".
                    // In such a case the value at index {0} has been handled already.
                    if (result.Contains(label))
                    {
                        continue;
                    }
                }
                else
                {
                    index = token.Rating;

                    if (token.IsNumbering)
                    {
                        // This is some kind of fallback that can occur together with mixed
                        // formattings, for example something like "text {0} is {lbl1}, but
                        // same as {1}". In such a case the "rating" is used as index, but
                        // current token does not have a valid label. Therefore, take "rating"
                        // as index and create a label for affected value. Uniqueness does
                        // not need to be checked because of rating is already unique.
                        label = String.Format(format, index);
                    }
                    else
                    {
                        // Uniqueness in never guaranteed in this case, because of the Message
                        // Template Rules allow multiple labels of same content. On the other
                        // hand, all arguments have to be resolved by their order anyway.
                        label = token.ToLabel();
                    }
                }

                if (index >= 0 && index < arguments.Length)
                {
                    value = arguments[index];
                }

                result.Append(label, value);
            }

            return(result);
        }