1d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/*******************************************************************************
2d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
3d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * All rights reserved. This program and the accompanying materials
4d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * are made available under the terms of the Eclipse Public License v1.0
5d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * which accompanies this distribution, and is available at
6d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * http://www.eclipse.org/legal/epl-v10.html
7d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *
8d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Contributors:
9d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *    Marc R. Hoffmann - initial API and implementation
10d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *
11d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann *******************************************************************************/
12d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpackage org.jacoco.cli.internal.commands;
13d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
14d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport static org.junit.Assert.assertTrue;
15d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
16d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.File;
17d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport java.io.FileOutputStream;
18d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
19d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.cli.internal.CommandTestBase;
20d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.ExecutionData;
21d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.jacoco.core.data.ExecutionDataWriter;
22d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.junit.Rule;
23d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.junit.Test;
24d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannimport org.junit.rules.TemporaryFolder;
25d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
26d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann/**
27d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann * Unit tests for {@link Report}.
28d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann */
29d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmannpublic class ReportTest extends CommandTestBase {
30d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
31d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Rule
32d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	public TemporaryFolder tmp = new TemporaryFolder();
33d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
34d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Test
3594ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann	public void should_print_usage_when_no_options_are_given()
3694ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann			throws Exception {
37d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		execute("report");
38d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
39d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertFailure();
40d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertContains("Option \"-classfiles\" is required", err);
41d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertContains(
42d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				"Usage: java -jar jacococli.jar report [<execfiles> ...]", err);
43d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
44d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
45d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Test
4694ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann	public void should_print_number_of_analyzed_classes() throws Exception {
47d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		execute("report", "-classfiles", getClassPath());
48d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
49d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertOk();
50f2c89c4f098baddf9ec689a6d839c2d8a8120b84Marc R. Hoffmann		assertContains("[INFO] Writing report with 14 classes.", out);
51d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
52d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
53d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Test
5494ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann	public void should_print_warning_when_exec_data_does_not_match()
5594ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann			throws Exception {
56d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		File exec = new File(tmp.getRoot(), "jacoco.exec");
57d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		final FileOutputStream execout = new FileOutputStream(exec);
58d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		ExecutionDataWriter writer = new ExecutionDataWriter(execout);
59d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		// Add probably invalid id for this test class:
60d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		writer.visitClassExecution(
61d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				new ExecutionData(0x123, getClass().getName().replace('.', '/'),
62d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						new boolean[] { true }));
63d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		execout.close();
64d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
65d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		execute("report", exec.getAbsolutePath(), "-classfiles",
66d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				getClassPath());
67d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
68d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertOk();
69d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertContains("[WARN] Some classes do not match with execution data.",
70d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				out);
71d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertContains(
72d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				"[WARN] For report generation the same class files must be used as at runtime.",
73d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				out);
74d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertContains(
75d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				"[WARN] Execution data for class org/jacoco/cli/internal/commands/ReportTest does not match.",
76d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				out);
77d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
78d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
79d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Test
8094ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann	public void should_create_xml_report_when_xml_option_is_provided()
81d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			throws Exception {
82d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		File xml = new File(tmp.getRoot(), "coverage.xml");
83d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
84d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		execute("report", "-classfiles", getClassPath(), "-xml",
85d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				xml.getAbsolutePath());
86d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
87d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertOk();
88d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertTrue(xml.isFile());
89d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
90d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
91d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Test
9294ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann	public void should_create_csv_report_when_csv_option_is_provided()
93d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			throws Exception {
94d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		File csv = new File(tmp.getRoot(), "coverage.csv");
95d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
96d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		execute("report", "-classfiles", getClassPath(), "-csv",
97d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				csv.getAbsolutePath());
98d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
99d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertOk();
100d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertTrue(csv.isFile());
101d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
102d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
103d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	@Test
10494ed743f66d67ddff24ccf9b83f120d3edd1f9d2Marc R. Hoffmann	public void should_create_html_report_when_html_option_is_provided()
105d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann			throws Exception {
106d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		File html = new File(tmp.getRoot(), "coverage");
107d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
108d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		execute("report", "-classfiles", getClassPath(), "-sourcefiles",
109d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				"./src", "-html", html.getAbsolutePath());
110d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
111d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertOk();
112d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertTrue(html.isDirectory());
113d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertTrue(new File(html,
114d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				"org.jacoco.cli.internal.commands/ReportTest.html").isFile());
115d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann		assertTrue(new File(html,
116d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann				"org.jacoco.cli.internal.commands/ReportTest.java.html")
117d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann						.isFile());
118d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann	}
119d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann
1201b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann	@Test
1211b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann	public void should_use_all_values_when_multiple_classfiles_options_are_provided()
1221b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann			throws Exception {
1231b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		File html = new File(tmp.getRoot(), "coverage");
1241b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann
1251b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		final String c1 = getClassPath()
1261b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann				+ "/org/jacoco/cli/internal/commands/ReportTest.class";
1271b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		final String c2 = getClassPath()
1281b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann				+ "/org/jacoco/cli/internal/commands/DumpTest.class";
1291b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann
1301b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		execute("report", "-classfiles", c1, "-classfiles", c2, "-html",
1311b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann				html.getAbsolutePath());
1321b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann
1331b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		assertOk();
1341b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		assertTrue(html.isDirectory());
1351b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		assertTrue(new File(html,
1361b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann				"org.jacoco.cli.internal.commands/ReportTest.html").isFile());
1371b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann		assertTrue(
1381b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann				new File(html, "org.jacoco.cli.internal.commands/DumpTest.html")
1391b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann						.isFile());
1401b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann	}
1411b2859f2e96d7d45c9f43d5a2e3bf91ff595488cMarc R. Hoffmann
142d850ed49b22d2a0c84a3b317acec8df7e7159016Marc R. Hoffmann}
143