1package com.xtremelabs.robolectric.util; 2 3import com.xtremelabs.robolectric.RobolectricConfig; 4 5import java.io.File; 6import java.io.FileInputStream; 7import java.util.Collection; 8import java.util.Map; 9import java.util.Properties; 10 11import static org.junit.Assert.assertTrue; 12 13public abstract class TestUtil { 14 public static File testDirLocation; 15 16 public static void assertEquals(Collection<?> expected, Collection<?> actual) { 17 org.junit.Assert.assertEquals(stringify(expected), stringify(actual)); 18 } 19 20 public static String stringify(Collection<?> collection) { 21 StringBuilder buf = new StringBuilder(); 22 for (Object o : collection) { 23 if (buf.length() > 0) buf.append("\n"); 24 buf.append(o); 25 } 26 return buf.toString(); 27 } 28 29 public static <T> void assertInstanceOf(Class<? extends T> expectedClass, T object) { 30 Class actualClass = object.getClass(); 31 assertTrue(expectedClass + " should be assignable from " + actualClass, 32 expectedClass.isAssignableFrom(actualClass)); 33 } 34 35 public static File file(String... pathParts) { 36 return file(new File("."), pathParts); 37 } 38 39 public static File file(File f, String... pathParts) { 40 for (String pathPart : pathParts) { 41 f = new File(f, pathPart); 42 } 43 return f; 44 } 45 46 public static File resourcesBaseDir() { 47 if (testDirLocation == null) { 48 File testDir = file("src", "test", "resources"); 49 if (hasTestManifest(testDir)) return testDirLocation = testDir; 50 51 File roboTestDir = file("robolectric", "src", "test", "resources"); 52 if (hasTestManifest(roboTestDir)) return testDirLocation = roboTestDir; 53 54 File submoduleDir = file("submodules", "robolectric", "src", "test", "resources"); 55 if (hasTestManifest(submoduleDir)) return testDirLocation = submoduleDir; 56 57 //required for robolectric-sqlite to find resources to test against 58 File roboSiblingTestDir = file(new File(new File(".").getAbsolutePath()).getParentFile().getParentFile(),"robolectric", "src", "test", "resources"); 59 if (hasTestManifest(roboSiblingTestDir)) return testDirLocation = roboSiblingTestDir; 60 61 throw new RuntimeException("can't find your TestAndroidManifest.xml in " 62 + testDir.getAbsolutePath() + " or " + roboTestDir.getAbsolutePath() + "\n or " + roboSiblingTestDir.getAbsolutePath()); 63 } else { 64 return testDirLocation; 65 } 66 } 67 68 private static boolean hasTestManifest(File testDir) { 69 return new File(testDir, "TestAndroidManifest.xml").isFile(); 70 } 71 72 public static File resourceFile(String... pathParts) { 73 return file(resourcesBaseDir(), pathParts); 74 } 75 76 public static RobolectricConfig newConfig(String androidManifestFile) { 77 return new RobolectricConfig(resourceFile(androidManifestFile), null, null); 78 } 79 80 public static File getSystemResourceDir(String... paths) throws Exception { 81 82 Map<String,String> env = System.getenv(); 83 String sdkDir; 84 if (env.containsKey("ANDROID_HOME")) { 85 sdkDir = env.get("ANDROID_HOME"); 86 } else { 87 Properties localProperties = new Properties(); 88 localProperties.load(new FileInputStream(new File("local.properties"))); 89 PropertiesHelper.doSubstitutions(localProperties); 90 sdkDir = localProperties.getProperty("sdk.dir"); 91 } 92 93 return file(new File(sdkDir, "platforms/android-10/data/res/"), paths); 94 } 95} 96