public void AppendFormatted_String_ICustomFormatter()
        {
            var provider = new ConcatFormatter();

            var expected = new StringBuilder();
            var actual   = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, actual, provider);

            foreach (string s in new[] { null, "", "a" })
            {
                // string
                expected.AppendFormat(provider, "{0}", s);
                iab.AppendFormatted(s);

                // string, format
                expected.AppendFormat(provider, "{0:X2}", s);
                iab.AppendFormatted(s, "X2");

                // string, alignment
                expected.AppendFormat(provider, "{0,3}", s);
                iab.AppendFormatted(s, 3);

                // string, alignment, format
                expected.AppendFormat(provider, "{0,-3:X2}", s);
                iab.AppendFormatted(s, -3, "X2");
            }

            actual.Append(provider, ref iab);

            Assert.Equal(expected.ToString(), actual.ToString());
        }
        public void AppendFormatted_ReadOnlySpanChar()
        {
            var expected = new StringBuilder();
            var actual   = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, actual);

            foreach (string s in new[] { "", "a", "bc", "def", "this is a longer string", "!" })
            {
                // span
                expected.Append(s);
                iab.AppendFormatted((ReadOnlySpan <char>)s);

                // span, format
                expected.AppendFormat("{0:X2}", s);
                iab.AppendFormatted((ReadOnlySpan <char>)s, format: "X2");

                foreach (int alignment in new[] { 0, 3, -3 })
                {
                    // span, alignment
                    expected.AppendFormat("{0," + alignment.ToString(CultureInfo.InvariantCulture) + "}", s);
                    iab.AppendFormatted((ReadOnlySpan <char>)s, alignment);

                    // span, alignment, format
                    expected.AppendFormat("{0," + alignment.ToString(CultureInfo.InvariantCulture) + ":X2}", s);
                    iab.AppendFormatted((ReadOnlySpan <char>)s, alignment, "X2");
                }
            }

            actual.Append(ref iab);

            Assert.Equal(expected.ToString(), actual.ToString());
        }
        public void AppendFormatted_ValueTypes_CreateProviderFlowed()
        {
            void Test <T>(T t)
            {
                var provider = new CultureInfo("en-US");
                var sb       = new StringBuilder();

                StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(1, 2, sb, provider);

                iab.AppendFormatted(t);
                Assert.Same(provider, ((IHasToStringState)t).ToStringState.LastProvider);

                iab.AppendFormatted(t, 1);
                Assert.Same(provider, ((IHasToStringState)t).ToStringState.LastProvider);

                iab.AppendFormatted(t, "X2");
                Assert.Same(provider, ((IHasToStringState)t).ToStringState.LastProvider);

                iab.AppendFormatted(t, 1, "X2");
                Assert.Same(provider, ((IHasToStringState)t).ToStringState.LastProvider);

                sb.Append(ref iab);
            }

            Test(new FormattableInt32Wrapper(42));
            Test(new SpanFormattableInt32Wrapper(84));
            Test((FormattableInt32Wrapper?)new FormattableInt32Wrapper(42));
            Test((SpanFormattableInt32Wrapper?)new SpanFormattableInt32Wrapper(84));
        }
Exemple #4
0
            /// <summary>Extracts the built string from the handler.</summary>
            internal string ToStringAndClear()
            {
                string s = _stringBuilderHandler._stringBuilder is StringBuilder sb?
                           sb.ToString() :
                               string.Empty;

                _stringBuilderHandler = default;
                return(s);
            }
Exemple #5
0
            /// <summary>Extracts the built string from the handler.</summary>
            internal string ToStringAndClear()
            {
                string s = _stringBuilderHandler._stringBuilder is StringBuilder sb?
                           StringBuilderCache.GetStringAndRelease(sb) :
                               string.Empty;

                _stringBuilderHandler = default;
                return(s);
            }
        public void AppendLine_AppendsNewLine()
        {
            var sb = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(1, 2, sb);

            Assert.Same(sb, sb.AppendLine(ref iab));
            Assert.Same(sb, sb.AppendLine(CultureInfo.InvariantCulture, ref iab));

            Assert.Equal(Environment.NewLine + Environment.NewLine, sb.ToString());
        }
        public void Append_Nop()
        {
            var sb = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(1, 2, sb);

            Assert.Same(sb, sb.Append(ref iab));
            Assert.Same(sb, sb.Append(CultureInfo.InvariantCulture, ref iab));

            Assert.Equal(0, sb.Length);
        }
