Skip to content

Commit

Permalink
Merge pull request #22 from centic9/JENKINS-16786
Browse files Browse the repository at this point in the history
JENKINS-16786: make coverage column show N/A as white, not black
  • Loading branch information
ognjenb committed Jul 22, 2013
2 parents b2fbab7 + 131a836 commit a730ff0
Show file tree
Hide file tree
Showing 4 changed files with 226 additions and 15 deletions.
Expand Up @@ -6,7 +6,6 @@
import hudson.model.Run;
import hudson.plugins.jacoco.JacocoBuildAction;
import hudson.plugins.jacoco.model.Coverage;
import hudson.plugins.jacoco.report.CoverageReport;
import hudson.views.ListViewColumn;

import java.awt.Color;
Expand Down Expand Up @@ -43,17 +42,37 @@ public String getPercent(final Job<?, ?> job) {
return stringBuilder.toString();
}

public String getLineColor(final BigDecimal amount) {
public String getLineColor(final Job<?, ?> job, final BigDecimal amount) {
if (amount == null) {
return null;
}

if(job != null) {
final Run<?, ?> lastSuccessfulBuild = job.getLastSuccessfulBuild();
if (lastSuccessfulBuild == null) {
return CoverageRange.NA.getLineHexString();
} else if (lastSuccessfulBuild.getAction(JacocoBuildAction.class) == null){
return CoverageRange.NA.getLineHexString();
}
}

return CoverageRange.valueOf(amount.doubleValue()).getLineHexString();
}

public String getFillColor(final BigDecimal amount) {
public String getFillColor(final Job<?, ?> job, final BigDecimal amount) {
if (amount == null) {
return null;
}

if(job != null) {
final Run<?, ?> lastSuccessfulBuild = job.getLastSuccessfulBuild();
if (lastSuccessfulBuild == null) {
return CoverageRange.NA.getFillHexString();
} else if (lastSuccessfulBuild.getAction(JacocoBuildAction.class) == null){
return CoverageRange.NA.getFillHexString();
}
}

final Color c = CoverageRange.fillColorOf(amount.doubleValue());
return CoverageRange.colorAsHexString(c);
}
Expand Down
Expand Up @@ -3,8 +3,8 @@
<j:when test="${it != null}">
<j:set var="coverageAmount" value="${it.getLineCoverage(job)}" />
<j:set var="coveragePercent" value="${it.getPercent(job)}" />
<j:set var="color" value="${it.getLineColor(coverageAmount)}" />
<j:set var="backgroundColor" value="${it.getFillColor(coverageAmount)}" />
<j:set var="color" value="${it.getLineColor(job, coverageAmount)}" />
<j:set var="backgroundColor" value="${it.getFillColor(job, coverageAmount)}" />
</j:when>
<j:otherwise>
<j:set var="coverageAmount" value="${null}" />
Expand Down
@@ -1,6 +1,6 @@
package hudson.plugins.jacococoveragecolumn;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.*;

import java.awt.Color;

Expand All @@ -27,4 +27,37 @@ public void testFillColorOfHandlesNull() throws Exception {
final Color color = CoverageRange.fillColorOf(null);
assertEquals(CoverageRange.ABYSSMAL.getFillColor(), color);
}

@Test
public void test() {
expect(CoverageRange.ABYSSMAL, -20.0);
expect(CoverageRange.ABYSSMAL, 0.0);
expect(CoverageRange.ABYSSMAL, 10.3);
expect(CoverageRange.TRAGIC, 25.0);
expect(CoverageRange.TRAGIC, 32.0);
expect(CoverageRange.POOR, 50.0);
expect(CoverageRange.POOR, 68.2);
expect(CoverageRange.FAIR, 75.0);
expect(CoverageRange.FAIR, 83.0);
expect(CoverageRange.SUFFICIENT, 85.0);
expect(CoverageRange.SUFFICIENT, 91.0);
expect(CoverageRange.GOOD, 92.0);
expect(CoverageRange.GOOD, 96.999);
expect(CoverageRange.EXCELLENT, 97.0);
expect(CoverageRange.EXCELLENT, 97.1);
expect(CoverageRange.PERFECT, 100.0);
expect(CoverageRange.PERFECT, 230.0);
}

private void expect(CoverageRange result, double value) {
assertEquals(result, CoverageRange.valueOf(value));
assertNotNull(CoverageRange.fillColorOf(value));
assertNotNull(result.getLineColor());
assertNotNull(result.getFillHexString());
assertNotNull(result.getLineHexString());
assertNotNull(CoverageRange.colorAsHexString(result.getLineColor()));
assertTrue("Had " + value + " and floor " + result.getFloor(),
value < 0 || // special handling for negative values, should not be passed in anyway
value >= result.getFloor());
}
}
@@ -1,14 +1,29 @@
package hudson.plugins.jacococoveragecolumn;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.*;
import hudson.console.ConsoleNote;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.model.Cause;
import hudson.model.Descriptor.FormException;
import hudson.model.ExternalJob;
import hudson.model.ExternalRun;
import hudson.model.Job;
import hudson.plugins.jacoco.JacocoBuildAction;
import hudson.search.QuickSilver;

import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.List;

import javax.servlet.ServletContext;

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.kohsuke.stapler.export.Exported;

public class JaCoCoColumnTest {

Expand All @@ -22,32 +37,176 @@ public void setUp() {

@Test
public void testGetPercentWithNoLastSuccessfulBuild() {
final Job<?, ?> mockJob = EasyMock.createMock(Job.class);
EasyMock.expect(mockJob.getLastSuccessfulBuild()).andReturn(null);
EasyMock.replay(mockJob);
ServletContext context = EasyMock.createNiceMock(ServletContext.class);

EasyMock.replay(context);

final Job<?, ?> mockJob = new ExternalJob("externaljob") {
@Override
protected void reload() {
}
};
assertEquals("N/A", jacocoColumn.getPercent(mockJob));
assertEquals(new BigDecimal("0.0"), jacocoColumn.getLineCoverage(mockJob));

EasyMock.verify(context);
}

@Test
public void testGetPercentWithLastSuccessfulBuild() {
ServletContext context = EasyMock.createNiceMock(ServletContext.class);

EasyMock.replay(context);

final Job<?, ?> mockJob = new ExternalJobExtension("externaljob");
assertEquals("N/A", jacocoColumn.getPercent(mockJob));
assertEquals(new BigDecimal("0.0"), jacocoColumn.getLineCoverage(mockJob));

EasyMock.verify(context);
}

@Test
public void testGetPercentWithBuildAndAction() {
ServletContext context = EasyMock.createNiceMock(ServletContext.class);

EasyMock.replay(context);

final Job<?, ?> mockJob = new ExternalJob("externaljob") {
@Override
protected void reload() {
}

@Override
@Exported
@QuickSilver
public ExternalRun getLastSuccessfulBuild() {
try {
ExternalRun newBuild = newBuild();
newBuild.getActions().add(new JacocoBuildAction(null, null, null, null, new BuildListener() {
private static final long serialVersionUID = 1L;

public void hyperlink(String url, String text) throws IOException {
}

public PrintStream getLogger() {
return null;
}

public PrintWriter fatalError(String format, Object... args) {
return null;
}

public PrintWriter fatalError(String msg) {
return null;
}

public PrintWriter error(String format, Object... args) {
return null;
}

public PrintWriter error(String msg) {
return null;
}

public void annotate(@SuppressWarnings("rawtypes") ConsoleNote ann) throws IOException {

}

public void started(List<Cause> causes) {
}

public void finished(Result result) {
}
}, null, null));
assertEquals(1, newBuild.getActions().size());
return newBuild;
} catch (IOException e) {
throw new IllegalStateException(e);
}
}

@Override
protected synchronized void saveNextBuildNumber() throws IOException {
}
};
assertEquals("0.0", jacocoColumn.getPercent(mockJob));
assertEquals(new BigDecimal("0.0"), jacocoColumn.getLineCoverage(mockJob));

EasyMock.verify(context);
}

@Test
public void testGetLineColorWithNull() throws Exception {
assertNull(jacocoColumn.getLineColor(null));
assertNull(jacocoColumn.getLineColor(null, null));
}

@Test
public void testGetLineColor() throws Exception {
assertEquals("EEEEEE", jacocoColumn.getLineColor(BigDecimal.valueOf(100)));
assertEquals(CoverageRange.NA.getLineHexString(), jacocoColumn.getLineColor(null, BigDecimal.valueOf(100)));

Job<?, ?> mockJob = new ExternalJobExtension("externaljob");
assertEquals(CoverageRange.NA.getLineHexString(), jacocoColumn.getLineColor(mockJob, BigDecimal.valueOf(100)));

mockJob = new ExternalJobExtension("externaljob") {
@Override
public ExternalRun getLastSuccessfulBuild() {
return null;
}
};
assertEquals(CoverageRange.NA.getLineHexString(), jacocoColumn.getLineColor(mockJob, BigDecimal.valueOf(100)));
}

@Test
public void testGetFillColorWithNull() throws Exception {
assertNull(jacocoColumn.getFillColor(null));
assertNull(jacocoColumn.getFillColor(null, null));
}

@Test
public void testGetFillColor100() throws Exception {
assertEquals("008B00", jacocoColumn.getFillColor(BigDecimal.valueOf(100)));
assertEquals(CoverageRange.PERFECT.getFillHexString(), jacocoColumn.getFillColor(null, BigDecimal.valueOf(100)));

Job<?, ?> mockJob = new ExternalJobExtension("externaljob");
assertEquals(CoverageRange.NA.getFillHexString(), jacocoColumn.getFillColor(mockJob, BigDecimal.valueOf(100)));

mockJob = new ExternalJobExtension("externaljob") {
@Override
public ExternalRun getLastSuccessfulBuild() {
return null;
}
};
assertEquals(CoverageRange.NA.getFillHexString(), jacocoColumn.getFillColor(mockJob, BigDecimal.valueOf(100)));
}

@Test
public void testDescriptor() throws FormException {
assertNotNull(jacocoColumn.getDescriptor());
assertNotNull(jacocoColumn.getDescriptor().newInstance(null, null));
assertNotNull(jacocoColumn.getDescriptor().getDisplayName());
}

private class ExternalJobExtension extends ExternalJob {

private ExternalJobExtension(String name) {
super(name);
}

@Override
protected void reload() {
}

@Override
@Exported
@QuickSilver
public ExternalRun getLastSuccessfulBuild() {
try {
return newBuild();
} catch (IOException e) {
throw new IllegalStateException(e);
}
}

@Override
protected synchronized void saveNextBuildNumber() throws IOException {
}
}
}

0 comments on commit a730ff0

Please sign in to comment.