calabash-android 0.2.11 → 0.2.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/CHANGES.txt +6 -0
  2. data/features-skeleton/support/app_installation_hooks.rb +11 -3
  3. data/features-skeleton/support/app_life_cycle_hooks.rb +9 -0
  4. data/features-skeleton/support/hooks.rb +18 -2
  5. data/lib/calabash-android/operations.rb +1 -1
  6. data/lib/calabash-android/steps/assert_steps.rb +12 -0
  7. data/lib/calabash-android/steps/list_steps.rb +40 -0
  8. data/lib/calabash-android/steps/map_steps.rb +61 -0
  9. data/lib/calabash-android/steps/navigation_steps.rb +10 -1
  10. data/lib/calabash-android/steps/progress_steps.rb +5 -0
  11. data/lib/calabash-android/version.rb +2 -2
  12. data/test-server/AndroidManifest.xml +5 -5
  13. data/test-server/build.xml +4 -0
  14. data/test-server/instrumentation-backend/.gitignore +1 -0
  15. data/test-server/instrumentation-backend/AndroidManifest.xml +4 -3
  16. data/test-server/instrumentation-backend/project.properties +1 -1
  17. data/test-server/instrumentation-backend/src/com/jayway/android/robotium/solo/MapViewUtils.java +328 -0
  18. data/test-server/instrumentation-backend/src/com/jayway/android/robotium/solo/SoloEnhanced.java +97 -0
  19. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/InstrumentationBackend.java +3 -3
  20. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/TestHelpers.java +51 -1
  21. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemProperties.java +195 -0
  22. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemText.java +136 -0
  23. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/GetMapBounds.java +27 -0
  24. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/GetMapCenter.java +27 -0
  25. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/GetMapMarker.java +31 -0
  26. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/GetMapMarkers.java +48 -0
  27. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/GetMapZoom.java +19 -0
  28. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/PanMapTo.java +23 -0
  29. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/SetMapCenter.java +23 -0
  30. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/SetMapZoom.java +34 -0
  31. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/TapAwayFromMarkers.java +28 -0
  32. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/map/TapMapMarker.java +29 -0
  33. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/spinner/GetSelectedSpinnerItemText.java +36 -0
  34. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/AssertGridViewContainsNoDuplicates.java +72 -0
  35. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/GetTextById.java +42 -0
  36. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/AssertViewProperty.java +141 -0
  37. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/ClickOnViewById.java +1 -8
  38. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/GetActivityName.java +32 -0
  39. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/GetViewProperty.java +107 -0
  40. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/HasView.java +31 -0
  41. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/Press.java +1 -1
  42. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/SelectTab.java +110 -0
  43. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForScreen.java +10 -6
  44. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForTab.java +108 -0
  45. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/{view → wait}/WaitForView.java +1 -1
  46. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/{view → wait}/WaitForViewById.java +21 -11
  47. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +3 -3
  48. metadata +102 -88