Exemple #8
0
 /// <summary>Creates an instance of the handler..</summary>
 /// <param name="literalLength">The number of constant characters outside of interpolation expressions in the interpolated string.</param>
 /// <param name="formattedCount">The number of interpolation expressions in the interpolated string.</param>
 /// <param name="condition">The condition Boolean passed to the <see cref="Debug"/> method.</param>
 /// <param name="shouldAppend">A value indicating whether formatting should proceed.</param>
 /// <remarks>This is intended to be called only by compiler-generated code. Arguments are not validated as they'd otherwise be for members intended to be used directly.</remarks>
 public WriteIfInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend)
 {
     if (condition)
     {
         _stringBuilderHandler = new StringBuilder.AppendInterpolatedStringHandler(literalLength, formattedCount, new StringBuilder(DefaultInterpolatedStringHandler.GetDefaultLength(literalLength, formattedCount)));
         shouldAppend          = true;
     }
     else
     {
         _stringBuilderHandler = default;
         shouldAppend          = false;
     }
 }
Exemple #9
0
 /// <summary>Creates an instance of the handler..</summary>
 /// <param name="literalLength">The number of constant characters outside of interpolation expressions in the interpolated string.</param>
 /// <param name="formattedCount">The number of interpolation expressions in the interpolated string.</param>
 /// <param name="condition">The condition Boolean passed to the <see cref="Debug"/> method.</param>
 /// <param name="shouldAppend">A value indicating whether formatting should proceed.</param>
 /// <remarks>This is intended to be called only by compiler-generated code. Arguments are not validated as they'd otherwise be for members intended to be used directly.</remarks>
 public AssertInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend)
 {
     if (condition)
     {
         _stringBuilderHandler = default;
         shouldAppend          = false;
     }
     else
     {
         // Only used when failing an assert.  Additional allocation here doesn't matter; just create a new StringBuilder.
         _stringBuilderHandler = new StringBuilder.AppendInterpolatedStringHandler(literalLength, formattedCount, new StringBuilder());
         shouldAppend          = true;
     }
 }
