public void AppendFormatted_ValueTypes_CreateProviderFlowed(bool useScratch)
        {
            void Test <T>(T t)
            {
                var provider = new CultureInfo("en-US");
                DefaultInterpolatedStringHandler handler = useScratch ?
                                                           new DefaultInterpolatedStringHandler(1, 2, provider, stackalloc char[16]) :
                                                           new DefaultInterpolatedStringHandler(1, 2, provider);

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

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

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

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

            Test(new FormattableInt32Wrapper(42));
            Test(new SpanFormattableInt32Wrapper(84));
            Test((FormattableInt32Wrapper?)new FormattableInt32Wrapper(42));
            Test((SpanFormattableInt32Wrapper?)new SpanFormattableInt32Wrapper(84));
        }
        public void AppendFormatted_String_ICustomFormatter()
        {
            var provider = new ConcatFormatter();

            var expected = new StringBuilder();
            DefaultInterpolatedStringHandler actual = new DefaultInterpolatedStringHandler(0, 0, provider);

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

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

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

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

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

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

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

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

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

            Assert.Equal(expected.ToString(), actual.ToStringAndClear());
        }
Exemple #4
0
 private static void FormatArgument <T>(ref DefaultInterpolatedStringHandler builder, T arg, int?alignment, string?format)
 {
     if (arg is null)
     {
         builder.AppendLiteral(NullValue);
     }
     else
     {
         if (alignment.HasValue && format is not null)
         {
             builder.AppendFormatted <T>(arg, alignment.GetValueOrDefault(), format);
         }
         else if (alignment.HasValue)
         {
             builder.AppendFormatted <T>(arg, alignment.GetValueOrDefault());
         }
         else if (format is not null)
         {
             builder.AppendFormatted <T>(arg, format);
         }
         else
         {
             builder.AppendFormatted <T>(arg);
         }
     }
 }
        public void ToStringAndClear_Clears()
        {
            DefaultInterpolatedStringHandler handler = new DefaultInterpolatedStringHandler(0, 0);

            handler.AppendLiteral("hi");
            Assert.Equal("hi", handler.ToStringAndClear());
            Assert.Equal(string.Empty, handler.ToStringAndClear());
        }
        public void AppendFormatted_ReferenceTypes()
        {
            var expected = new StringBuilder();
            DefaultInterpolatedStringHandler actual = new DefaultInterpolatedStringHandler(0, 0);

            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);
                    actual.AppendFormatted(o);
                    if (o is IHasToStringState tss1)
                    {
                        Assert.True(string.IsNullOrEmpty(tss1.ToStringState.LastFormat));
                        AssertModeMatchesType(tss1);
                    }

                    // object, format
                    expected.AppendFormat("{0:X2}", o);
                    actual.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);
                        actual.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);
                        actual.AppendFormatted(o, alignment, "X2");
                        if (o is IHasToStringState tss4)
                        {
                            Assert.Equal("X2", tss4.ToStringState.LastFormat);
                            AssertModeMatchesType(tss4);
                        }
                    }
                }
            }

            Assert.Equal(expected.ToString(), actual.ToStringAndClear());
        }
Exemple #7
0
        static void TestManualDefaultStringInterpolationHandler()
        {
            Console.WriteLine("TestManualDefaultStringInterpolationHandler:");
            C c = new C(42);
            DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(0, 1);

            defaultInterpolatedStringHandler.AppendFormatted(c);
            M2(Space(), defaultInterpolatedStringHandler.ToStringAndClear());
        }
        public QueryInterpolatedStringHandler(int literalLength, int formattedCount)
        {
            _innerHandler = new DefaultInterpolatedStringHandler(literalLength, formattedCount);

            // Default to a prepared query since we're using parameters
            _queryOptions = new QueryOptions().AdHoc(false);

            _parameterCount = 0;
        }
Exemple #9
0
        public string Format <T0>(T0 arg0)
        {
            var builder = new DefaultInterpolatedStringHandler(2, 1, CultureInfo.InvariantCulture);

            builder.AppendLiteral(_formatSegments[0]);
            FormatArgument(ref builder, arg0, _valueAlignments[0], _valueFormats[0]);
            builder.AppendLiteral(_formatSegments[1]);
            return(builder.ToString());
        }
        public void ToString_DoesntClear()
        {
            DefaultInterpolatedStringHandler handler = new DefaultInterpolatedStringHandler(0, 0);

            handler.AppendLiteral("hi");
            for (int i = 0; i < 3; i++)
            {
                Assert.Equal("hi", handler.ToString());
            }
            Assert.Equal("hi", handler.ToStringAndClear());
        }
    public GuardInterpolatedStringHandler(int literalLength, int formattedCount, bool condition, out bool shouldAppend)
    {
        if (condition)
        {
            _innerHandler = default;
            shouldAppend  = false;
        }

        _innerHandler = new DefaultInterpolatedStringHandler(literalLength, formattedCount);
        shouldAppend  = true;
    }
        public void AppendLiteral()
        {
            var expected = new StringBuilder();
            DefaultInterpolatedStringHandler actual = new DefaultInterpolatedStringHandler(0, 0);

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

            Assert.Equal(expected.ToString(), actual.ToStringAndClear());
        }
        public void Grow_Large(bool useScratch)
        {
            var expected = new StringBuilder();
            DefaultInterpolatedStringHandler handler = useScratch ?
                                                       new DefaultInterpolatedStringHandler(3, 1000, null, stackalloc char[16]) :
                                                       new DefaultInterpolatedStringHandler(3, 1000);

            for (int i = 0; i < 1000; i++)
            {
                handler.AppendFormatted(i);
                expected.Append(i);

                handler.AppendFormatted(i, 3);
                expected.AppendFormat("{0,3}", i);
            }

            Assert.Equal(expected.ToString(), handler.ToStringAndClear());
        }
        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();
                DefaultInterpolatedStringHandler actual = new DefaultInterpolatedStringHandler(0, 0, provider);

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

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

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

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

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

            Test(new FormattableInt32Wrapper(42));
            Test(new SpanFormattableInt32Wrapper(84));
            Test((FormattableInt32Wrapper?)new FormattableInt32Wrapper(42));
            Test((SpanFormattableInt32Wrapper?)new SpanFormattableInt32Wrapper(84));
        }
