public void SendNextLine_2CallsPlusNulls_AllLinesWritten()
        {
            //note that null/empty strings are not ignored here (end-of-data marks are handled in LineDispenser (and besides they are null Tuples and not Tuples with empty lines)

            //arrange
            const int targetNo = 11;
            var       target   = new TextDispenserForTarget(_writer, targetNo);
            var       targetPO = new PrivateObject(target);

            //act
            target.SendNextLine("first line".ToExternalTuple(targetNo)); //note that targetNo sent to a LineDispenserForTarget here is ignored
            target.SendNextLine("second line".ToExternalTuple(targetNo));
            target.SendNextLine(string.Empty.ToExternalTuple(targetNo));
            target.SendNextLine(new Tuple <ExternalLine, int>(null, targetNo));

            //assert
            targetPO.GetField("TargetNo").Should().Be(targetNo);
            var writtenLines = WrittenLines.ToList();

            writtenLines.Count().Should().Be(4);
            writtenLines[0].Should().Be("first line");
            writtenLines[1].Should().Be("second line");
            writtenLines[2].Should().Be(string.Empty);
            writtenLines[3].Should().Be(string.Empty); //note that null string sent to TextWriter is indistinguishable from empty string
        }
        public void SendNextLine_2Calls_2LinesWritten()
        {
            //arrange
            const int targetNo    = 4;
            var       dispenser   = new TextDispenserForTarget(_writer, targetNo);
            var       dispenserPO = new PrivateObject(dispenser);

            //act
            dispenser.SendNextLine("first line".ToExternalTuple(targetNo));
            dispenser.SendNextLine("second line".ToExternalTuple(targetNo));

            //assert
            dispenserPO.GetField("TargetNo").Should().Be(targetNo);
            var writtenLines = WrittenLines.ToList();

            writtenLines.Count().Should().Be(2);
            writtenLines[0].Should().Be("first line");
            writtenLines[1].Should().Be("second line");
        }
        public void Dispose_Call_MakesTargetDisposed()
        {
            //arrange
            const int targetNo = 9;
            var       target   = new TextDispenserForTarget(_writer, targetNo);
            var       targetPO = new PrivateObject(target);

            //act
            target.SendNextLine("first line".ToExternalTuple(targetNo));
            target.Dispose();
            Action a = () => { target.SendNextLine("second line".ToExternalTuple(targetNo)); };

            //assert
            a.Should().Throw <ObjectDisposedException>().WithMessage("Cannot write to a closed TextWriter.");

            targetPO.GetField("TargetNo").Should().Be(targetNo);
            var writtenLines = WrittenLines.ToList();

            writtenLines.Count().Should().Be(1);
            writtenLines[0].Should().Be("first line");
        }