@@ -0,0 +1,27 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import java.util.List;
4
+
5
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
6
+ import sh.calaba.instrumentationbackend.Result;
7
+ import sh.calaba.instrumentationbackend.actions.Action;
8
+
9
+ /**
10
+ * A succesful response includes bonusInformation: [top, right, bottom, left] in decimal degrees
11
+ * @author Nicholas Albion
12
+ */
13
+ public class GetMapBounds implements Action {
14
+
15
+ @Override
16
+ public Result execute(String... args) {
17
+ List<String> bounds = InstrumentationBackend.solo.getMapBounds();
18
+ Result result = new Result(true);
19
+ result.setExtras( bounds );
20
+ return result;
21
+ }
22
+
23
+ @Override
24
+ public String key() {
25
+ return "get_map_bounds";
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ /**
8
+ * Returns latitude, longitude (in decimal degrees) in the "bonusInformation"
9
+ *
10
+ * @author Nicholas Albion
11
+ */
12
+ public class GetMapCenter implements Action {
13
+
14
+ @Override
15
+ public Result execute(String... args) {
16
+ double[] center = InstrumentationBackend.solo.getMapCenter();
17
+ Result result = new Result(true);
18
+ result.addBonusInformation( Double.toString(center[0]) );
19
+ result.addBonusInformation( Double.toString(center[1]) );
20
+ return result;
21
+ }
22
+
23
+ @Override
24
+ public String key() {
25
+ return "get_map_center";
26
+ }
27
+ }
@@ -0,0 +1,31 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+
4
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
5
+ import sh.calaba.instrumentationbackend.Result;
6
+ import sh.calaba.instrumentationbackend.actions.Action;
7
+
8
+ /**
9
+ * Allows the test script to retreive a specific marker by title
10
+ *
11
+ * @author Nicholas Albion
12
+ */
13
+ public class GetMapMarker implements Action {
14
+
15
+ @Override
16
+ public Result execute(String... args) {
17
+ String title = args[0];
18
+ String marker = InstrumentationBackend.solo.getMapMarkerItem(title);
19
+
20
+ if( marker == null ) {
21
+ return new Result(false, "Could not find marker " + title);
22
+ } else {
23
+ return new Result(true, marker);
24
+ }
25
+ }
26
+
27
+ @Override
28
+ public String key() {
29
+ return "get_map_marker";
30
+ }
31
+ }
@@ -0,0 +1,48 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+
4
+ import java.util.List;
5
+
6
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
7
+ import sh.calaba.instrumentationbackend.Result;
8
+ import sh.calaba.instrumentationbackend.actions.Action;
9
+
10
+ import com.google.android.maps.ItemizedOverlay;
11
+
12
+ /**
13
+ * Allows the test script to retreive a list of markers on {@link ItemizedOverlay}s.
14
+ * The optional arg can be used to require a specific number of markers
15
+ *
16
+ * @author Nicholas Albion
17
+ */
18
+ public class GetMapMarkers implements Action {
19
+
20
+ @Override
21
+ public Result execute(String... args) {
22
+ List<String> markers = InstrumentationBackend.solo.getMapMarkerItems();
23
+
24
+ Result result;
25
+ if( args.length != 0 ) {
26
+ int expectedNumberOfStops = Integer.parseInt(args[0]);
27
+
28
+ if( expectedNumberOfStops != markers.size() ) {
29
+ result = new Result(false, "Expected " + expectedNumberOfStops + " markers, but found " + markers.size());
30
+ } else {
31
+ result = new Result(true);
32
+ }
33
+ } else {
34
+ result = new Result(true);
35
+ }
36
+
37
+ for (String markerJson : markers) {
38
+ // Log.i("get_map_markers", markerJson);
39
+ result.addBonusInformation(markerJson);
40
+ }
41
+ return result;
42
+ }
43
+
44
+ @Override
45
+ public String key() {
46
+ return "get_map_markers";
47
+ }
48
+ }
@@ -0,0 +1,19 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ public class GetMapZoom implements Action {
8
+
9
+ @Override
10
+ public Result execute(String... args) {
11
+ int zoomLevel = InstrumentationBackend.solo.getMapZoom();
12
+ return new Result(true, Integer.toString(zoomLevel));
13
+ }
14
+
15
+ @Override
16
+ public String key() {
17
+ return "get_map_zoom";
18
+ }
19
+ }
@@ -0,0 +1,23 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ /**
8
+ * Center on lat, lon
9
+ * @author Nicholas Albion
10
+ */
11
+ public class PanMapTo implements Action {
12
+
13
+ @Override
14
+ public Result execute(String... args) {
15
+ InstrumentationBackend.solo.panMapTo( Double.parseDouble(args[0]), Double.parseDouble(args[1]) );
16
+ return Result.successResult();
17
+ }
18
+
19
+ @Override
20
+ public String key() {
21
+ return "pan_map_to";
22
+ }
23
+ }
@@ -0,0 +1,23 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ /**
8
+ * Center on lat, lon
9
+ * @author Nicholas Albion
10
+ */
11
+ public class SetMapCenter implements Action {
12
+
13
+ @Override
14
+ public Result execute(String... args) {
15
+ InstrumentationBackend.solo.setMapCenter( Double.parseDouble(args[0]), Double.parseDouble(args[1]) );
16
+ return Result.successResult();
17
+ }
18
+
19
+ @Override
20
+ public String key() {
21
+ return "set_map_center";
22
+ }
23
+ }
@@ -0,0 +1,34 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ /**
8
+ * @author Nicholas Albion
9
+ */
10
+ public class SetMapZoom implements Action {
11
+
12
+ @Override
13
+ public Result execute(String... args) {
14
+ if( "in".equals(args[0]) ) {
15
+ return new Result( InstrumentationBackend.solo.zoomInOnMap() );
16
+ } else if( "out".equals(args[0]) ) {
17
+ return new Result( InstrumentationBackend.solo.zoomOutOnMap() );
18
+ }
19
+
20
+ int zoomLevel = Integer.parseInt(args[0]);
21
+ int newZoom = InstrumentationBackend.solo.setMapZoom( zoomLevel );
22
+
23
+ if( newZoom == zoomLevel ) {
24
+ return Result.successResult();
25
+ } else {
26
+ return new Result(false, "Requested zoom level: " + zoomLevel + " but current zoom level is " + newZoom);
27
+ }
28
+ }
29
+
30
+ @Override
31
+ public String key() {
32
+ return "set_map_zoom";
33
+ }
34
+ }
@@ -0,0 +1,28 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ /**
8
+ * An optional "step" parameter lets the test script specify the number of pixels to increment down/across when
9
+ * searching for a marker - defaults to 5
10
+ *
11
+ * @author Nicholas Albion
12
+ */
13
+ public class TapAwayFromMarkers implements Action {
14
+
15
+ @Override
16
+ public Result execute(String... args) {
17
+ int step = (args.length == 0) ? 5 : Integer.parseInt(args[0]);
18
+ if( InstrumentationBackend.solo.tapMapAwayFromMarkers(step) ) {
19
+ return Result.successResult();
20
+ }
21
+ return new Result(false, "Could not find any where to tap away from markers");
22
+ }
23
+
24
+ @Override
25
+ public String key() {
26
+ return "tap_map_away_from_markers";
27
+ }
28
+ }
@@ -0,0 +1,29 @@
1
+ package sh.calaba.instrumentationbackend.actions.map;
2
+
3
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
4
+ import sh.calaba.instrumentationbackend.Result;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+
7
+ /**
8
+ * eg: tap_map_marker_by_title, "my marker"
9
+ * eg: tap_map_marker_by_title, "my marker", "10000" (keep trying for 10 seconds)
10
+ *
11
+ * @author Nicholas Albion
12
+ */
13
+ public class TapMapMarker implements Action {
14
+
15
+ @Override
16
+ public Result execute(String... args) {
17
+ String title = args[0];
18
+ long timeout = (args.length > 1) ? Long.parseLong(args[1]) : 10000;
19
+ if( InstrumentationBackend.solo.tapMapMarkerItem(title, timeout) ) {
20
+ return Result.successResult();
21
+ }
22
+ return new Result(false, "Could not find marker '" + title + "' to tap after waiting " + timeout + " ms");
23
+ }
24
+
25
+ @Override
26
+ public String key() {
27
+ return "tap_map_marker_by_title";
28
+ }
29
+ }
@@ -0,0 +1,36 @@
1
+ package sh.calaba.instrumentationbackend.actions.spinner;
2
+
3
+ import sh.calaba.instrumentationbackend.Result;
4
+ import sh.calaba.instrumentationbackend.TestHelpers;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+ import android.widget.Spinner;
7
+
8
+ public class GetSelectedSpinnerItemText implements Action {
9
+
10
+ @Override
11
+ public Result execute(String... args) {
12
+ final String idArgument = args[0];
13
+ final Spinner foundView = TestHelpers.getViewById(idArgument, Spinner.class);
14
+
15
+ if( null == foundView ) {
16
+ return notFoundResult(idArgument);
17
+ }
18
+
19
+ return new Result(true, getSelectedSpinnerText(foundView));
20
+ }
21
+
22
+ private String getSelectedSpinnerText(final Spinner foundView) {
23
+ Object selectedItem = foundView.getSelectedItem();
24
+ return (null != selectedItem) ? selectedItem.toString() : "";
25
+ }
26
+
27
+ private Result notFoundResult(final String idArgument) {
28
+ return Result.failedResult(String.format("Could not find %s with id %s.", Spinner.class.getName(), idArgument));
29
+ }
30
+
31
+ @Override
32
+ public String key() {
33
+ return "get_selected_spinner_item_text";
34
+ }
35
+
36
+ }
@@ -0,0 +1,72 @@
1
+ package sh.calaba.instrumentationbackend.actions.text;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.LinkedList;
5
+
6
+ import android.widget.GridView;
7
+ import android.widget.TextView;
8
+ import sh.calaba.instrumentationbackend.InstrumentationBackend;
9
+ import sh.calaba.instrumentationbackend.Result;
10
+ import sh.calaba.instrumentationbackend.actions.Action;
11
+
12
+ /**
13
+ * Optional arg is 1-based index - eg: assert_no_duplicates_in_grid, "1" examines the first grid
14
+ * @author Nicholas Albion
15
+ */
16
+ public class AssertGridViewContainsNoDuplicates implements Action {
17
+
18
+ @Override
19
+ public Result execute(String... args) {
20
+ ArrayList<GridView> gridViews = InstrumentationBackend.solo.getCurrentGridViews();
21
+
22
+ if( gridViews.size() == 0 ) {
23
+ return new Result(false, "Could not find any grid views");
24
+ }
25
+
26
+ int index;
27
+ LinkedList<String> duplicates;
28
+ if( args.length == 1 ) {
29
+ index = Integer.parseInt(args[0]) - 1;
30
+ duplicates = assertNoDuplicatesInGrid( gridViews.get(index) );
31
+ } else {
32
+ index = gridViews.size() - 1;
33
+ do {
34
+ GridView gridView = gridViews.get(index);
35
+ duplicates = assertNoDuplicatesInGrid(gridView);
36
+ if( duplicates.size() != 0 ) {
37
+ break;
38
+ }
39
+ } while( index-- != 0 );
40
+ }
41
+
42
+ if( duplicates.size() == 0 ) {
43
+ return Result.successResult();
44
+ } else {
45
+ Result result = new Result(false, "Duplicates were found in GridView #" + (index + 1) + ": " + duplicates);
46
+ result.setExtras( duplicates );
47
+ return result;
48
+ }
49
+ }
50
+
51
+ private LinkedList<String> assertNoDuplicatesInGrid( GridView gridView ) {
52
+ //InstrumentationBackend.solo.getViews( gridView );
53
+ ArrayList<TextView> textViews = InstrumentationBackend.solo.getCurrentTextViews( gridView );
54
+ LinkedList<String> textValues = new LinkedList<String>();
55
+ LinkedList<String> duplicates = new LinkedList<String>();
56
+
57
+ for (TextView textView : textViews) {
58
+ String text = textView.getText().toString();
59
+ if( textValues.contains(text) ) {
60
+ duplicates.add(text);
61
+ } else {
62
+ textValues.add(text);
63
+ }
64
+ }
65
+ return duplicates;
66
+ }
67
+
68
+ @Override
69
+ public String key() {
70
+ return "assert_no_duplicates_in_grid";
71
+ }
72
+ }
@@ -0,0 +1,42 @@
1
+ package sh.calaba.instrumentationbackend.actions.text;
2
+
3
+ import sh.calaba.instrumentationbackend.Result;
4
+ import sh.calaba.instrumentationbackend.TestHelpers;
5
+ import sh.calaba.instrumentationbackend.actions.Action;
6
+ import android.view.View;
7
+ import android.widget.TextView;
8
+
9
+ public class GetTextById implements Action {
10
+
11
+ @Override
12
+ public Result execute(String... args) {
13
+ String idArgument = args[0];
14
+ final View theView = TestHelpers.getViewById(idArgument);
15
+
16
+ if (null == theView) {
17
+ return notFoundResult(idArgument);
18
+ } else if (!(theView instanceof TextView)) {
19
+ return foundButNotATextViewResult(idArgument, theView);
20
+ }
21
+
22
+ return new Result(true, textOf(theView));
23
+ }
24
+
25
+ @Override
26
+ public String key() {
27
+ return "get_text_by_id";
28
+ }
29
+
30
+ private String textOf(final View theView) {
31
+ return ((TextView)theView).getText().toString();
32
+ }
33
+
34
+ private Result foundButNotATextViewResult(String idArgument, final View theView) {
35
+ return Result.failedResult(String.format("Found View with id %s but it is a %s not a %s", idArgument, theView.getClass().getName(), TextView.class.getName()));
36
+ }
37
+
38
+ private Result notFoundResult(String idArgument) {
39
+ return Result.failedResult(String.format("View with id %s was not found.", idArgument));
40
+ }
41
+
42
+ }