worm 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,156 @@
1
+ class Screen
2
+
3
+ def initialize(screen_data = nil)
4
+ if screen_data.nil?
5
+ @screen_data = MultiJson.load(Frank::Cucumber::Gateway.new.send_get('dump'))
6
+ else
7
+ @screen_data = screen_data
8
+ end
9
+ end
10
+
11
+ def all_views
12
+ add_views(@screen_data)
13
+ @views
14
+ end
15
+
16
+ def add_views(json)
17
+ json["subviews"].each do |view|
18
+ add_view view
19
+ add_views(view) unless view["subviews"].count == 0
20
+ end
21
+ end
22
+
23
+ def view_by_id(id)
24
+ @found_view = nil
25
+ view_by_id_with_data(@screen_data, id)
26
+ @found_view
27
+ end
28
+
29
+ def view_by_label(label)
30
+ @found_view = nil
31
+ view_by_label_with_data(@screen_data, label)
32
+ @found_view
33
+ end
34
+
35
+ def view_class(label)
36
+ view_by_label(label)["class"]
37
+ end
38
+
39
+ def view_frame_width(label)
40
+ view_frame(label)["size"]["width"]
41
+ end
42
+
43
+ def view_frame_height(label)
44
+ view_frame(label)["size"]["height"]
45
+ end
46
+
47
+ def view_frame(label)
48
+ view_by_label(label)["frame"]
49
+ end
50
+
51
+ def view_is_visible(label)
52
+ view_by_label(label)["isHidden"] == 0
53
+ end
54
+
55
+ def view_x(label)
56
+ view_by_label(label)["accessibilityFrame"]["origin"]["x"]
57
+ end
58
+
59
+ def view_y(label)
60
+ view_by_label(label)["accessibilityFrame"]["origin"]["y"]
61
+ end
62
+
63
+ def view_origin(label)
64
+ view_by_label(label)
65
+ end
66
+
67
+ def view_tag(label)
68
+ view_by_label(label)["tag"]
69
+ end
70
+
71
+ def view_accessibility_height(label)
72
+ view_by_label(label)["accessibilityFrame"]["size"]["height"]
73
+ end
74
+
75
+ def view_accessibility_width(label)
76
+ view_by_label(label)["accessibilityFrame"]["size"]["width"]
77
+ end
78
+
79
+ def get_class(view_data)
80
+ view_data["class"]
81
+ end
82
+
83
+ def get_label(view_data)
84
+ view_data["accessibilityLabel"]
85
+ end
86
+
87
+ def accessible_buttons
88
+ buttons = []
89
+ all_views.each do |view|
90
+ if get_class(view).include? 'Button'
91
+ buttons << get_label(view) unless get_label(view).nil?
92
+ end
93
+ end
94
+ buttons
95
+ end
96
+
97
+ def accessible_text_fields
98
+ texts = []
99
+ all_views.each do |view|
100
+ if get_class(view).include? 'UITextField'
101
+ texts << get_label(view) unless get_label(view).nil?
102
+ end
103
+ end
104
+ texts
105
+ end
106
+
107
+ def accessible_tables
108
+ tables = []
109
+ all_views.each do |view|
110
+ if get_class(view).include? 'TableView'
111
+ tables << get_label(view) unless get_label(view).nil?
112
+ end
113
+ end
114
+ tables
115
+ end
116
+
117
+ def accessible_labels
118
+ labels = []
119
+ all_views.each do |view|
120
+ if get_class(view).include? 'Label'
121
+ labels << get_label(view) unless get_label(view).nil?
122
+ end
123
+ end
124
+ labels
125
+ end
126
+
127
+ private
128
+ def add_view(view)
129
+ @views = [] unless @views
130
+ @views << view
131
+ end
132
+
133
+ def view_by_id_with_data(json,id)
134
+ if json["uid"] == id
135
+ @found_view = json
136
+ else
137
+ if json["subviews"].count > 0
138
+ json["subviews"].each do |view|
139
+ view_by_id_with_data(view,id)
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ def view_by_label_with_data(json,label)
146
+ if json["accessibilityLabel"].eql? label
147
+ @found_view = json
148
+ else
149
+ if json["subviews"].count > 0
150
+ json["subviews"].each do |view|
151
+ view_by_label_with_data(view,label)
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,6 @@
1
+ class SelectorBuilder
2
+
3
+ def self.build(type, label)
4
+ "view:'#{type}' marked:'#{label}'"
5
+ end
6
+ end
@@ -0,0 +1,66 @@
1
+ require 'frank-cucumber/console'
2
+ require 'frank-cucumber/frank_helper'
3
+ require 'screen'
4
+ require 'selector_builder'
5
+ require 'multi_json'
6
+
7
+ class Worm
8
+ include Frank::Cucumber::FrankHelper
9
+
10
+ def initialize
11
+ Frank::Cucumber::FrankHelper.use_shelley_from_now_on
12
+ end
13
+
14
+ def use_physical
15
+ Frank::Cucumber::FrankHelper.test_on_physical_device_via_bonjour
16
+ end
17
+
18
+ def press(label)
19
+ screen = Screen.new
20
+ Frank::Console.new.touch(SelectorBuilder.build(screen.view_class(label), label))
21
+ end
22
+
23
+ def buttons
24
+ Screen.new.accessible_buttons
25
+ end
26
+
27
+ def text_fields
28
+ Screen.new.accessible_text_fields
29
+ end
30
+
31
+ def labels
32
+ Screen.new.accessible_labels
33
+ end
34
+
35
+ def tables
36
+ Screen.new.accessible_tables
37
+ end
38
+
39
+ def set_text(text, label)
40
+ screen = Screen.new
41
+ Frank::Console.new.touch(SelectorBuilder.build(screen.view_class(label), text))
42
+ end
43
+
44
+ def type(text)
45
+ Frank::Console.new.type_into_keyboard(text)
46
+ end
47
+
48
+ def landscape
49
+ frankly_set_orientation('landscape')
50
+ end
51
+
52
+ def portrait
53
+ frankly_set_orientation('portrait')
54
+ end
55
+
56
+ def touch_alert(button)
57
+ touch("view:'UIAlertButton' marked:'#{button}'")
58
+ end
59
+
60
+ def selector(label)
61
+ screen = Screen.new
62
+ SelectorBuilder.build(screen.view_class(label), label)
63
+ end
64
+ end
65
+
66
+
@@ -0,0 +1,83 @@
1
+ require 'screen'
2
+ require 'multi_json'
3
+ require 'spec_helper'
4
+
5
+ describe Screen do
6
+
7
+ let(:json) {MultiJson.load('{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"subviews":[{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":44,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"testLabel","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UIView"},{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel1","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"},{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel2","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"},{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":2,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"textField1","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UITextField"},{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":2,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"textField2","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UITextField"}],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIWindow"}')}
8
+ let(:server){Frank::Cucumber::Gateway.any_instance.stub(:send_get).with('dump').and_return(json)}
9
+ let(:screen){ screen = Screen.new(json)}
10
+
11
+ let(:json1) {MultiJson.load('{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel1","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"}')}
12
+ let(:server1){Frank::Cucumber::Gateway.any_instance.stub(:send_get).with('dump').and_return(json)}
13
+ let(:screen1){ screen = Screen.new(json)}
14
+
15
+ context 'getting views' do
16
+ it 'can get all the views' do
17
+ screen.all_views.count == 2
18
+ end
19
+ it 'can get a view by id' do
20
+ screen.view_by_id(1).should == json
21
+ end
22
+ it 'can get a nested view by id' do
23
+ screen.view_by_id(44).should == MultiJson.load('{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":44,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"testLabel","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UIView"}')
24
+ end
25
+ it 'can get a view by label' do
26
+ screen.view_by_label("testLabel").should == MultiJson.load('{"frame":{"size":{"width":148,"height":888},"origin":{"x":20,"y":0}},"uid":44,"backgroundColor":"<NON-RGB COLOR>","isHidden":0,"accessibilityLabel":"testLabel","subviews":[],"tag":0,"accessibilityFrame":{"size":{"width":444,"height":555},"origin":{"x":20,"y":0}},"alpha":1,"autoresizingMask":36,"class":"UIView"}')
27
+ end
28
+ it 'can get a nested view by label' do
29
+ screen.view_by_label('buttonLabel1').should == MultiJson.load('{"frame":{"size":{"width":768,"height":1024},"origin":{"x":0,"y":0}},"uid":1,"backgroundColor":{},"isHidden":0,"accessibilityLabel":"buttonLabel1","subviews":[],"tag":0,"isKeyWindow":1,"accessibilityFrame":{},"windowLevel":0,"alpha":1,"autoresizingMask":0,"class":"UIButton"}')
30
+ end
31
+ end
32
+ context 'getting view properties by label' do
33
+ it 'can get the view class' do
34
+ screen.view_class("testLabel").should == "UIView"
35
+ end
36
+ it 'can get the nested view class' do
37
+ screen.view_class("textField1").should == "UITextField"
38
+ end
39
+ it 'can get the view width' do
40
+ screen.view_frame_width("testLabel").should == 148
41
+ end
42
+ it 'can get the view height' do
43
+ screen.view_frame_height("testLabel").should == 888
44
+ end
45
+ it 'can get the view visibility' do
46
+ screen.view_is_visible("testLabel").should be_true
47
+ end
48
+ it 'can get the view x-coordinates' do
49
+ screen.view_x("testLabel").should == 20
50
+ end
51
+ it 'can get the view y-coordinates' do
52
+ screen.view_y("testLabel").should == 0
53
+ end
54
+ it 'can get the view tag' do
55
+ screen.view_tag("testLabel").should == 0
56
+ end
57
+ it 'can get the view accessibility frame height' do
58
+ screen.view_accessibility_height("testLabel") == 444
59
+ end
60
+ it 'can get the view accessibility frame width' do
61
+ screen.view_accessibility_height("testLabel") == 555
62
+ end
63
+ end
64
+ context 'getting view properties from raw json' do
65
+ it 'can get the class from raw view data' do
66
+ screen.get_class(json1).should == "UIButton"
67
+ end
68
+ it 'can get the accessibility label from raw view data' do
69
+ screen.get_label(json1).should == "buttonLabel1"
70
+ end
71
+ end
72
+ context 'getting all view elements' do
73
+ it 'can get a list of all the buttons on the screen' do
74
+ screen.accessible_buttons.should == ["buttonLabel1", "buttonLabel2"]
75
+ end
76
+
77
+ it 'can get a list of all the text fields' do
78
+ screen.accessible_text_fields.should == ["textField1", "textField2"]
79
+ end
80
+ end
81
+ end
82
+
83
+
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'selector_builder'
3
+
4
+ describe SelectorBuilder do
5
+ context 'building a selector' do
6
+ it 'should build a valid selector' do
7
+ type = 'UILabel'
8
+ label = 'testLabel'
9
+ SelectorBuilder.build(type, label).should == "view:'UILabel' marked:'testLabel'"
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: worm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jeremy Stewart
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: frank-cucumber
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.1.8
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.1.8
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: An irb driver for Frankified apps
47
+ email: jlstewart379@gmail.com
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - lib/worm.rb
53
+ - lib/selector_builder.rb
54
+ - lib/screen.rb
55
+ - spec/selector_builder_spec.rb
56
+ - spec/screen_spec.rb
57
+ homepage: https://github.com/jlstewart379/worm.git
58
+ licenses: []
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubyforge_project:
77
+ rubygems_version: 1.8.24
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: An irb driver for Frankified apps
81
+ test_files:
82
+ - spec/selector_builder_spec.rb
83
+ - spec/screen_spec.rb
84
+ has_rdoc: