Home | History | Annotate | Download | only in table
      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