void divider_should_renderHeaderAndBlankFooterWhenDefinedInline()
        {
            var tab = new PlainTextTable()
                      .AddRow("Name", "Value")
                      .Divide('-')
                      .AddRow("Data a1", "Data b1")
                      .AddRow("Data a2", "Data b2")
                      .AddRow("Data a3", "Data b3")
                      .Divide('-')
                      .ToString();

            var result = tab.ToString();

            output.WriteLine(result + "EOM");

            string expected = @"Name    Value  
---------------
Data a1 Data b1
Data a2 Data b2
Data a3 Data b3
---------------
";

            Assert.Equal(expected, result);
        }
        void fluid_should_setAlignmentByIndexer()
        {
            var tab = new PlainTextTable();

            tab.Align(2, 'r');

            Assert.Equal(Alignment.Right, tab.Alignments[2]);
        }
        void fluid_should_setTrimTrailingSpace()
        {
            var tab = new PlainTextTable();

            tab.TrimTrailingSpace(true);

            Assert.True(tab.TrimTrailingWhitespace);
        }
        void fluid_should_setSeparateByDelimiter()
        {
            var tab = new PlainTextTable();

            tab.SeparateBy("TEST");

            Assert.Equal("TEST", tab.ColumnSeparator);
        }
        void expectedColumns_should_inferMaxFromFirstRow()
        {
            var tab = new PlainTextTable();

            tab.ImportRows(create_test_data());

            Assert.Equal(3, tab.ColumnsExpected);
        }
        void emptyEnumerable_should_renderAnEmptyString()
        {
            var tab = new PlainTextTable(Enumerable.Empty <string[]>());

            var actual = tab.ToString();

            Assert.Equal(string.Empty, actual);
        }
        void columnState_should_returnAnEmptyArrayWhenNoColumnsHaveBeenImported()
        {
            var tab = new PlainTextTable();

            var columns = tab.GetColumnState();

            Assert.NotNull(columns);
            Assert.Empty(columns);
        }
        void columnState_should_inferColumnWidthsFromTestData()
        {
            var tab = new PlainTextTable(create_test_data());

            var columns = tab.GetColumnState();

            Assert.Equal(3, columns.Length);

            Assert.Equal(5, columns[0].Width);
            Assert.Equal(5, columns[1].Width);
            Assert.Equal(9, columns[2].Width);
        }
        void render_should_writeSpaceDelimitedTable()
        {
            var tab = new PlainTextTable(create_test_data());

            var result = tab.ToString();

            output.WriteLine(result + "EOM");

            string expected = @"Col A Col B Col C    
R1-A  R1-B  R1-C     
R2-A  R2-B  R2-C long
R3-A  R3-B  R3-C     
";

            Assert.Equal(expected, result);
        }
        void fluid_should_setAlignmentsByString()
        {
            var tab = new PlainTextTable(create_test_data());

            tab.Align("lmr");

            Assert.Equal(3, tab.Alignments.Count);

            var columns = tab.GetColumnState();

            Assert.Equal(3, columns.Length);

            Assert.Equal(Alignment.Left, columns[0].Align);
            Assert.Equal(Alignment.Center, columns[1].Align);
            Assert.Equal(Alignment.Right, columns[2].Align);
        }
        void render_should_writeTrimmedRightColumn()
        {
            var tab = new PlainTextTable(create_test_data());

            tab.TrimTrailingSpace(true);

            var result = tab.ToString();

            output.WriteLine(result + "EOM");

            string expected = @"Col A Col B Col C
R1-A  R1-B  R1-C
R2-A  R2-B  R2-C long
R3-A  R3-B  R3-C
";

            Assert.Equal(expected, result);
        }
        void render_should_writeAlignedColumns()
        {
            var tab = new PlainTextTable(create_test_data());

            tab.SeparateBy("|");
            tab.Align('l', 'r', 'm');

            var result = tab.ToString();

            output.WriteLine(result + "EOM");

            string expected = @"Col A|Col B|  Col C  
R1-A | R1-B|  R1-C   
R2-A | R2-B|R2-C long
R3-A | R3-B|  R3-C   
";

            Assert.Equal(expected, result);
        }
        void divider_should_renderHeaderAndSummaryFooter()
        {
            var tab = new PlainTextTable(create_test_data());

            tab.DivideAt(1, '-');
            tab.DivideAt(-2, '-');

            var result = tab.ToString();

            output.WriteLine(result + "EOM");

            string expected = @"Col A Col B Col C    
---------------------
R1-A  R1-B  R1-C     
R2-A  R2-B  R2-C long
---------------------
R3-A  R3-B  R3-C     
";

            Assert.Equal(expected, result);
        }
        void expectedColumns_should_throwExceptionIfRowElementLengthIsInvalid()
        {
            var tab = new PlainTextTable(4);

            Assert.Throws <UnexpectedColumnCountException>(() => tab.ImportRows(create_test_data()));
        }
        void stringPadding_should_preferLeftOffsetWhenAligningCentre(string input, int length, string expected, Alignment align, bool padRight)
        {
            var actual = PlainTextTable.Pad(input, length, align, padRight);

            Assert.Equal(expected, actual);
        }
        void stringPadding_should_padWith(string input, int length, string expected, Alignment align, bool padRight)
        {
            var actual = PlainTextTable.Pad(input, length, align, padRight);

            Assert.Equal(expected, actual);
        }