Browse Source

Add conformance tests for Table with header cells spanning multiple columns

Marcin Ziąbek 1 month ago
parent
commit
3a2ef01038

+ 224 - 0
Source/QuestPDF.ConformanceTests/Table/TableWithHeaderCellsSpanningMultipleColumnsTests.cs

@@ -0,0 +1,224 @@
+using QuestPDF.ConformanceTests.TestEngine;
+using QuestPDF.Drawing;
+using QuestPDF.Fluent;
+using QuestPDF.Helpers;
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.ConformanceTests.Table;
+
+internal class TableWithHeaderCellsSpanningMultipleColumnsTests : ConformanceTestBase
+{
+    protected override Document GetDocumentUnderTest()
+    {
+        return Document
+            .Create(document =>
+            {
+                document.Page(page =>
+                {
+                    page.Margin(60);
+
+                    page.Content()
+                        .Shrink()
+                        .Border(1)
+                        .BorderColor(Colors.Grey.Darken1)
+                        .Table(table =>
+                        {
+                            table.ApplySemanticTags();
+
+                            table.ColumnsDefinition(columns =>
+                            {
+                                columns.RelativeColumn();
+                                columns.RelativeColumn();
+                                columns.RelativeColumn();
+                                columns.RelativeColumn();
+                                columns.RelativeColumn();
+                            });
+                            
+                            table.Header(header =>
+                            {
+                                header.Cell().RowSpan(2).Element(HeaderCellStyle).Text("Paper Type");
+                                header.Cell().ColumnSpan(2).Element(HeaderCellStyle).Text("Width");
+                                header.Cell().ColumnSpan(2).Element(HeaderCellStyle).Text("Height");
+                                header.Cell().Element(HeaderCellStyle).Text("Inches");
+                                header.Cell().Element(HeaderCellStyle).Text("Points");
+                                header.Cell().Element(HeaderCellStyle).Text("Inches");
+                                header.Cell().Element(HeaderCellStyle).Text("Points");
+                            });
+
+                            table.Cell().AsSemanticHorizontalHeader().Element(HeaderCellStyle).Text("A3");
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                                
+                            table.Cell().AsSemanticHorizontalHeader().Element(HeaderCellStyle).Text("A4");
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            
+                            table.Cell().AsSemanticHorizontalHeader().Element(HeaderCellStyle).Text("A5");
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            table.Cell().Element(CellStyle).Text(Placeholders.Decimal());
+                            
+                            IContainer HeaderCellStyle(IContainer container) =>
+                                container
+                                    .Border(1)
+                                    .BorderColor(Colors.Grey.Lighten2)
+                                    .Background(Colors.Grey.Lighten3)
+                                    .Padding(8)
+                                    .AlignMiddle()
+                                    .DefaultTextStyle(x => x.Bold());
+
+                            IContainer CellStyle(IContainer container) =>
+                                container
+                                    .Border(1)
+                                    .BorderColor(Colors.Grey.Lighten2)
+                                    .Padding(8);
+                        });
+                });
+            });
+    }
+
+    protected override SemanticTreeNode? GetExpectedSemanticTree()
+    {
+        return ExpectedSemanticTree.DocumentRoot(root =>
+        {
+            root.Child("Table", table =>
+            {
+                table.Child("THead", thead =>
+                {
+                    thead.Child("TR", row =>
+                    {
+                        row.Child("TH", th => th
+                            .Id(5)
+                            .Attribute("Table", "RowSpan", 2)
+                            .Child("P"));
+                        
+                        row.Child("TH", th => th
+                            .Id(6)
+                            .Attribute("Table", "ColSpan", 2)
+                            .Child("P"));
+                        
+                        row.Child("TH", th => th
+                            .Id(7)
+                            .Attribute("Table", "ColSpan", 2)
+                            .Child("P"));
+                    });
+                    
+                    thead.Child("TR", row =>
+                    {
+                        row.Child("TH", th => th
+                            .Id(9)
+                            .Attribute("Table", "Headers", new[] { 6 })
+                            .Child("P"));
+                        
+                        row.Child("TH", th => th
+                            .Id(10)
+                            .Attribute("Table", "Headers", new[] { 6 })
+                            .Child("P"));
+                        
+                        row.Child("TH", th => th
+                            .Id(11)
+                            .Attribute("Table", "Headers", new[] { 7 })
+                            .Child("P"));
+                        
+                        row.Child("TH", th => th
+                            .Id(12)
+                            .Attribute("Table", "Headers", new[] { 7 })
+                            .Child("P"));
+                    });
+                });
+
+                table.Child("TBody", tbody =>
+                {
+                    tbody.Child("TR", row =>
+                    {
+                        row.Child("TH", th => th
+                            .Id(22)
+                            .Attribute("Table", "Headers", new[] { 5 })
+                            .Child("P"));
+                        
+                        row.Child("TD", th => th
+                            .Id(23)
+                            .Attribute("Table", "Headers", new[] { 6, 9, 22 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(24)
+                            .Attribute("Table", "Headers", new[] { 6, 10, 22 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(25)
+                            .Attribute("Table", "Headers", new[] { 7, 11, 22 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(26)
+                            .Attribute("Table", "Headers", new[] { 7, 12, 22 })
+                            .Child("P"));
+                    });
+                    
+                    tbody.Child("TR", row =>
+                    {
+                        row.Child("TH", th => th
+                            .Id(28)
+                            .Attribute("Table", "Headers", new[] { 5 })
+                            .Child("P"));
+                        
+                        row.Child("TD", th => th
+                            .Id(29)
+                            .Attribute("Table", "Headers", new[] { 6, 9, 28 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(30)
+                            .Attribute("Table", "Headers", new[] { 6, 10, 28 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(31)
+                            .Attribute("Table", "Headers", new[] { 7, 11, 28 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(32)
+                            .Attribute("Table", "Headers", new[] { 7, 12, 28 })
+                            .Child("P"));
+                    });
+                    
+                    tbody.Child("TR", row =>
+                    {
+                        row.Child("TH", th => th
+                            .Id(34)
+                            .Attribute("Table", "Headers", new[] { 5 })
+                            .Child("P"));
+                        
+                        row.Child("TD", th => th
+                            .Id(35)
+                            .Attribute("Table", "Headers", new[] { 6, 9, 34 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(36)
+                            .Attribute("Table", "Headers", new[] { 6, 10, 34 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(37)
+                            .Attribute("Table", "Headers", new[] { 7, 11, 34 })
+                            .Child("P"));
+                        
+                        row.Child("TD", td => td
+                            .Id(38)
+                            .Attribute("Table", "Headers", new[] { 7, 12, 34 })
+                            .Child("P"));
+                    });
+                });
+            });
+        });
+    }
+}