Exemple #10
0
 /// <summary>Creates an instance of the handler..</summary>
 /// <param name="literalLength">The number of constant characters outside of interpolation expressions in the interpolated string.</param>
 /// <param name="formattedCount">The number of interpolation expressions in the interpolated string.</param>
 /// <param name="condition">The condition Boolean passed to the <see cref="Debug"/> method.</param>
 /// <param name="shouldAppend">A value indicating whether formatting should proceed.</param>
 /// <remarks>This is intended to be called only by compiler-generated code. Arguments are not validated as they'd otherwise be for members intended to be used directly.</remarks>
 public WriteIfInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend)
 {
     if (condition)
     {
         // Only used in debug, but could be used on non-failure code paths, so use a cached builder.
         _stringBuilderHandler = new StringBuilder.AppendInterpolatedStringHandler(literalLength, formattedCount,
                                                                                   StringBuilderCache.Acquire(DefaultInterpolatedStringHandler.GetDefaultLength(literalLength, formattedCount)));
         shouldAppend = true;
     }
     else
     {
         _stringBuilderHandler = default;
         shouldAppend          = false;
     }
 }
        public void AppendFormatted_ValueTypes_ICustomFormatter()
        {
            var provider = new ConcatFormatter();

            void Test <T>(T t)
            {
                void AssertTss(T tss, string format)
                {
                    Assert.Equal(format, ((IHasToStringState)tss).ToStringState.LastFormat);
                    Assert.Same(provider, ((IHasToStringState)tss).ToStringState.LastProvider);
                    Assert.Equal(ToStringMode.ICustomFormatterFormat, ((IHasToStringState)tss).ToStringState.ToStringMode);
                }

                var expected = new StringBuilder();
                var actual   = new StringBuilder();

                StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, actual, provider);

                // struct
                expected.AppendFormat(provider, "{0}", t);
                iab.AppendFormatted(t);
                AssertTss(t, null);

                // struct, format
                expected.AppendFormat(provider, "{0:X2}", t);
                iab.AppendFormatted(t, "X2");
                AssertTss(t, "X2");

                // struct, alignment
                expected.AppendFormat(provider, "{0,3}", t);
                iab.AppendFormatted(t, 3);
                AssertTss(t, null);

                // struct, alignment, format
                expected.AppendFormat(provider, "{0,-3:X2}", t);
                iab.AppendFormatted(t, -3, "X2");
                AssertTss(t, "X2");

                Assert.Equal(expected.ToString(), actual.ToString());

                actual.Append(ref iab);
            }

            Test(new FormattableInt32Wrapper(42));
            Test(new SpanFormattableInt32Wrapper(84));
            Test((FormattableInt32Wrapper?)new FormattableInt32Wrapper(42));
            Test((SpanFormattableInt32Wrapper?)new SpanFormattableInt32Wrapper(84));
        }
        public void AppendLiteral()
        {
            var expected = new StringBuilder();
            var actual   = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, actual);

            foreach (string s in new[] { "", "a", "bc", "def", "this is a long string", "!" })
            {
                expected.Append(s);
                iab.AppendLiteral(s);
            }

            actual.Append(ref iab);

            Assert.Equal(expected.ToString(), actual.ToString());
        }
        public void AppendFormatted_ReferenceTypes_ICustomFormatter()
        {
            var provider = new ConcatFormatter();

            var expected = new StringBuilder();
            var actual   = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, actual, provider);

            foreach (string s in new[] { null, "", "a" })
            {
                foreach (IHasToStringState tss in new IHasToStringState[] { new FormattableStringWrapper(s), new SpanFormattableStringWrapper(s) })
                {
                    void AssertTss(IHasToStringState tss, string format)
                    {
                        Assert.Equal(format, tss.ToStringState.LastFormat);
                        Assert.Same(provider, tss.ToStringState.LastProvider);
                        Assert.Equal(ToStringMode.ICustomFormatterFormat, tss.ToStringState.ToStringMode);
                    }

                    // object
                    expected.AppendFormat(provider, "{0}", tss);
                    iab.AppendFormatted(tss);
                    AssertTss(tss, null);

                    // object, format
                    expected.AppendFormat(provider, "{0:X2}", tss);
                    iab.AppendFormatted(tss, "X2");
                    AssertTss(tss, "X2");

                    // object, alignment
                    expected.AppendFormat(provider, "{0,3}", tss);
                    iab.AppendFormatted(tss, 3);
                    AssertTss(tss, null);

                    // object, alignment, format
                    expected.AppendFormat(provider, "{0,-3:X2}", tss);
                    iab.AppendFormatted(tss, -3, "X2");
                    AssertTss(tss, "X2");
                }
            }

            actual.Append(provider, ref iab);

            Assert.Equal(expected.ToString(), actual.ToString());
        }
        public void AppendFormatted_ValueTypes()
        {
            void Test <T>(T t)
            {
                var expected = new StringBuilder();
                var actual   = new StringBuilder();

                StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, actual);

                // struct
                expected.AppendFormat("{0}", t);
                iab.AppendFormatted(t);
                Assert.True(string.IsNullOrEmpty(((IHasToStringState)t).ToStringState.LastFormat));
                AssertModeMatchesType(((IHasToStringState)t));

                // struct, format
                expected.AppendFormat("{0:X2}", t);
                iab.AppendFormatted(t, "X2");
                Assert.Equal("X2", ((IHasToStringState)t).ToStringState.LastFormat);
                AssertModeMatchesType(((IHasToStringState)t));

                foreach (int alignment in new[] { 0, 3, -3 })
                {
                    // struct, alignment
                    expected.AppendFormat("{0," + alignment.ToString(CultureInfo.InvariantCulture) + "}", t);
                    iab.AppendFormatted(t, alignment);
                    Assert.True(string.IsNullOrEmpty(((IHasToStringState)t).ToStringState.LastFormat));
                    AssertModeMatchesType(((IHasToStringState)t));

                    // struct, alignment, format
                    expected.AppendFormat("{0," + alignment.ToString(CultureInfo.InvariantCulture) + ":X2}", t);
                    iab.AppendFormatted(t, alignment, "X2");
                    Assert.Equal("X2", ((IHasToStringState)t).ToStringState.LastFormat);
                    AssertModeMatchesType(((IHasToStringState)t));
                }

                actual.Append(ref iab);

                Assert.Equal(expected.ToString(), actual.ToString());
            }

            Test(new FormattableInt32Wrapper(42));
            Test(new SpanFormattableInt32Wrapper(84));
            Test((FormattableInt32Wrapper?)new FormattableInt32Wrapper(42));
            Test((SpanFormattableInt32Wrapper?)new SpanFormattableInt32Wrapper(84));
        }
