rufus 0.5 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/RufusApp/RufusApp.xcodeproj/project.pbxproj +41 -3
- data/RufusApp/RufusApp/RUViewController.h +4 -1
- data/RufusApp/RufusApp/RUViewController.m +13 -0
- data/RufusApp/RufusApp/ScrollChildViewController.h +18 -0
- data/RufusApp/RufusApp/ScrollChildViewController.m +24 -0
- data/RufusApp/RufusApp/ScrollChildViewController.xib +30 -0
- data/RufusApp/RufusApp/ScrollPageViewController.h +13 -0
- data/RufusApp/RufusApp/ScrollPageViewController.m +91 -0
- data/RufusApp/RufusApp/ScrollPageViewController.xib +20 -0
- data/RufusApp/RufusApp/TablePageViewController.h +23 -0
- data/RufusApp/RufusApp/TablePageViewController.m +108 -0
- data/RufusApp/RufusApp/TablePageViewController.xib +75 -0
- data/RufusApp/RufusApp/en.lproj/RUViewController.xib +24 -0
- data/features/rufus.feature +12 -0
- data/features/scroll.feature +10 -0
- data/features/step_definitions/rufus_steps.rb +15 -0
- data/features/step_definitions/scroll_steps.rb +6 -0
- data/features/step_definitions/table_steps.rb +14 -0
- data/features/support/routes.rb +8 -0
- data/features/support/screens/home_page.rb +2 -0
- data/features/support/screens/scroll_page.rb +11 -0
- data/features/support/screens/table_page.rb +14 -0
- data/features/table.feature +13 -0
- data/features/view.feature +1 -1
- data/lib/rufus.rb +21 -0
- data/lib/rufus/accessors/accessors.rb +6 -0
- data/lib/rufus/accessors/table.rb +49 -0
- data/lib/rufus/driver.rb +11 -0
- data/rakefile +4 -1
- data/rufus.gemspec +1 -1
- data/spec/drivers_specs/driver_spec.rb +52 -0
- data/spec/rufus_spec.rb +8 -0
- data/spec/table_spec.rb +34 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTRkZjc4ZWVmOGQ0ZTAxMDI2NWJmZWQ4NzY0MzQyYTQ2ZDNjM2IzYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MmU5YjNmNmQ1OTdmNjBlN2NkZTY5MGUxNzBhYTdkODZhNjNhYzAyOA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZWEzOTc5ZGJkZjU0ZDY1YzgxZjUxYmI4ZDE1NTc5NzNiMDhmODgzMTNmMTAz
|
10
|
+
OWM0Y2Y5MGE1ZmJmYzNmOWVmZjExZjYwMGVlNmEyMzk0OGJiZmMyYzVlZDNm
|
11
|
+
MjNmOTI2ODZjNTQ4MTM0YzMzNWY1NTQ5OGE4Yjc3MjQwOTAxMGE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzQxMTg5MWVhMDNmN2FhZjNlYjgzZjRkOGQ1MjY5MDJlOThmZGIyMTllYTU1
|
14
|
+
YjJmYTU4ZjU5NGU5YTUxYjU5NzlmMGE0YmYwZGIwZGZiNjNlYWJiMzNiYjY4
|
15
|
+
NmRkMjUwNDk3MDQxNDQxOGY0ZWJlMGE2ZTJhMjYxNzU0YmJhN2I=
|
@@ -7,6 +7,12 @@
|
|
7
7
|
objects = {
|
8
8
|
|
9
9
|
/* Begin PBXBuildFile section */
|
10
|
+
B855BA3D1810E9F000B33F42 /* ScrollChildViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B855BA3B1810E9F000B33F42 /* ScrollChildViewController.m */; };
|
11
|
+
B855BA3E1810E9F000B33F42 /* ScrollChildViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B855BA3C1810E9F000B33F42 /* ScrollChildViewController.xib */; };
|
12
|
+
B869CCEE1814292E00093724 /* ScrollPageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B869CCEC1814292E00093724 /* ScrollPageViewController.m */; };
|
13
|
+
B869CCEF1814292E00093724 /* ScrollPageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B869CCED1814292E00093724 /* ScrollPageViewController.xib */; };
|
14
|
+
B869CCF31814B62800093724 /* TablePageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B869CCF11814B62800093724 /* TablePageViewController.m */; };
|
15
|
+
B869CCF41814B62800093724 /* TablePageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B869CCF21814B62800093724 /* TablePageViewController.xib */; };
|
10
16
|
B88C11DE17BD550E00A62E9D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B88C11DD17BD550E00A62E9D /* UIKit.framework */; };
|
11
17
|
B88C11E017BD550E00A62E9D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B88C11DF17BD550E00A62E9D /* Foundation.framework */; };
|
12
18
|
B88C11E217BD550E00A62E9D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B88C11E117BD550E00A62E9D /* CoreGraphics.framework */; };
|
@@ -44,6 +50,15 @@
|
|
44
50
|
/* End PBXContainerItemProxy section */
|
45
51
|
|
46
52
|
/* Begin PBXFileReference section */
|
53
|
+
B855BA3A1810E9F000B33F42 /* ScrollChildViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollChildViewController.h; sourceTree = "<group>"; };
|
54
|
+
B855BA3B1810E9F000B33F42 /* ScrollChildViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollChildViewController.m; sourceTree = "<group>"; };
|
55
|
+
B855BA3C1810E9F000B33F42 /* ScrollChildViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScrollChildViewController.xib; sourceTree = "<group>"; };
|
56
|
+
B869CCEB1814292E00093724 /* ScrollPageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollPageViewController.h; sourceTree = "<group>"; };
|
57
|
+
B869CCEC1814292E00093724 /* ScrollPageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollPageViewController.m; sourceTree = "<group>"; };
|
58
|
+
B869CCED1814292E00093724 /* ScrollPageViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScrollPageViewController.xib; sourceTree = "<group>"; };
|
59
|
+
B869CCF01814B62800093724 /* TablePageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TablePageViewController.h; sourceTree = "<group>"; };
|
60
|
+
B869CCF11814B62800093724 /* TablePageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TablePageViewController.m; sourceTree = "<group>"; };
|
61
|
+
B869CCF21814B62800093724 /* TablePageViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TablePageViewController.xib; sourceTree = "<group>"; };
|
47
62
|
B88C11DA17BD550E00A62E9D /* RufusApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RufusApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
48
63
|
B88C11DD17BD550E00A62E9D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
49
64
|
B88C11DF17BD550E00A62E9D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
@@ -140,9 +155,6 @@
|
|
140
155
|
B8F2F16D18026FA00037AD69 /* PageObjectControllers */,
|
141
156
|
B88C11EC17BD550E00A62E9D /* RUAppDelegate.h */,
|
142
157
|
B88C11ED17BD550E00A62E9D /* RUAppDelegate.m */,
|
143
|
-
B88C11F517BD550E00A62E9D /* RUViewController.h */,
|
144
|
-
B88C11F617BD550E00A62E9D /* RUViewController.m */,
|
145
|
-
B88C11F817BD550E00A62E9D /* RUViewController.xib */,
|
146
158
|
B88C11E417BD550E00A62E9D /* Supporting Files */,
|
147
159
|
);
|
148
160
|
path = RufusApp;
|
@@ -181,6 +193,18 @@
|
|
181
193
|
name = "Supporting Files";
|
182
194
|
sourceTree = "<group>";
|
183
195
|
};
|
196
|
+
B8B8FA9A1810FF1B00E3BCA3 /* OtherViewControllers */ = {
|
197
|
+
isa = PBXGroup;
|
198
|
+
children = (
|
199
|
+
B88C11F517BD550E00A62E9D /* RUViewController.h */,
|
200
|
+
B88C11F617BD550E00A62E9D /* RUViewController.m */,
|
201
|
+
B88C11F817BD550E00A62E9D /* RUViewController.xib */,
|
202
|
+
B855BA3A1810E9F000B33F42 /* ScrollChildViewController.h */,
|
203
|
+
B855BA3B1810E9F000B33F42 /* ScrollChildViewController.m */,
|
204
|
+
);
|
205
|
+
name = OtherViewControllers;
|
206
|
+
sourceTree = "<group>";
|
207
|
+
};
|
184
208
|
B8F2F16D18026FA00037AD69 /* PageObjectControllers */ = {
|
185
209
|
isa = PBXGroup;
|
186
210
|
children = (
|
@@ -196,6 +220,14 @@
|
|
196
220
|
B88C121817BD55BB00A62E9D /* RufusPageViewController.h */,
|
197
221
|
B88C121917BD55BB00A62E9D /* RufusPageViewController.m */,
|
198
222
|
B88C121A17BD55BB00A62E9D /* RufusPageViewController.xib */,
|
223
|
+
B855BA3C1810E9F000B33F42 /* ScrollChildViewController.xib */,
|
224
|
+
B869CCEB1814292E00093724 /* ScrollPageViewController.h */,
|
225
|
+
B869CCEC1814292E00093724 /* ScrollPageViewController.m */,
|
226
|
+
B869CCED1814292E00093724 /* ScrollPageViewController.xib */,
|
227
|
+
B8B8FA9A1810FF1B00E3BCA3 /* OtherViewControllers */,
|
228
|
+
B869CCF01814B62800093724 /* TablePageViewController.h */,
|
229
|
+
B869CCF11814B62800093724 /* TablePageViewController.m */,
|
230
|
+
B869CCF21814B62800093724 /* TablePageViewController.xib */,
|
199
231
|
);
|
200
232
|
name = PageObjectControllers;
|
201
233
|
sourceTree = "<group>";
|
@@ -272,12 +304,15 @@
|
|
272
304
|
isa = PBXResourcesBuildPhase;
|
273
305
|
buildActionMask = 2147483647;
|
274
306
|
files = (
|
307
|
+
B855BA3E1810E9F000B33F42 /* ScrollChildViewController.xib in Resources */,
|
275
308
|
B88C11E817BD550E00A62E9D /* InfoPlist.strings in Resources */,
|
276
309
|
B88C11F017BD550E00A62E9D /* Default.png in Resources */,
|
277
310
|
B88C11F217BD550E00A62E9D /* Default@2x.png in Resources */,
|
311
|
+
B869CCF41814B62800093724 /* TablePageViewController.xib in Resources */,
|
278
312
|
B88C11F417BD550E00A62E9D /* Default-568h@2x.png in Resources */,
|
279
313
|
B88C11FA17BD550E00A62E9D /* RUViewController.xib in Resources */,
|
280
314
|
B8F2F172180270290037AD69 /* EnabledPageViewController.xib in Resources */,
|
315
|
+
B869CCEF1814292E00093724 /* ScrollPageViewController.xib in Resources */,
|
281
316
|
B8F2F1771802703D0037AD69 /* DisplayedPageViewController.xib in Resources */,
|
282
317
|
B8F2F16C180255FE0037AD69 /* ExistsPageViewController.xib in Resources */,
|
283
318
|
B88C121C17BD55BB00A62E9D /* RufusPageViewController.xib in Resources */,
|
@@ -315,9 +350,12 @@
|
|
315
350
|
isa = PBXSourcesBuildPhase;
|
316
351
|
buildActionMask = 2147483647;
|
317
352
|
files = (
|
353
|
+
B855BA3D1810E9F000B33F42 /* ScrollChildViewController.m in Sources */,
|
318
354
|
B88C11EA17BD550E00A62E9D /* main.m in Sources */,
|
355
|
+
B869CCF31814B62800093724 /* TablePageViewController.m in Sources */,
|
319
356
|
B88C11EE17BD550E00A62E9D /* RUAppDelegate.m in Sources */,
|
320
357
|
B88C11F717BD550E00A62E9D /* RUViewController.m in Sources */,
|
358
|
+
B869CCEE1814292E00093724 /* ScrollPageViewController.m in Sources */,
|
321
359
|
B88C121B17BD55BB00A62E9D /* RufusPageViewController.m in Sources */,
|
322
360
|
B8F2F16B180255FE0037AD69 /* ExistsPageViewController.m in Sources */,
|
323
361
|
B8F2F171180270290037AD69 /* EnabledPageViewController.m in Sources */,
|
@@ -15,12 +15,15 @@
|
|
15
15
|
@property (weak, nonatomic) IBOutlet UIButton *showAlertButton;
|
16
16
|
@property (weak, nonatomic) IBOutlet UIButton *rufusButton;
|
17
17
|
@property (weak, nonatomic) IBOutlet UIButton *enabledPageButton;
|
18
|
+
@property (weak, nonatomic) IBOutlet UIButton *scrollPageButton;
|
19
|
+
@property (weak, nonatomic) IBOutlet UIButton *tablePageButton;
|
18
20
|
|
19
21
|
- (IBAction)toEnabledPage:(id)sender;
|
20
22
|
- (IBAction)toRufusPage:(id)sender;
|
21
23
|
- (IBAction)showAlert:(id)sender;
|
22
24
|
- (IBAction)toExistsPage:(id)sender;
|
23
25
|
- (IBAction)toDisplayedPage:(id)sender;
|
24
|
-
|
26
|
+
- (IBAction)toSwipePage:(id)sender;
|
27
|
+
- (IBAction)toTablePage:(id)sender;
|
25
28
|
|
26
29
|
@end
|
@@ -11,6 +11,9 @@
|
|
11
11
|
#import "ExistsPageViewController.h"
|
12
12
|
#import "DisplayedPageViewController.h"
|
13
13
|
#import "EnabledPageViewController.h"
|
14
|
+
#import "ScrollPageViewController.h"
|
15
|
+
#import "TablePageViewController.h"
|
16
|
+
|
14
17
|
|
15
18
|
@interface RUViewController ()
|
16
19
|
|
@@ -59,6 +62,16 @@
|
|
59
62
|
[[self navigationController] pushViewController:displayedPageViewController animated:YES];
|
60
63
|
}
|
61
64
|
|
65
|
+
- (IBAction)toSwipePage:(id)sender {
|
66
|
+
ScrollPageViewController *scrollPageViewController = [[ScrollPageViewController alloc] init];
|
67
|
+
[[self navigationController] pushViewController:scrollPageViewController animated:YES];
|
68
|
+
}
|
69
|
+
|
70
|
+
- (IBAction)toTablePage:(id)sender {
|
71
|
+
TablePageViewController *tablePageViewController = [[TablePageViewController alloc] init];
|
72
|
+
[[self navigationController] pushViewController:tablePageViewController animated:YES];
|
73
|
+
}
|
74
|
+
|
62
75
|
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
|
63
76
|
{
|
64
77
|
if (buttonIndex == [alertView cancelButtonIndex])
|
@@ -0,0 +1,18 @@
|
|
1
|
+
//
|
2
|
+
// ScrollPageViewController.h
|
3
|
+
// RufusApp
|
4
|
+
//
|
5
|
+
// Created by Jeremy Stewart on 10/18/13.
|
6
|
+
// Copyright (c) 2013 Northwoods. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import <UIKit/UIKit.h>
|
10
|
+
|
11
|
+
@interface ScrollChildViewController : UIViewController
|
12
|
+
|
13
|
+
@property (assign, nonatomic) NSInteger index;
|
14
|
+
@property (weak, nonatomic) IBOutlet UILabel *screenNumber;
|
15
|
+
|
16
|
+
-(void)setIndexLabel:(int) index;
|
17
|
+
|
18
|
+
@end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
//
|
2
|
+
// ScrollPageViewController.m
|
3
|
+
// RufusApp
|
4
|
+
//
|
5
|
+
// Created by Jeremy Stewart on 10/18/13.
|
6
|
+
// Copyright (c) 2013 Northwoods. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import "ScrollChildViewController.h"
|
10
|
+
|
11
|
+
@interface ScrollChildViewController ()
|
12
|
+
|
13
|
+
@end
|
14
|
+
|
15
|
+
@implementation ScrollChildViewController
|
16
|
+
@synthesize screenNumber;
|
17
|
+
|
18
|
+
|
19
|
+
-(void)setIndexLabel:(int) index
|
20
|
+
{
|
21
|
+
[[self screenNumber] setText:[NSString stringWithFormat:@"Screen #%d", index]];
|
22
|
+
}
|
23
|
+
|
24
|
+
@end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="4510" systemVersion="12F45" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES">
|
3
|
+
<dependencies>
|
4
|
+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
|
5
|
+
</dependencies>
|
6
|
+
<objects>
|
7
|
+
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ScrollChildViewController">
|
8
|
+
<connections>
|
9
|
+
<outlet property="screenNumber" destination="Xxs-ch-qjw" id="iZf-B6-JX8"/>
|
10
|
+
<outlet property="view" destination="2" id="3"/>
|
11
|
+
</connections>
|
12
|
+
</placeholder>
|
13
|
+
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
14
|
+
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2">
|
15
|
+
<rect key="frame" x="0.0" y="0.0" width="768" height="1004"/>
|
16
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
17
|
+
<subviews>
|
18
|
+
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Screen #n" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xxs-ch-qjw">
|
19
|
+
<rect key="frame" x="290" y="412" width="189" height="61"/>
|
20
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
21
|
+
<fontDescription key="fontDescription" type="system" pointSize="40"/>
|
22
|
+
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
|
23
|
+
<nil key="highlightedColor"/>
|
24
|
+
</label>
|
25
|
+
</subviews>
|
26
|
+
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
27
|
+
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
28
|
+
</view>
|
29
|
+
</objects>
|
30
|
+
</document>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
//
|
2
|
+
// ScrollPageViewController.h
|
3
|
+
// RufusApp
|
4
|
+
//
|
5
|
+
// Created by Jeremy Stewart on 10/20/13.
|
6
|
+
// Copyright (c) 2013 Northwoods. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import <UIKit/UIKit.h>
|
10
|
+
|
11
|
+
@interface ScrollPageViewController : UIViewController
|
12
|
+
|
13
|
+
@end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
//
|
2
|
+
// ScrollPageViewController.m
|
3
|
+
// RufusApp
|
4
|
+
//
|
5
|
+
// Created by Jeremy Stewart on 10/20/13.
|
6
|
+
// Copyright (c) 2013 Northwoods. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import "ScrollPageViewController.h"
|
10
|
+
#import "ScrollChildViewController.h"
|
11
|
+
|
12
|
+
@interface ScrollPageViewController ()
|
13
|
+
|
14
|
+
@end
|
15
|
+
|
16
|
+
@implementation ScrollPageViewController
|
17
|
+
|
18
|
+
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
|
19
|
+
{
|
20
|
+
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
21
|
+
if (self) {
|
22
|
+
// Custom initialization
|
23
|
+
}
|
24
|
+
return self;
|
25
|
+
}
|
26
|
+
|
27
|
+
- (void)viewDidLoad
|
28
|
+
{
|
29
|
+
[super viewDidLoad];
|
30
|
+
// Do any additional setup after loading the view from its nib.
|
31
|
+
}
|
32
|
+
|
33
|
+
- (void)didReceiveMemoryWarning
|
34
|
+
{
|
35
|
+
[super didReceiveMemoryWarning];
|
36
|
+
// Dispose of any resources that can be recreated.
|
37
|
+
}
|
38
|
+
|
39
|
+
-(void)loadView
|
40
|
+
{
|
41
|
+
[super loadView];
|
42
|
+
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
|
43
|
+
[scrollView setPagingEnabled:YES];
|
44
|
+
|
45
|
+
[scrollView addSubview:[self getChildViewForIndex:1]];
|
46
|
+
[scrollView addSubview:[self getChildViewForIndex:2]];
|
47
|
+
[scrollView addSubview:[self getChildViewForIndex:3]];
|
48
|
+
|
49
|
+
float childWidth = [self getChildViewForIndex:0].frame.size.width;
|
50
|
+
float childHeight = [self getChildViewForIndex:0].frame.size.height;
|
51
|
+
|
52
|
+
[scrollView setContentSize:CGSizeMake(childWidth * 3, childHeight)];
|
53
|
+
|
54
|
+
[[self view] addSubview:scrollView];
|
55
|
+
}
|
56
|
+
|
57
|
+
-(UIView *)getChildViewForIndex:(int) index
|
58
|
+
{
|
59
|
+
ScrollChildViewController *childViewController = [[ScrollChildViewController alloc] initWithNibName:@"ScrollChildViewController" bundle:nil];
|
60
|
+
|
61
|
+
|
62
|
+
UIView *view = [childViewController view];
|
63
|
+
|
64
|
+
switch (index) {
|
65
|
+
case 1:
|
66
|
+
[view setBackgroundColor:[UIColor blueColor]];
|
67
|
+
[childViewController setIndexLabel:index];
|
68
|
+
break;
|
69
|
+
case 2:
|
70
|
+
{
|
71
|
+
[view setBackgroundColor:[UIColor redColor]];
|
72
|
+
CGRect frame = CGRectMake([self view].frame.size.width, 0, [self view].frame.size.width, [self view].frame.size.height);
|
73
|
+
[view setFrame:frame];
|
74
|
+
[childViewController setIndexLabel:index];
|
75
|
+
break;
|
76
|
+
}
|
77
|
+
case 3:
|
78
|
+
{
|
79
|
+
[view setBackgroundColor:[UIColor greenColor]];
|
80
|
+
CGRect frame = CGRectMake([self view].frame.size.width * 2, 0, [self view].frame.size.width, [self view].frame.size.height);
|
81
|
+
[view setFrame:frame];
|
82
|
+
[childViewController setIndexLabel:index];
|
83
|
+
break;
|
84
|
+
}
|
85
|
+
default:
|
86
|
+
break;
|
87
|
+
}
|
88
|
+
return [childViewController view];
|
89
|
+
}
|
90
|
+
|
91
|
+
@end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="4437" systemVersion="13A451" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES">
|
3
|
+
<dependencies>
|
4
|
+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3662"/>
|
5
|
+
</dependencies>
|
6
|
+
<objects>
|
7
|
+
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ScrollPageViewController">
|
8
|
+
<connections>
|
9
|
+
<outlet property="view" destination="2" id="3"/>
|
10
|
+
</connections>
|
11
|
+
</placeholder>
|
12
|
+
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
13
|
+
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2">
|
14
|
+
<rect key="frame" x="0.0" y="20" width="768" height="1004"/>
|
15
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
16
|
+
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
17
|
+
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackTranslucent"/>
|
18
|
+
</view>
|
19
|
+
</objects>
|
20
|
+
</document>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
//
|
2
|
+
// TablePageViewController.h
|
3
|
+
// RufusApp
|
4
|
+
//
|
5
|
+
// Created by Jeremy Stewart on 10/20/13.
|
6
|
+
// Copyright (c) 2013 Northwoods. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import <UIKit/UIKit.h>
|
10
|
+
|
11
|
+
@interface TablePageViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
|
12
|
+
{
|
13
|
+
NSArray *labels;
|
14
|
+
NSArray *unsorted;
|
15
|
+
}
|
16
|
+
|
17
|
+
@property (weak, nonatomic) IBOutlet UITableView *ascending;
|
18
|
+
@property (weak, nonatomic) IBOutlet UITableView *descending;
|
19
|
+
@property (weak, nonatomic) IBOutlet UILabel *sortedLabel;
|
20
|
+
@property (weak, nonatomic) IBOutlet UILabel *unsortedLabel;
|
21
|
+
@property (weak, nonatomic) IBOutlet UITableView *notSorted;
|
22
|
+
|
23
|
+
@end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
//
|
2
|
+
// TablePageViewController.m
|
3
|
+
// RufusApp
|
4
|
+
//
|
5
|
+
// Created by Jeremy Stewart on 10/20/13.
|
6
|
+
// Copyright (c) 2013 Northwoods. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import "TablePageViewController.h"
|
10
|
+
|
11
|
+
@interface TablePageViewController ()
|
12
|
+
|
13
|
+
@end
|
14
|
+
|
15
|
+
@implementation TablePageViewController
|
16
|
+
@synthesize ascending, descending, notSorted;
|
17
|
+
|
18
|
+
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
|
19
|
+
{
|
20
|
+
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
21
|
+
if (self) {
|
22
|
+
labels = [self makeLabels];
|
23
|
+
|
24
|
+
}
|
25
|
+
return self;
|
26
|
+
}
|
27
|
+
|
28
|
+
-(void)viewWillAppear:(BOOL)animated
|
29
|
+
{
|
30
|
+
[super viewWillAppear:animated];
|
31
|
+
[ascending setAccessibilityLabel:@"ascending"];
|
32
|
+
[descending setAccessibilityLabel:@"descending"];
|
33
|
+
[notSorted setAccessibilityLabel:@"notSorted"];
|
34
|
+
}
|
35
|
+
|
36
|
+
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
|
37
|
+
{
|
38
|
+
return 1;
|
39
|
+
}
|
40
|
+
|
41
|
+
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
42
|
+
{
|
43
|
+
return [labels count];
|
44
|
+
}
|
45
|
+
|
46
|
+
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
47
|
+
{
|
48
|
+
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
|
49
|
+
if (!cell) {
|
50
|
+
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
|
51
|
+
}
|
52
|
+
NSLog(@"%@", [tableView accessibilityLabel]);
|
53
|
+
|
54
|
+
if ([[tableView accessibilityLabel] isEqualToString:[ascending accessibilityLabel]]) {
|
55
|
+
UILabel *text = [labels objectAtIndex:[indexPath row]];
|
56
|
+
[[cell textLabel] setText:[text text]];
|
57
|
+
} else if ([[tableView accessibilityLabel] isEqualToString:[descending accessibilityLabel]]) {
|
58
|
+
UILabel *text = [labels objectAtIndex:([labels count] - 1) - [indexPath row]];
|
59
|
+
[[cell textLabel] setText:[text text]];
|
60
|
+
} else {
|
61
|
+
if ([indexPath row] % 2 == 0) {
|
62
|
+
[[cell textLabel] setText:@"x"];
|
63
|
+
} else {
|
64
|
+
[[cell textLabel] setText:@"j"];
|
65
|
+
}
|
66
|
+
|
67
|
+
}
|
68
|
+
|
69
|
+
return cell;
|
70
|
+
}
|
71
|
+
|
72
|
+
-(NSArray *) makeLabels
|
73
|
+
{
|
74
|
+
|
75
|
+
UILabel *one = [[UILabel alloc] init];
|
76
|
+
[one setText:@"1"];
|
77
|
+
UILabel *two = [[UILabel alloc] init];
|
78
|
+
[two setText:@"2"];
|
79
|
+
UILabel *three = [[UILabel alloc] init];
|
80
|
+
[three setText:@"3"];
|
81
|
+
|
82
|
+
UILabel *a = [[UILabel alloc] init];
|
83
|
+
[a setText:@"a"];
|
84
|
+
UILabel *b = [[UILabel alloc] init];
|
85
|
+
[b setText:@"b"];
|
86
|
+
UILabel *c = [[UILabel alloc] init];
|
87
|
+
[c setText:@"c"];
|
88
|
+
UILabel *d = [[UILabel alloc] init];
|
89
|
+
[d setText:@"d"];
|
90
|
+
UILabel *e = [[UILabel alloc] init];
|
91
|
+
[e setText:@"e"];
|
92
|
+
|
93
|
+
NSMutableArray *tableLabels = [[NSMutableArray alloc] init];
|
94
|
+
[tableLabels addObject:one];
|
95
|
+
[tableLabels addObject:two];
|
96
|
+
[tableLabels addObject:three];
|
97
|
+
[tableLabels addObject:a];
|
98
|
+
[tableLabels addObject:b];
|
99
|
+
[tableLabels addObject:c];
|
100
|
+
[tableLabels addObject:d];
|
101
|
+
[tableLabels addObject:e];
|
102
|
+
|
103
|
+
return tableLabels;
|
104
|
+
|
105
|
+
}
|
106
|
+
|
107
|
+
|
108
|
+
@end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="3.0" toolsVersion="4510" systemVersion="12F45" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES">
|
3
|
+
<dependencies>
|
4
|
+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
|
5
|
+
</dependencies>
|
6
|
+
<objects>
|
7
|
+
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TablePageViewController">
|
8
|
+
<connections>
|
9
|
+
<outlet property="ascending" destination="kZD-bA-3M9" id="9YH-ox-6m4"/>
|
10
|
+
<outlet property="descending" destination="bFd-cR-AnT" id="eBV-Hh-9s9"/>
|
11
|
+
<outlet property="notSorted" destination="uNl-JB-Y7y" id="qUm-f4-Dvn"/>
|
12
|
+
<outlet property="sortedLabel" destination="y3W-to-ma5" id="BFf-Dd-ctn"/>
|
13
|
+
<outlet property="unsortedLabel" destination="D79-jP-phq" id="KXO-Qp-Qgv"/>
|
14
|
+
<outlet property="view" destination="2" id="3"/>
|
15
|
+
</connections>
|
16
|
+
</placeholder>
|
17
|
+
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
18
|
+
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="2">
|
19
|
+
<rect key="frame" x="0.0" y="0.0" width="768" height="1004"/>
|
20
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
21
|
+
<subviews>
|
22
|
+
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="kZD-bA-3M9">
|
23
|
+
<rect key="frame" x="42" y="162" width="150" height="467"/>
|
24
|
+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
25
|
+
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
26
|
+
<connections>
|
27
|
+
<outlet property="dataSource" destination="-1" id="LFA-Si-hjw"/>
|
28
|
+
<outlet property="delegate" destination="-1" id="mZE-tT-AJ1"/>
|
29
|
+
</connections>
|
30
|
+
</tableView>
|
31
|
+
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Ascending" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="y3W-to-ma5">
|
32
|
+
<rect key="frame" x="69" y="114" width="81" height="21"/>
|
33
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
34
|
+
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
35
|
+
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
36
|
+
<nil key="highlightedColor"/>
|
37
|
+
</label>
|
38
|
+
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Unsorted" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SsI-ER-Hih">
|
39
|
+
<rect key="frame" x="294" y="114" width="71" height="21"/>
|
40
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
41
|
+
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
42
|
+
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
43
|
+
<nil key="highlightedColor"/>
|
44
|
+
</label>
|
45
|
+
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="bFd-cR-AnT">
|
46
|
+
<rect key="frame" x="503" y="162" width="150" height="467"/>
|
47
|
+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
48
|
+
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
49
|
+
<connections>
|
50
|
+
<outlet property="dataSource" destination="-1" id="xoA-JK-lwY"/>
|
51
|
+
<outlet property="delegate" destination="-1" id="Yuo-gb-oXe"/>
|
52
|
+
</connections>
|
53
|
+
</tableView>
|
54
|
+
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Descending" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="D79-jP-phq">
|
55
|
+
<rect key="frame" x="543" y="114" width="92" height="21"/>
|
56
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
57
|
+
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
58
|
+
<nil key="highlightedColor"/>
|
59
|
+
</label>
|
60
|
+
<tableView clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" alwaysBounceVertical="YES" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="uNl-JB-Y7y">
|
61
|
+
<rect key="frame" x="227" y="166" width="228" height="460"/>
|
62
|
+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
63
|
+
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
64
|
+
<connections>
|
65
|
+
<outlet property="dataSource" destination="-1" id="Oy2-GU-eZX"/>
|
66
|
+
<outlet property="delegate" destination="-1" id="LLv-JY-nfq"/>
|
67
|
+
</connections>
|
68
|
+
</tableView>
|
69
|
+
</subviews>
|
70
|
+
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
71
|
+
<accessibility key="accessibilityConfiguration" label="tableView"/>
|
72
|
+
<simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
|
73
|
+
</view>
|
74
|
+
</objects>
|
75
|
+
</document>
|
@@ -10,7 +10,9 @@
|
|
10
10
|
<outlet property="enabledPageButton" destination="8Xe-wy-gw2" id="mNp-pl-GZO"/>
|
11
11
|
<outlet property="existsPageButton" destination="ptK-30-J0y" id="eem-Ie-lJP"/>
|
12
12
|
<outlet property="rufusButton" destination="4" id="11"/>
|
13
|
+
<outlet property="scrollPageButton" destination="Trw-jM-66l" id="lPV-bJ-geS"/>
|
13
14
|
<outlet property="showAlertButton" destination="VTc-fX-2Iw" id="ndi-Zu-qSy"/>
|
15
|
+
<outlet property="tablePageButton" destination="dE6-Ap-U8w" id="rGg-Yd-dCs"/>
|
14
16
|
<outlet property="view" destination="2" id="3"/>
|
15
17
|
</connections>
|
16
18
|
</placeholder>
|
@@ -93,6 +95,28 @@
|
|
93
95
|
<action selector="toDisplayedPage:" destination="-1" eventType="touchUpInside" id="hho-oP-47b"/>
|
94
96
|
</connections>
|
95
97
|
</button>
|
98
|
+
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Trw-jM-66l">
|
99
|
+
<rect key="frame" x="315" y="472" width="132" height="30"/>
|
100
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
101
|
+
<accessibility key="accessibilityConfiguration" label="swipePageButton"/>
|
102
|
+
<state key="normal" title="Swipe Page Button">
|
103
|
+
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
104
|
+
</state>
|
105
|
+
<connections>
|
106
|
+
<action selector="toSwipePage:" destination="-1" eventType="touchUpInside" id="1Hg-Xm-nsi"/>
|
107
|
+
</connections>
|
108
|
+
</button>
|
109
|
+
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dE6-Ap-U8w">
|
110
|
+
<rect key="frame" x="318" y="510" width="126" height="30"/>
|
111
|
+
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
112
|
+
<accessibility key="accessibilityConfiguration" label="tablePageButton"/>
|
113
|
+
<state key="normal" title="Table Page Button">
|
114
|
+
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
115
|
+
</state>
|
116
|
+
<connections>
|
117
|
+
<action selector="toTablePage:" destination="-1" eventType="touchUpInside" id="hgd-Rn-c0B"/>
|
118
|
+
</connections>
|
119
|
+
</button>
|
96
120
|
</subviews>
|
97
121
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
98
122
|
<constraints>
|
data/features/rufus.feature
CHANGED
@@ -17,4 +17,16 @@ Feature: Using Rufus
|
|
17
17
|
Scenario: Getting page elements by class
|
18
18
|
Then I can get a list of the buttons
|
19
19
|
|
20
|
+
Scenario: Waiting for a view defined by a hash to be enabled
|
21
|
+
Given I have navigated to the "EnabledPage" using the "to_enabled" route
|
22
|
+
Then I can use a hash to wait for "enabledTextField" to become enabled
|
23
|
+
And I see that the "notEnabledTextField" is never enabled
|
20
24
|
|
25
|
+
Scenario: Waiting for a view defined by a hash to exist
|
26
|
+
Given I have navigated to the "ExistsPage" using the "to_exists" route
|
27
|
+
Then I can use a hash to wait for the "This Alert Exists" view to exist
|
28
|
+
|
29
|
+
Scenario: Waiting for a view defined by a hash to be displayed
|
30
|
+
Given I have navigated to the "DisplayedPage" using the "to_displayed" route
|
31
|
+
Then I can use a hash to wait for the "Mystery Label" to be displayed
|
32
|
+
And I see that the "Invisible Label" is never displayed
|
@@ -0,0 +1,10 @@
|
|
1
|
+
@swipe
|
2
|
+
Feature: Swiping the screen
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given I rotate the app to "portrait"
|
6
|
+
|
7
|
+
Scenario: Swiping to the right
|
8
|
+
Given I have navigated to the "ScrollPage" using the "to_scroll" route
|
9
|
+
When I scroll to the right on the view defined "Screen #3"
|
10
|
+
Then I can see I scrolled to the view named "Screen #3"
|
@@ -12,4 +12,19 @@ Then(/^I can get a list of the buttons$/) do
|
|
12
12
|
elements_of_type('UIAButton').each do |element|
|
13
13
|
element.class.name.should eq('Selenium::WebDriver::Element')
|
14
14
|
end
|
15
|
+
end
|
16
|
+
Then(/^I can use a hash to wait for "([^"]*)" to become enabled$/) do |which|
|
17
|
+
enabled_hash_after_wait?(:name => "#{which}").should be_true
|
18
|
+
end
|
19
|
+
Then(/^I can use a hash to wait for the "([^"]*)" view to exist$/) do |which|
|
20
|
+
exists_hash_after_wait?(:name => "#{which}").should be_true
|
21
|
+
end
|
22
|
+
Then(/^I can use a hash to wait for the "([^"]*)" to be displayed$/) do |which|
|
23
|
+
displayed_hash_after_wait?(:name => "#{which}").should be_true
|
24
|
+
end
|
25
|
+
When(/^I see that the "([^"]*)" is never displayed$/) do |which|
|
26
|
+
displayed_hash_after_wait?(:name => "#{which}").should be_false
|
27
|
+
end
|
28
|
+
When(/^I see that the "([^"]*)" is never enabled$/) do |which|
|
29
|
+
enabled_hash_after_wait?(:name => "#{which}").should be_false
|
15
30
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Then(/^I see the table defined "([^"]*)" is( not)? sorted$/) do |which, unsorted|
|
2
|
+
on(TablePage).send("view_#{which}_view").sorted?.should == unsorted.nil?
|
3
|
+
end
|
4
|
+
Then(/^I can see all the children for the view defined "([^"]*)"$/) do |which|
|
5
|
+
children = on(TablePage).send("view_#{which}_view").children
|
6
|
+
children[0].attribute('name').should eq '1'
|
7
|
+
children[1].attribute('name').should eq '2'
|
8
|
+
children[2].attribute('name').should eq '3'
|
9
|
+
children[3].attribute('name').should eq 'a'
|
10
|
+
children[4].attribute('name').should eq 'b'
|
11
|
+
children[5].attribute('name').should eq 'c'
|
12
|
+
children[6].attribute('name').should eq 'd'
|
13
|
+
children[7].attribute('name').should eq 'e'
|
14
|
+
end
|
data/features/support/routes.rb
CHANGED
@@ -11,6 +11,8 @@ class HomePage
|
|
11
11
|
button(:view_exists, :name => 'existsButton')
|
12
12
|
button(:view_displayed, :name => 'displayedPageButton')
|
13
13
|
button(:view_enabled, :name => 'enabledPageButton')
|
14
|
+
button(:view_scroll, :name => 'swipePageButton')
|
15
|
+
button(:view_tables, :name => 'tablePageButton')
|
14
16
|
button(:alert_Ok, :name => 'Ok')
|
15
17
|
button(:alert_Cancel, :name => 'Cancel')
|
16
18
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rufus'
|
2
|
+
|
3
|
+
class TablePage
|
4
|
+
include Rufus
|
5
|
+
|
6
|
+
table(:view_ascending, :name => 'ascending')
|
7
|
+
table(:view_descending, :name => 'descending')
|
8
|
+
table(:view_unsorted, :name => 'notSorted')
|
9
|
+
|
10
|
+
def active?
|
11
|
+
exists_after_wait? view_ascending_view
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
@table
|
2
|
+
Feature: dealing with tables
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given I have navigated to the "TablePage" using the "to_tables" route
|
6
|
+
|
7
|
+
Scenario: Checking the sort
|
8
|
+
Then I see the table defined "ascending" is sorted
|
9
|
+
And I see the table defined "descending" is sorted
|
10
|
+
And I see the table defined "unsorted" is not sorted
|
11
|
+
|
12
|
+
Scenario: Getting the child elements
|
13
|
+
Then I can see all the children for the view defined "ascending"
|
data/features/view.feature
CHANGED
@@ -31,7 +31,7 @@ Feature: Interacting with views
|
|
31
31
|
Given I have navigated to the "EnabledPage" using the "to_enabled" route
|
32
32
|
Then I am on the "EnabledPage"
|
33
33
|
And the view marked "not_enabled" is not enabled
|
34
|
-
|
34
|
+
|
35
35
|
Scenario: Calling views in a block
|
36
36
|
Given I am on the "HomePage"
|
37
37
|
Then in a block can see the existence of views "rufus", "exists" and "displayed"
|
data/lib/rufus.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rufus/navigation'
|
2
2
|
require 'rufus/accessors/accessors'
|
3
3
|
require 'rufus/accessors/view'
|
4
|
+
require 'rufus/accessors/table'
|
4
5
|
|
5
6
|
module Rufus
|
6
7
|
|
@@ -38,6 +39,21 @@ module Rufus
|
|
38
39
|
true
|
39
40
|
end
|
40
41
|
|
42
|
+
def enabled_hash_after_wait?(locator, timeout = 5)
|
43
|
+
element = find locator
|
44
|
+
enabled_after_wait? element, timeout
|
45
|
+
end
|
46
|
+
|
47
|
+
def exists_hash_after_wait?(locator, timeout = 5)
|
48
|
+
view = Rufus::Accessors::View.new locator
|
49
|
+
exists_after_wait? view, timeout
|
50
|
+
end
|
51
|
+
|
52
|
+
def displayed_hash_after_wait?(locator, timeout = 5)
|
53
|
+
view = Rufus::Accessors::View.new locator
|
54
|
+
displayed_after_wait? view, timeout
|
55
|
+
end
|
56
|
+
|
41
57
|
def find(locator)
|
42
58
|
selenium.find(locator)
|
43
59
|
end
|
@@ -54,6 +70,11 @@ module Rufus
|
|
54
70
|
selenium.elements_by_tag(type)
|
55
71
|
end
|
56
72
|
|
73
|
+
def scroll_to(locator)
|
74
|
+
selenium.scroll_to(locator)
|
75
|
+
end
|
57
76
|
end
|
58
77
|
|
59
78
|
|
79
|
+
|
80
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rufus/accessors/view'
|
2
|
+
|
3
|
+
module Rufus
|
4
|
+
module Accessors
|
5
|
+
class Table < View
|
6
|
+
|
7
|
+
def children
|
8
|
+
selenium.cells locator
|
9
|
+
end
|
10
|
+
|
11
|
+
def sorted?
|
12
|
+
elements_sorted children
|
13
|
+
end
|
14
|
+
|
15
|
+
def sorted_ascending?
|
16
|
+
ascending? children
|
17
|
+
end
|
18
|
+
|
19
|
+
def sorted_descending?
|
20
|
+
descending? children
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def elements_sorted(elements)
|
26
|
+
return true if elements.count == 1
|
27
|
+
descending? elements or ascending? elements
|
28
|
+
end
|
29
|
+
|
30
|
+
def descending?(elements)
|
31
|
+
labels = elements.map{|element| element.attribute 'name'}
|
32
|
+
elements = elements.map{|element| element.attribute 'name'}
|
33
|
+
elements == labels.sort.reverse
|
34
|
+
end
|
35
|
+
|
36
|
+
def ascending?(elements)
|
37
|
+
labels = elements.map{|element| element.attribute 'name'}
|
38
|
+
elements = elements.map{|element| element.attribute 'name'}
|
39
|
+
elements == labels.sort
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def element_names(elements)
|
44
|
+
elements.map{|element| element.attribute 'name'}
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/rufus/driver.rb
CHANGED
@@ -41,6 +41,12 @@ module Rufus
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
def cells(locator)
|
45
|
+
element = find(locator)
|
46
|
+
raise 'Expected view to be of type UIATableView' unless element.tag_name.eql? 'UIATableView'
|
47
|
+
element.find_elements(:tag_name, 'UIATableCell')
|
48
|
+
end
|
49
|
+
|
44
50
|
def click(locator)
|
45
51
|
find(locator).click
|
46
52
|
end
|
@@ -161,6 +167,11 @@ module Rufus
|
|
161
167
|
driver.find_elements(:tag_name, name)
|
162
168
|
end
|
163
169
|
|
170
|
+
def scroll_to(locator)
|
171
|
+
id = find(locator).ref
|
172
|
+
driver.execute_script 'mobile: scrollTo', {'element' => id}
|
173
|
+
end
|
174
|
+
|
164
175
|
private
|
165
176
|
|
166
177
|
def url(config)
|
data/rakefile
CHANGED
@@ -26,7 +26,7 @@ end
|
|
26
26
|
|
27
27
|
desc "Run the features"
|
28
28
|
task :features do
|
29
|
-
`bundle exec cucumber
|
29
|
+
`bundle exec cucumber 1>&2`
|
30
30
|
end
|
31
31
|
|
32
32
|
desc "Starting the appium server"
|
@@ -88,3 +88,6 @@ task :reset_sim do
|
|
88
88
|
APPLESCRIPT}
|
89
89
|
end
|
90
90
|
|
91
|
+
desc "Deploy new build to simulator"
|
92
|
+
task :deploy => [:reset_sim, :build_sim, :install_sim]
|
93
|
+
|
data/rufus.gemspec
CHANGED
@@ -350,5 +350,57 @@ describe Rufus::Driver do
|
|
350
350
|
end
|
351
351
|
end
|
352
352
|
end
|
353
|
+
context 'scrolling' do
|
354
|
+
|
355
|
+
let(:yaml){double('YAML loader')}
|
356
|
+
let(:mock_driver){'a mock app driver'}
|
357
|
+
let(:url){'http://127.0.0.1:4723/wd/hub'}
|
358
|
+
let(:mock_element){'mock selenium element'}
|
359
|
+
let(:swipe_options){{'element' => 1}}
|
360
|
+
before(:each) do
|
361
|
+
File.stub(:exists?).and_return(true)
|
362
|
+
@config = {"browser_name" =>"iOS", "platform"=>"Mac", "version"=>"6.1", "app"=>"/Users/app/path/rufus.app", "use_physical" => false}
|
363
|
+
YAML.should_receive(:load).and_return(@config)
|
364
|
+
@driver = Rufus::Driver.new
|
365
|
+
end
|
366
|
+
|
367
|
+
it 'can scroll to a view' do
|
368
|
+
Rufus::Drivers::IOS_Simulator.should_receive(:for).with(@config, url).and_return(mock_driver)
|
369
|
+
mock_driver.should_receive(:find_element).with(:name, 'elementName').and_return(mock_element)
|
370
|
+
mock_element.should_receive(:ref).and_return(1)
|
371
|
+
mock_driver.should_receive(:execute_script).with('mobile: scrollTo', swipe_options)
|
372
|
+
@driver.scroll_to(:name => 'elementName')
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
context 'finding child elements of table view' do
|
377
|
+
|
378
|
+
let(:yaml){double('YAML loader')}
|
379
|
+
let(:mock_driver){'a mock app driver'}
|
380
|
+
let(:url){'http://127.0.0.1:4723/wd/hub'}
|
381
|
+
let(:mock_element){'mock selenium element'}
|
382
|
+
let(:children){'mock tableview children'}
|
383
|
+
|
384
|
+
before(:each) do
|
385
|
+
File.stub(:exists?).and_return(true)
|
386
|
+
@config = {"browser_name" =>"iOS", "platform"=>"Mac", "version"=>"6.1", "app"=>"/Users/app/path/rufus.app", "use_physical" => false}
|
387
|
+
YAML.should_receive(:load).and_return(@config)
|
388
|
+
@driver = Rufus::Driver.new
|
389
|
+
Rufus::Drivers::IOS_Simulator.should_receive(:for).with(@config, url).and_return(mock_driver)
|
390
|
+
mock_driver.should_receive(:find_element).with(:name, 'elementName').and_return(mock_element)
|
391
|
+
end
|
392
|
+
|
393
|
+
it 'returns no elements if element is not table view' do
|
394
|
+
mock_element.should_receive(:tag_name).and_return('UIStaticText')
|
395
|
+
expect{@driver.cells(:name => 'elementName')}.to raise_error(RuntimeError, 'Expected view to be of type UIATableView')
|
396
|
+
end
|
397
|
+
|
398
|
+
it 'can find a list of child elements' do
|
399
|
+
mock_element.should_receive(:tag_name).and_return('UIATableView')
|
400
|
+
mock_element.should_receive(:find_elements).with(:tag_name, 'UIATableCell').and_return(children)
|
401
|
+
@driver.cells(:name => 'elementName').should == children
|
402
|
+
end
|
403
|
+
end
|
353
404
|
end
|
354
405
|
end
|
406
|
+
|
data/spec/rufus_spec.rb
CHANGED
@@ -112,4 +112,12 @@ describe Rufus do
|
|
112
112
|
end
|
113
113
|
|
114
114
|
end
|
115
|
+
|
116
|
+
context 'scrolling' do
|
117
|
+
let(:selenium){'mock selenium driver'}
|
118
|
+
it 'can swipe to the right' do
|
119
|
+
selenium.should_receive(:scroll_to).with(:name => 'elementName')
|
120
|
+
scroll_to(:name => 'elementName')
|
121
|
+
end
|
122
|
+
end
|
115
123
|
end
|
data/spec/table_spec.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rufus/accessors/table'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Rufus::Accessors::Table do
|
5
|
+
|
6
|
+
|
7
|
+
context 'getting child elements' do
|
8
|
+
|
9
|
+
let(:table) {Rufus::Accessors::Table.new(:name => 'testTable')}
|
10
|
+
let(:selenium){double('Selenium::WebDriver')}
|
11
|
+
let(:mock_child_elements){double('list of child elements')}
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
table.should_receive(:selenium).and_return(selenium)
|
15
|
+
selenium.should_receive(:cells).with(:name => 'testTable').and_return(mock_child_elements)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'can get all the child elements of the table' do
|
19
|
+
table.children.should eq mock_child_elements
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'determining sort' do
|
23
|
+
|
24
|
+
let(:first_element){'first child element'}
|
25
|
+
let(:second_element){'second child element'}
|
26
|
+
let(:third_element){'third child element'}
|
27
|
+
|
28
|
+
it 'is considered sorted for one child' do
|
29
|
+
mock_child_elements.should_receive(:count).and_return 1
|
30
|
+
table.sorted?.should be_true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rufus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.6'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Stewart
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: page_navigation
|
@@ -304,6 +304,15 @@ files:
|
|
304
304
|
- RufusApp/RufusApp/RufusPageViewController.h
|
305
305
|
- RufusApp/RufusApp/RufusPageViewController.m
|
306
306
|
- RufusApp/RufusApp/RufusPageViewController.xib
|
307
|
+
- RufusApp/RufusApp/ScrollChildViewController.h
|
308
|
+
- RufusApp/RufusApp/ScrollChildViewController.m
|
309
|
+
- RufusApp/RufusApp/ScrollChildViewController.xib
|
310
|
+
- RufusApp/RufusApp/ScrollPageViewController.h
|
311
|
+
- RufusApp/RufusApp/ScrollPageViewController.m
|
312
|
+
- RufusApp/RufusApp/ScrollPageViewController.xib
|
313
|
+
- RufusApp/RufusApp/TablePageViewController.h
|
314
|
+
- RufusApp/RufusApp/TablePageViewController.m
|
315
|
+
- RufusApp/RufusApp/TablePageViewController.xib
|
307
316
|
- RufusApp/RufusApp/en.lproj/InfoPlist.strings
|
308
317
|
- RufusApp/RufusApp/en.lproj/RUViewController.xib
|
309
318
|
- RufusApp/RufusApp/main.m
|
@@ -315,9 +324,12 @@ files:
|
|
315
324
|
- features/alert.feature
|
316
325
|
- features/driver.feature
|
317
326
|
- features/rufus.feature
|
327
|
+
- features/scroll.feature
|
318
328
|
- features/step_definitions/alert_steps.rb.rb
|
319
329
|
- features/step_definitions/driver_steps.rb
|
320
330
|
- features/step_definitions/rufus_steps.rb
|
331
|
+
- features/step_definitions/scroll_steps.rb
|
332
|
+
- features/step_definitions/table_steps.rb
|
321
333
|
- features/step_definitions/view_steps.rb
|
322
334
|
- features/support/core_ext/string.rb
|
323
335
|
- features/support/env.rb
|
@@ -328,9 +340,13 @@ files:
|
|
328
340
|
- features/support/screens/exists_page.rb
|
329
341
|
- features/support/screens/home_page.rb
|
330
342
|
- features/support/screens/rufus_page.rb
|
343
|
+
- features/support/screens/scroll_page.rb
|
344
|
+
- features/support/screens/table_page.rb
|
345
|
+
- features/table.feature
|
331
346
|
- features/view.feature
|
332
347
|
- lib/rufus.rb
|
333
348
|
- lib/rufus/accessors/accessors.rb
|
349
|
+
- lib/rufus/accessors/table.rb
|
334
350
|
- lib/rufus/accessors/view.rb
|
335
351
|
- lib/rufus/driver.rb
|
336
352
|
- lib/rufus/drivers/iOS_device.rb
|
@@ -345,6 +361,7 @@ files:
|
|
345
361
|
- spec/navigation_spec.rb
|
346
362
|
- spec/rufus_spec.rb
|
347
363
|
- spec/spec_helper.rb
|
364
|
+
- spec/table_spec.rb
|
348
365
|
- spec/view_spec.rb
|
349
366
|
homepage: https://github.com/jlstewart379/rufus
|
350
367
|
licenses:
|