14ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamspackage com.xtremelabs.robolectric.util;
24ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
3147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwinimport com.xtremelabs.robolectric.RobolectricConfig;
4147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin
54ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamsimport java.io.File;
628dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuwimport java.io.FileInputStream;
74ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamsimport java.util.Collection;
87e5cf376e4804434595efd685f894d5661ea9246Chris Van Vrankenimport java.util.Map;
928dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuwimport java.util.Properties;
104ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
114ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamsimport static org.junit.Assert.assertTrue;
124ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
134ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williamspublic abstract class TestUtil {
144ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static File testDirLocation;
154ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
164ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static void assertEquals(Collection<?> expected, Collection<?> actual) {
174ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        org.junit.Assert.assertEquals(stringify(expected), stringify(actual));
184ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    }
194ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
204ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static String stringify(Collection<?> collection) {
214ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        StringBuilder buf = new StringBuilder();
224ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        for (Object o : collection) {
234ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams            if (buf.length() > 0) buf.append("\n");
244ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams            buf.append(o);
254ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        }
264ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        return buf.toString();
274ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    }
284ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
294ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static <T> void assertInstanceOf(Class<? extends T> expectedClass, T object) {
304ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        Class actualClass = object.getClass();
314ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        assertTrue(expectedClass + " should be assignable from " + actualClass,
324ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams                expectedClass.isAssignableFrom(actualClass));
334ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    }
344ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
354ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static File file(String... pathParts) {
364ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        return file(new File("."), pathParts);
374ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    }
384ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
394ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static File file(File f, String... pathParts) {
404ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        for (String pathPart : pathParts) {
414ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams            f = new File(f, pathPart);
424ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        }
434ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        return f;
444ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    }
454ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
464ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static File resourcesBaseDir() {
474ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        if (testDirLocation == null) {
484ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams            File testDir = file("src", "test", "resources");
49a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin            if (hasTestManifest(testDir)) return testDirLocation = testDir;
504ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
514ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams            File roboTestDir = file("robolectric", "src", "test", "resources");
52a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin            if (hasTestManifest(roboTestDir)) return testDirLocation = roboTestDir;
534ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
543015d6b2e3a136ae6c013ba0d3f6c45c2e1ddf31Chris Van Vranken            File submoduleDir = file("submodules", "robolectric", "src", "test", "resources");
553015d6b2e3a136ae6c013ba0d3f6c45c2e1ddf31Chris Van Vranken            if (hasTestManifest(submoduleDir)) return testDirLocation = submoduleDir;
563015d6b2e3a136ae6c013ba0d3f6c45c2e1ddf31Chris Van Vranken
57b236352b9344e79f4f6d2efe4b7c5393bc9fe9c5Chris Van Vranken            //required for robolectric-sqlite to find resources to test against
58b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken            File roboSiblingTestDir = file(new File(new File(".").getAbsolutePath()).getParentFile().getParentFile(),"robolectric", "src", "test", "resources");
59b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken            if (hasTestManifest(roboSiblingTestDir)) return testDirLocation = roboSiblingTestDir;
60b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken
614ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams            throw new RuntimeException("can't find your TestAndroidManifest.xml in "
62b381ee39223f4b835daac148d7e135d061860914Chris Van Vranken                    + testDir.getAbsolutePath() + " or " + roboTestDir.getAbsolutePath() + "\n or " + roboSiblingTestDir.getAbsolutePath());
634ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        } else {
644ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams            return testDirLocation;
654ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        }
664ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    }
674ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams
68a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin    private static boolean hasTestManifest(File testDir) {
69a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin        return new File(testDir, "TestAndroidManifest.xml").isFile();
70a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin    }
71a6ff2c2b15018092af3a28697b521d1ca5e789f0Christian Williams & Phil Goodwin
724ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    public static File resourceFile(String... pathParts) {
734ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams        return file(resourcesBaseDir(), pathParts);
744ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams    }
75147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin
76147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin    public static RobolectricConfig newConfig(String androidManifestFile) {
77147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin        return new RobolectricConfig(resourceFile(androidManifestFile), null, null);
78147cdda64f4a372a27599ae1f902bd7be90bee5cPhil Goodwin    }
7928dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuw
80f2906888dbe454d6b607e123cc5fdfebd190372bJesse Toth & Tim Labeeuw    public static File getSystemResourceDir(String... paths) throws Exception {
817e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken
827e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken       Map<String,String> env = System.getenv();
837e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken       String sdkDir;
847e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken       if (env.containsKey("ANDROID_HOME")) {
857e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken    	   sdkDir = env.get("ANDROID_HOME");
867e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken       } else {
877e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken    	    Properties localProperties = new Properties();
887e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken           	localProperties.load(new FileInputStream(new File("local.properties")));
897e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken           	PropertiesHelper.doSubstitutions(localProperties);
907e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken           	sdkDir = localProperties.getProperty("sdk.dir");
917e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken       }
927e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken
937e5cf376e4804434595efd685f894d5661ea9246Chris Van Vranken        return file(new File(sdkDir, "platforms/android-10/data/res/"), paths);
9428dc94ecb7ac94834b97e3f6be778b3f2bb734fdJesse Toth & Tim Labeeuw    }
954ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29Christian Williams}
96