worm 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: