From 8c38390038edcebd55f9dec8359ef983f3813425 Mon Sep 17 00:00:00 2001
From: Albert Krewinkel <albert@zeitkraut.de>
Date: Fri, 27 Nov 2020 21:21:25 +0100
Subject: [PATCH] HTML reader tests: improve test coverage of new features

---
 src/Text/Pandoc/Readers/HTML/Table.hs |   3 +-
 test/html-reader.html                 |  76 ++++++++++++++++++
 test/html-reader.native               | 109 ++++++++++++++++++++++++++
 3 files changed, 187 insertions(+), 1 deletion(-)

diff --git a/src/Text/Pandoc/Readers/HTML/Table.hs b/src/Text/Pandoc/Readers/HTML/Table.hs
index 5a783988f..91639fa4c 100644
--- a/src/Text/Pandoc/Readers/HTML/Table.hs
+++ b/src/Text/Pandoc/Readers/HTML/Table.hs
@@ -214,7 +214,8 @@ normalize :: [ColWidth] -> TableHead -> [TableBody] -> TableFoot
           -> Either String ([ColSpec], TableHead, [TableBody], TableFoot)
 normalize widths head' bodies foot = do
   let rows = headRows head' <> concatMap bodyRows bodies <> footRows foot
-  let rowLength = length . rowCells
+  let cellWidth (Cell _ _ _ (ColSpan cs) _) = cs
+  let rowLength = foldr (\cell acc -> cellWidth cell + acc) 0 . rowCells
   let ncols = maximum (map rowLength rows)
   let tblType = tableType (map rowCells rows)
   -- fail on empty table
diff --git a/test/html-reader.html b/test/html-reader.html
index ae937af82..4b688cb20 100644
--- a/test/html-reader.html
+++ b/test/html-reader.html
@@ -487,6 +487,7 @@ An e-mail address: nobody [at] nowhere.net<blockquote>
     </tbody>
 </table>
 <hr />
+<p>Row headers</p>
 <table>
     <thead>
     <tr>
@@ -656,6 +657,7 @@ An e-mail address: nobody [at] nowhere.net<blockquote>
     </tbody>
 </table>
 <hr />
+<p>tbody tags omitted</p>
 <table>
     <tr>
         <td>1</td>
@@ -669,6 +671,7 @@ An e-mail address: nobody [at] nowhere.net<blockquote>
     </tr>
 </table>
 <hr />
+<p>empty head</p>
 <table>
     <thead>
     </thead>
@@ -686,6 +689,7 @@ An e-mail address: nobody [at] nowhere.net<blockquote>
     </tbody>
 </table>
 <hr />
+<p>explicit body and foot</p>
 <table>
     <tbody>
     <tr>
@@ -702,6 +706,78 @@ An e-mail address: nobody [at] nowhere.net<blockquote>
     </tr>
     </tfoot>
 </table>
+<h2>Colspans and Rowspans</h2>
+<table>
+    <tr>
+        <td colspan="2">1 and 2</td>
+        <td>3</td>
+    </tr>
+    <tr>
+        <td colspan="3">4, 5, and 6</td>
+    </tr>
+</table>
+<hr/>
+<table>
+    <thead>
+    <tr>
+        <th colspan="3">Numbers</th>
+    </tr>
+    </thead>
+    <tbody>
+    <tr>
+        <td rowspan="2">1 and 4</td>
+        <td>2</td>
+        <td>3</td>
+    </tr>
+    <tr>
+        <td>5</td>
+        <td>6</td>
+    </tr>
+    </tbody>
+</table>
+<h2>Attributes</h2>
+<table id="attrib-test-table">
+  <thead class="table-head">
+    <tr class="table-head-row">
+      <th abbr="x" colspan="3">Cat X</th>
+    </tr>
+    <tbody data-part="body" class="main">
+    <tr data-part="row">
+        <td data-part="cell">1</td>
+        <td valign="bottom">2</td>
+        <td style="color: #151950">3</td>
+    </tr>
+    </tbody>
+    <tfoot class="summary">
+    <tr bgcolor="#ccc">
+        <td data-square="true">4</td>
+        <td>5</td>
+        <td>6</td>
+    </tr>
+    </tfoot>
+</table>
+<h2>Tag omission</h2>
+<p>thead, tbody, and tfoot</p>
+<table>
+    <thead>
+        <tr>
+            <td>X</td>
+            <td>Y</td>
+            <td>Z</td>
+        </tr>
+    <tbody>
+        <tr>
+            <td>1</td>
+            <td>2</td>
+            <td>3</td>
+        </tr>
+    <tfoot>
+        <tr>
+            <td>4</td>
+            <td>5</td>
+            <td>6</td>
+        </tr>
+</table>
 <h2>Empty Tables</h2>
 <p>This section should be empty.</p>
 <table>
