PageRenderTime 28ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/robolectric-processor/src/test/java/org/robolectric/annotation/processing/RobolectricProcessorTest.java

http://github.com/pivotal/robolectric
Java | 236 lines | 207 code | 25 blank | 4 comment | 2 complexity | 33f3fe2716f947d9a95e008605017967 MD5 | raw file
Possible License(s): Apache-2.0, MIT
  1. package org.robolectric.annotation.processing;
  2. import static org.truth0.Truth.ASSERT;
  3. import static com.google.testing.compile.JavaFileObjects.*;
  4. import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
  5. import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
  6. import static org.robolectric.annotation.processing.RobolectricProcessor.PACKAGE_OPT;
  7. import static org.robolectric.annotation.processing.RobolectricProcessor.SHOULD_INSTRUMENT_PKG_OPT;
  8. import static org.robolectric.annotation.processing.validator.Utils.ROBO_SOURCE;
  9. import static org.robolectric.annotation.processing.validator.Utils.SHADOW_PROVIDER_SOURCE;
  10. import static org.robolectric.annotation.processing.validator.Utils.SHADOW_EXTRACTOR_SOURCE;
  11. import java.io.BufferedReader;
  12. import java.io.IOException;
  13. import java.io.InputStreamReader;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. import org.junit.Test;
  17. import com.google.common.collect.ImmutableList;
  18. public class RobolectricProcessorTest {
  19. private static final Map<String,String> DEFAULT_OPTS = new HashMap<>();
  20. static {
  21. DEFAULT_OPTS.put(PACKAGE_OPT, "org.robolectric");
  22. }
  23. @Test
  24. public void robolectricProcessor_supportsPackageOption() {
  25. ASSERT.that(new RobolectricProcessor().getSupportedOptions()).contains(PACKAGE_OPT);
  26. }
  27. @Test
  28. public void robolectricProcessor_supportsShouldInstrumentPackageOption() {
  29. ASSERT.that(
  30. new RobolectricProcessor().getSupportedOptions()).contains(SHOULD_INSTRUMENT_PKG_OPT);
  31. }
  32. @Test
  33. public void unannotatedSource_shouldCompile() {
  34. ASSERT.about(javaSources())
  35. .that(ImmutableList.of(
  36. ROBO_SOURCE,
  37. SHADOW_PROVIDER_SOURCE,
  38. SHADOW_EXTRACTOR_SOURCE,
  39. forSourceString("HelloWorld", "final class HelloWorld {}")))
  40. .processedWith(new RobolectricProcessor())
  41. .compilesWithoutError();
  42. //.and().generatesNoSources(); Should add this assertion onces
  43. // it becomes available in compile-testing
  44. }
  45. @Test
  46. public void generatedFile_shouldHandleInnerClassCollisions() {
  47. // Because the Generated annotation has a retention of "source", it can't
  48. // be tested by a unit test - must run a source-level test.
  49. ASSERT.about(javaSources())
  50. .that(ImmutableList.of(
  51. ROBO_SOURCE,
  52. SHADOW_PROVIDER_SOURCE,
  53. SHADOW_EXTRACTOR_SOURCE,
  54. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java"),
  55. forResource("org/robolectric/annotation/processing/shadows/ShadowOuterDummy.java"),
  56. forResource("org/robolectric/annotation/processing/shadows/ShadowUniqueDummy.java")))
  57. .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
  58. .compilesWithoutError()
  59. .and()
  60. .generatesSources(forResource("org/robolectric/Robolectric_InnerClassCollision.java"));
  61. }
  62. @Test
  63. public void generatedFile_shouldSkipNonPublicClasses() {
  64. ASSERT.about(javaSources())
  65. .that(ImmutableList.of(
  66. ROBO_SOURCE,
  67. SHADOW_PROVIDER_SOURCE,
  68. SHADOW_EXTRACTOR_SOURCE,
  69. forResource("org/robolectric/annotation/processing/shadows/ShadowPrivate.java"),
  70. forResource("org/robolectric/annotation/processing/shadows/ShadowOuterDummy2.java"),
  71. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java")))
  72. .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
  73. .compilesWithoutError()
  74. .and()
  75. .generatesSources(forResource("org/robolectric/Robolectric_HiddenClasses.java"));
  76. }
  77. @Test
  78. public void generatedFile_shouldHandleAnythingShadows() {
  79. ASSERT.about(javaSources())
  80. .that(ImmutableList.of(
  81. ROBO_SOURCE,
  82. SHADOW_PROVIDER_SOURCE,
  83. SHADOW_EXTRACTOR_SOURCE,
  84. forResource("org/robolectric/annotation/processing/shadows/ShadowAnything.java"),
  85. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java")))
  86. .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
  87. .compilesWithoutError()
  88. .and()
  89. .generatesSources(forResource("org/robolectric/Robolectric_Anything.java"));
  90. }
  91. @Test
  92. public void generatedFile_shouldHandleClassNameOnlyShadows() {
  93. ASSERT.about(javaSources())
  94. .that(ImmutableList.of(
  95. SHADOW_PROVIDER_SOURCE,
  96. SHADOW_EXTRACTOR_SOURCE,
  97. forResource("org/robolectric/annotation/processing/shadows/ShadowClassNameOnly.java"),
  98. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java")))
  99. .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
  100. .compilesWithoutError()
  101. .and()
  102. .generatesSources(forResource("org/robolectric/Robolectric_ClassNameOnly.java"));
  103. }
  104. @Test
  105. public void generatedFile_shouldNotGenerateShadowOfMethodsForExcludedClasses() {
  106. ASSERT.about(javaSources())
  107. .that(ImmutableList.of(
  108. SHADOW_PROVIDER_SOURCE,
  109. SHADOW_EXTRACTOR_SOURCE,
  110. forResource("org/robolectric/annotation/processing/shadows/ShadowExcludedFromAndroidSdk.java")))
  111. .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
  112. .compilesWithoutError()
  113. .and()
  114. .generatesSources(forResource("org/robolectric/Robolectric_NoExcludedTypes.java"));
  115. }
  116. @Test
  117. public void generatedFile_shouldUseSpecifiedPackage() throws IOException {
  118. StringBuffer expected = new StringBuffer();
  119. BufferedReader reader = new BufferedReader(new InputStreamReader(RobolectricProcessorTest.class.getClassLoader().getResourceAsStream("org/robolectric/Robolectric_ClassNameOnly.java")));
  120. String line;
  121. while ((line = reader.readLine()) != null) {
  122. expected.append(line).append("\n");
  123. }
  124. line = expected.toString();
  125. line = line.replace("package org.robolectric", "package my.test.pkg");
  126. Map<String,String> opts = new HashMap<>();
  127. opts.put(PACKAGE_OPT, "my.test.pkg");
  128. ASSERT.about(javaSources())
  129. .that(ImmutableList.of(
  130. SHADOW_PROVIDER_SOURCE,
  131. SHADOW_EXTRACTOR_SOURCE,
  132. forResource("org/robolectric/annotation/processing/shadows/ShadowClassNameOnly.java"),
  133. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java")))
  134. .processedWith(new RobolectricProcessor(opts))
  135. .compilesWithoutError()
  136. .and()
  137. .generatesSources(forSourceString("Shadows", line));
  138. }
  139. @Test
  140. public void shouldGenerateMetaInfServicesFile() {
  141. ASSERT.about(javaSources())
  142. .that(ImmutableList.of(
  143. SHADOW_PROVIDER_SOURCE,
  144. SHADOW_EXTRACTOR_SOURCE,
  145. forResource("org/robolectric/annotation/processing/shadows/ShadowClassNameOnly.java"),
  146. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java")))
  147. .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
  148. .compilesWithoutError()
  149. .and()
  150. .generatesFiles(forResource("META-INF/services/org.robolectric.internal.ShadowProvider"));
  151. }
  152. @Test
  153. public void shouldGracefullyHandleUnrecognisedAnnotation() {
  154. ASSERT.about(javaSources())
  155. .that(ImmutableList.of(
  156. ROBO_SOURCE,
  157. SHADOW_PROVIDER_SOURCE,
  158. SHADOW_EXTRACTOR_SOURCE,
  159. forResource("org/robolectric/annotation/TestWithUnrecognizedAnnotation.java")))
  160. .processedWith(new RobolectricProcessor())
  161. .compilesWithoutError();
  162. }
  163. @Test
  164. public void shouldGracefullyHandleNoAnythingClass_withNoRealObject() {
  165. ASSERT.about(javaSource())
  166. .that(forResource("org/robolectric/annotation/processing/shadows/ShadowAnything.java"))
  167. .processedWith(new RobolectricProcessor())
  168. .failsToCompile();
  169. }
  170. @Test
  171. public void shouldGracefullyHandleNoAnythingClass_withFoundOnImplementsAnnotation() {
  172. ASSERT.about(javaSources())
  173. .that(ImmutableList.of(
  174. SHADOW_PROVIDER_SOURCE,
  175. SHADOW_EXTRACTOR_SOURCE,
  176. forResource("org/robolectric/annotation/processing/shadows/ShadowRealObjectWithCorrectAnything.java")))
  177. .processedWith(new RobolectricProcessor())
  178. .failsToCompile();
  179. }
  180. @Test
  181. public void shouldGenerateGenericShadowOf() {
  182. ASSERT.about(javaSources())
  183. .that(ImmutableList.of(
  184. ROBO_SOURCE,
  185. SHADOW_PROVIDER_SOURCE,
  186. SHADOW_EXTRACTOR_SOURCE,
  187. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java"),
  188. forResource("org/robolectric/annotation/processing/shadows/ShadowParameterizedDummy.java")))
  189. .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
  190. .compilesWithoutError()
  191. .and()
  192. .generatesSources(forResource("org/robolectric/Robolectric_Parameterized.java"));
  193. }
  194. @Test
  195. public void generatedShadowProvider_canConfigureInstrumentingPackages() {
  196. Map<String, String> options = new HashMap<>();
  197. options.put(PACKAGE_OPT, "org.robolectric");
  198. options.put(SHOULD_INSTRUMENT_PKG_OPT, "false");
  199. ASSERT.about(javaSources())
  200. .that(ImmutableList.of(
  201. ROBO_SOURCE,
  202. SHADOW_PROVIDER_SOURCE,
  203. SHADOW_EXTRACTOR_SOURCE,
  204. forResource("org/robolectric/annotation/processing/shadows/ShadowAnything.java"),
  205. forResource("org/robolectric/annotation/processing/shadows/ShadowDummy.java")))
  206. .processedWith(new RobolectricProcessor(options))
  207. .compilesWithoutError()
  208. .and()
  209. .generatesSources(forResource("org/robolectric/Robolectric_EmptyProvidedPackageNames.java"));
  210. }
  211. }