diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java b/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java index 25871fad2..8ba5f3de4 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivity.java @@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.io.maps; import com.google.android.apps.mytracks.io.gdata.maps.MapsMapMetadata; import com.google.android.apps.mytracks.io.sendtogoogle.SendRequest; import com.google.android.maps.mytracks.R; +import com.google.common.annotations.VisibleForTesting; import android.app.Activity; import android.app.AlertDialog; @@ -46,12 +47,14 @@ import java.util.ArrayList; public class ChooseMapActivity extends Activity { private static final int PROGRESS_DIALOG = 1; - private static final int ERROR_DIALOG = 2; - + @VisibleForTesting + static final int ERROR_DIALOG = 2; + private SendRequest sendRequest; private ChooseMapAsyncTask asyncTask; private ProgressDialog progressDialog; - private ArrayAdapter arrayAdapter; + @VisibleForTesting + ArrayAdapter arrayAdapter; @Override public void onCreate(Bundle savedInstanceState) { @@ -166,7 +169,7 @@ public class ChooseMapActivity extends Activity { */ public void onAsyncTaskCompleted( boolean success, ArrayList mapIds, ArrayList mapData) { - removeDialog(PROGRESS_DIALOG); + removeProgressDialog(); if (success) { arrayAdapter.clear(); // To prevent displaying the emptyView message momentarily before the @@ -181,7 +184,7 @@ public class ChooseMapActivity extends Activity { } } } else { - showDialog(ERROR_DIALOG); + showErrorDialog(); } } @@ -191,6 +194,22 @@ public class ChooseMapActivity extends Activity { public void showProgressDialog() { showDialog(PROGRESS_DIALOG); } + + /** + * Shows the error dialog. + */ + @VisibleForTesting + void showErrorDialog() { + showDialog(ERROR_DIALOG); + } + + /** + * Remove the progress dialog. + */ + @VisibleForTesting + void removeProgressDialog() { + removeDialog(PROGRESS_DIALOG); + } /** * Starts the next activity, {@link SendMapsActivity}. @@ -210,7 +229,8 @@ public class ChooseMapActivity extends Activity { * * @author Jimmy Shih */ - private class ListItem { + @VisibleForTesting + class ListItem { private String mapId; private MapsMapMetadata mapData; @@ -233,4 +253,4 @@ public class ChooseMapActivity extends Activity { return mapData; } } -} +} \ No newline at end of file diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivityTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivityTest.java new file mode 100644 index 000000000..051a28289 --- /dev/null +++ b/MyTracksTest/src/com/google/android/apps/mytracks/io/maps/ChooseMapActivityTest.java @@ -0,0 +1,146 @@ +/* + * Copyright 2012 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.android.apps.mytracks.io.maps; + +import com.google.android.apps.mytracks.io.gdata.maps.MapsMapMetadata; +import com.google.android.maps.mytracks.R; + +import android.content.Intent; +import android.test.AndroidTestCase; +import android.widget.ArrayAdapter; + +import java.util.ArrayList; + +/** + * Tests the {@link ChooseMapActivity}. + * + * @author Youtao Liu + */ +public class ChooseMapActivityTest extends AndroidTestCase { + + private static final String MAP_ID = "mapid"; + private static final String MAP_TITLE = "title"; + private static final String MAP_DESC = "desc"; + + private ArrayList mapIds = new ArrayList(); + private ArrayList mapDatas = new ArrayList(); + private boolean errorDialogShown = false; + private boolean progressDialogRemoved = false; + + /** + * Creates a class to override some methods of {@link ChooseMapActivity} to + * makes it testable. + * + * @author youtaol + */ + public class ChooseMapActivityMock extends ChooseMapActivity { + /** + * By overriding this method, avoids to start next activity. + */ + @Override + public void startActivity(Intent intent) {} + + /** + * By overriding this method, avoids to show an error dialog and set the + * show flag to true. + */ + @Override + public void showErrorDialog() { + errorDialogShown = true; + } + + /** + * By overriding this method, avoids to show an error dialog and set the + * show flag to true. + */ + @Override + public void removeProgressDialog() { + progressDialogRemoved = true; + } + } + + /** + * Tests the method + * {@link ChooseMapActivity#onAsyncTaskCompleted(boolean, ArrayList, ArrayList)} + * . An alert dialog should be shown when there is no map. + * + * @throws InterruptedException + */ + public void testOnAsyncTaskCompleted_fail() { + ChooseMapActivityMock chooseMapActivityMock = new ChooseMapActivityMock(); + errorDialogShown = false; + progressDialogRemoved = false; + chooseMapActivityMock.onAsyncTaskCompleted(false, null, null); + assertTrue(progressDialogRemoved); + assertTrue(errorDialogShown); + } + + /** + * Tests the method + * {@link ChooseMapActivity#onAsyncTaskCompleted(boolean, ArrayList, ArrayList)} + * . Check the logic when there is only map. + */ + public void testOnAsyncTaskCompleted_success_oneMap() { + ChooseMapActivityMock chooseMapActivityMock = new ChooseMapActivityMock(); + chooseMapActivityMock.arrayAdapter = new ArrayAdapter(getContext(), + R.layout.choose_map_item); + simulateMaps(1); + chooseMapActivityMock.onAsyncTaskCompleted(true, mapIds, mapDatas); + assertEquals(1, chooseMapActivityMock.arrayAdapter.getCount()); + assertEquals(MAP_ID + "0", chooseMapActivityMock.arrayAdapter.getItem(0).getMapId()); + assertEquals(MAP_TITLE + "0", chooseMapActivityMock.arrayAdapter.getItem(0).getMapData() + .getTitle()); + assertEquals(MAP_DESC + "0", chooseMapActivityMock.arrayAdapter.getItem(0).getMapData() + .getDescription()); + } + + /** + * Tests the method + * {@link ChooseMapActivity#onAsyncTaskCompleted(boolean, ArrayList, ArrayList)} + * . Check the logic when there are 10 maps. + */ + public void testOnAsyncTaskCompleted_success_twoMaps() { + ChooseMapActivityMock chooseMapActivityMock = new ChooseMapActivityMock(); + chooseMapActivityMock.arrayAdapter = new ArrayAdapter(getContext(), + R.layout.choose_map_item); + simulateMaps(10); + chooseMapActivityMock.onAsyncTaskCompleted(true, mapIds, mapDatas); + assertEquals(10, chooseMapActivityMock.arrayAdapter.getCount()); + assertEquals(MAP_ID + "9", chooseMapActivityMock.arrayAdapter.getItem(9).getMapId()); + assertEquals(MAP_TITLE + "9", chooseMapActivityMock.arrayAdapter.getItem(9).getMapData() + .getTitle()); + assertEquals(MAP_DESC + "9", chooseMapActivityMock.arrayAdapter.getItem(9).getMapData() + .getDescription()); + } + + /** + * Simulates map data for the test. + * + * @param number of data should be simulated. + */ + private void simulateMaps(int number) { + mapIds = new ArrayList(); + mapDatas = new ArrayList(); + for (int i = 0; i < number; i++) { + mapIds.add(MAP_ID + i); + MapsMapMetadata metaData = new MapsMapMetadata(); + metaData.setTitle(MAP_TITLE + i); + metaData.setDescription(MAP_DESC + i); + metaData.setSearchable(true); + mapDatas.add(metaData); + } + } +}