Exemple #15
0
        public string Format <T0, T1, T2, T3, T4, T5>(T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
        {
            var builder = new DefaultInterpolatedStringHandler(7, 6, CultureInfo.InvariantCulture);

            builder.AppendLiteral(_formatSegments[0]);
            FormatArgument(ref builder, arg0, _valueAlignments[0], _valueFormats[0]);
            builder.AppendLiteral(_formatSegments[1]);
            FormatArgument(ref builder, arg1, _valueAlignments[1], _valueFormats[1]);
            builder.AppendLiteral(_formatSegments[2]);
            FormatArgument(ref builder, arg2, _valueAlignments[2], _valueFormats[2]);
            builder.AppendLiteral(_formatSegments[3]);
            FormatArgument(ref builder, arg3, _valueAlignments[3], _valueFormats[3]);
            builder.AppendLiteral(_formatSegments[4]);
            FormatArgument(ref builder, arg4, _valueAlignments[4], _valueFormats[4]);
            builder.AppendLiteral(_formatSegments[5]);
            FormatArgument(ref builder, arg5, _valueAlignments[5], _valueFormats[5]);
            builder.AppendLiteral(_formatSegments[6]);
            return(builder.ToString());
        }
        public void AppendFormatted_ReferenceTypes_ICustomFormatter()
        {
            var provider = new ConcatFormatter();

            var expected = new StringBuilder();
            DefaultInterpolatedStringHandler actual = new DefaultInterpolatedStringHandler(0, 0, 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);
                    actual.AppendFormatted(tss);
                    AssertTss(tss, null);

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

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

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

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

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

                // struct, format
                expected.AppendFormat("{0:X2}", t);
                actual.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);
                    actual.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);
                    actual.AppendFormatted(t, alignment, "X2");
                    Assert.Equal("X2", ((IHasToStringState)t).ToStringState.LastFormat);
                    AssertModeMatchesType(((IHasToStringState)t));
                }

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

            Test(new FormattableInt32Wrapper(42));
            Test(new SpanFormattableInt32Wrapper(84));
            Test((FormattableInt32Wrapper?)new FormattableInt32Wrapper(42));
            Test((SpanFormattableInt32Wrapper?)new SpanFormattableInt32Wrapper(84));
        }
        public void AppendFormatted_ReferenceTypes_CreateProviderFlowed(bool useScratch)
        {
            var provider = new CultureInfo("en-US");
            DefaultInterpolatedStringHandler handler = useScratch ?
                                                       new DefaultInterpolatedStringHandler(1, 2, provider, stackalloc char[16]) :
                                                       new DefaultInterpolatedStringHandler(1, 2, provider);

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

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

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

                handler.AppendFormatted(tss, 1, "X2");
                Assert.Same(provider, tss.ToStringState.LastProvider);
            }
        }
 public QueryInterpolatedStringHandler(int literalLength, int formattedCount, QueryOptions queryOptions)
 {
     _innerHandler   = new DefaultInterpolatedStringHandler(literalLength, formattedCount);
     _queryOptions   = queryOptions;
     _parameterCount = 0;
 }
Exemple #20
0
 /// <summary>Creates a new string by using the specified provider to control the formatting of the specified interpolated string.</summary>
 /// <param name="provider">An object that supplies culture-specific formatting information.</param>
 /// <param name="initialBuffer">The initial buffer that may be used as temporary space as part of the formatting operation. The contents of this buffer may be overwritten.</param>
 /// <param name="handler">The interpolated string.</param>
 /// <returns>The string that results for formatting the interpolated string using the specified format provider.</returns>
 public static string Create(IFormatProvider?provider, Span <char> initialBuffer, [InterpolatedStringHandlerArgument("provider", "initialBuffer")] ref DefaultInterpolatedStringHandler handler) =>
 handler.ToStringAndClear();
Exemple #21
0
 /// <summary>Creates a new string by using the specified provider to control the formatting of the specified interpolated string.</summary>
 /// <param name="provider">An object that supplies culture-specific formatting information.</param>
 /// <param name="handler">The interpolated string.</param>
 /// <returns>The string that results for formatting the interpolated string using the specified format provider.</returns>
 public static string Create(IFormatProvider?provider, [InterpolatedStringHandlerArgument(nameof(provider))] ref DefaultInterpolatedStringHandler handler) =>
 handler.ToStringAndClear();
Exemple #22
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;
     }
 }
Exemple #23
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 #24
0
 public LogStringHandler(int literalLength, int formattedCount, IFormatProvider?provider, Span <char> initialBuffer)
 {
     _handler = new DefaultInterpolatedStringHandler(literalLength, formattedCount, provider, initialBuffer);
     Values   = new Dictionary <string, object?>();
 }
Exemple #25
0
 public LogStringHandler(int literalLength, int formattedCount)
 {
     _handler = new DefaultInterpolatedStringHandler(literalLength, formattedCount);
     Values   = new Dictionary <string, object?>();
 }