lib/calabash-cucumber/map.rb in calabash-cucumber-0.9.165 vs lib/calabash-cucumber/map.rb in calabash-cucumber-0.9.166
- old
+ new
@@ -2,14 +2,67 @@
module Calabash
module Cucumber
module Map #=> Connection
+ # returns an array of views matched by the +query+ or the result of
+ # performing the Objective-C sequence defined by the +method_name+ and
+ # +method_args+ on all the views matched by the +query+
+ #
+ # the query language is documented here: https://github.com/calabash/calabash-ios/wiki
+ #
+ # returns a JSON representation of each view that is matched
+ #
+ # when the +method_name+ is a calabash operation, returns an array that
+ # contains the result of calling the objc selector +description+ on each
+ # matched view. these are examples of calabash operations: +:flash+,
+ # +:scrollToRowWithMark+, +:changeDatePickerDate+.
def map(query, method_name, *method_args)
- raw_map(query,method_name, *method_args)['results']
+ #todo calabash operations should return 'views touched' in JSON format
+ raw_map(query, method_name, *method_args)['results']
end
+ # returns a JSON object the represents the result of performing an http
+ # query against the calabash server.
+ #
+ # gem users should _not_ call this method directly; call +map+ instead.
+ #
+ # raises an error and takes a screenshot if the value of the +outcome+ key
+ # is _not_ 'SUCCESS'
+ #
+ # the JSON object contains the following keys:
+ #
+ # +outcome+ => indicates the success or failure of the query
+ #
+ # +status_bar_orientation+ => the orientation of the status bar
+ #
+ # +results+ => views matched by the +query+ or the result of
+ # performing the Objective-C selector sequence defined by
+ # the +method_name+ with arguments defined in
+ # +method_args+ on all views matched by the +query+
+ #
+ # the query language is documented here: https://github.com/calabash/calabash-ios/wiki
+ #
+ # here are some examples that clarify how the +method_name+ and +method_args+
+ # influence the value of the +results+ key
+ #
+ # simple examples:
+ #
+ # raw_map('label')['result'] #=> [ all visible UILabels ]
+ # raw_map('label', :text) #=> [ the 'text' of all visible UILabels ]
+ #
+ # example of calling a selector with arguments:
+ #
+ # <tt>raw_map("tableView marked:'cheeses'", {'numberOfRowsInSection' => 0})) =></tt>
+ # <tt>[ the number of rows in the first section of the 'cheeses' table ]</tt>
+ #
+ # example of calling a selector on view to return an object and then calling
+ # another selector on the returned object:
+ #
+ # <tt>raw_map("pickerView marked:'cheeses'", :delegate, [{pickerView:nil},{titleForRow:1},{forComponent:0}]) =></tt>
+ # objc call: <tt>[[pickerView delegate] pickerView:nil titleForRow:1 forComponent:0] =></tt>
+ # <tt>['French']</tt>
def raw_map(query, method_name, *method_args)
operation_map = {
:method_name => method_name,
:arguments => method_args
}
@@ -19,9 +72,51 @@
if res['outcome'] != 'SUCCESS'
screenshot_and_raise "map #{query}, #{method_name} failed because: #{res['reason']}\n#{res['details']}"
end
res
+ end
+
+ # asserts the result of a calabash +map+ call and raises an error with
+ # +msg+ if no valid results are found.
+ #
+ # casual gem users should never need to call this method; this is a
+ # convenience method for gem maintainers.
+ #
+ # raises an error if +map_results+:
+ #
+ # is an empty list #=> []
+ # contains a '<VOID>' string #=> [ "<VOID>" ]
+ # contains '*****' string #=> [ "*****" ]
+ # contains a single nil #=> [ nil ]
+ #
+ # when evaluating whether a +map+ call is successful it is important to
+ # note that sometimes a <tt>[ nil ]</tt> or <tt>[nil, <val>, nil]</tt> is
+ # a valid result.
+ #
+ # consider a controller with 3 labels:
+ #
+ # label @ index 0 has text "foo"
+ # label @ index 1 has text nil (the [label text] => nil)
+ # label @ index 2 has text "bar"
+ #
+ # map('label', :text) => ['foo', nil, 'bar']
+ # map('label index:1', :text) => [nil]
+ #
+ # in other cases, <tt>[ nil ]</tt> should be treated as an invalid result
+ #
+ # # invalid
+ # > mark = 'mark does not exist'
+ # > map('tableView', :scrollToRowWithMark, mark, args) => [ nil ]
+ #
+ # here a <tt>[ nil ]</tt> should be considered invalid because the
+ # the operation could not be performed because there is not row that
+ # matches +mark+
+ def assert_map_results(map_results, msg)
+ compact = map_results.compact
+ if compact.empty? or compact.member? '<VOID>' or compact.member? '*****'
+ screenshot_and_raise msg
+ end
end
end
end
end
\ No newline at end of file