public void ConstructionWorksWithWrongInvalidSize()
        {
            // --- Act
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, -123);

            // --- Assert
            tw.ShouldNotBeNull();
            tw.FlushSize.ShouldBe(1024 * 1024);
            tw.FormatProvider.ShouldBe(CultureInfo.InvariantCulture);
            tw.Encoding.ShouldBe(Encoding.UTF8);
            tw.FlushCount.ShouldBe(0);
            tw.FlushCheckCount.ShouldBe(0);
        }
        public async Task WriteAsyncStringWorksAsExpected()
        {
            // --- Arrange
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, 1);

            // --- Act
            for (var i = 0; i < 78; i++)
            {
                await tw.WriteAsync("System.Object");
            }
            var flushCountBefore = tw.FlushCount;
            await tw.WriteAsync("System.Object");

            // --- Assert
            flushCountBefore.ShouldBe(0);
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(79);
        }
        public async Task WriteAsyncCharArrayWithIndexWorksAsExpected()
        {
            // --- Arrange
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, 1);

            // --- Act
            for (var i = 0; i < 255; i++)
            {
                await tw.WriteAsync(new[] { '*', 'c', 'h', 'a', 'r', '*' }, 1, 4);
            }
            var flushCountBefore = tw.FlushCount;
            await tw.WriteAsync(new[] { 'c', 'h', 'a', 'r' });

            // --- Assert
            flushCountBefore.ShouldBe(0);
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(256);
        }
        public async Task WriteCharAsyncWorksAsExpected()
        {
            // --- Arrange
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, 1);

            // --- Act
            for (var i = 0; i < 1023; i++)
            {
                await tw.WriteAsync('+');
            }
            var flushCountBefore = tw.FlushCount;
            await tw.WriteAsync('+');

            // --- Assert
            flushCountBefore.ShouldBe(0);
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(1024);
        }
        public void WriteBoolWorksAsExpected()
        {
            // --- Arrange
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, 1);

            // --- Act
            for (var i = 0; i < 255; i++)
            {
                tw.Write(true);
            }
            var flushCountBefore = tw.FlushCount;

            tw.Write(true);

            // --- Assert
            flushCountBefore.ShouldBe(0);
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(256);
        }
        public void WriteUlongWorksAsExpected()
        {
            // --- Arrange
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, 1);

            // --- Act
            for (var i = 0; i < 63; i++)
            {
                tw.Write(1234567812345678ul);
            }
            var flushCountBefore = tw.FlushCount;

            tw.Write(1234567812345678ul);

            // --- Assert
            flushCountBefore.ShouldBe(0);
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(64);
        }
        public void WriteFormattedStringWorksAsExpected()
        {
            // --- Arrange
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, 1);

            // --- Act
            for (var i = 0; i < 78; i++)
            {
                tw.Write("This is: {0}", 1234);
            }
            var flushCountBefore = tw.FlushCount;

            tw.Write("This is: {0}", 1234);

            // --- Assert
            flushCountBefore.ShouldBe(0);
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(79);
        }
        public void WriteFloatWorksAsExpected()
        {
            // --- Arrange
            var tw = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8, text => { }, 1);

            // --- Act
            for (var i = 0; i < 127; i++)
            {
                tw.Write(-234.125f);
            }
            var flushCountBefore = tw.FlushCount;

            tw.Write(-234.125f);

            // --- Assert
            flushCountBefore.ShouldBe(0);
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(128);
        }
        public void FlushActionIsInvoked()
        {
            // --- Arrange
            var flushed        = false;
            var flushedContent = string.Empty;
            var tw             = new AutoFlushTextWriter(CultureInfo.InvariantCulture, Encoding.UTF8,
                                                         text =>
            {
                flushed        = true;
                flushedContent = text;
            }, 1);

            // --- Act
            tw.Write(new string('*', 2048));

            // --- Assert
            flushed.ShouldBeTrue();
            flushedContent.ShouldBe(new string('*', 2048));
            tw.FlushCount.ShouldBe(1);
            tw.FlushCheckCount.ShouldBe(1);
        }