package org.robolectric.annotation.processing.validator; import com.google.common.collect.ImmutableList; import com.google.testing.compile.CompileTester; import com.google.testing.compile.CompileTester.LineClause; import com.google.testing.compile.CompileTester.SuccessfulCompilationClause; import com.google.testing.compile.CompileTester.UnsuccessfulCompilationClause; import com.google.testing.compile.JavaFileObjects; import org.robolectric.annotation.processing.RobolectricProcessor; import org.truth0.FailureStrategy; import org.truth0.subjects.Subject; import org.truth0.subjects.SubjectFactory; import javax.tools.JavaFileObject; import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources; import static org.truth0.Truth.ASSERT; public final class SingleClassSubject extends Subject<SingleClassSubject, String> { public static SubjectFactory<SingleClassSubject, String> singleClass() { return new SubjectFactory<SingleClassSubject, String>() { @Override public SingleClassSubject getSubject(FailureStrategy failureStrategy, String source) { return new SingleClassSubject(failureStrategy, source); } }; } JavaFileObject source; CompileTester tester; public SingleClassSubject(FailureStrategy failureStrategy, String subject) { super(failureStrategy, subject); source = JavaFileObjects.forResource(Utils.toResourcePath(subject)); tester = ASSERT.about(javaSources()) .that(ImmutableList.of(source, Utils.ROBO_SOURCE, Utils.SHADOW_EXTRACTOR_SOURCE)) .processedWith(new RobolectricProcessor()); } public SuccessfulCompilationClause compilesWithoutError() { try { return tester.compilesWithoutError(); } catch (AssertionError e) { failureStrategy.fail(e.getMessage()); } return null; } public SingleFileClause failsToCompile() { try { return new SingleFileClause(tester.failsToCompile(), source); } catch (AssertionError e) { failureStrategy.fail(e.getMessage()); } return null; } final class SingleFileClause implements CompileTester.ChainingClause<SingleFileClause> { UnsuccessfulCompilationClause unsuccessful; JavaFileObject source; public SingleFileClause(UnsuccessfulCompilationClause unsuccessful, JavaFileObject source) { this.unsuccessful = unsuccessful; this.source = source; } public SingleLineClause withErrorContaining(final String messageFragment) { try { return new SingleLineClause(unsuccessful.withErrorContaining(messageFragment).in(source)); } catch (AssertionError e) { failureStrategy.fail(e.getMessage()); } return null; } public SingleFileClause withNoErrorContaining(final String messageFragment) { try { unsuccessful.withErrorContaining(messageFragment); } catch (AssertionError e) { return this; } failureStrategy.fail("Shouldn't have found any errors containing " + messageFragment + ", but we did"); return this; } public SingleFileClause and() { return this; } final class SingleLineClause implements CompileTester.ChainingClause<SingleFileClause> { LineClause lineClause; public SingleLineClause(LineClause lineClause) { this.lineClause = lineClause; } public CompileTester.ChainingClause<SingleFileClause> onLine(long lineNumber) { try { lineClause.onLine(lineNumber); return new CompileTester.ChainingClause<SingleFileClause>() { @Override public SingleFileClause and() { return SingleFileClause.this; } }; } catch (AssertionError e) { failureStrategy.fail(e.getMessage()); } return null; } @Override public SingleFileClause and() { return SingleFileClause.this; } } } }