diff --git a/test/html-reader.native b/test/html-reader.native
index ea74c25e1..04ec55d1e 100644
--- a/test/html-reader.native
+++ b/test/html-reader.native
@@ -395,6 +395,7 @@ Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("titl
  (TableFoot ("",[],[])
  [])
 ,HorizontalRule
+,Para [Str "Row",Space,Str "headers"]
 ,Table ("",[],[]) (Caption Nothing
  [])
  [(AlignDefault,ColWidthDefault)
@@ -647,6 +648,7 @@ Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("titl
  (TableFoot ("",[],[])
  [])
 ,HorizontalRule
+,Para [Str "tbody",Space,Str "tags",Space,Str "omitted"]
 ,Table ("",[],[]) (Caption Nothing
  [])
  [(AlignDefault,ColWidthDefault)
@@ -673,6 +675,7 @@ Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("titl
  (TableFoot ("",[],[])
  [])
 ,HorizontalRule
+,Para [Str "empty",Space,Str "head"]
 ,Table ("",[],[]) (Caption Nothing
  [])
  [(AlignDefault,ColWidthDefault)
@@ -699,6 +702,7 @@ Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("titl
  (TableFoot ("",[],[])
  [])
 ,HorizontalRule
+,Para [Str "explicit",Space,Str "body",Space,Str "and",Space,Str "foot"]
 ,Table ("",[],[]) (Caption Nothing
  [])
  [(AlignDefault,ColWidthDefault)
@@ -723,5 +727,110 @@ Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("titl
    [Plain [Str "5"]]
   ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
    [Plain [Str "6"]]]])
+,Header 2 ("colspans-and-rowspans",[],[]) [Str "Colspans",Space,Str "and",Space,Str "Rowspans"]
+,Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)]
+ (TableHead ("",[],[])
+ [])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+  []
+  [Row ("",[],[])
+   [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 2)
+    [Plain [Str "1",Space,Str "and",Space,Str "2"]]
+   ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "3"]]]
+  ,Row ("",[],[])
+   [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 3)
+    [Plain [Str "4,",Space,Str "5,",Space,Str "and",Space,Str "6"]]]])]
+ (TableFoot ("",[],[])
+ [])
+,HorizontalRule
+,Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)]
+ (TableHead ("",[],[])
+ [Row ("",[],[])
+  [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 3)
+   [Plain [Str "Numbers"]]]])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+  []
+  [Row ("",[],[])
+   [Cell ("",[],[]) AlignDefault (RowSpan 2) (ColSpan 1)
+    [Plain [Str "1",Space,Str "and",Space,Str "4"]]
+   ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "2"]]
+   ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "3"]]]
+  ,Row ("",[],[])
+   [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "5"]]
+   ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "6"]]]])]
+ (TableFoot ("",[],[])
+ [])
+,Header 2 ("attributes",[],[]) [Str "Attributes"]
+,Table ("attrib-test-table",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)]
+ (TableHead ("",["table-head"],[])
+ [Row ("",["table-head-row"],[])
+  [Cell ("",[],[("abbr","x")]) AlignDefault (RowSpan 1) (ColSpan 3)
+   [Plain [Str "Cat",Space,Str "X"]]]])
+ [(TableBody ("",["main"],[("part","body")]) (RowHeadColumns 0)
+  []
+  [Row ("",[],[("part","row")])
+   [Cell ("",[],[("part","cell")]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "1"]]
+   ,Cell ("",[],[("valign","bottom")]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "2"]]
+   ,Cell ("",[],[("style","color: #151950")]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "3"]]]])]
+ (TableFoot ("",["summary"],[])
+ [Row ("",[],[("bgcolor","#ccc")])
+  [Cell ("",[],[("square","true")]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "4"]]
+  ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "5"]]
+  ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "6"]]]])
+,Header 2 ("tag-omission",[],[]) [Str "Tag",Space,Str "omission"]
+,Para [Str "thead,",Space,Str "tbody,",Space,Str "and",Space,Str "tfoot"]
+,Table ("",[],[]) (Caption Nothing
+ [])
+ [(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault)]
+ (TableHead ("",[],[])
+ [Row ("",[],[])
+  [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "X"]]
+  ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "Y"]]
+  ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "Z"]]]])
+ [(TableBody ("",[],[]) (RowHeadColumns 0)
+  []
+  [Row ("",[],[])
+   [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "1"]]
+   ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "2"]]
+   ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+    [Plain [Str "3"]]]])]
+ (TableFoot ("",[],[])
+ [Row ("",[],[])
+  [Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "4"]]
+  ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "5"]]
+  ,Cell ("",[],[]) AlignDefault (RowSpan 1) (ColSpan 1)
+   [Plain [Str "6"]]]])
 ,Header 2 ("empty-tables",[],[]) [Str "Empty",Space,Str "Tables"]
 ,Para [Str "This",Space,Str "section",Space,Str "should",Space,Str "be",Space,Str "empty."]]