Skip to content

Commit 115014e

Browse files
java-team-github-botCompile-Testing Team
authored andcommitted
Improve error messages rendered by JavaSourcesSubject.parsesAs() and JavaFileObjectSubject.containsElementsIn() to more easily distinguish between errors incurred in *actual* vs *expected* source.
RELNOTES=Improve error messages rendered by `JavaSourcesSubject.parsesAs()` and `JavaFileObjectSubject.containsElementsIn()` to more easily distinguish between errors incurred in *actual* vs *expected* source. PiperOrigin-RevId: 468034719
1 parent 60a5b54 commit 115014e

6 files changed

Lines changed: 52 additions & 11 deletions

File tree

src/main/java/com/google/testing/compile/JavaFileObjectSubject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,10 @@ private void performTreeDifference(
170170
String failureVerb,
171171
String expectedTitle,
172172
BiFunction<ParseResult, ParseResult, TreeDifference> differencingFunction) {
173-
ParseResult actualResult = Parser.parse(ImmutableList.of(actual));
173+
ParseResult actualResult = Parser.parse(ImmutableList.of(actual), "*actual* source");
174174
CompilationUnitTree actualTree = getOnlyElement(actualResult.compilationUnits());
175175

176-
ParseResult expectedResult = Parser.parse(ImmutableList.of(expected));
176+
ParseResult expectedResult = Parser.parse(ImmutableList.of(expected), "*expected* source");
177177
CompilationUnitTree expectedTree = getOnlyElement(expectedResult.compilationUnits());
178178

179179
TreeDifference treeDifference = differencingFunction.apply(expectedResult, actualResult);

src/main/java/com/google/testing/compile/JavaSourcesSubject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public void parsesAs(JavaFileObject first, JavaFileObject... rest) {
158158
"Compilation generated no additional source files, though some were expected."));
159159
return;
160160
}
161-
ParseResult actualResult = Parser.parse(actual);
161+
ParseResult actualResult = Parser.parse(actual, "*actual* source");
162162
ImmutableList<Diagnostic<? extends JavaFileObject>> errors =
163163
actualResult.diagnosticsByKind().get(Kind.ERROR);
164164
if (!errors.isEmpty()) {
@@ -170,7 +170,7 @@ public void parsesAs(JavaFileObject first, JavaFileObject... rest) {
170170
failWithoutActual(simpleFact(message.toString()));
171171
return;
172172
}
173-
ParseResult expectedResult = Parser.parse(Lists.asList(first, rest));
173+
ParseResult expectedResult = Parser.parse(Lists.asList(first, rest), "*expected* source");
174174
ImmutableList<TypedCompilationUnit> actualTrees =
175175
actualResult.compilationUnits().stream()
176176
.map(TypedCompilationUnit::create)

src/main/java/com/google/testing/compile/MoreTrees.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static CompilationUnitTree parseLinesToTree(String... source) {
5252
/** Parses the source given into a {@link CompilationUnitTree}. */
5353
static CompilationUnitTree parseLinesToTree(Iterable<String> source) {
5454
Iterable<? extends CompilationUnitTree> parseResults =
55-
Parser.parse(ImmutableList.of(JavaFileObjects.forSourceLines("", source)))
55+
Parser.parse(ImmutableList.of(JavaFileObjects.forSourceLines("", source)), "source")
5656
.compilationUnits();
5757
return Iterables.getOnlyElement(parseResults);
5858
}
@@ -64,7 +64,7 @@ static ParseResult parseLines(String... source) {
6464

6565
/** Parses the source given and produces a {@link ParseResult}. */
6666
static ParseResult parseLines(Iterable<String> source) {
67-
return Parser.parse(ImmutableList.of(JavaFileObjects.forSourceLines("", source)));
67+
return Parser.parse(ImmutableList.of(JavaFileObjects.forSourceLines("", source)), "source");
6868
}
6969

7070
/**

src/main/java/com/google/testing/compile/Parser.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,11 @@ public final class Parser {
5050
/**
5151
* Parses {@code sources} into {@linkplain CompilationUnitTree compilation units}. This method
5252
* <b>does not</b> compile the sources.
53+
*
54+
* @param sourcesDescription describes the sources. Parsing exceptions will contain this string.
55+
* @throws IllegalStateException if any parsing errors occur.
5356
*/
54-
static ParseResult parse(Iterable<? extends JavaFileObject> sources) {
57+
static ParseResult parse(Iterable<? extends JavaFileObject> sources, String sourcesDescription) {
5558
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
5659
DiagnosticCollector<JavaFileObject> diagnosticCollector = new DiagnosticCollector<>();
5760
InMemoryJavaFileManager fileManager =
@@ -72,8 +75,8 @@ static ParseResult parse(Iterable<? extends JavaFileObject> sources) {
7275
Iterable<? extends CompilationUnitTree> parsedCompilationUnits = task.parse();
7376
List<Diagnostic<? extends JavaFileObject>> diagnostics = diagnosticCollector.getDiagnostics();
7477
if (foundParseErrors(parsedCompilationUnits, diagnostics)) {
75-
throw new IllegalStateException(
76-
"error while parsing:\n" + Joiner.on('\n').join(diagnostics));
78+
String msgPrefix = String.format("Error while parsing %s:\n", sourcesDescription);
79+
throw new IllegalStateException(msgPrefix + Joiner.on('\n').join(diagnostics));
7780
}
7881
return new ParseResult(
7982
sortDiagnosticsByKind(diagnostics), parsedCompilationUnits, Trees.instance(task));
@@ -195,4 +198,6 @@ private DummyJavaCompilerSubclass() {
195198
super(null);
196199
}
197200
}
201+
202+
private Parser() {}
198203
}

src/test/java/com/google/testing/compile/JavaFileObjectSubjectTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static com.google.testing.compile.JavaFileObjectSubject.assertThat;
2222
import static com.google.testing.compile.JavaFileObjectSubject.javaFileObjects;
2323
import static java.nio.charset.StandardCharsets.UTF_8;
24+
import static org.junit.Assert.assertThrows;
2425

2526
import com.google.common.truth.ExpectFailure;
2627
import java.io.IOException;
@@ -196,4 +197,39 @@ public void hasSourceEquivalentTo_failOnExtraInActual() throws IOException {
196197
public void containsElementsIn_completeMatch() {
197198
assertThat(SAMPLE_ACTUAL_FILE_FOR_MATCHING).containsElementsIn(SAMPLE_ACTUAL_FILE_FOR_MATCHING);
198199
}
200+
201+
private static final JavaFileObject SIMPLE_INVALID_FILE =
202+
JavaFileObjects.forSourceLines(
203+
"test.SomeClass", //
204+
"package test;",
205+
"",
206+
"public syntax error class SomeClass {",
207+
"}");
208+
private static final JavaFileObject SIMPLE_VALID_FILE =
209+
JavaFileObjects.forSourceLines(
210+
"test.SomeClass", //
211+
"package test;",
212+
"",
213+
"public class SomeClass {",
214+
"}");
215+
216+
@Test
217+
public void containsElementsIn_badActual() {
218+
IllegalStateException ex =
219+
assertThrows(
220+
IllegalStateException.class,
221+
() -> assertThat(SIMPLE_INVALID_FILE).containsElementsIn(SIMPLE_VALID_FILE));
222+
223+
assertThat(ex).hasMessageThat().startsWith("Error while parsing *actual* source:\n");
224+
}
225+
226+
@Test
227+
public void containsElementsIn_badExpected() {
228+
IllegalStateException ex =
229+
assertThrows(
230+
IllegalStateException.class,
231+
() -> assertThat(SIMPLE_VALID_FILE).containsElementsIn(SIMPLE_INVALID_FILE));
232+
233+
assertThat(ex).hasMessageThat().startsWith("Error while parsing *expected* source:\n");
234+
}
199235
}

src/test/java/com/google/testing/compile/JavaSourcesSubjectFactoryTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ public void parsesAs_expectedFileFailsToParse() {
398398
.parsesAs(JavaFileObjects.forResource("test/HelloWorld-broken.java"));
399399
fail();
400400
} catch (IllegalStateException expected) {
401-
assertThat(expected.getMessage()).startsWith("error while parsing:");
401+
assertThat(expected.getMessage()).startsWith("Error while parsing *expected* source:\n");
402402
}
403403
}
404404

@@ -410,7 +410,7 @@ public void parsesAs_actualFileFailsToParse() {
410410
.parsesAs(HELLO_WORLD_RESOURCE);
411411
fail();
412412
} catch (IllegalStateException expected) {
413-
assertThat(expected.getMessage()).startsWith("error while parsing:");
413+
assertThat(expected.getMessage()).startsWith("Error while parsing *actual* source:\n");
414414
}
415415
}
416416

0 commit comments

Comments
 (0)