1 /******************************************************************************* 2 * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors 3 * All rights reserved. This program and the accompanying materials 4 * are made available under the terms of the Eclipse Public License v1.0 5 * which accompanies this distribution, and is available at 6 * http://www.eclipse.org/legal/epl-v10.html 7 * 8 * Contributors: 9 * Marc R. Hoffmann - initial API and implementation 10 * 11 *******************************************************************************/ 12 package org.jacoco.report.internal.html.table; 13 14 import static org.junit.Assert.assertEquals; 15 import static org.junit.Assert.assertFalse; 16 import static org.junit.Assert.assertTrue; 17 18 import java.io.IOException; 19 import java.util.Arrays; 20 import java.util.Collections; 21 import java.util.Comparator; 22 import java.util.Locale; 23 24 import org.jacoco.core.analysis.CoverageNodeImpl; 25 import org.jacoco.core.analysis.ICoverageNode; 26 import org.jacoco.core.analysis.ICoverageNode.CounterEntity; 27 import org.jacoco.core.analysis.ICoverageNode.ElementType; 28 import org.jacoco.core.internal.analysis.CounterImpl; 29 import org.jacoco.report.MemoryMultiReportOutput; 30 import org.jacoco.report.internal.ReportOutputFolder; 31 import org.jacoco.report.internal.html.HTMLDocument; 32 import org.jacoco.report.internal.html.HTMLElement; 33 import org.jacoco.report.internal.html.HTMLSupport; 34 import org.jacoco.report.internal.html.resources.Resources; 35 import org.junit.After; 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.w3c.dom.Document; 39 40 /** 41 * Unit tests for {@link CounterColumn}. 42 */ 43 public class CounterColumnTest { 44 45 private MemoryMultiReportOutput output; 46 47 private ReportOutputFolder root; 48 49 private Resources resources; 50 51 private HTMLDocument doc; 52 53 private HTMLElement td; 54 55 private HTMLSupport support; 56 57 private Locale locale; 58 59 @Before 60 public void setup() throws Exception { 61 output = new MemoryMultiReportOutput(); 62 root = new ReportOutputFolder(output); 63 resources = new Resources(root); 64 doc = new HTMLDocument(root.createFile("Test.html"), "UTF-8"); 65 doc.head().title(); 66 td = doc.body().table("somestyle").tr().td(); 67 support = new HTMLSupport(); 68 locale = Locale.ENGLISH; 69 } 70 71 @After 72 public void teardown() throws IOException { 73 output.close(); 74 output.assertAllClosed(); 75 } 76 77 @Test 78 public void testInitVisible() throws Exception { 79 IColumnRenderer column = CounterColumn.newTotal(CounterEntity.LINE, 80 locale); 81 final ITableItem item = createItem(0, 3); 82 assertTrue(column.init(Arrays.asList(item), item.getNode())); 83 doc.close(); 84 } 85 86 @Test 87 public void testInitInvisible() throws Exception { 88 IColumnRenderer column = CounterColumn.newTotal(CounterEntity.LINE, 89 locale); 90 final ITableItem item = createItem(0, 0); 91 assertFalse(column.init(Arrays.asList(item), createNode(1, 0))); 92 doc.close(); 93 } 94 95 @Test 96 public void testItemTotal() throws Exception { 97 IColumnRenderer column = CounterColumn.newTotal(CounterEntity.LINE, 98 locale); 99 final ITableItem item = createItem(100, 50); 100 column.init(Collections.singletonList(item), item.getNode()); 101 column.item(td, item, resources, root); 102 doc.close(); 103 final Document doc = support.parse(output.getFile("Test.html")); 104 assertEquals("150", 105 support.findStr(doc, "/html/body/table/tr/td[1]/text()")); 106 } 107 108 @Test 109 public void testItemMissed() throws Exception { 110 IColumnRenderer column = CounterColumn.newMissed(CounterEntity.LINE, 111 locale); 112 final ITableItem item = createItem(100, 50); 113 column.init(Collections.singletonList(item), item.getNode()); 114 column.item(td, item, resources, root); 115 doc.close(); 116 final Document doc = support.parse(output.getFile("Test.html")); 117 assertEquals("100", 118 support.findStr(doc, "/html/body/table/tr/td[1]/text()")); 119 } 120 121 @Test 122 public void testItemCovered() throws Exception { 123 IColumnRenderer column = CounterColumn.newCovered(CounterEntity.LINE, 124 locale); 125 final ITableItem item = createItem(100, 50); 126 column.init(Collections.singletonList(item), item.getNode()); 127 column.item(td, item, resources, root); 128 doc.close(); 129 final Document doc = support.parse(output.getFile("Test.html")); 130 assertEquals("50", 131 support.findStr(doc, "/html/body/table/tr/td[1]/text()")); 132 } 133 134 @Test 135 public void testLocale() throws Exception { 136 IColumnRenderer column = CounterColumn.newTotal(CounterEntity.LINE, 137 Locale.ITALIAN); 138 final ITableItem item = createItem(1000, 0); 139 column.init(Collections.singletonList(item), item.getNode()); 140 column.item(td, item, resources, root); 141 doc.close(); 142 final Document doc = support.parse(output.getFile("Test.html")); 143 assertEquals("1.000", 144 support.findStr(doc, "/html/body/table/tr/td[1]/text()")); 145 } 146 147 @Test 148 public void testFooter() throws Exception { 149 IColumnRenderer column = CounterColumn.newTotal(CounterEntity.LINE, 150 locale); 151 final ITableItem item = createItem(20, 60); 152 column.init(Collections.singletonList(item), item.getNode()); 153 column.footer(td, item.getNode(), resources, root); 154 doc.close(); 155 final Document doc = support.parse(output.getFile("Test.html")); 156 assertEquals("80", 157 support.findStr(doc, "/html/body/table/tr/td[1]/text()")); 158 } 159 160 @Test 161 public void testComparatorTotal() throws Exception { 162 IColumnRenderer column = CounterColumn.newTotal(CounterEntity.LINE, 163 locale); 164 final Comparator<ITableItem> c = column.getComparator(); 165 final ITableItem i1 = createItem(30, 0); 166 final ITableItem i2 = createItem(40, 0); 167 assertEquals(0, c.compare(i1, i1)); 168 assertTrue(c.compare(i1, i2) > 0); 169 assertTrue(c.compare(i2, i1) < 0); 170 doc.close(); 171 } 172 173 @Test 174 public void testComparatorCovered() throws Exception { 175 IColumnRenderer column = CounterColumn.newCovered(CounterEntity.LINE, 176 locale); 177 final Comparator<ITableItem> c = column.getComparator(); 178 final ITableItem i1 = createItem(70, 30); 179 final ITableItem i2 = createItem(50, 50); 180 assertEquals(0, c.compare(i1, i1)); 181 assertTrue(c.compare(i1, i2) > 0); 182 assertTrue(c.compare(i2, i1) < 0); 183 doc.close(); 184 } 185 186 @Test 187 public void testComparatorMissed() throws Exception { 188 IColumnRenderer column = CounterColumn.newMissed(CounterEntity.LINE, 189 locale); 190 final Comparator<ITableItem> c = column.getComparator(); 191 final ITableItem i1 = createItem(20, 80); 192 final ITableItem i2 = createItem(50, 50); 193 assertEquals(0, c.compare(i1, i1)); 194 assertTrue(c.compare(i1, i2) > 0); 195 assertTrue(c.compare(i2, i1) < 0); 196 doc.close(); 197 } 198 199 private ITableItem createItem(final int missed, final int covered) { 200 final ICoverageNode node = createNode(missed, covered); 201 return new ITableItem() { 202 public String getLinkLabel() { 203 return "Foo"; 204 } 205 206 public String getLink(ReportOutputFolder base) { 207 return null; 208 } 209 210 public String getLinkStyle() { 211 return Resources.getElementStyle(node.getElementType()); 212 } 213 214 public ICoverageNode getNode() { 215 return node; 216 } 217 }; 218 } 219 220 private CoverageNodeImpl createNode(final int missed, final int covered) { 221 return new CoverageNodeImpl(ElementType.GROUP, "Foo") { 222 { 223 this.lineCounter = CounterImpl.getInstance(missed, covered); 224 } 225 }; 226 } 227 } 228