Exemple #15
0
        public void DebugHandler_AppendOverloads_MatchStringBuilderHandler()
        {
            var actual = new Debug.AssertInterpolatedStringHandler(0, 0, condition: false, out bool shouldAppend);

            Assert.True(shouldAppend);

            var sb       = new StringBuilder();
            var expected = new StringBuilder.AppendInterpolatedStringHandler(0, 0, sb);

            actual.AppendLiteral("abcd");
            expected.AppendLiteral("abcd");

            actual.AppendFormatted(123);
            expected.AppendFormatted(123);

            actual.AppendFormatted(45.6, 10);
            expected.AppendFormatted(45.6, 10);

            actual.AppendFormatted(default(Guid), "X");
            expected.AppendFormatted(default(Guid), "X");

            DateTime dt = DateTime.UtcNow;

            actual.AppendFormatted(dt, -100, "r");
            expected.AppendFormatted(dt, -100, "r");

            actual.AppendFormatted("hello");
            expected.AppendFormatted("hello");

            actual.AppendFormatted("world", -10, null);
            expected.AppendFormatted("world", -10, null);

            actual.AppendFormatted((ReadOnlySpan <char>) "nice to");
            expected.AppendFormatted((ReadOnlySpan <char>) "nice to");

            actual.AppendFormatted((ReadOnlySpan <char>) "nice to", 0, "anything");
            expected.AppendFormatted((ReadOnlySpan <char>) "nice to", 0, "anything");

            actual.AppendFormatted((object)DayOfWeek.Monday, 42, null);
            expected.AppendFormatted((object)DayOfWeek.Monday, 42, null);

            VerifyAssert(() => Debug.Assert(false, actual), sb.ToString());
        }
        public void AppendFormatted_ReferenceTypes_CreateProviderFlowed()
        {
            var provider = new CultureInfo("en-US");
            var sb       = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(1, 2, sb, provider);

            foreach (IHasToStringState tss in new IHasToStringState[] { new FormattableStringWrapper("hello"), new SpanFormattableStringWrapper("hello") })
            {
                iab.AppendFormatted(tss);
                Assert.Same(provider, tss.ToStringState.LastProvider);

                iab.AppendFormatted(tss, 1);
                Assert.Same(provider, tss.ToStringState.LastProvider);

                iab.AppendFormatted(tss, "X2");
                Assert.Same(provider, tss.ToStringState.LastProvider);

                iab.AppendFormatted(tss, 1, "X2");
                Assert.Same(provider, tss.ToStringState.LastProvider);
            }

            sb.Append(ref iab);
        }
 public void AppendFormatted_InvalidTryFormatCharsWritten_Throws(bool tooBig) // vs tooSmall
 {
     StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, new StringBuilder());
     Assert.Throws <FormatException>(() => iab.AppendFormatted(new InvalidCharsWritten(tooBig)));
 }
        public void AppendFormatted_ReferenceTypes()
        {
            var expected = new StringBuilder();
            var actual   = new StringBuilder();

            StringBuilder.AppendInterpolatedStringHandler iab = new StringBuilder.AppendInterpolatedStringHandler(0, 0, actual);

            foreach (string rawInput in new[] { null, "", "a", "bc", "def", "this is a longer string", "!" })
            {
                foreach (object o in new object[]
                {
                    rawInput,                                  // raw string directly; ToString will return itself
                    new StringWrapper(rawInput),               // wrapper object that returns string from ToString
                    new FormattableStringWrapper(rawInput),    // IFormattable wrapper around string
                    new SpanFormattableStringWrapper(rawInput) // ISpanFormattable wrapper around string
                })
                {
                    // object
                    expected.AppendFormat("{0}", o);
                    iab.AppendFormatted(o);
                    if (o is IHasToStringState tss1)
                    {
                        Assert.True(string.IsNullOrEmpty(tss1.ToStringState.LastFormat));
                        AssertModeMatchesType(tss1);
                    }

                    // object, format
                    expected.AppendFormat("{0:X2}", o);
                    iab.AppendFormatted(o, "X2");
                    if (o is IHasToStringState tss2)
                    {
                        Assert.Equal("X2", tss2.ToStringState.LastFormat);
                        AssertModeMatchesType(tss2);
                    }

                    foreach (int alignment in new[] { 0, 3, -3 })
                    {
                        // object, alignment
                        expected.AppendFormat("{0," + alignment.ToString(CultureInfo.InvariantCulture) + "}", o);
                        iab.AppendFormatted(o, alignment);
                        if (o is IHasToStringState tss3)
                        {
                            Assert.True(string.IsNullOrEmpty(tss3.ToStringState.LastFormat));
                            AssertModeMatchesType(tss3);
                        }

                        // object, alignment, format
                        expected.AppendFormat("{0," + alignment.ToString(CultureInfo.InvariantCulture) + ":X2}", o);
                        iab.AppendFormatted(o, alignment, "X2");
                        if (o is IHasToStringState tss4)
                        {
                            Assert.Equal("X2", tss4.ToStringState.LastFormat);
                            AssertModeMatchesType(tss4);
                        }
                    }
                }
            }

            actual.Append(ref iab);

            Assert.Equal(expected.ToString(), actual.ToString());
        }