public void Assign_WithMixedTokensSixArguments_CountAsExpected(String formats, Int32 expected)
        {
            IEnumerable <BaseToken> tokens = this.CreateTokens(formats);

            Object[] arguments = new Object[] { 111111, 222222, 333333, 444444, 555555, 666666 };

            IArgumentRelations actual = RelationsAssigner.Assign(tokens, arguments);

            Assert.That(actual.Count, Is.EqualTo(expected));
        }
        public void Assign_TokensEmpty_ResultAsExpected()
        {
            IEnumerable <BaseToken> tokens = new List <BaseToken>();

            Object[] arguments = new Object[] { "argument1" };

            IArgumentRelations actual = RelationsAssigner.Assign(tokens, arguments);

            Assert.That(actual, Is.Not.Null);
            Assert.That(actual.Count, Is.Zero);
        }
        public void Assign_ArgumentsEmpty_ResultAsExpected()
        {
            IEnumerable <BaseToken> tokens = new List <BaseToken>()
            {
                new TextToken(0, new StringBuilder("sometext"))
            };

            Object[] arguments = new Object[0];

            IArgumentRelations actual = RelationsAssigner.Assign(tokens, arguments);

            Assert.That(actual, Is.Not.Null);
            Assert.That(actual.Count, Is.Zero);
        }
        public void Assign_OneHoleTokenWithFormatThreeArguments_ResultIsOne()
        {
            IEnumerable <BaseToken> tokens = new List <BaseToken>()
            {
                new HoleToken(0, 1, new StringBuilder("{fmt}"))
            };

            Object[] arguments = new Object[]
            {
                "someargument", 42, Guid.NewGuid()
            };

            IArgumentRelations actual = RelationsAssigner.Assign(tokens, arguments);

            Assert.That(actual.Count, Is.EqualTo(1));
        }
        public void Assign_ThreeHoleTokensWithFormatOneArgument_ResultIsThree()
        {
            IEnumerable <BaseToken> tokens = new List <BaseToken>()
            {
                new HoleToken(0, 1, new StringBuilder("{fmt}")),
                new HoleToken(0, 2, new StringBuilder("{fmt}")),
                new HoleToken(0, 3, new StringBuilder("{fmt}"))
            };

            Object[] arguments = new Object[]
            {
                "someargument"
            };

            IArgumentRelations actual = RelationsAssigner.Assign(tokens, arguments);

            Assert.That(actual.Count, Is.EqualTo(3));
        }
        /// <summary>
        /// Formats the list of <paramref name="arguments"/> into the <paramref name="format"/> string using
        /// given <paramref name="options"/>.
        /// </summary>
        /// <remarks>
        /// This method formats the list of <paramref name="arguments"/> into the <paramref name="format"/>
        /// string using given <paramref name="options"/>.
        /// </remarks>
        /// <param name="discard">
        /// This parameter is only for internal handling and tells the method to resolve relation assignments
        /// or not.
        /// </param>
        /// <param name="options">
        /// An instance of class <see cref="Options"/> with detailed formatting instructions.
        /// </param>
        /// <param name="relations">
        /// When this method returns, this parameter contains a list of Label-Value relations consisting
        /// of the labels taken from <paramref name="format"/> and the <paramref name="arguments"/> as
        /// their values.
        /// </param>
        /// <param name="format">
        /// A string containing formatting instructions, either for index-based formatting, like
        /// <c>"{0}, {1}, ..."</c>, or for template-based formatting, like <c>"{name1}, {name2}, ..."</c>).
        /// </param>
        /// <param name="arguments">
        /// The optional list of arguments to be used.
        /// </param>
        /// <returns>
        /// A copy of <paramref name="format"/> with the format elements replaced by the string representation
        /// of the corresponding objects in <paramref name="arguments"/>.
        /// </returns>
        private static String Format(Boolean discard, Options options, out IArgumentRelations relations, String format, params Object[] arguments)
        {
            relations = RelationsAssigner.Default;

            if (format == null || format.Length == 0)
            {
                return(String.Empty);
            }

            StringBuilder output = new StringBuilder(512);

            IEnumerable <BaseToken> tokens = TemplateParser.Parse(format);

            arguments = arguments.ExpandArguments();

            TemplateWeaver.Weave(options, tokens, output, arguments);

            if (!discard)
            {
                relations = RelationsAssigner.Assign(tokens, arguments);
            }

            return(Template.Truncate(options, output).ToString());
        }