aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc R. Hoffmann <hoffmann@mountainminds.com>2010-09-22 17:19:27 +0000
committerMarc R. Hoffmann <hoffmann@mountainminds.com>2010-09-22 17:19:27 +0000
commit3fe54a3eb8e60ec0d263e61f7c8555dd54f3e6c9 (patch)
tree4781725d60266b266415d0c7d5d0c3b7587712ae
parentdaad13828752fcc9a3ccbaf0505b1b1aaa9a419e (diff)
downloadjacoco-3fe54a3eb8e60ec0d263e61f7c8555dd54f3e6c9.tar.gz
Trac #98: Simplify table layout (no colspan any more).
-rw-r--r--org.jacoco.doc/docroot/doc/.resources/doc.css25
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/HTMLElementTest.java8
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/NodePageTest.java1
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/ReportPageTest.java1
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/SessionsPageTest.java1
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/SourceFilePageTest.java1
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/table/BarColumnTest.java (renamed from org.jacoco.report.test/src/org/jacoco/report/html/BarColumnTest.java)36
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/table/CounterColumnTest.java (renamed from org.jacoco.report.test/src/org/jacoco/report/html/CounterColumnTest.java)106
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/table/CoverageTableTest.java (renamed from org.jacoco.report.test/src/org/jacoco/report/html/CoverageTableTest.java)93
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/table/LabelColumnTest.java (renamed from org.jacoco.report.test/src/org/jacoco/report/html/LabelColumnTest.java)35
-rw-r--r--org.jacoco.report.test/src/org/jacoco/report/html/table/PercentageColumnTest.java (renamed from org.jacoco.report.test/src/org/jacoco/report/html/PercentageColumnTest.java)35
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/ClassPage.java1
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/CounterColumn.java102
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/HTMLElement.java20
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java23
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/IHTMLReportContext.java1
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/NodePage.java1
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/resources/report.css24
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/table/BarColumn.java (renamed from org.jacoco.report/src/org/jacoco/report/html/BarColumn.java)25
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/table/CounterColumn.java180
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/table/CoverageTable.java (renamed from org.jacoco.report/src/org/jacoco/report/html/CoverageTable.java)15
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/table/ICoverageTableColumn.java (renamed from org.jacoco.report/src/org/jacoco/report/html/ICoverageTableColumn.java)37
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/table/ICoverageTableItem.java (renamed from org.jacoco.report/src/org/jacoco/report/html/ICoverageTableItem.java)3
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/table/LabelColumn.java (renamed from org.jacoco.report/src/org/jacoco/report/html/LabelColumn.java)23
-rw-r--r--org.jacoco.report/src/org/jacoco/report/html/table/PercentageColumn.java (renamed from org.jacoco.report/src/org/jacoco/report/html/PercentageColumn.java)26
25 files changed, 557 insertions, 266 deletions
diff --git a/org.jacoco.doc/docroot/doc/.resources/doc.css b/org.jacoco.doc/docroot/doc/.resources/doc.css
index d7924aac..1da2a4af 100644
--- a/org.jacoco.doc/docroot/doc/.resources/doc.css
+++ b/org.jacoco.doc/docroot/doc/.resources/doc.css
@@ -152,17 +152,24 @@ table.coverage thead {
table.coverage thead td {
white-space:nowrap;
- padding:2px 12px 0px 6px;
+ padding:2px 8px 0px 8px;
border-bottom:#b0b0b0 1px solid;
}
+table.coverage thead td.ctr1 {
+ text-align:right;
+ padding-right:4px;
+ border-left:#b0b0b0 1px dotted;
+}
+
table.coverage thead td.ctr2 {
text-align:right;
+ padding-left:4px;
}
table.coverage tbody td {
vertical-align:top;
- padding:2px 12px 2px 6px;
+ padding:2px 8px 2px 8px;
border-bottom:#d6d3ce 1px solid;
}
@@ -172,26 +179,28 @@ table.coverage tbody tr:hover {
table.coverage tbody td.ctr1 {
text-align:right;
- padding:2px 0px 2px 6px;
+ padding-right:4px;
+ border-left:#d6d3ce 1px dotted;
}
table.coverage tbody td.ctr2 {
text-align:right;
- padding:2px 12px 2px 4px;
+ padding-left:4px;
}
table.coverage tfoot td {
- padding:2px 12px 2px 6px;
+ padding:2px 8px 2px 8px;
}
table.coverage tfoot td.ctr1 {
text-align:right;
- padding:2px 0px 2px 6px;
+ padding-right:4px;
+ border-left:#d6d3ce 1px dotted;
}
table.coverage tfoot td.ctr2 {
text-align:right;
- padding:2px 12px 2px 4px;
+ padding-left:4px;
}
.footer {
@@ -208,4 +217,4 @@ table.coverage tfoot td.ctr2 {
.right {
float:right;
-} \ No newline at end of file
+}
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/HTMLElementTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/HTMLElementTest.java
index 4389d564..3b34efbb 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/HTMLElementTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/HTMLElementTest.java
@@ -225,14 +225,6 @@ public class HTMLElementTest {
}
@Test
- public void testTd3() throws IOException {
- root.td("mystyle", 3);
- root.close();
- assertEquals("<root><td class=\"mystyle\" colspan=\"3\"/></root>",
- buffer.toString());
- }
-
- @Test
public void testImg() throws IOException {
root.img("sample.gif", 16, 32, "Hello");
root.close();
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/NodePageTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/NodePageTest.java
index 53513f9e..2f29770a 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/NodePageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/NodePageTest.java
@@ -27,6 +27,7 @@ import org.jacoco.report.ReportOutputFolder;
import org.jacoco.report.html.index.IIndexUpdate;
import org.jacoco.report.html.resources.Resources;
import org.jacoco.report.html.resources.Styles;
+import org.jacoco.report.html.table.CoverageTable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/ReportPageTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/ReportPageTest.java
index 314aa01b..55ff7a57 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/ReportPageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/ReportPageTest.java
@@ -23,6 +23,7 @@ import org.jacoco.report.ReportOutputFolder;
import org.jacoco.report.html.index.IIndexUpdate;
import org.jacoco.report.html.resources.Resources;
import org.jacoco.report.html.resources.Styles;
+import org.jacoco.report.html.table.CoverageTable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/SessionsPageTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/SessionsPageTest.java
index 3031d357..5b8ff9ba 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/SessionsPageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/SessionsPageTest.java
@@ -31,6 +31,7 @@ import org.jacoco.report.html.index.ElementIndex;
import org.jacoco.report.html.index.IIndexUpdate;
import org.jacoco.report.html.resources.Resources;
import org.jacoco.report.html.resources.Styles;
+import org.jacoco.report.html.table.CoverageTable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/SourceFilePageTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/SourceFilePageTest.java
index ffcac562..11ca0e73 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/SourceFilePageTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/SourceFilePageTest.java
@@ -30,6 +30,7 @@ import org.jacoco.report.ReportOutputFolder;
import org.jacoco.report.html.index.IIndexUpdate;
import org.jacoco.report.html.resources.Resources;
import org.jacoco.report.html.resources.Styles;
+import org.jacoco.report.html.table.CoverageTable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/BarColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/table/BarColumnTest.java
index ea7d2bec..1335ba78 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/BarColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/table/BarColumnTest.java
@@ -10,9 +10,11 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import java.util.Arrays;
@@ -23,7 +25,11 @@ import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
import org.jacoco.core.analysis.ICoverageNode.ElementType;
import org.jacoco.report.MemoryMultiReportOutput;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLDocument;
+import org.jacoco.report.html.HTMLElement;
+import org.jacoco.report.html.HTMLSupport;
import org.jacoco.report.html.resources.Resources;
+import org.jacoco.report.html.table.BarColumn;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -45,7 +51,7 @@ public class BarColumnTest {
private HTMLDocument doc;
- private HTMLElement tr;
+ private HTMLElement td;
private HTMLSupport support;
@@ -56,7 +62,7 @@ public class BarColumnTest {
resources = new Resources(root);
doc = new HTMLDocument(root.createFile("Test.html"), "UTF-8");
doc.head().title();
- tr = doc.body().table("somestyle").tr();
+ td = doc.body().table("somestyle").tr().td();
support = new HTMLSupport();
}
@@ -66,8 +72,22 @@ public class BarColumnTest {
}
@Test
+ public void testIsVisible() throws Exception {
+ final BarColumn column = new BarColumn("TestHeader", CounterEntity.LINE);
+ assertTrue(column.isVisible());
+ doc.close();
+ }
+
+ @Test
+ public void testGetStyle() throws Exception {
+ final BarColumn column = new BarColumn("TestHeader", CounterEntity.LINE);
+ assertNull(column.getStyle());
+ doc.close();
+ }
+
+ @Test
public void testHeader() throws Exception {
- new BarColumn("TestHeader", CounterEntity.LINE).header(tr, resources,
+ new BarColumn("TestHeader", CounterEntity.LINE).header(td, resources,
root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
@@ -77,7 +97,7 @@ public class BarColumnTest {
@Test
public void testFooter() throws Exception {
- new BarColumn("TestHeader", CounterEntity.LINE).footer(tr,
+ new BarColumn("TestHeader", CounterEntity.LINE).footer(td,
createNode(20, 5), resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
@@ -90,7 +110,7 @@ public class BarColumnTest {
final ICoverageTableItem i1 = createItem(20, 5);
final ICoverageTableItem i2 = createItem(30, 24);
col.init(Arrays.asList(i1, i2), createNode(50, 29));
- col.item(tr, i1, resources, root);
+ col.item(td, i1, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
@@ -119,7 +139,7 @@ public class BarColumnTest {
final BarColumn col = new BarColumn("", CounterEntity.LINE);
final ICoverageTableItem i1 = createItem(20, 0);
col.init(Arrays.asList(i1), createNode(20, 0));
- col.item(tr, i1, resources, root);
+ col.item(td, i1, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
@@ -140,7 +160,7 @@ public class BarColumnTest {
final BarColumn col = new BarColumn("", CounterEntity.LINE);
final ICoverageTableItem i1 = createItem(20, 20);
col.init(Arrays.asList(i1), createNode(20, 20));
- col.item(tr, i1, resources, root);
+ col.item(td, i1, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/CounterColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/table/CounterColumnTest.java
index 618fb62f..9656c304 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/CounterColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/table/CounterColumnTest.java
@@ -10,9 +10,11 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import java.util.Collections;
@@ -23,7 +25,11 @@ import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
import org.jacoco.core.analysis.ICoverageNode.ElementType;
import org.jacoco.report.MemoryMultiReportOutput;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLDocument;
+import org.jacoco.report.html.HTMLElement;
+import org.jacoco.report.html.HTMLSupport;
import org.jacoco.report.html.resources.Resources;
+import org.jacoco.report.html.table.CounterColumn;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -45,12 +51,10 @@ public class CounterColumnTest {
private HTMLDocument doc;
- private HTMLElement tr;
+ private HTMLElement td;
private HTMLSupport support;
- private ICoverageTableColumn column;
-
@Before
public void setup() throws Exception {
output = new MemoryMultiReportOutput();
@@ -58,9 +62,8 @@ public class CounterColumnTest {
resources = new Resources(root);
doc = new HTMLDocument(root.createFile("Test.html"), "UTF-8");
doc.head().title();
- tr = doc.body().table("somestyle").tr();
+ td = doc.body().table("somestyle").tr().td();
support = new HTMLSupport();
- column = new CounterColumn("TestHeader", CounterEntity.LINE);
}
@After
@@ -69,73 +72,96 @@ public class CounterColumnTest {
}
@Test
- public void testHeader() throws Exception {
+ public void testVisible() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newTotal("TestHeader",
+ "style", CounterEntity.LINE);
final ICoverageTableItem item = createItem(1, 3);
column.init(Collections.singletonList(item), item.getNode());
- column.header(tr, resources, root);
+ assertTrue(column.isVisible());
doc.close();
- final Document doc = support.parse(output.getFile("Test.html"));
- assertEquals("TestHeader",
- support.findStr(doc, "/html/body/table/tr/td/text()"));
}
@Test
- public void testItem() throws Exception {
- final ICoverageTableItem item = createItem(150, 50);
+ public void testInvisible() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newTotal("TestHeader",
+ "style", CounterEntity.LINE);
+ final ICoverageTableItem item = createItem(0, 0);
+ column.init(Collections.singletonList(item), createItem(1, 0).getNode());
+ assertFalse(column.isVisible());
+ doc.close();
+ }
+
+ @Test
+ public void testGetStyle() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newTotal("TestHeader",
+ "mystyle", CounterEntity.LINE);
+ assertEquals("mystyle", column.getStyle());
+ doc.close();
+ }
+
+ @Test
+ public void testHeader() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newTotal("TestHeader",
+ "style", CounterEntity.LINE);
+ final ICoverageTableItem item = createItem(1, 3);
column.init(Collections.singletonList(item), item.getNode());
- column.item(tr, item, resources, root);
+ column.header(td, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
- assertEquals("100 / ",
- support.findStr(doc, "/html/body/table/tr/td[2]/text()"));
- assertEquals("150",
- support.findStr(doc, "/html/body/table/tr/td[3]/text()"));
+ assertEquals("TestHeader",
+ support.findStr(doc, "/html/body/table/tr/td/text()"));
}
@Test
- public void testFooter() throws Exception {
- final ICoverageTableItem item = createItem(80, 60);
+ public void testItemTotal() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newTotal("TestHeader",
+ "style", CounterEntity.LINE);
+ final ICoverageTableItem item = createItem(150, 50);
column.init(Collections.singletonList(item), item.getNode());
- column.footer(tr, item.getNode(), resources, root);
+ column.item(td, item, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
- assertEquals("20 / ",
- support.findStr(doc, "/html/body/table/tr/td[2]/text()"));
- assertEquals("80",
- support.findStr(doc, "/html/body/table/tr/td[3]/text()"));
+ assertEquals("150",
+ support.findStr(doc, "/html/body/table/tr/td[1]/text()"));
}
@Test
- public void testHiddenHeader() throws Exception {
- final ICoverageTableItem item = createItem(0, 0);
+ public void testItemMissed() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newMissed("TestHeader",
+ "style", CounterEntity.LINE);
+ final ICoverageTableItem item = createItem(150, 50);
column.init(Collections.singletonList(item), item.getNode());
- tr.td(); // ensure we still have valid xhtml
- column.header(tr, resources, root);
+ column.item(td, item, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
- assertEquals("", support.findStr(doc, "/html/body/table/tr"));
+ assertEquals("100",
+ support.findStr(doc, "/html/body/table/tr/td[1]/text()"));
}
@Test
- public void testHiddenItem() throws Exception {
- final ICoverageTableItem item = createItem(0, 0);
+ public void testItemCovered() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newCovered("TestHeader",
+ "style", CounterEntity.LINE);
+ final ICoverageTableItem item = createItem(150, 50);
column.init(Collections.singletonList(item), item.getNode());
- tr.td(); // ensure we still have valid xhtml
- column.item(tr, item, resources, root);
+ column.item(td, item, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
- assertEquals("", support.findStr(doc, "/html/body/table/tr"));
+ assertEquals("50",
+ support.findStr(doc, "/html/body/table/tr/td[1]/text()"));
}
@Test
- public void testHiddenFooter() throws Exception {
- final ICoverageTableItem item = createItem(0, 0);
+ public void testFooter() throws Exception {
+ ICoverageTableColumn column = CounterColumn.newTotal("TestHeader",
+ "style", CounterEntity.LINE);
+ final ICoverageTableItem item = createItem(80, 60);
column.init(Collections.singletonList(item), item.getNode());
- tr.td(); // ensure we still have valid xhtml
- column.footer(tr, item.getNode(), resources, root);
+ column.footer(td, item.getNode(), resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
- assertEquals("", support.findStr(doc, "/html/body/table/tr"));
+ assertEquals("80",
+ support.findStr(doc, "/html/body/table/tr/td[1]/text()"));
}
private ICoverageTableItem createItem(final int total, final int covered) {
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/CoverageTableTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/table/CoverageTableTest.java
index 9e09af8b..b2e66dbe 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/CoverageTableTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/table/CoverageTableTest.java
@@ -10,9 +10,10 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.Arrays;
@@ -26,7 +27,11 @@ import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
import org.jacoco.core.analysis.ICoverageNode.ElementType;
import org.jacoco.report.MemoryMultiReportOutput;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLDocument;
+import org.jacoco.report.html.HTMLElement;
+import org.jacoco.report.html.HTMLSupport;
import org.jacoco.report.html.resources.Resources;
+import org.jacoco.report.html.table.CoverageTable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -75,17 +80,25 @@ public class CoverageTableTest {
store.append("init-");
}
- public void header(HTMLElement tr, Resources resources,
+ public boolean isVisible() {
+ return true;
+ }
+
+ public String getStyle() {
+ return null;
+ }
+
+ public void header(HTMLElement td, Resources resources,
ReportOutputFolder base) {
store.append("header-");
}
- public void footer(HTMLElement tr, ICoverageNode total,
+ public void footer(HTMLElement td, ICoverageNode total,
Resources resources, ReportOutputFolder base) {
store.append("footer-");
}
- public void item(HTMLElement tr, ICoverageTableItem item,
+ public void item(HTMLElement td, ICoverageTableItem item,
Resources resources, ReportOutputFolder base) {
store.append("item").append(item.getLinkLabel()).append("-");
}
@@ -106,6 +119,44 @@ public class CoverageTableTest {
}
@Test
+ public void testInvisible() throws IOException {
+ final ICoverageTableColumn recorder = new ICoverageTableColumn() {
+
+ public void init(List<ICoverageTableItem> items, ICoverageNode total) {
+ }
+
+ public boolean isVisible() {
+ return false;
+ }
+
+ public String getStyle() {
+ return null;
+ }
+
+ public void header(HTMLElement td, Resources resources,
+ ReportOutputFolder base) {
+ fail();
+ }
+
+ public void footer(HTMLElement td, ICoverageNode total,
+ Resources resources, ReportOutputFolder base) {
+ fail();
+ }
+
+ public void item(HTMLElement td, ICoverageTableItem item,
+ Resources resources, ReportOutputFolder base) {
+ fail();
+ }
+ };
+ final List<ICoverageTableItem> items = Arrays
+ .asList(createItem("A", 1));
+ new CoverageTable(Arrays.asList(recorder),
+ CounterComparator.TOTALITEMS.on(CounterEntity.CLASS)).render(
+ body, items, createTotal("Sum", 1), resources, root);
+ doc.close();
+ }
+
+ @Test
public void testSorting() throws IOException {
final ICoverageTableColumn recorder = new ICoverageTableColumn() {
@@ -114,15 +165,23 @@ public class CoverageTableTest {
public void init(List<ICoverageTableItem> items, ICoverageNode total) {
}
- public void header(HTMLElement tr, Resources resources,
+ public boolean isVisible() {
+ return true;
+ }
+
+ public String getStyle() {
+ return null;
+ }
+
+ public void header(HTMLElement td, Resources resources,
ReportOutputFolder base) {
}
- public void footer(HTMLElement tr, ICoverageNode total,
+ public void footer(HTMLElement td, ICoverageNode total,
Resources resources, ReportOutputFolder base) {
}
- public void item(HTMLElement tr, ICoverageTableItem item,
+ public void item(HTMLElement td, ICoverageTableItem item,
Resources resources, ReportOutputFolder base) {
store.append(item.getLinkLabel());
}
@@ -149,21 +208,29 @@ public class CoverageTableTest {
public void init(List<ICoverageTableItem> items, ICoverageNode total) {
}
- public void header(HTMLElement tr, Resources resources,
+ public boolean isVisible() {
+ return true;
+ }
+
+ public String getStyle() {
+ return null;
+ }
+
+ public void header(HTMLElement td, Resources resources,
ReportOutputFolder base) throws IOException {
- tr.td().text("Header");
+ td.text("Header");
}
- public void footer(HTMLElement tr, ICoverageNode total,
+ public void footer(HTMLElement td, ICoverageNode total,
Resources resources, ReportOutputFolder base)
throws IOException {
- tr.td().text("Footer");
+ td.text("Footer");
}
- public void item(HTMLElement tr, ICoverageTableItem item,
+ public void item(HTMLElement td, ICoverageTableItem item,
Resources resources, ReportOutputFolder base)
throws IOException {
- tr.td().text(item.getLinkLabel());
+ td.text(item.getLinkLabel());
}
};
final List<ICoverageTableItem> items = Arrays.asList(
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/LabelColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/table/LabelColumnTest.java
index ee764f6b..59a1244e 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/LabelColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/table/LabelColumnTest.java
@@ -10,16 +10,24 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import org.jacoco.core.analysis.CoverageNodeImpl;
import org.jacoco.core.analysis.ICoverageNode;
import org.jacoco.core.analysis.ICoverageNode.ElementType;
import org.jacoco.report.MemoryMultiReportOutput;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLDocument;
+import org.jacoco.report.html.HTMLElement;
+import org.jacoco.report.html.HTMLSupport;
import org.jacoco.report.html.resources.Resources;
+import org.jacoco.report.html.table.ICoverageTableColumn;
+import org.jacoco.report.html.table.ICoverageTableItem;
+import org.jacoco.report.html.table.LabelColumn;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -41,7 +49,7 @@ public class LabelColumnTest {
private HTMLDocument doc;
- private HTMLElement tr;
+ private HTMLElement td;
private HTMLSupport support;
@@ -54,9 +62,10 @@ public class LabelColumnTest {
resources = new Resources(root);
doc = new HTMLDocument(root.createFile("Test.html"), "UTF-8");
doc.head().title();
- tr = doc.body().table("somestyle").tr();
+ td = doc.body().table("somestyle").tr().td();
support = new HTMLSupport();
column = new LabelColumn();
+ column.init(null, null);
}
@After
@@ -65,8 +74,20 @@ public class LabelColumnTest {
}
@Test
+ public void testIsVisible() throws Exception {
+ assertTrue(column.isVisible());
+ doc.close();
+ }
+
+ @Test
+ public void testGetStyle() throws Exception {
+ assertNull(column.getStyle());
+ doc.close();
+ }
+
+ @Test
public void testHeader() throws Exception {
- column.header(tr, resources, root);
+ column.header(td, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("Element",
@@ -75,7 +96,7 @@ public class LabelColumnTest {
@Test
public void testFooter() throws Exception {
- column.footer(tr,
+ column.footer(td,
new CoverageNodeImpl(ElementType.GROUP, "Foo", false),
resources, root);
doc.close();
@@ -86,7 +107,7 @@ public class LabelColumnTest {
@Test
public void testItemWithoutLink() throws Exception {
- column.item(tr, createItem("Abc", null), resources, root);
+ column.item(td, createItem("Abc", null), resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("Abc",
@@ -97,7 +118,7 @@ public class LabelColumnTest {
@Test
public void testItemWithLink() throws Exception {
- column.item(tr, createItem("Def", "def.html"), resources, root);
+ column.item(td, createItem("Def", "def.html"), resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("Def",
diff --git a/org.jacoco.report.test/src/org/jacoco/report/html/PercentageColumnTest.java b/org.jacoco.report.test/src/org/jacoco/report/html/table/PercentageColumnTest.java
index 5d295f1c..f4aa56b8 100644
--- a/org.jacoco.report.test/src/org/jacoco/report/html/PercentageColumnTest.java
+++ b/org.jacoco.report.test/src/org/jacoco/report/html/table/PercentageColumnTest.java
@@ -10,9 +10,10 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import java.util.Collections;
@@ -23,7 +24,13 @@ import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
import org.jacoco.core.analysis.ICoverageNode.ElementType;
import org.jacoco.report.MemoryMultiReportOutput;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLDocument;
+import org.jacoco.report.html.HTMLElement;
+import org.jacoco.report.html.HTMLSupport;
import org.jacoco.report.html.resources.Resources;
+import org.jacoco.report.html.table.ICoverageTableColumn;
+import org.jacoco.report.html.table.ICoverageTableItem;
+import org.jacoco.report.html.table.PercentageColumn;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -45,7 +52,7 @@ public class PercentageColumnTest {
private HTMLDocument doc;
- private HTMLElement tr;
+ private HTMLElement td;
private HTMLSupport support;
@@ -58,7 +65,7 @@ public class PercentageColumnTest {
resources = new Resources(root);
doc = new HTMLDocument(root.createFile("Test.html"), "UTF-8");
doc.head().title();
- tr = doc.body().table("somestyle").tr();
+ td = doc.body().table("somestyle").tr().td();
support = new HTMLSupport();
column = new PercentageColumn("TestHeader", CounterEntity.LINE);
}
@@ -69,10 +76,22 @@ public class PercentageColumnTest {
}
@Test
+ public void testIsVisible() throws Exception {
+ assertTrue(column.isVisible());
+ doc.close();
+ }
+
+ @Test
+ public void testGetStyle() throws Exception {
+ assertEquals("ctr2", column.getStyle());
+ doc.close();
+ }
+
+ @Test
public void testHeader() throws Exception {
final ICoverageTableItem item = createItem(1, 3);
column.init(Collections.singletonList(item), item.getNode());
- column.header(tr, resources, root);
+ column.header(td, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("TestHeader",
@@ -83,7 +102,7 @@ public class PercentageColumnTest {
public void testItem1() throws Exception {
final ICoverageTableItem item = createItem(150, 50);
column.init(Collections.singletonList(item), item.getNode());
- column.item(tr, item, resources, root);
+ column.item(td, item, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("33%",
@@ -94,7 +113,7 @@ public class PercentageColumnTest {
public void testItem2() throws Exception {
final ICoverageTableItem item = createItem(0, 50);
column.init(Collections.singletonList(item), item.getNode());
- column.item(tr, item, resources, root);
+ column.item(td, item, resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("n/a",
@@ -105,7 +124,7 @@ public class PercentageColumnTest {
public void testFooter1() throws Exception {
final ICoverageTableItem item = createItem(80, 60);
column.init(Collections.singletonList(item), item.getNode());
- column.footer(tr, item.getNode(), resources, root);
+ column.footer(td, item.getNode(), resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("75%", support.findStr(doc, "/html/body/table/tr"));
@@ -115,7 +134,7 @@ public class PercentageColumnTest {
public void testFooter2() throws Exception {
final ICoverageTableItem item = createItem(0, 60);
column.init(Collections.singletonList(item), item.getNode());
- column.footer(tr, item.getNode(), resources, root);
+ column.footer(td, item.getNode(), resources, root);
doc.close();
final Document doc = support.parse(output.getFile("Test.html"));
assertEquals("n/a", support.findStr(doc, "/html/body/table/tr"));
diff --git a/org.jacoco.report/src/org/jacoco/report/html/ClassPage.java b/org.jacoco.report/src/org/jacoco/report/html/ClassPage.java
index 331210a1..679d191e 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/ClassPage.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/ClassPage.java
@@ -23,6 +23,7 @@ import org.jacoco.core.analysis.MethodCoverage;
import org.jacoco.report.IReportVisitor;
import org.jacoco.report.ReportOutputFolder;
import org.jacoco.report.html.resources.Styles;
+import org.jacoco.report.html.table.ICoverageTableItem;
/**
* Page showing coverage information for a class as a table of methods. The
diff --git a/org.jacoco.report/src/org/jacoco/report/html/CounterColumn.java b/org.jacoco.report/src/org/jacoco/report/html/CounterColumn.java
deleted file mode 100644
index b2bfcfac..00000000
--- a/org.jacoco.report/src/org/jacoco/report/html/CounterColumn.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Marc R. Hoffmann - initial API and implementation
- *
- * $Id: $
- *******************************************************************************/
-package org.jacoco.report.html;
-
-import java.io.IOException;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-import java.util.List;
-
-import org.jacoco.core.analysis.ICounter;
-import org.jacoco.core.analysis.ICoverageNode;
-import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
-import org.jacoco.report.ReportOutputFolder;
-import org.jacoco.report.html.resources.Resources;
-import org.jacoco.report.html.resources.Styles;
-
-/**
- * Column that prints the number of missed entities and the total number for
- * each item and a summary in the footer. If the total number of items is zero,
- * no column is emitted at all. The implementation is stateful, instances must
- * not be used in parallel.
- *
- * @author Marc R. Hoffmann
- * @version $Revision: $
- */
-public class CounterColumn implements ICoverageTableColumn {
-
- private final String header;
-
- private final CounterEntity entity;
-
- private boolean visible;
-
- private final NumberFormat integerFormat = DecimalFormat
- .getIntegerInstance();
-
- /**
- * Creates a new column that is based on the {@link ICounter} for the given
- * entity.
- *
- * @param header
- * column header caption
- * @param entity
- * counter entity for this column
- */
- public CounterColumn(final String header, final CounterEntity entity) {
- this.header = header;
- this.entity = entity;
- }
-
- public void init(final List<ICoverageTableItem> items,
- final ICoverageNode total) {
- for (final ICoverageTableItem i : items) {
- if (i.getNode().getCounter(entity).getTotalCount() > 0) {
- visible = true;
- return;
- }
- }
- visible = false;
- }
-
- public void header(final HTMLElement tr, final Resources resources,
- final ReportOutputFolder base) throws IOException {
- if (visible) {
- tr.td(Styles.CTR2, 3).text(header);
- }
- }
-
- public void footer(final HTMLElement tr, final ICoverageNode total,
- final Resources resources, final ReportOutputFolder base)
- throws IOException {
- cell(tr, total);
- }
-
- public void item(final HTMLElement tr, final ICoverageTableItem item,
- final Resources resources, final ReportOutputFolder base)
- throws IOException {
- cell(tr, item.getNode());
- }
-
- private void cell(final HTMLElement tr, final ICoverageNode node)
- throws IOException {
- if (visible) {
- tr.td(); // extra column to allow alignment to the right
- final ICounter c = node.getCounter(entity);
- tr.td(Styles.CTR1).text(
- integerFormat.format(c.getMissedCount())).text(" / ");
- tr.td(Styles.CTR2).text(integerFormat.format(c.getTotalCount()));
- }
- }
-
-}
diff --git a/org.jacoco.report/src/org/jacoco/report/html/HTMLElement.java b/org.jacoco.report/src/org/jacoco/report/html/HTMLElement.java
index 6bdecd86..73f0ab8d 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/HTMLElement.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/HTMLElement.java
@@ -349,26 +349,6 @@ public class HTMLElement extends XMLElement {
}
/**
- * Creates a 'td' element.
- *
- * @param classattr
- * value of the class attribute
- * @param colspanattr
- * value of the colspan attribute
- * @return 'td' element
- * @throws IOException
- * in case of problems with the writer
- */
- public HTMLElement td(final String classattr, final int colspanattr)
- throws IOException {
- final HTMLElement td = td(classattr);
- if (colspanattr > 1) {
- td.attr("colspan", colspanattr);
- }
- return td;
- }
-
- /**
* Creates a 'img' element.
*
* @param srcattr
diff --git a/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java b/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
index 896890e3..e5091bfb 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/HTMLFormatter.java
@@ -35,6 +35,11 @@ import org.jacoco.report.html.index.ElementIndex;
import org.jacoco.report.html.index.IIndexUpdate;
import org.jacoco.report.html.resources.Resources;
import org.jacoco.report.html.resources.Styles;
+import org.jacoco.report.html.table.BarColumn;
+import org.jacoco.report.html.table.CounterColumn;
+import org.jacoco.report.html.table.CoverageTable;
+import org.jacoco.report.html.table.LabelColumn;
+import org.jacoco.report.html.table.PercentageColumn;
/**
* Formatter for coverage reports in multiple HTML pages.
@@ -86,13 +91,23 @@ public class HTMLFormatter implements IReportFormatter, IHTMLReportContext {
new PercentageColumn("", CounterEntity.INSTRUCTION),
- new CounterColumn("Missed Classes", CounterEntity.CLASS),
+ CounterColumn.newMissed("Missed", Styles.CTR1, CounterEntity.CLASS),
- new CounterColumn("Missed Methods", CounterEntity.METHOD),
+ CounterColumn.newTotal("Classes", Styles.CTR2, CounterEntity.CLASS),
- new CounterColumn("Missed Blocks", CounterEntity.BLOCK),
+ CounterColumn.newMissed("Missed", Styles.CTR1, CounterEntity.METHOD),
- new CounterColumn("Missed Lines", CounterEntity.LINE)), DEFAULT_SORTING);
+ CounterColumn.newTotal("Methods", Styles.CTR2, CounterEntity.METHOD),
+
+ CounterColumn.newMissed("Missed", Styles.CTR1, CounterEntity.BLOCK),
+
+ CounterColumn.newTotal("Blocks", Styles.CTR2, CounterEntity.BLOCK),
+
+ CounterColumn.newMissed("Missed", Styles.CTR1, CounterEntity.LINE),
+
+ CounterColumn.newTotal("Lines", Styles.CTR2, CounterEntity.LINE)),
+
+ DEFAULT_SORTING);
}
/**
diff --git a/org.jacoco.report/src/org/jacoco/report/html/IHTMLReportContext.java b/org.jacoco.report/src/org/jacoco/report/html/IHTMLReportContext.java
index 9165bc76..6df2a5b2 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/IHTMLReportContext.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/IHTMLReportContext.java
@@ -16,6 +16,7 @@ import org.jacoco.core.analysis.ICoverageNode.ElementType;
import org.jacoco.report.ILanguageNames;
import org.jacoco.report.html.index.IIndexUpdate;
import org.jacoco.report.html.resources.Resources;
+import org.jacoco.report.html.table.CoverageTable;
/**
* Context and configuration information during creation of a HTML report.
diff --git a/org.jacoco.report/src/org/jacoco/report/html/NodePage.java b/org.jacoco.report/src/org/jacoco/report/html/NodePage.java
index 8226c300..8bf3571a 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/NodePage.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/NodePage.java
@@ -19,6 +19,7 @@ import org.jacoco.report.IReportVisitor;
import org.jacoco.report.ISourceFileLocator;
import org.jacoco.report.ReportOutputFolder;
import org.jacoco.report.html.resources.Resources;
+import org.jacoco.report.html.table.ICoverageTableItem;
/**
* Report page that represents a coverage node.
diff --git a/org.jacoco.report/src/org/jacoco/report/html/resources/report.css b/org.jacoco.report/src/org/jacoco/report/html/resources/report.css
index ae9d9b73..3c1c5fc5 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/resources/report.css
+++ b/org.jacoco.report/src/org/jacoco/report/html/resources/report.css
@@ -105,17 +105,24 @@ table.coverage thead {
table.coverage thead td {
white-space:nowrap;
- padding:2px 12px 0px 6px;
+ padding:2px 8px 0px 8px;
border-bottom:#b0b0b0 1px solid;
}
+table.coverage thead td.ctr1 {
+ text-align:right;
+ padding-right:4px;
+ border-left:#b0b0b0 1px dotted;
+}
+
table.coverage thead td.ctr2 {
text-align:right;
+ padding-left:4px;
}
table.coverage tbody td {
white-space:nowrap;
- padding:2px 12px 2px 6px;
+ padding:2px 8px 2px 8px;
border-bottom:#d6d3ce 1px solid;
}
@@ -125,27 +132,29 @@ table.coverage tbody tr:hover {
table.coverage tbody td.ctr1 {
text-align:right;
- padding:2px 0px 2px 6px;
+ padding-right:4px;
+ border-left:#d6d3ce 1px dotted;
}
table.coverage tbody td.ctr2 {
text-align:right;
- padding:2px 12px 2px 4px;
+ padding-left:4px;
}
table.coverage tfoot td {
white-space:nowrap;
- padding:2px 12px 2px 6px;
+ padding:2px 8px 2px 8px;
}
table.coverage tfoot td.ctr1 {
text-align:right;
- padding:2px 0px 2px 6px;
+ padding-right:4px;
+ border-left:#d6d3ce 1px dotted;
}
table.coverage tfoot td.ctr2 {
text-align:right;
- padding:2px 12px 2px 4px;
+ padding-left:4px;
}
.footer {
@@ -163,4 +172,3 @@ table.coverage tfoot td.ctr2 {
.right {
float:right;
}
-
diff --git a/org.jacoco.report/src/org/jacoco/report/html/BarColumn.java b/org.jacoco.report/src/org/jacoco/report/html/table/BarColumn.java
index dec8cd4f..b627821b 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/BarColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/table/BarColumn.java
@@ -10,7 +10,7 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import java.io.IOException;
import java.text.DecimalFormat;
@@ -21,6 +21,7 @@ import org.jacoco.core.analysis.ICounter;
import org.jacoco.core.analysis.ICoverageNode;
import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLElement;
import org.jacoco.report.html.resources.Resources;
/**
@@ -69,21 +70,27 @@ public class BarColumn implements ICoverageTableColumn {
}
}
- public void header(final HTMLElement tr, final Resources resources,
+ public boolean isVisible() {
+ return true;
+ }
+
+ public String getStyle() {
+ return null;
+ }
+
+ public void header(final HTMLElement td, final Resources resources,
final ReportOutputFolder base) throws IOException {
- tr.td().text(header);
+ td.text(header);
}
- public void footer(final HTMLElement tr, final ICoverageNode total,
+ public void footer(final HTMLElement td, final ICoverageNode total,
final Resources resources, final ReportOutputFolder base)
throws IOException {
- tr.td();
}
- public void item(final HTMLElement tr, final ICoverageTableItem item,
+ public void item(final HTMLElement td, final ICoverageTableItem item,
final Resources resources, final ReportOutputFolder base)
throws IOException {
- final HTMLElement td = tr.td();
if (max > 0) {
final ICounter counter = item.getNode().getCounter(entity);
final int missed = counter.getMissedCount();
@@ -98,8 +105,8 @@ public class BarColumn implements ICoverageTableColumn {
throws IOException {
final int width = count * WIDTH / max;
if (width > 0) {
- td.img(resources.getLink(base, image), width, 10, integerFormat
- .format(count));
+ td.img(resources.getLink(base, image), width, 10,
+ integerFormat.format(count));
}
}
diff --git a/org.jacoco.report/src/org/jacoco/report/html/table/CounterColumn.java b/org.jacoco.report/src/org/jacoco/report/html/table/CounterColumn.java
new file mode 100644
index 00000000..18ccdc54
--- /dev/null
+++ b/org.jacoco.report/src/org/jacoco/report/html/table/CounterColumn.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Marc R. Hoffmann - initial API and implementation
+ *
+ * $Id: $
+ *******************************************************************************/
+package org.jacoco.report.html.table;
+
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.List;
+
+import org.jacoco.core.analysis.ICounter;
+import org.jacoco.core.analysis.ICoverageNode;
+import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
+import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLElement;
+import org.jacoco.report.html.resources.Resources;
+
+/**
+ * Column that prints the counter values of entities for each item and a summary
+ * in the footer. If the total number of items is zero, no column is emitted at
+ * all. The implementation is stateful, instances must not be used in parallel.
+ *
+ * @author Marc R. Hoffmann
+ * @version $Revision: $
+ */
+public abstract class CounterColumn implements ICoverageTableColumn {
+
+ /**
+ * Creates a new column that shows the total count for the given entity.
+ *
+ * @param header
+ * column header caption
+ * @param style
+ * style class for table cells created for this column
+ * @param entity
+ * counter entity for this column
+ * @return column instance
+ */
+ public static CounterColumn newTotal(final String header,
+ final String style, final CounterEntity entity) {
+ return new CounterColumn(header, style, entity) {
+ @Override
+ protected int getValue(final ICounter counter) {
+ return counter.getTotalCount();
+ }
+ };
+ }
+
+ /**
+ * Creates a new column that shows the missed count for the given entity.
+ *
+ * @param header
+ * column header caption
+ * @param style
+ * style class for table cells created for this column
+ * @param entity
+ * counter entity for this column
+ * @return column instance
+ */
+ public static CounterColumn newMissed(final String header,
+ final String style, final CounterEntity entity) {
+ return new CounterColumn(header, style, entity) {
+ @Override
+ protected int getValue(final ICounter counter) {
+ return counter.getMissedCount();
+ }
+ };
+ }
+
+ /**
+ * Creates a new column that shows the covered count for the given entity.
+ *
+ * @param header
+ * column header caption
+ * @param style
+ * style class for table cells created for this column
+ * @param entity
+ * counter entity for this column
+ * @return column instance
+ */
+ public static CounterColumn newCovered(final String header,
+ final String style, final CounterEntity entity) {
+ return new CounterColumn(header, style, entity) {
+ @Override
+ protected int getValue(final ICounter counter) {
+ return counter.getCoveredCount();
+ }
+ };
+ }
+
+ private final String header;
+
+ private final String style;
+
+ private final CounterEntity entity;
+
+ private boolean visible;
+
+ private final NumberFormat integerFormat = DecimalFormat
+ .getIntegerInstance();
+
+ /**
+ * Creates a new column that is based on the {@link ICounter} for the given
+ * entity.
+ *
+ * @param header
+ * column header caption
+ * @param style
+ * style class for table cells created for this column
+ * @param entity
+ * counter entity for this column
+ */
+ protected CounterColumn(final String header, final String style,
+ final CounterEntity entity) {
+ this.header = header;
+ this.style = style;
+ this.entity = entity;
+ }
+
+ public void init(final List<ICoverageTableItem> items,
+ final ICoverageNode total) {
+ for (final ICoverageTableItem i : items) {
+ if (i.getNode().getCounter(entity).getTotalCount() > 0) {
+ visible = true;
+ return;
+ }
+ }
+ visible = false;
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+ public String getStyle() {
+ return style;
+ }
+
+ public void header(final HTMLElement td, final Resources resources,
+ final ReportOutputFolder base) throws IOException {
+ td.text(header);
+ }
+
+ public void footer(final HTMLElement td, final ICoverageNode total,
+ final Resources resources, final ReportOutputFolder base)
+ throws IOException {
+ cell(td, total);
+ }
+
+ public void item(final HTMLElement td, final ICoverageTableItem item,
+ final Resources resources, final ReportOutputFolder base)
+ throws IOException {
+ cell(td, item.getNode());
+ }
+
+ private void cell(final HTMLElement td, final ICoverageNode node)
+ throws IOException {
+ final int value = getValue(node.getCounter(entity));
+ td.text(integerFormat.format(value));
+ }
+
+ /**
+ * Retrieves the respective value from the counter.
+ *
+ * @param counter
+ * counter object
+ * @return value of interest
+ */
+ protected abstract int getValue(ICounter counter);
+
+}
diff --git a/org.jacoco.report/src/org/jacoco/report/html/CoverageTable.java b/org.jacoco.report/src/org/jacoco/report/html/table/CoverageTable.java
index 4131fab3..10538bea 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/CoverageTable.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/table/CoverageTable.java
@@ -10,7 +10,7 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import java.io.IOException;
import java.util.ArrayList;
@@ -21,6 +21,7 @@ import java.util.List;
import org.jacoco.core.analysis.ICoverageNode;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLElement;
import org.jacoco.report.html.resources.Resources;
import org.jacoco.report.html.resources.Styles;
@@ -89,7 +90,9 @@ public class CoverageTable {
final HTMLElement tr = table.thead().tr();
for (final ICoverageTableColumn c : columns) {
c.init(items, total);
- c.header(tr, resources, base);
+ if (c.isVisible()) {
+ c.header(tr.td(c.getStyle()), resources, base);
+ }
}
}
@@ -98,7 +101,9 @@ public class CoverageTable {
throws IOException {
final HTMLElement tr = table.tfoot().tr();
for (final ICoverageTableColumn c : columns) {
- c.footer(tr, total, resources, base);
+ if (c.isVisible()) {
+ c.footer(tr.td(c.getStyle()), total, resources, base);
+ }
}
}
@@ -109,7 +114,9 @@ public class CoverageTable {
for (final ICoverageTableItem item : items) {
final HTMLElement tr = tbody.tr();
for (final ICoverageTableColumn c : columns) {
- c.item(tr, item, resources, base);
+ if (c.isVisible()) {
+ c.item(tr.td(c.getStyle()), item, resources, base);
+ }
}
}
}
diff --git a/org.jacoco.report/src/org/jacoco/report/html/ICoverageTableColumn.java b/org.jacoco.report/src/org/jacoco/report/html/table/ICoverageTableColumn.java
index 2994408c..bea7d74d 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/ICoverageTableColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/table/ICoverageTableColumn.java
@@ -10,13 +10,14 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import java.io.IOException;
import java.util.List;
import org.jacoco.core.analysis.ICoverageNode;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLElement;
import org.jacoco.report.html.resources.Resources;
/**
@@ -40,10 +41,26 @@ public interface ICoverageTableColumn {
public void init(List<ICoverageTableItem> items, ICoverageNode total);
/**
+ * Determines whether this column should actually be rendered. Will always
+ * be called after the call to {@link #init(List, ICoverageNode)}.
+ *
+ * @return <code>true</code> if the column should be visible
+ */
+ public boolean isVisible();
+
+ /**
+ * Return the optional CSS style class name for the td-Elements of this
+ * column.
+ *
+ * @return css style class or <code>null</code>
+ */
+ public String getStyle();
+
+ /**
* Renders the header for this column.
*
- * @param tr
- * the parent table row
+ * @param td
+ * the parent table cell
* @param resources
* static resources that might be referenced
* @param base
@@ -51,14 +68,14 @@ public interface ICoverageTableColumn {
* @throws IOException
* in case of IO problems with the element output
*/
- public void header(HTMLElement tr, Resources resources,
+ public void header(HTMLElement td, Resources resources,
ReportOutputFolder base) throws IOException;
/**
* Renders the footer for this column.
*
- * @param tr
- * the parent table row
+ * @param td
+ * the parent table cell
* @param total
* the summary of all coverage data items in the table
* @param resources
@@ -68,14 +85,14 @@ public interface ICoverageTableColumn {
* @throws IOException
* in case of IO problems with the element output
*/
- public void footer(HTMLElement tr, ICoverageNode total,
+ public void footer(HTMLElement td, ICoverageNode total,
Resources resources, ReportOutputFolder base) throws IOException;
/**
* Renders a single item in this column.
*
- * @param tr
- * the parent table row
+ * @param td
+ * the parent table cell
* @param item
* the item to display
* @param resources
@@ -85,7 +102,7 @@ public interface ICoverageTableColumn {
* @throws IOException
* in case of IO problems with the element output
*/
- public void item(HTMLElement tr, ICoverageTableItem item,
+ public void item(HTMLElement td, ICoverageTableItem item,
Resources resources, ReportOutputFolder base) throws IOException;
}
diff --git a/org.jacoco.report/src/org/jacoco/report/html/ICoverageTableItem.java b/org.jacoco.report/src/org/jacoco/report/html/table/ICoverageTableItem.java
index 75aea6d6..99f31207 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/ICoverageTableItem.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/table/ICoverageTableItem.java
@@ -10,9 +10,10 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import org.jacoco.core.analysis.ICoverageNode;
+import org.jacoco.report.html.ILinkable;
/**
* Interface for a item (row) in a coverage data table.
diff --git a/org.jacoco.report/src/org/jacoco/report/html/LabelColumn.java b/org.jacoco.report/src/org/jacoco/report/html/table/LabelColumn.java
index 2c75f44a..13975cb7 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/LabelColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/table/LabelColumn.java
@@ -10,13 +10,14 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import java.io.IOException;
import java.util.List;
import org.jacoco.core.analysis.ICoverageNode;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLElement;
import org.jacoco.report.html.resources.Resources;
/**
@@ -34,21 +35,29 @@ public class LabelColumn implements ICoverageTableColumn {
final ICoverageNode total) {
}
- public void header(final HTMLElement tr, final Resources resources,
+ public boolean isVisible() {
+ return true;
+ }
+
+ public String getStyle() {
+ return null;
+ }
+
+ public void header(final HTMLElement td, final Resources resources,
final ReportOutputFolder base) throws IOException {
- tr.td().text("Element");
+ td.text("Element");
}
- public void footer(final HTMLElement tr, final ICoverageNode total,
+ public void footer(final HTMLElement td, final ICoverageNode total,
final Resources resources, final ReportOutputFolder base)
throws IOException {
- tr.td().text("Total");
+ td.text("Total");
}
- public void item(final HTMLElement tr, final ICoverageTableItem item,
+ public void item(final HTMLElement td, final ICoverageTableItem item,
final Resources resources, final ReportOutputFolder base)
throws IOException {
- tr.td().a(item, base);
+ td.a(item, base);
}
}
diff --git a/org.jacoco.report/src/org/jacoco/report/html/PercentageColumn.java b/org.jacoco.report/src/org/jacoco/report/html/table/PercentageColumn.java
index 5d99ad3a..04189407 100644
--- a/org.jacoco.report/src/org/jacoco/report/html/PercentageColumn.java
+++ b/org.jacoco.report/src/org/jacoco/report/html/table/PercentageColumn.java
@@ -10,7 +10,7 @@
*
* $Id: $
*******************************************************************************/
-package org.jacoco.report.html;
+package org.jacoco.report.html.table;
import java.io.IOException;
import java.text.DecimalFormat;
@@ -21,6 +21,7 @@ import org.jacoco.core.analysis.ICounter;
import org.jacoco.core.analysis.ICoverageNode;
import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
import org.jacoco.report.ReportOutputFolder;
+import org.jacoco.report.html.HTMLElement;
import org.jacoco.report.html.resources.Resources;
import org.jacoco.report.html.resources.Styles;
@@ -59,28 +60,35 @@ public class PercentageColumn implements ICoverageTableColumn {
final ICoverageNode total) {
}
- public void header(final HTMLElement tr, final Resources resources,
+ public boolean isVisible() {
+ return true;
+ }
+
+ public String getStyle() {
+ return Styles.CTR2;
+ }
+
+ public void header(final HTMLElement td, final Resources resources,
final ReportOutputFolder base) throws IOException {
- tr.td().text(header);
+ td.text(header);
}
- public void footer(final HTMLElement tr, final ICoverageNode total,
+ public void footer(final HTMLElement td, final ICoverageNode total,
final Resources resources, final ReportOutputFolder base)
throws IOException {
- cell(tr, total);
+ cell(td, total);
}
- public void item(final HTMLElement tr, final ICoverageTableItem item,
+ public void item(final HTMLElement td, final ICoverageTableItem item,
final Resources resources, final ReportOutputFolder base)
throws IOException {
- cell(tr, item.getNode());
+ cell(td, item.getNode());
}
- private void cell(final HTMLElement tr, final ICoverageNode node)
+ private void cell(final HTMLElement td, final ICoverageNode node)
throws IOException {
final ICounter counter = node.getCounter(entity);
final int total = counter.getTotalCount();
- final HTMLElement td = tr.td(Styles.CTR2);
if (total == 0) {
td.text("n/a");
} else {