Skip to content

Commit 39d8b9e

Browse files
committed
Improved PotentialAssignment description with better formatting, and handling for failed toString() calls. Refactored tests into proper unit tests closer wrapping the relevant bit of this code too.
1 parent 0ebb59e commit 39d8b9e

File tree

5 files changed

+80
-118
lines changed

5 files changed

+80
-118
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.junit.experimental.theories;
22

3+
import static java.lang.String.format;
4+
35
public abstract class PotentialAssignment {
46
public static class CouldNotGenerateValueException extends Exception {
57
private static final long serialVersionUID = 1L;
@@ -8,23 +10,36 @@ public static class CouldNotGenerateValueException extends Exception {
810
public static PotentialAssignment forValue(final String name, final Object value) {
911
return new PotentialAssignment() {
1012
@Override
11-
public Object getValue() throws CouldNotGenerateValueException {
13+
public Object getValue() {
1214
return value;
1315
}
1416

1517
@Override
1618
public String toString() {
17-
return String.format("[%s]", value);
19+
return format("[%s]", value);
1820
}
1921

2022
@Override
21-
public String getDescription() throws CouldNotGenerateValueException {
22-
return String.format("%s: %s", name, value);
23+
public String getDescription() {
24+
String valueString;
25+
26+
if (value == null) {
27+
valueString = "null";
28+
} else {
29+
try {
30+
valueString = format("\"%s\"", value);
31+
} catch (Throwable e) {
32+
valueString = format("[toString() threw %s: %s]",
33+
e.getClass().getSimpleName(), e.getMessage());
34+
}
35+
}
36+
37+
return format("%s <from %s>", valueString, name);
2338
}
2439
};
2540
}
26-
41+
2742
public abstract Object getValue() throws CouldNotGenerateValueException;
2843

2944
public abstract String getDescription() throws CouldNotGenerateValueException;
30-
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.junit.tests.experimental.theories;
2+
3+
import static org.junit.Assert.*;
4+
import org.junit.Test;
5+
import org.junit.experimental.theories.PotentialAssignment;
6+
import org.junit.experimental.theories.PotentialAssignment.CouldNotGenerateValueException;
7+
8+
public class PotentialAssignmentTest {
9+
10+
@Test
11+
public void shouldUseQuotedValueInDescription() throws CouldNotGenerateValueException {
12+
String name = "stringDatapoint";
13+
Object value = new Object() {
14+
@Override
15+
public String toString() {
16+
return "string value";
17+
}
18+
};
19+
20+
PotentialAssignment assignment = PotentialAssignment.forValue(name, value);
21+
22+
assertEquals("\"string value\" <from stringDatapoint>", assignment.getDescription());
23+
}
24+
25+
@Test
26+
public void shouldNotUseQuotesForNullValueDescriptions() throws CouldNotGenerateValueException {
27+
String name = "nullDatapoint";
28+
Object value = null;
29+
30+
PotentialAssignment assignment = PotentialAssignment.forValue(name, value);
31+
32+
assertEquals("null <from nullDatapoint>", assignment.getDescription());
33+
}
34+
35+
@Test
36+
public void shouldIncludeFailureInDescriptionIfToStringFails() throws CouldNotGenerateValueException {
37+
String name = "explodingValue";
38+
Object value = new Object() {
39+
@Override
40+
public String toString() {
41+
throw new RuntimeException("Oh no!");
42+
}
43+
};
44+
45+
PotentialAssignment assignment = PotentialAssignment.forValue(name, value);
46+
47+
assertEquals("[toString() threw RuntimeException: Oh no!] <from explodingValue>", assignment.getDescription());
48+
}
49+
50+
@Test
51+
public void shouldReturnGivenValue() throws CouldNotGenerateValueException {
52+
Object value = new Object();
53+
PotentialAssignment assignment = PotentialAssignment.forValue("name", value);
54+
assertEquals(value, assignment.getValue());
55+
}
56+
57+
}

src/test/java/org/junit/tests/experimental/theories/TestedOnSupplierTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void foo(@TestedOn(ints = {1}) int x) {
2121
public void descriptionStatesParameterName() throws Exception {
2222
TestedOnSupplier supplier = new TestedOnSupplier();
2323
List<PotentialAssignment> assignments = supplier.getValueSources(signatureOfFoo());
24-
assertThat(assignments.get(0).getDescription(), is("ints: 1"));
24+
assertThat(assignments.get(0).getDescription(), is("\"1\" <from ints>"));
2525
}
2626

2727
private ParameterSignature signatureOfFoo() throws NoSuchMethodException {

src/test/java/org/junit/tests/experimental/theories/TheoryFailureMessagesTest.java

-110
This file was deleted.

src/test/java/org/junit/tests/experimental/theories/runner/UnsuccessfulWithDataPointFields.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void everythingIsZero(int x, int y) {
6161
@Test
6262
public void reportBadParams() throws Exception {
6363
assertThat(testResult(DoesntUseParams.class),
64-
hasSingleFailureContaining("everythingIsZero(ONE: 1, ONE: 1)"));
64+
hasSingleFailureContaining("everythingIsZero(\"1\" <from ONE>, \"1\" <from ONE>)"));
6565
}
6666

6767
@RunWith(Theories.class)

0 commit comments

Comments
 (0)