From 4fd9d923f4a2e56a15e84e530bc20984eb3f1ed1 Mon Sep 17 00:00:00 2001 From: Ryan Richard and Sarah Chandler Date: Wed, 26 Sep 2012 10:53:13 -0700 Subject: [PATCH 1/5] made it possible to use robolectric from an Android level 14 project. Intent.getExtras() returns null when there are no extras. --- src/main/java/android/webkit/TestWebSettings.java | 4 ---- .../com/xtremelabs/robolectric/shadows/ShadowIntent.java | 7 ++++++- .../robolectric/shadows/ShadowSQLiteDatabase.java | 2 +- .../com/xtremelabs/robolectric/shadows/IntentTest.java | 7 +++++++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/android/webkit/TestWebSettings.java b/src/main/java/android/webkit/TestWebSettings.java index af57d795fff..660c53cea8a 100644 --- a/src/main/java/android/webkit/TestWebSettings.java +++ b/src/main/java/android/webkit/TestWebSettings.java @@ -29,22 +29,18 @@ public class TestWebSettings extends WebSettings { public TestWebSettings() { } - @Override public boolean getAllowFileAccessFromFileURLs() { return allowFileAccessFromFile; } - @Override public boolean getAllowUniversalAccessFromFileURLs() { return allowUniversalAccessFromFile; } - @Override public void setAllowFileAccessFromFileURLs(boolean allow) { allowFileAccessFromFile = allow; } - @Override public void setAllowUniversalAccessFromFileURLs(boolean allow) { allowUniversalAccessFromFile = allow; } diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowIntent.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowIntent.java index 47a514e88e7..8b58143f761 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowIntent.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowIntent.java @@ -202,8 +202,13 @@ public Intent putExtras(Intent src) { @Implementation public Bundle getExtras() { + if (extras.isEmpty()) { + return null; + } + Bundle bundle = new Bundle(); - ((ShadowBundle) Robolectric.shadowOf_(bundle)).map.putAll(extras); + Map map = ((ShadowBundle) Robolectric.shadowOf_(bundle)).map; + map.putAll(extras); return bundle; } diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowSQLiteDatabase.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowSQLiteDatabase.java index e5e7d027560..f8ff10c8ac5 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowSQLiteDatabase.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowSQLiteDatabase.java @@ -119,7 +119,7 @@ public long insertWithOnConflict(String table, String nullColumnHack, resultSet.close(); return result; } catch (SQLException e) { - throw new android.database.SQLException(e.getLocalizedMessage(), e); + throw new android.database.SQLException(e.getLocalizedMessage()); } } diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/IntentTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/IntentTest.java index 37034da2e46..44d175adf62 100644 --- a/src/test/java/com/xtremelabs/robolectric/shadows/IntentTest.java +++ b/src/test/java/com/xtremelabs/robolectric/shadows/IntentTest.java @@ -30,6 +30,13 @@ @RunWith(WithTestDefaultsRunner.class) public class IntentTest { + + @Test + public void testGetExtraReturnsNull_whenThereAreNoExtrasAdded() throws Exception { + Intent intent = new Intent(); + assertEquals(intent.getExtras(), null); + } + @Test public void testStringExtra() throws Exception { Intent intent = new Intent(); From 9d30273624c785a341bb2f61a8ccdcabb443e261 Mon Sep 17 00:00:00 2001 From: Jan Berkel Date: Wed, 26 Sep 2012 23:24:55 +0200 Subject: [PATCH 2/5] BitmapFactory.decodeStream should support null options --- .../robolectric/shadows/ShadowBitmapFactory.java | 9 ++++++--- .../robolectric/shadows/BitmapFactoryTest.java | 11 ++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBitmapFactory.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBitmapFactory.java index f804eb11364..9ca30052501 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBitmapFactory.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBitmapFactory.java @@ -37,7 +37,7 @@ public static Bitmap decodeResource(Resources res, int id, BitmapFactory.Options shadowOf(bitmap).setLoadedFromResourceId(id); return bitmap; } - + private static String getResourceName(int id) { return shadowOf(Robolectric.application).getResourceLoader().getNameForId(id); } @@ -84,8 +84,10 @@ public static Bitmap create(String name, BitmapFactory.Options options) { shadowBitmap.setWidth(widthAndHeight.x); shadowBitmap.setHeight(widthAndHeight.y); - options.outWidth = widthAndHeight.x; - options.outHeight = widthAndHeight.y; + if (options != null) { + options.outWidth = widthAndHeight.x; + options.outHeight = widthAndHeight.y; + } return bitmap; } @@ -102,6 +104,7 @@ public static void provideWidthAndHeightHints(String file, int width, int height } private static String stringify(BitmapFactory.Options options) { + if (options == null) return ""; List opts = new ArrayList(); if (options.inJustDecodeBounds) opts.add("inJustDecodeBounds"); diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/BitmapFactoryTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/BitmapFactoryTest.java index 38742769a1a..53ee7104681 100644 --- a/src/test/java/com/xtremelabs/robolectric/shadows/BitmapFactoryTest.java +++ b/src/test/java/com/xtremelabs/robolectric/shadows/BitmapFactoryTest.java @@ -42,6 +42,15 @@ public void decodeStream_shouldSetDescription() throws Exception { assertEquals(100, bitmap.getHeight()); } + @Test + public void decodeStream_shouldSetDescriptionWithNullOptions() throws Exception { + InputStream inputStream = Robolectric.application.getContentResolver().openInputStream(Uri.parse("content:/path")); + Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, null); + assertEquals("Bitmap for content:/path", shadowOf(bitmap).getDescription()); + assertEquals(100, bitmap.getWidth()); + assertEquals(100, bitmap.getHeight()); + } + @Test public void decodeResource_shouldGetWidthAndHeightFromHints() throws Exception { ShadowBitmapFactory.provideWidthAndHeightHints(R.drawable.an_image, 123, 456); @@ -59,7 +68,7 @@ public void decodeResource_canTakeOptions() throws Exception { Bitmap bitmap = BitmapFactory.decodeResource(Robolectric.application.getResources(), R.drawable.an_image, options); assertEquals(true, shadowOf(bitmap).getDescription().contains("inSampleSize=100")); } - + @Test public void decodeFile_shouldGetWidthAndHeightFromHints() throws Exception { ShadowBitmapFactory.provideWidthAndHeightHints("/some/file.jpg", 123, 456); From 186bd0780b7acfde791819caea284386f47e04c2 Mon Sep 17 00:00:00 2001 From: Amit Pawar & Phil Goodwin Date: Wed, 26 Sep 2012 15:25:29 -0700 Subject: [PATCH 3/5] Change API level to 16 in several places --- .../xtremelabs/robolectric/Robolectric.java | 1 + .../robolectric/RobolectricConfig.java | 5 +++-- .../res/DrawableResourceLoaderTest.java | 2 +- .../res/MenuResourceLoaderTest.java | 21 +++++++++---------- .../robolectric/res/ResourceLoaderTest.java | 13 ++++++------ .../robolectric/shadows/ViewGroupTest.java | 3 ++- .../xtremelabs/robolectric/util/TestUtil.java | 3 ++- src/test/resources/TestAndroidManifest.xml | 2 +- 8 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/xtremelabs/robolectric/Robolectric.java b/src/main/java/com/xtremelabs/robolectric/Robolectric.java index bdb983704b6..feb1aefcdf7 100644 --- a/src/main/java/com/xtremelabs/robolectric/Robolectric.java +++ b/src/main/java/com/xtremelabs/robolectric/Robolectric.java @@ -74,6 +74,7 @@ public class Robolectric { public static Application application; + public static final int DEFAULT_SDK_VERSION = 16; public static T newInstanceOf(Class clazz) { return RobolectricInternals.newInstanceOf(clazz); diff --git a/src/main/java/com/xtremelabs/robolectric/RobolectricConfig.java b/src/main/java/com/xtremelabs/robolectric/RobolectricConfig.java index ccbf71e78cb..dc8181a7dd8 100644 --- a/src/main/java/com/xtremelabs/robolectric/RobolectricConfig.java +++ b/src/main/java/com/xtremelabs/robolectric/RobolectricConfig.java @@ -14,6 +14,7 @@ import java.util.List; import static android.content.pm.ApplicationInfo.*; +import static com.xtremelabs.robolectric.Robolectric.DEFAULT_SDK_VERSION; public class RobolectricConfig { private final File androidManifestFile; @@ -92,13 +93,13 @@ private void parseAndroidManifest() { Integer minSdkVer = getTagAttributeIntValue(manifestDocument, "uses-sdk", "android:minSdkVersion"); Integer sdkVer = getTagAttributeIntValue(manifestDocument, "uses-sdk", "android:targetSdkVersion"); if (minSdkVer == null) { - minSdkVersion = 10; + minSdkVersion = DEFAULT_SDK_VERSION; minSdkVersionSpecified = false; } else { minSdkVersion = minSdkVer; } if (sdkVer == null) { - sdkVersion = 10; + sdkVersion = DEFAULT_SDK_VERSION; sdkVersionSpecified = false; } else { sdkVersion = sdkVer; diff --git a/src/test/java/com/xtremelabs/robolectric/res/DrawableResourceLoaderTest.java b/src/test/java/com/xtremelabs/robolectric/res/DrawableResourceLoaderTest.java index 4357e55d4bf..eda7b179e34 100644 --- a/src/test/java/com/xtremelabs/robolectric/res/DrawableResourceLoaderTest.java +++ b/src/test/java/com/xtremelabs/robolectric/res/DrawableResourceLoaderTest.java @@ -44,7 +44,7 @@ public void setup() throws Exception { @Test public void testProcessResourceXml() throws Exception { assertTrue("drawable/rainbow", resourceLoader.documents.containsKey("drawable/rainbow")); - assertEquals("documents.size", 116, resourceLoader.documents.size()); + assertEquals("documents.size", 218, resourceLoader.documents.size()); } @Test diff --git a/src/test/java/com/xtremelabs/robolectric/res/MenuResourceLoaderTest.java b/src/test/java/com/xtremelabs/robolectric/res/MenuResourceLoaderTest.java index 95aafdb5984..612abf8557f 100644 --- a/src/test/java/com/xtremelabs/robolectric/res/MenuResourceLoaderTest.java +++ b/src/test/java/com/xtremelabs/robolectric/res/MenuResourceLoaderTest.java @@ -1,26 +1,25 @@ package com.xtremelabs.robolectric.res; -import static com.xtremelabs.robolectric.util.TestUtil.resourceFile; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.*; - -import org.junit.Test; -import org.junit.runner.RunWith; - import android.view.MenuItem; - import com.xtremelabs.robolectric.R; import com.xtremelabs.robolectric.Robolectric; import com.xtremelabs.robolectric.WithTestDefaultsRunner; import com.xtremelabs.robolectric.tester.android.view.TestMenu; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static com.xtremelabs.robolectric.Robolectric.DEFAULT_SDK_VERSION; +import static com.xtremelabs.robolectric.util.TestUtil.resourceFile; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; @RunWith(WithTestDefaultsRunner.class) public class MenuResourceLoaderTest { - @Test public void shouldInflateComplexMenu() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("menu")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("menu")); TestMenu testMenu = new TestMenu(); resourceLoader.inflateMenu(Robolectric.application, R.menu.test_withchilds, testMenu); assertThat(testMenu.size(), equalTo(4)); @@ -28,7 +27,7 @@ public void shouldInflateComplexMenu() throws Exception { @Test public void shouldParseSubItemCorrectly() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("menu")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("menu")); TestMenu testMenu = new TestMenu(); resourceLoader.inflateMenu(Robolectric.application, R.menu.test_withchilds, testMenu); MenuItem mi = testMenu.findItem(R.id.test_submenu_1); diff --git a/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java b/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java index 917b2c2280d..d64f055546a 100644 --- a/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java +++ b/src/test/java/com/xtremelabs/robolectric/res/ResourceLoaderTest.java @@ -13,6 +13,7 @@ import java.io.File; +import static com.xtremelabs.robolectric.Robolectric.DEFAULT_SDK_VERSION; import static com.xtremelabs.robolectric.util.TestUtil.resourceFile; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.*; @@ -26,7 +27,7 @@ public void shouldUseFileSystemSeparatorWhenEvaluatingLayoutDirectories() throws @Test public void shouldLoadSystemResources() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("assets")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("assets")); String stringValue = resourceLoader.getStringValue(android.R.string.copy); assertEquals("Copy", stringValue); @@ -36,14 +37,14 @@ public void shouldLoadSystemResources() throws Exception { @Test public void shouldLoadLocalResources() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("assets")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("assets")); String stringValue = resourceLoader.getStringValue(R.string.copy); assertEquals("Local Copy", stringValue); } @Test(expected=I18nException.class) public void shouldThrowExceptionOnI18nStrictModeInflateView() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("layout")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("layout")); resourceLoader.setStrictI18n(true); ViewGroup vg = new FrameLayout(Robolectric.application); resourceLoader.inflateView(Robolectric.application, R.layout.text_views, vg); @@ -51,21 +52,21 @@ public void shouldThrowExceptionOnI18nStrictModeInflateView() throws Exception { @Test(expected=I18nException.class) public void shouldThrowExceptionOnI18nStrictModeInflateMenu() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("menu")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("menu")); resourceLoader.setStrictI18n(true); resourceLoader.inflateMenu(Robolectric.application, R.menu.test, null); } @Test(expected=I18nException.class) public void shouldThrowExceptionOnI18nStrictModeInflatePreferences() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("xml")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("xml")); resourceLoader.setStrictI18n(true); resourceLoader.inflatePreferences(Robolectric.application, R.xml.preferences); } @Test public void testChoosesLayoutBasedOnSearchPath_respectsOrderOfPath() throws Exception { - ResourceLoader resourceLoader = new ResourceLoader(10, R.class, resourceFile("res"), resourceFile("layout")); + ResourceLoader resourceLoader = new ResourceLoader(DEFAULT_SDK_VERSION, R.class, resourceFile("res"), resourceFile("layout")); resourceLoader.setLayoutQualifierSearchPath("does-not-exist", "land", "xlarge"); ViewGroup viewGroup = new FrameLayout(Robolectric.application); ViewGroup view = (ViewGroup) resourceLoader.inflateView(Robolectric.application, R.layout.different_screen_sizes, viewGroup); diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java index ac911922680..a821f39c490 100644 --- a/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java +++ b/src/test/java/com/xtremelabs/robolectric/shadows/ViewGroupTest.java @@ -19,6 +19,7 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import static com.xtremelabs.robolectric.Robolectric.DEFAULT_SDK_VERSION; import static com.xtremelabs.robolectric.Robolectric.shadowOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.sameInstance; @@ -40,7 +41,7 @@ public class ViewGroupTest { @Before public void setUp() throws Exception { context = new Application(); - ShadowApplication.bind(context, new ResourceLoader(10, R.class, null, null)); + ShadowApplication.bind(context, new ResourceLoader(DEFAULT_SDK_VERSION, R.class, null, null)); root = new FrameLayout(context); diff --git a/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java b/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java index ee18eb5dc74..2d475c93f2c 100644 --- a/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java +++ b/src/test/java/com/xtremelabs/robolectric/util/TestUtil.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Properties; +import static com.xtremelabs.robolectric.Robolectric.DEFAULT_SDK_VERSION; import static org.junit.Assert.assertTrue; public abstract class TestUtil { @@ -90,6 +91,6 @@ public static File getSystemResourceDir(String... paths) throws Exception { sdkDir = localProperties.getProperty("sdk.dir"); } - return file(new File(sdkDir, "platforms/android-10/data/res/"), paths); + return file(new File(sdkDir, "platforms/android-" + DEFAULT_SDK_VERSION + "/data/res/"), paths); } } diff --git a/src/test/resources/TestAndroidManifest.xml b/src/test/resources/TestAndroidManifest.xml index 40bc485544a..530cf7185d4 100644 --- a/src/test/resources/TestAndroidManifest.xml +++ b/src/test/resources/TestAndroidManifest.xml @@ -1,5 +1,5 @@ - + From 487961053c70661ddd0c05fc2cf6740f2512ddee Mon Sep 17 00:00:00 2001 From: pivotal Date: Fri, 28 Sep 2012 14:41:38 -0700 Subject: [PATCH 4/5] Use maps.jar from API level 16 add-ons. Until now, we were using API level 10. --- build.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.xml b/build.xml index e183a482b6d..11786b6b927 100644 --- a/build.xml +++ b/build.xml @@ -217,13 +217,13 @@ - + - + - + From 82530f12f2fd0442d4686640eb233fa31acd7eb7 Mon Sep 17 00:00:00 2001 From: Phil Goodwin & Rick Kawala Date: Fri, 28 Sep 2012 16:27:21 -0700 Subject: [PATCH 5/5] add support for getAddress() to ShadowBluetoothAdapter (which previously did not have a test --- .../shadows/ShadowBluetoothAdapter.java | 10 +++++++++- .../shadows/BluetoothAdapterTest.java | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/xtremelabs/robolectric/shadows/BluetoothAdapterTest.java diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBluetoothAdapter.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBluetoothAdapter.java index e15a0fdfd79..5932e36042c 100644 --- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBluetoothAdapter.java +++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowBluetoothAdapter.java @@ -15,9 +15,9 @@ @SuppressWarnings({"UnusedDeclaration"}) @Implements(BluetoothAdapter.class) public class ShadowBluetoothAdapter { - private Set bondedDevices = new HashSet(); private boolean isDiscovering; + private String address; @Implementation public static BluetoothAdapter getDefaultAdapter() { @@ -50,4 +50,12 @@ public boolean isDiscovering() { return isDiscovering; } + @Implementation + public String getAddress() { + return this.address; + } + + public void setAddress(String address) { + this.address = address; + } } diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/BluetoothAdapterTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/BluetoothAdapterTest.java new file mode 100644 index 00000000000..ab8883eccbd --- /dev/null +++ b/src/test/java/com/xtremelabs/robolectric/shadows/BluetoothAdapterTest.java @@ -0,0 +1,19 @@ +package com.xtremelabs.robolectric.shadows; + +import android.bluetooth.BluetoothAdapter; +import com.xtremelabs.robolectric.WithTestDefaultsRunner; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static com.xtremelabs.robolectric.Robolectric.shadowOf; +import static junit.framework.Assert.assertEquals; + +@RunWith(WithTestDefaultsRunner.class) +public class BluetoothAdapterTest { + @Test + public void canGetAndSetAddress() throws Exception { + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + shadowOf(adapter).setAddress("expected"); + assertEquals("expected", adapter.getAddress()); + } +}