diff --git a/.gitmodules b/.gitmodules index e8c42f13b..e69de29bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "sdk/externals/OpenUDID"] - path = sdk/externals/OpenUDID - url = https://github.com/ylechelle/OpenUDID.git diff --git a/BinaryProjects/ANSDK.xcodeproj/project.pbxproj b/BinaryProjects/ANSDK.xcodeproj/project.pbxproj index 07d09e4d7..b33a2779f 100644 --- a/BinaryProjects/ANSDK.xcodeproj/project.pbxproj +++ b/BinaryProjects/ANSDK.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 8A4FF3AA1A2F8CC10000E4CC /* an_arrow_right@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8A4FF3A91A2F8CC10000E4CC /* an_arrow_right@3x.png */; }; 8A4FF3AD1A2F8CE50000E4CC /* an_arrow_right@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8A4FF3AB1A2F8CE50000E4CC /* an_arrow_right@2x.png */; }; 8A4FF3AE1A2F8CE50000E4CC /* an_arrow_right.png in Resources */ = {isa = PBXBuildFile; fileRef = 8A4FF3AC1A2F8CE50000E4CC /* an_arrow_right.png */; }; + 8A56E67C1B264DC200642ACC /* ANAdAdapterNativeAdColony.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A56E67B1B264DC200642ACC /* ANAdAdapterNativeAdColony.m */; }; 8A598F8B1A1EA061009BA879 /* ANNativeStandardAdResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A598F881A1EA061009BA879 /* ANNativeStandardAdResponse.h */; settings = {ATTRIBUTES = (Private, ); }; }; 8A598F8C1A1EA061009BA879 /* ANNativeStandardAdResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A598F891A1EA061009BA879 /* ANNativeStandardAdResponse.m */; }; 8A598F8D1A1EA061009BA879 /* ANNativeStandardAdResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A598F891A1EA061009BA879 /* ANNativeStandardAdResponse.m */; }; @@ -584,6 +585,8 @@ 8A4FF3A91A2F8CC10000E4CC /* an_arrow_right@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "an_arrow_right@3x.png"; sourceTree = ""; }; 8A4FF3AB1A2F8CE50000E4CC /* an_arrow_right@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "an_arrow_right@2x.png"; sourceTree = ""; }; 8A4FF3AC1A2F8CE50000E4CC /* an_arrow_right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = an_arrow_right.png; sourceTree = ""; }; + 8A56E67A1B264DC200642ACC /* ANAdAdapterNativeAdColony.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterNativeAdColony.h; sourceTree = ""; }; + 8A56E67B1B264DC200642ACC /* ANAdAdapterNativeAdColony.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterNativeAdColony.m; sourceTree = ""; }; 8A598F881A1EA061009BA879 /* ANNativeStandardAdResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANNativeStandardAdResponse.h; sourceTree = ""; }; 8A598F891A1EA061009BA879 /* ANNativeStandardAdResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANNativeStandardAdResponse.m; sourceTree = ""; }; 8A6514701A12DB31003F1047 /* UIView+ANNativeAdCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+ANNativeAdCategory.h"; sourceTree = ""; }; @@ -654,6 +657,7 @@ 8A9AED8C1A1BE84F00C58BDA /* AppNexusSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppNexusSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8A9AED8F1A1BE84F00C58BDA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8A9AED901A1BE84F00C58BDA /* AppNexusSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppNexusSDK.h; sourceTree = ""; }; + 8A9FB0131B29F97A004EAC63 /* libInMobi-4.5.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libInMobi-4.5.3.a"; sourceTree = ""; }; 8AA5B4C41AA8B4A500522E1C /* libANSDKInMobiAdapter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libANSDKInMobiAdapter.a; sourceTree = BUILT_PRODUCTS_DIR; }; 8AA5B4CE1AA8B72C00522E1C /* ANAdAdapterBannerInMobi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterBannerInMobi.h; sourceTree = ""; }; 8AA5B4CF1AA8B72C00522E1C /* ANAdAdapterBannerInMobi.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterBannerInMobi.m; sourceTree = ""; }; @@ -668,7 +672,6 @@ 8AA5B4D91AA8B72C00522E1C /* IMNativeDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IMNativeDelegate.h; sourceTree = ""; }; 8AA5B4DA1AA8B72C00522E1C /* InMobi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InMobi.h; sourceTree = ""; }; 8AA5B4DB1AA8B72C00522E1C /* InMobiAnalytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InMobiAnalytics.h; sourceTree = ""; }; - 8AA5B4DC1AA8B72C00522E1C /* libInMobi-4.5.1.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libInMobi-4.5.1.a"; sourceTree = ""; }; 8AA5B4DF1AA8B74E00522E1C /* ANAdAdapterInterstitialInMobi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterInterstitialInMobi.h; sourceTree = ""; }; 8AA5B4E01AA8B74E00522E1C /* ANAdAdapterInterstitialInMobi.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANAdAdapterInterstitialInMobi.m; sourceTree = ""; }; 8AA5B4E11AA8B74E00522E1C /* ANAdAdapterNativeInMobi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANAdAdapterNativeInMobi.h; sourceTree = ""; }; @@ -1004,6 +1007,8 @@ 8A8DEF891AD58EC900742AD7 /* ANAdAdapterBaseAdColony+PrivateMethods.h */, 8A8E0FDC1AD432B7004C5C50 /* ANAdAdapterInterstitialAdColony.h */, 8A8E0FDD1AD432B7004C5C50 /* ANAdAdapterInterstitialAdColony.m */, + 8A56E67A1B264DC200642ACC /* ANAdAdapterNativeAdColony.h */, + 8A56E67B1B264DC200642ACC /* ANAdAdapterNativeAdColony.m */, ); name = AdColony; path = ../mediation/mediatedviews/AdColony; @@ -1217,7 +1222,7 @@ 8AA5B4D91AA8B72C00522E1C /* IMNativeDelegate.h */, 8AA5B4DA1AA8B72C00522E1C /* InMobi.h */, 8AA5B4DB1AA8B72C00522E1C /* InMobiAnalytics.h */, - 8AA5B4DC1AA8B72C00522E1C /* libInMobi-4.5.1.a */, + 8A9FB0131B29F97A004EAC63 /* libInMobi-4.5.3.a */, ); path = InMobiSDK; sourceTree = ""; @@ -2215,6 +2220,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 8A56E67C1B264DC200642ACC /* ANAdAdapterNativeAdColony.m in Sources */, 8A8E0FDE1AD432B7004C5C50 /* ANAdAdapterBaseAdColony.m in Sources */, 8A8E0FDF1AD432B7004C5C50 /* ANAdAdapterInterstitialAdColony.m in Sources */, ); diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 66903d342..b77c3ed2d 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,3 +1,39 @@ +## RC 2.3 + +### Bug fixes: + ++ MS-1219 Removed OpenUDID dependency + ++ MS-1265 Move location of kANAdFetcherDidReceiveResponseNotification + ++ MS-1267 Testing improvements + +### New mediation adapters: + ++ MS-1107 AdColony Native + +### Contains the following mediated SDKs: + ++ AdMob SDK Version 7.3.1 + ++ Amazon SDK Version 2.2.8 + ++ Facebook SDK Version 4.2.0 + ++ Millennial Media SDK Version 5.4.1 + ++ MoPub SDK Version 3.8.0 + ++ InMobi SDK Version 4.5.3 + ++ VDOPIA Lightweight SDK Version 4 + ++ Vungle SDK 3.0.13 + ++ AdColony SDK 2.5.1 + ++ Chartboost SDK 5.4.0 + ## RC 2.2 ### Feature additions: diff --git a/mediation/mediatedviews/AdColony/ANAdAdapterBaseAdColony.h b/mediation/mediatedviews/AdColony/ANAdAdapterBaseAdColony.h index 20b1e54e3..54725c753 100644 --- a/mediation/mediatedviews/AdColony/ANAdAdapterBaseAdColony.h +++ b/mediation/mediatedviews/AdColony/ANAdAdapterBaseAdColony.h @@ -13,7 +13,11 @@ limitations under the License. */ -#import +#import + +// Can be used to query ANNativeAdResponse customElements for native ads from AdColony +// Returns AdColonyNativeAdView +extern NSString *const kANAdAdapterNativeAdColonyVideoView; @interface ANAdAdapterBaseAdColony : NSObject diff --git a/mediation/mediatedviews/AdColony/ANAdAdapterNativeAdColony.h b/mediation/mediatedviews/AdColony/ANAdAdapterNativeAdColony.h new file mode 100644 index 000000000..50f4eea5a --- /dev/null +++ b/mediation/mediatedviews/AdColony/ANAdAdapterNativeAdColony.h @@ -0,0 +1,21 @@ +/* Copyright 2015 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "ANNativeCustomAdapter.h" +#import "ANAdAdapterBaseAdColony.h" + +@interface ANAdAdapterNativeAdColony : NSObject + +@end \ No newline at end of file diff --git a/mediation/mediatedviews/AdColony/ANAdAdapterNativeAdColony.m b/mediation/mediatedviews/AdColony/ANAdAdapterNativeAdColony.m new file mode 100644 index 000000000..8869e9dec --- /dev/null +++ b/mediation/mediatedviews/AdColony/ANAdAdapterNativeAdColony.m @@ -0,0 +1,173 @@ +/* Copyright 2015 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "ANAdAdapterNativeAdColony.h" +#import "ANAdAdapterBaseAdColony+PrivateMethods.h" +#import "ANLogging.h" +#import +#import + +#import "UIView+ANCategory.h" + +NSString *const kANAdAdapterNativeAdColonyVideoView = @"ANAdAdapterNativeAdColonyVideoView"; + +#pragma mark - ANAdColonyViewController + +@interface ANAdColonyViewController : UIViewController + +@property (nonatomic, readwrite, weak) UIViewController *rootViewController; + +@end + +@implementation ANAdColonyViewController + +- (void)presentViewController:(UIViewController *)viewControllerToPresent + animated:(BOOL)flag + completion:(void (^)(void))completion { + [self.rootViewController presentViewController:viewControllerToPresent + animated:flag + completion:completion]; +} + +- (void)dismissViewControllerAnimated:(BOOL)flag + completion:(void (^)(void))completion { + [self.rootViewController dismissViewControllerAnimated:flag + completion:completion]; +} + +@end + +#pragma mark - ANAdAdapterNativeAdColony + +@interface ANAdAdapterNativeAdColony () + +@property (nonatomic, readwrite, strong) ANAdColonyViewController *proxyViewController; + +@end + +@implementation ANAdAdapterNativeAdColony + +@synthesize requestDelegate = _requestDelegate; +@synthesize nativeAdDelegate = _nativeAdDelegate; +@synthesize expired = _expired; + +- (void)requestNativeAdWithServerParameter:(NSString *)parameterString + adUnitId:(NSString *)adUnitId + targetingParameters:(ANTargetingParameters *)targetingParameters { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + [ANAdAdapterBaseAdColony setAdColonyTargetingWithTargetingParameters:targetingParameters]; + AdColonyNativeAdView *nativeAdView = [AdColony getNativeAdForZone:adUnitId + presentingViewController:self.proxyViewController]; + if (nativeAdView) { + ANNativeMediatedAdResponse *adResponse = [self adResponseFromNativeAdView:nativeAdView]; + [self.requestDelegate didLoadNativeAd:adResponse]; + } else { + ADCOLONY_ZONE_STATUS zoneStatus = [AdColony zoneStatusForZone:adUnitId]; + ANAdResponseCode errorCode = ANAdResponseInternalError; + switch (zoneStatus) { + case ADCOLONY_ZONE_STATUS_NO_ZONE: + errorCode = ANAdResponseInvalidRequest; + break; + case ADCOLONY_ZONE_STATUS_OFF: + errorCode = ANAdResponseInvalidRequest; + break; + case ADCOLONY_ZONE_STATUS_LOADING: + errorCode = ANAdResponseUnableToFill; + break; + case ADCOLONY_ZONE_STATUS_UNKNOWN: + errorCode = ANAdResponseInternalError; + break; + default: + ANLogDebug(@"%@ %@ | Unhandled AdColony Zone Status: %ld", NSStringFromClass([self class]), NSStringFromSelector(_cmd), (long)zoneStatus); + errorCode = ANAdResponseInternalError; + break; + } + [self.requestDelegate didFailToLoadNativeAd:errorCode]; + } +} + +- (ANNativeMediatedAdResponse *)adResponseFromNativeAdView:(AdColonyNativeAdView *)nativeAdView { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + ANNativeMediatedAdResponse *adResponse = [[ANNativeMediatedAdResponse alloc] initWithCustomAdapter:self + networkCode:ANNativeAdNetworkCodeAdColony]; + adResponse.title = nativeAdView.adTitle; + adResponse.body = nativeAdView.adDescription; + adResponse.iconImage = nativeAdView.advertiserIcon; + + NSMutableDictionary *mutableCustomElements = [[NSMutableDictionary alloc] init]; + if (nativeAdView.advertiserName) { + mutableCustomElements[kANAdAdapterNativeAdColonyVideoView] = nativeAdView; + } + adResponse.customElements = [mutableCustomElements copy]; + + return adResponse; +} + +- (void)registerViewForImpressionTrackingAndClickHandling:(UIView *)view + withRootViewController:(UIViewController *)rvc + clickableViews:(NSArray *)clickableViews { + self.proxyViewController.rootViewController = rvc; +} + +- (ANAdColonyViewController *)proxyViewController { + if (!_proxyViewController) _proxyViewController = [[ANAdColonyViewController alloc] init]; + return _proxyViewController; +} + +#pragma mark - AdColonyNativeAdDelegate + +- (void)onAdColonyNativeAdStarted:(AdColonyNativeAdView *)ad { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + // Do nothing +} + +- (void)onAdColonyNativeAdExpanded:(AdColonyNativeAdView *)ad { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + [self.nativeAdDelegate adWasClicked]; + [self.nativeAdDelegate willPresentAd]; + [self.nativeAdDelegate didPresentAd]; +} + +- (void)onAdColonyNativeAdFinished:(AdColonyNativeAdView *)ad + expanded:(BOOL)expanded { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + if (expanded) { + [self.nativeAdDelegate willCloseAd]; + [self.nativeAdDelegate didCloseAd]; + } +} + +- (void)onAdColonyNativeAd:(AdColonyNativeAdView *)ad + finishedWithInfo:(AdColonyAdInfo *)info + expanded:(BOOL)expanded { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + if (expanded) { + [self.nativeAdDelegate willCloseAd]; + [self.nativeAdDelegate didCloseAd]; + } +} + +- (void)onAdColonyNativeAd:(AdColonyNativeAdView *)ad + muted:(BOOL)muted { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + // Do nothing +} + +- (void)onAdColonyNativeAdEngagementPressed:(AdColonyNativeAdView *)ad { + ANLogTrace(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); + [self.nativeAdDelegate adWasClicked]; +} + +@end \ No newline at end of file diff --git a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/AdColony b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/AdColony index 60ca01244..ae619a761 100755 Binary files a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/AdColony and b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/AdColony differ diff --git a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColony.h b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColony.h index a2a686e4e..451a9c0a0 100755 --- a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColony.h +++ b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColony.h @@ -15,13 +15,13 @@ /** * Enum for zone status */ -typedef enum { +typedef NS_ENUM(NSUInteger, ADCOLONY_ZONE_STATUS) { ADCOLONY_ZONE_STATUS_NO_ZONE = 0, /**< AdColony has not been configured with that zone ID. */ ADCOLONY_ZONE_STATUS_OFF, /**< The zone has been turned off on the [Control Panel](http://clients.adcolony.com). */ ADCOLONY_ZONE_STATUS_LOADING, /**< The zone is preparing ads for display. */ ADCOLONY_ZONE_STATUS_ACTIVE, /**< The zone has completed preparing ads for display. */ ADCOLONY_ZONE_STATUS_UNKNOWN /**< AdColony has not yet received the zone's configuration from the server. */ -} ADCOLONY_ZONE_STATUS; +}; #pragma mark - #pragma mark Forward declarations diff --git a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyAdInfo.h b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyAdInfo.h index f2d21fb60..8d5a3c686 100755 --- a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyAdInfo.h +++ b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyAdInfo.h @@ -53,7 +53,7 @@ typedef enum { @property (nonatomic, readonly) NSString *iapProductID; /** - * The number of items the user wishes to purchase. + * The number of items to be purchased. * @param iapQuantity An int denoting the number of items the user wishes to purchase. */ @property (nonatomic, readonly) int iapQuantity; diff --git a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyNativeAdView.h b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyNativeAdView.h index 7f475a9f5..c85717056 100755 --- a/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyNativeAdView.h +++ b/mediation/mediatedviews/AdColony/AdColonySDK/AdColony.framework/Versions/A/Headers/AdColonyNativeAdView.h @@ -68,7 +68,7 @@ * Use this property to access the UIButton and customize anything about it except its title text and tap action. * @param engagementButton The engagement button that is already embedded within this ad. */ -@property (nonatomic) UIButton* engagementButton; +@property (nonatomic, readonly) UIButton* engagementButton; /** * Returns the recommended height for the AdColonyNativeAdView if it will be displayed at the specified width. @@ -161,4 +161,10 @@ * @param muted Whether the ad was muted or unmuted. */ -(void)onAdColonyNativeAd:(AdColonyNativeAdView*)ad muted:(BOOL)muted; + +/** + * Notifies your app that a user has engaged with the native ad via an in-video engagement mechanism. + * @param ad The affected native ad view. + */ +-(void)onAdColonyNativeAdEngagementPressed:(AdColonyNativeAdView*)ad; @end diff --git a/mediation/mediatedviews/Amazon/AmazonSDK/AmazonAd.framework/Versions/A/AmazonAd b/mediation/mediatedviews/Amazon/AmazonSDK/AmazonAd.framework/Versions/A/AmazonAd index ed71919b2..21f6f2136 100644 Binary files a/mediation/mediatedviews/Amazon/AmazonSDK/AmazonAd.framework/Versions/A/AmazonAd and b/mediation/mediatedviews/Amazon/AmazonSDK/AmazonAd.framework/Versions/A/AmazonAd differ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Chartboost b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Chartboost index edf4a034d..27f108c28 100644 Binary files a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Chartboost and b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Chartboost differ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBAnalytics.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBAnalytics.h index ec91be6f9..54a1849b3 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBAnalytics.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBAnalytics.h @@ -1,7 +1,7 @@ /* * CBAnalytics.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBInPlay.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBInPlay.h index 8d9308c7d..655ec88b6 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBInPlay.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBInPlay.h @@ -1,7 +1,7 @@ /* * CBInPlay.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsBadge.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsBadge.h index 79d4f7f22..57a50b371 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsBadge.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsBadge.h @@ -1,7 +1,7 @@ /* * CBMoreAppsBadge.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsButton.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsButton.h index 81fbadab2..705dc8050 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsButton.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBMoreAppsButton.h @@ -1,7 +1,7 @@ /* * CBMoreAppsButton.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeed.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeed.h index 4c4b037c6..829597bf7 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeed.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeed.h @@ -1,7 +1,7 @@ /* * CBNewsfeed.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeedUI.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeedUI.h index 9f6b50259..a6de5d5e2 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeedUI.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBNewsfeedUI.h @@ -1,7 +1,7 @@ /* * CBNewsfeedUI.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBStory.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBStory.h index 8bc28aeff..4946ae341 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBStory.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/CBStory.h @@ -1,7 +1,7 @@ /* * CBStory.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ diff --git a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/Chartboost.h b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/Chartboost.h index 52c0e6e67..e4383ae4b 100644 --- a/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/Chartboost.h +++ b/mediation/mediatedviews/Chartboost/ChartboostSDK/Chartboost.framework/Versions/A/Headers/Chartboost.h @@ -1,7 +1,7 @@ /* * Chartboost.h * Chartboost - * 5.2.1 + * 5.4.0 * * Copyright 2011 Chartboost. All rights reserved. */ @@ -33,7 +33,9 @@ typedef NS_ENUM(NSUInteger, CBFramework) { /*! Fyber. */ CBFrameworkFyber, /*! Prime31Unreal. */ - CBFrameworkPrime31Unreal + CBFrameworkPrime31Unreal, + /*! Weeby. */ + CBFrameworkWeeby }; /*! @@ -372,6 +374,18 @@ extern CBLocation const CBLocationDefault; */ + (NSString *)getCustomId; +/*! + @abstract + Set a custom version to append to the POST body of every request. This is useful for analytics and provides chartboost with important information. + example setFramework:Unity withVersion:4.6, setFrameworkVersion:5.2.1 + + @param frameworkVersion The version sent as a string. + + @discussion This is an internal method used via Chartboost's Unity and Corona SDKs + to track their usage. + */ ++ (void)setFrameworkVersion:(NSString*)frameworkVersion; + /*! @abstract Set a custom framework suffix to append to the POST headers field. @@ -383,6 +397,19 @@ extern CBLocation const CBLocationDefault; */ + (void)setFramework:(CBFramework)framework; +/*! + @abstract + Set a custom framework suffix to append to the POST headers field. +example setFramework:Unity withVersion:4.6, setFrameworkVersion:5.2.1 + + @param framework The suffix to send with all Chartbooost API server requets. + @param version The platform version used for analytics. Example Unity should set Application.unityVersion + + @discussion This is an internal method used via Chartboost's Unity and Corona SDKs + to track their usage. + */ ++ (void)setFramework:(CBFramework)framework withVersion:(NSString *)version; + /*! @abstract Decide if Chartboost SDK should show interstitials in the first session. diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/FBAudienceNetwork b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/FBAudienceNetwork index 5de443a65..07851755b 100644 Binary files a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/FBAudienceNetwork and b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/FBAudienceNetwork differ diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdChoicesView.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdChoicesView.h index 63d0da5aa..54ac6a319 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdChoicesView.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdChoicesView.h @@ -18,6 +18,8 @@ #import +#import "FBAdDefines.h" + @class FBAdImage; @class FBNativeAd; @class FBNativeAdViewAttributes; @@ -28,6 +30,7 @@ @abstract FBAdChoicesView offers a simple way to display a sponsored or AdChoices icon. */ +FB_CLASS_EXPORT @interface FBAdChoicesView : UIView /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdDefines.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdDefines.h new file mode 100644 index 000000000..f38abcc94 --- /dev/null +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdDefines.h @@ -0,0 +1,38 @@ +// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. +// +// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, +// copy, modify, and distribute this software in source code or binary form for use +// in connection with the web services and APIs provided by Facebook. +// +// As with any software that integrates with the Facebook platform, your use of +// this software is subject to the Facebook Developer Principles and Policies +// [http://developers.facebook.com/policy/]. This copyright notice shall be +// included in all copies or substantial portions of the software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef FBAudienceNetwork_FBAdDefines_h +#define FBAudienceNetwork_FBAdDefines_h + +#ifdef __cplusplus +#define FB_EXTERN_C_BEGIN extern "C" { +#define FB_EXTERN_C_END } +#else +#define FB_EXTERN_C_BEGIN +#define FB_EXTERN_C_END +#endif + +#ifdef __cplusplus +# define FB_EXPORT extern "C" __attribute__((visibility("default"))) +#else +# define FB_EXPORT extern __attribute__((visibility("default"))) +#endif + +#define FB_CLASS_EXPORT __attribute__((visibility("default"))) + +#endif diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSettings.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSettings.h index e57d3077d..8f297a6ae 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSettings.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSettings.h @@ -18,7 +18,9 @@ #import -extern NSString *const FBAudienceNetworkErrorDomain; +#import "FBAdDefines.h" + +FB_EXPORT NSString *const FBAudienceNetworkErrorDomain; typedef NS_ENUM(NSInteger, FBAdLogLevel) { FBAdLogLevelNone, @@ -35,6 +37,7 @@ typedef NS_ENUM(NSInteger, FBAdLogLevel) { @abstract AdSettings contains global settings for all ad controls. */ +FB_CLASS_EXPORT @interface FBAdSettings : NSObject /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSize.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSize.h index cbad976a0..3ad9e1859 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSize.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdSize.h @@ -19,6 +19,8 @@ #import #import +#import "FBAdDefines.h" + /*! @typedef FBAdSize @@ -32,32 +34,32 @@ typedef struct FBAdSize { /*! @abstract DEPRECATED - Represents the fixed banner ad size - 320pt by 50pt. */ -extern FBAdSize const kFBAdSize320x50; +FB_EXPORT FBAdSize const kFBAdSize320x50; /*! @abstract Represents the flexible banner ad size, where banner width depends on its container width, and banner height is fixed as 50pt. */ -extern FBAdSize const kFBAdSizeHeight50Banner; +FB_EXPORT FBAdSize const kFBAdSizeHeight50Banner; /*! @abstract Represents the flexible banner ad size, where banner width depends on its container width, and banner height is fixed as 90pt. */ -extern FBAdSize const kFBAdSizeHeight90Banner; +FB_EXPORT FBAdSize const kFBAdSizeHeight90Banner; /*! @abstract Represents the interstitial ad size. */ -extern FBAdSize const kFBAdSizeInterstital; +FB_EXPORT FBAdSize const kFBAdSizeInterstital; /*! @abstract Represents the flexible rectangle ad size, where width depends on its container width, and height is fixed as 250pt. */ -extern FBAdSize const kFBAdSizeHeight250Rectangle; - +FB_EXPORT FBAdSize const kFBAdSizeHeight250Rectangle; +FB_CLASS_EXPORT @interface FBAdCustomSize : NSObject + (FBAdSize)customSize:(CGSize)size; diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdView.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdView.h index 82c0f276f..1e843d5cf 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdView.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAdView.h @@ -19,6 +19,7 @@ #import #import +#import "FBAdDefines.h" #import "FBAdSize.h" @protocol FBAdViewDelegate; @@ -28,6 +29,7 @@ @abstract A customized UIView to represent a Facebook ad (a.k.a. banner ad). */ +FB_CLASS_EXPORT @interface FBAdView : UIView /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAudienceNetwork.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAudienceNetwork.h index 5a1881754..b23742253 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAudienceNetwork.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBAudienceNetwork.h @@ -30,4 +30,4 @@ #import #import -#define FB_AD_SDK_VERSION @"4.1.0" +#define FB_AD_SDK_VERSION @"4.2.0" diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBInterstitialAd.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBInterstitialAd.h index e057d8593..da67ce631 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBInterstitialAd.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBInterstitialAd.h @@ -19,6 +19,7 @@ #import #import +#import "FBAdDefines.h" #import "FBAdView.h" @protocol FBInterstitialAdDelegate; @@ -29,6 +30,7 @@ @abstract A modal view controller to represent a Facebook interstitial ad. This is a full-screen ad shown in your application. */ +FB_CLASS_EXPORT @interface FBInterstitialAd : UIViewController /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBMediaView.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBMediaView.h index e19613ae9..8619c7bc3 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBMediaView.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBMediaView.h @@ -18,6 +18,8 @@ #import +#import "FBAdDefines.h" + @protocol FBMediaViewDelegate; @class FBNativeAd; @@ -27,6 +29,7 @@ @abstract The FBMediaView loads media content from a given FBNativeAd. This view takes the place of manually loading a cover image. */ +FB_CLASS_EXPORT @interface FBMediaView : UIView /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAd.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAd.h index 976f5fbae..9864c674f 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAd.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAd.h @@ -18,6 +18,8 @@ #import +#import "FBAdDefines.h" + @protocol FBNativeAdDelegate; @class FBAdImage; @@ -35,6 +37,7 @@ typedef NS_ENUM(NSInteger, FBNativeAdsCachePolicy) { The FBNativeAd represents ad metadata to allow you to construct custom ad views. See the NativeAdSample in the sample apps section of the Audience Network framework. */ +FB_CLASS_EXPORT @interface FBNativeAd : NSObject /*! @@ -238,9 +241,9 @@ typedef NS_ENUM(NSInteger, FBNativeAdsCachePolicy) { @abstract Represents the Facebook ad star rating, which contains the rating value and rating scale. */ -extern const struct FBAdStarRating { - float value; - int scale; +FB_EXPORT struct FBAdStarRating { + CGFloat value; + NSInteger scale; } FBAdStarRating; /*! @@ -248,6 +251,7 @@ extern const struct FBAdStarRating { @abstract Represents an image creative. */ +FB_CLASS_EXPORT @interface FBAdImage : NSObject /*! @@ -296,6 +300,7 @@ extern const struct FBAdStarRating { @abstract Helper view that draws a star rating based off a native ad. */ +FB_CLASS_EXPORT @interface FBAdStarRatingView : UIView /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdScrollView.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdScrollView.h index 10be3261b..91371dcc2 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdScrollView.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdScrollView.h @@ -18,17 +18,19 @@ #import +#import "FBAdDefines.h" #import "FBNativeAdView.h" #import "FBNativeAdsManager.h" @protocol FBNativeAdView; /*! - @typedef FBNativeAdScrollView + @class FBNativeAdScrollView @abstract Contains multiple ads in a scroll view. @discussion If adding this view to a XIB or Storyboard, you may recieve the error "Unknown class FBNativeAdScrollView in Interface Builder file" in some cases. This error is caused by the linker failing to include FBNativeAdScrollView in your build. To resolve this, call [FBNativeAdScrollView class] in your project, or add "-all_load -ObjC" to "Other Linker Flags" in your project settings. */ +FB_CLASS_EXPORT @interface FBNativeAdScrollView : UIView /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewAdProvider.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewAdProvider.h index 0c58b1872..7e01c9d81 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewAdProvider.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewAdProvider.h @@ -19,6 +19,7 @@ #import #import +#import "FBAdDefines.h" #import "FBNativeAd.h" #import "FBNativeAdsManager.h" @@ -27,8 +28,15 @@ @abstract Additional functionality on top of FBNativeAdsManager to assist in using native ads within a UITableView. This class contains a mechanism to map indexPaths to native ads in a stable manner as well as helpers which assist in doing the math to include ads at a regular interval within a table view. */ +FB_CLASS_EXPORT @interface FBNativeAdTableViewAdProvider : NSObject +/*! + @property + @abstract Passes delegate methods from FBNativeAd. Separate delegate calls will be made for each native ad contained. + */ +@property (nonatomic, weak) id delegate; + /*! @method diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewCellProvider.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewCellProvider.h index 3fb6f1213..cf9aac087 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewCellProvider.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdTableViewCellProvider.h @@ -19,6 +19,7 @@ #import #import +#import "FBAdDefines.h" #import "FBNativeAd.h" #import "FBNativeAdTableViewAdProvider.h" #import "FBNativeAdView.h" @@ -29,6 +30,7 @@ @abstract Class which assists in putting FBNativeAdViews into UITableViews. This class manages the creation of UITableViewCells which host native ad views. Functionality is provided to create UITableCellViews as needed for a given indexPath as well as computing the height of the cells. */ +FB_CLASS_EXPORT @interface FBNativeAdTableViewCellProvider : FBNativeAdTableViewAdProvider /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdView.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdView.h index fa000af1e..746cb013e 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdView.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdView.h @@ -18,6 +18,7 @@ #import +#import "FBAdDefines.h" #import "FBNativeAd.h" @class FBNativeAdViewAttributes; @@ -28,10 +29,10 @@ for different values of FBNativeAdViewType */ typedef NS_ENUM(NSInteger, FBNativeAdViewType) { - FBNativeAdViewTypeGenericHeight400, - FBNativeAdViewTypeGenericHeight300, + FBNativeAdViewTypeGenericHeight100 = 1, FBNativeAdViewTypeGenericHeight120, - FBNativeAdViewTypeGenericHeight100, + FBNativeAdViewTypeGenericHeight300, + FBNativeAdViewTypeGenericHeight400, }; /*! @@ -40,6 +41,7 @@ typedef NS_ENUM(NSInteger, FBNativeAdViewType) { @abstract The FBNativeAdView creates prebuilt native ad template views and manages native ads. */ +FB_CLASS_EXPORT @interface FBNativeAdView : UIView /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdsManager.h b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdsManager.h index 3c2fcd7b7..cfe331c83 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdsManager.h +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Headers/FBNativeAdsManager.h @@ -16,9 +16,9 @@ // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +#import "FBAdDefines.h" #import "FBNativeAd.h" - /*! @protocol FBNativeAdsManagerDelegate @@ -49,6 +49,7 @@ @abstract This class provides a mechanism to fetch a set of ads and then use them within your application. The recommended usage is to call nextNativeAd: at the moment when you are about to render an ad. The native ads manager supports giving out as many ads as needed by cloning over the set of ads it got back from the server which can be useful for feed scenarios. */ +FB_CLASS_EXPORT @interface FBNativeAdsManager : NSObject /*! diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Info.plist b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Info.plist index e630d6eab..4cdf7db0f 100644 Binary files a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Info.plist and b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Info.plist differ diff --git a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Modules/module.modulemap b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Modules/module.modulemap index f59087448..b0a3468e6 100644 --- a/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Modules/module.modulemap +++ b/mediation/mediatedviews/Facebook/FacebookSDK/FBAudienceNetwork.framework/Modules/module.modulemap @@ -1,6 +1,17 @@ framework module FBAudienceNetwork { - umbrella header "FBAudienceNetwork.h" + umbrella header "FBAudienceNetwork.h" - export * - module * { export * } + export * + module * { + export * + } + + link framework "AdSupport" + link framework "CoreGraphics" + link framework "CoreImage" + link framework "CoreMotion" + link framework "Foundation" + link framework "Security" + link framework "StoreKit" + link framework "UIKit" } diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Modules/module.modulemap b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Modules/module.modulemap old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/GoogleMobileAds b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/GoogleMobileAds old mode 100644 new mode 100755 index 83438925d..f740ba0bb Binary files a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/GoogleMobileAds and b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/GoogleMobileAds differ diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPBannerView.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPBannerView.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPCustomRenderedAd.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPCustomRenderedAd.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPCustomRenderedBannerViewDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPCustomRenderedBannerViewDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPCustomRenderedInterstitialDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPCustomRenderedInterstitialDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPInterstitial.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPInterstitial.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPRequest.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/DFPRequest.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAdNetworkExtras.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAdNetworkExtras.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAdSize.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAdSize.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAdSizeDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAdSizeDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAppEventDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADAppEventDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADBannerView.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADBannerView.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADBannerViewDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADBannerViewDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADExtras.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADExtras.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInAppPurchase.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInAppPurchase.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInAppPurchaseDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInAppPurchaseDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInterstitial.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInterstitial.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInterstitialDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADInterstitialDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADRequest.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADRequest.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADRequestError.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GADRequestError.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GoogleMobileAds.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GoogleMobileAds.h old mode 100644 new mode 100755 index 17e558f25..7a3322aa4 --- a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GoogleMobileAds.h +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/GoogleMobileAds.h @@ -35,6 +35,19 @@ FOUNDATION_EXPORT const unsigned char GoogleMobileAdsVersionString[]; #import #import +#import +#import +#import + +#import +#import +#import +#import +#import +#import + +#import + #import #import #import diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAd.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAd.h new file mode 100755 index 000000000..a858b91f8 --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAd.h @@ -0,0 +1,22 @@ +// +// GADNativeAd.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import +#import + +@protocol GADNativeAdDelegate; + +/// Native ad base class. All native ad types are subclasses of this class. +@interface GADNativeAd : NSObject + +/// Optional delegate to receive state change notifications. +@property(nonatomic, weak) id delegate; + +/// Root view controller for handling ad actions. +@property(nonatomic, weak) UIViewController *rootViewController; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAdDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAdDelegate.h new file mode 100755 index 000000000..fa39d858b --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAdDelegate.h @@ -0,0 +1,41 @@ +// +// GADNativeAdDelegate.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import + +@class GADNativeAd; + +/// Identifies native ad assets. +@protocol GADNativeAdDelegate + +@optional + +#pragma mark Click-Time Lifecycle Notifications + +/// Called just before presenting the user a full screen view, such as a browser, in response to +/// clicking on an ad. Use this opportunity to stop animations, time sensitive interactions, etc. +/// +/// Normally the user looks at the ad, dismisses it, and control returns to your application with +/// the nativeAdDidDismissScreen: message. However, if the user hits the Home button or clicks on an +/// App Store link, your application will end. The next method called will be the +/// applicationWillResignActive: of your UIApplicationDelegate object.Immediately after that, +/// nativeAdWillLeaveApplication: is called. +- (void)nativeAdWillPresentScreen:(GADNativeAd *)nativeAd; + +/// Called just before dismissing a full screen view. +- (void)nativeAdWillDismissScreen:(GADNativeAd *)nativeAd; + +/// Called just after dismissing a full screen view. Use this opportunity to restart anything you +/// may have stopped as part of nativeAdWillPresentScreen:. +- (void)nativeAdDidDismissScreen:(GADNativeAd *)nativeAd; + +/// Called just before the application will go to the background or terminate due to an ad action +/// that will launch another application (such as the App Store). The normal UIApplicationDelegate +/// methods, like applicationDidEnterBackground:, will be called immediately before this. +- (void)nativeAdWillLeaveApplication:(GADNativeAd *)nativeAd; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAdImage.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAdImage.h new file mode 100755 index 000000000..9596b3d10 --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAdImage.h @@ -0,0 +1,20 @@ +// +// GADNativeAdImage.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import +#import + +/// Native ad image. +@interface GADNativeAdImage : NSObject + +/// The image. If image autoloading is disabled, this property will be nil. +@property(nonatomic, readonly, strong) UIImage *image; + +/// The image's URL. +@property(nonatomic, readonly, strong) NSURL *imageURL; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAppInstallAd.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAppInstallAd.h new file mode 100755 index 000000000..06ea4fce8 --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeAppInstallAd.h @@ -0,0 +1,77 @@ +// +// GADNativeAppInstallAd.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import +#import + +#import "../GADAdLoaderDelegate.h" +#import "GADNativeAd.h" +#import "GADNativeAdImage.h" + +// For use with GADAdLoader's creation methods. If you request this ad type, your delegate must +// conform to the GADNativeAppInstallAdRequestDelegate protocol. +// +// See GADNativeAdImageAdLoaderOptions.h for ad loader image options. +extern NSString *const kGADAdLoaderAdTypeNativeAppInstall; + +/// Native app install ad. +@interface GADNativeAppInstallAd : GADNativeAd + +#pragma mark - Must be displayed + +/// App title. +@property(nonatomic, readonly, copy) NSString *headline; +/// Text that encourages user to take some action with the ad. For example "Install". +@property(nonatomic, readonly, copy) NSString *callToAction; +/// Application icon. +@property(nonatomic, readonly, strong) GADNativeAdImage *icon; + +#pragma mark - Recommended to display + +/// App description. +@property(nonatomic, readonly, copy) NSString *body; +/// The app store name. For example, "App Store". +@property(nonatomic, readonly, copy) NSString *store; +/// String representation of the app's price. +@property(nonatomic, readonly, copy) NSString *price; +/// Array of GADNativeAdImage objects related to the advertised application. +@property(nonatomic, readonly, strong) NSArray *images; +/// App store rating (0 to 5). +@property(nonatomic, readonly, copy) NSDecimalNumber *starRating; + +@end + +#pragma mark - Protocol and constants + +/// The delegate of a GADAdLoader object implements this protocol to receive GADNativeAppInstallAd +/// ads. +@protocol GADNativeAppInstallAdLoaderDelegate +/// Called when a native app install ad is received. +- (void)adLoader:(GADAdLoader *)adLoader + didReceiveNativeAppInstallAd:(GADNativeAppInstallAd *)nativeAppInstallAd; +@end + +#pragma mark - Native App Install Ad View + +/// Base class for app install ad views. Your app install ad view must be a subclass of this class +/// and must call superclass methods for all overriden methods. +@interface GADNativeAppInstallAdView : UIView + +/// This property must point to the native app install ad object rendered by this ad view. +@property(nonatomic, strong) GADNativeAppInstallAd *nativeAppInstallAd; + +// Weak references to your ad view's asset views. +@property(nonatomic, weak) IBOutlet UIView *headlineView; +@property(nonatomic, weak) IBOutlet UIView *callToActionView; +@property(nonatomic, weak) IBOutlet UIView *iconView; +@property(nonatomic, weak) IBOutlet UIView *bodyView; +@property(nonatomic, weak) IBOutlet UIView *storeView; +@property(nonatomic, weak) IBOutlet UIView *priceView; +@property(nonatomic, weak) IBOutlet UIView *imageView; +@property(nonatomic, weak) IBOutlet UIView *starRatingView; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeContentAd.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeContentAd.h new file mode 100755 index 000000000..652333559 --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeContentAd.h @@ -0,0 +1,72 @@ +// +// GADNativeContentAd.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import +#import + +#import "../GADAdLoaderDelegate.h" +#import "GADNativeAd.h" +#import "GADNativeAdImage.h" + +#pragma mark - Native Content Ad Assets + +// For use with GADAdLoader's creation methods. If you request this ad type, your delegate must +// conform to the GADNativeContentAdRequestDelegate protocol. +// +// See GADNativeAdImageAdLoaderOptions.h for ad loader image options. +extern NSString *const kGADAdLoaderAdTypeNativeContent; + +/// Native content ad. +@interface GADNativeContentAd : GADNativeAd + +#pragma mark - Must be displayed + +/// Primary text headline. +@property(nonatomic, readonly, copy) NSString *headline; +/// Secondary text. +@property(nonatomic, readonly, copy) NSString *body; + +#pragma mark - Recommended to display + +/// Large images. +@property(nonatomic, readonly, copy) NSArray *images; +/// Small logo image. +@property(nonatomic, readonly, strong) GADNativeAdImage *logo; +/// Text that encourages user to take some action with the ad. +@property(nonatomic, readonly, copy) NSString *callToAction; +/// Identifies the advertiser. For example, the advertiser’s name or visible URL. +@property(nonatomic, readonly, copy) NSString *advertiser; + +@end + +#pragma mark - Protocol and constants + +/// The delegate of a GADAdLoader object implements this protocol to receive GADNativeContentAd ads. +@protocol GADNativeContentAdLoaderDelegate +/// Called when native content is received. +- (void)adLoader:(GADAdLoader *)adLoader + didReceiveNativeContentAd:(GADNativeContentAd *)nativeContentAd; +@end + +#pragma mark - Native Content Ad View + +/// Base class for content ad views. Your content ad view must be a subclass of this class and must +/// call superclass methods for all overriden methods. +@interface GADNativeContentAdView : UIView + +/// This property must point to the native content ad object rendered by this ad view. +@property(nonatomic, strong) GADNativeContentAd *nativeContentAd; + +// Weak references to your ad view's asset views. +@property(nonatomic, weak) IBOutlet UIView *headlineView; +@property(nonatomic, weak) IBOutlet UIView *bodyView; +@property(nonatomic, weak) IBOutlet UIView *imageView; +@property(nonatomic, weak) IBOutlet UIView *logoView; +@property(nonatomic, weak) IBOutlet UIView *callToActionView; +@property(nonatomic, weak) IBOutlet UIView *advertiserView; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeCustomTemplateAd.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeCustomTemplateAd.h new file mode 100755 index 000000000..b6b5d5ee8 --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Formats/GADNativeCustomTemplateAd.h @@ -0,0 +1,61 @@ +// +// GADNativeCustomTemplateAd.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import +#import + +#import "../GADAdLoaderDelegate.h" +#import "GADNativeAd.h" +#import "GADNativeAdImage.h" + +// For use with GADAdLoader's creation methods. If you request this ad type, your delegate must +// conform to the GADNativeCustomTemplateAdLoaderDelegate protocol. +extern NSString *const kGADAdLoaderAdTypeNativeCustomTemplate; + +/// Native custom template ad. +@interface GADNativeCustomTemplateAd : GADNativeAd + +/// The ad's custom template ID. +@property(nonatomic, readonly) NSString *templateID; + +/// Array of available asset keys. +@property(nonatomic, readonly) NSArray *availableAssetKeys; + +/// Returns the native ad image corresponding to the specified key or nil if the image is not +/// available. +- (GADNativeAdImage *)imageForKey:(NSString *)key; + +/// Returns the string corresponding to the specified key or nil if the string is not available. +- (NSString *)stringForKey:(NSString *)key; + +/// Call when the user clicks on the ad. Provide the asset key that best matches the asset the user +/// interacted with. Provide |customClickHandler| only if this template is configured with a custom +/// click action, otherwise pass in nil. If a block is provided, the ad's built-in click actions are +/// ignored and |customClickHandler| is executed after recording the click. +- (void)performClickOnAssetWithKey:(NSString *)assetKey + customClickHandler:(dispatch_block_t)customClickHandler; + +/// Call when the ad is displayed on screen to the user. Can be called multiple times. Only the +/// first impression is recorded. +- (void)recordImpression; + +@end + +#pragma mark - Loading Protocol + +/// The delegate of a GADAdLoader object implements this protocol to receive +/// GADNativeCustomTemplateAd ads. +@protocol GADNativeCustomTemplateAdLoaderDelegate + +/// Called when requesting an ad. Asks the delgate for an array of custom template ID strings. +- (NSArray *)nativeCustomTemplateIDsForAdLoader:(GADAdLoader *)adLoader; + +/// Tells the delegate that a native custom template ad was received. +- (void)adLoader:(GADAdLoader *)adLoader + didReceiveNativeCustomTemplateAd:(GADNativeCustomTemplateAd *)nativeCustomTemplateAd; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoader.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoader.h new file mode 100755 index 000000000..92443db1b --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoader.h @@ -0,0 +1,42 @@ +// +// GADAdLoader.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import +#import + +@class GADRequest; +@class GADRequestError; +@protocol GADAdLoaderDelegate; + +/// Loads ads. See GADAdLoaderAdTypes.h for available ad types. +@interface GADAdLoader : NSObject + +/// Object notified when an ad request succeeds or fails. Must conform to requested ad types' +/// delegate protocols. +@property(nonatomic, weak) id delegate; + +/// Returns an initialized ad loader configured to load the specified ad types. +/// +/// @param rootViewController The root view controller is used to present ad click actions. Cannot +/// be nil. +/// @param adTypes An array of ad types. See GADAdLoaderAdTypes.h for available ad types. +/// @param options An array of GADAdLoaderOptions objects to configure how ads are loaded, or nil to +/// use default options. See each ad type's header for available GADAdLoaderOptions subclasses. +- (instancetype)initWithAdUnitID:(NSString *)adUnitID + rootViewController:(UIViewController *)rootViewController + adTypes:(NSArray *)adTypes + options:(NSArray *)options; + +/// Loads the ad and informs the delegate of the outcome. +- (void)loadRequest:(GADRequest *)request; + +@end + +/// Ad loader options base class. See each ad type's header for available GADAdLoaderOptions +/// subclasses. +@interface GADAdLoaderOptions : NSObject +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoaderAdTypes.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoaderAdTypes.h new file mode 100755 index 000000000..aec03719f --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoaderAdTypes.h @@ -0,0 +1,20 @@ +// +// GADAdLoaderAdTypes.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import + +// For use with GADAdLoader's creation methods. See the constants' respective headers for each ad +// type's delegate requirements. + +/// Native app install ad type. \see GADNativeAppInstallAd.h. +extern NSString *const kGADAdLoaderAdTypeNativeAppInstall; + +/// Native content ad type. \see GADNativeContentAd.h. +extern NSString *const kGADAdLoaderAdTypeNativeContent; + +/// Native custom template ad type. \see GADNativeCustomTemplateAd.h. +extern NSString *const kGADAdLoaderAdTypeNativeCustomTemplate; diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoaderDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoaderDelegate.h new file mode 100755 index 000000000..5fa5ac0d7 --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/GADAdLoaderDelegate.h @@ -0,0 +1,18 @@ +// +// GADAdLoaderDelegate.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import + +@class GADAdLoader; +@class GADRequestError; + +@protocol GADAdLoaderDelegate + +/// Called when adLoader fails to load an ad. +- (void)adLoader:(GADAdLoader *)adLoader didFailToReceiveAdWithError:(GADRequestError *)error; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Options/GADNativeAdImageAdLoaderOptions.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Options/GADNativeAdImageAdLoaderOptions.h new file mode 100755 index 000000000..4db6f1a36 --- /dev/null +++ b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Loading/Options/GADNativeAdImageAdLoaderOptions.h @@ -0,0 +1,31 @@ +// +// GADNativeAdImageAdLoaderOptions.h +// Google Mobile Ads SDK +// +// Copyright 2015 Google Inc. All rights reserved. +// + +#import "../GADAdLoader.h" + +/// Native ad image orientation preference. +typedef NS_ENUM(NSInteger, GADNativeAdImageAdLoaderOptionsOrientation) { + GADNativeAdImageAdLoaderOptionsOrientationAny, ///< No orientation preference. + GADNativeAdImageAdLoaderOptionsOrientationPortrait, ///< Prefer portrait images. + GADNativeAdImageAdLoaderOptionsOrientationLandscape ///< Prefer landscape images. +}; + +@interface GADNativeAdImageAdLoaderOptions : GADAdLoaderOptions + +/// Indicates if image asset content should be loaded by the SDK. If set to YES, the SDK will not +/// load image asset content and native ad image URLs can be used to fetch content. Defaults to NO, +/// image assets are loaded by the SDK. +@property(nonatomic, assign) BOOL disableImageLoading; + +/// Indicates if multiple images should be loaded for each asset. Defaults to NO. +@property(nonatomic, assign) BOOL shouldRequestMultipleImages; + +/// Indicates preferred image orientation. Defaults to +/// GADNativeAdImageAdLoaderOptionsOrientationAny. +@property(nonatomic, assign) GADNativeAdImageAdLoaderOptionsOrientation preferredImageOrientation; + +@end diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventBanner.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventBanner.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventBannerDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventBannerDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventExtras.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventExtras.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventInterstitial.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventInterstitial.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventInterstitialDelegate.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventInterstitialDelegate.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventRequest.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Mediation/GADCustomEventRequest.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Search/GADSearchBannerView.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Search/GADSearchBannerView.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Search/GADSearchRequest.h b/mediation/mediatedviews/GoogleAdMob/GoogleAdMobSDK/GoogleMobileAds.framework/Versions/A/Headers/Search/GADSearchRequest.h old mode 100644 new mode 100755 diff --git a/mediation/mediatedviews/InMobi/InMobiSDK/LICENSE-INMOBI.txt b/mediation/mediatedviews/InMobi/InMobiSDK/LICENSE-INMOBI.txt new file mode 100644 index 000000000..cf4b5f8ab --- /dev/null +++ b/mediation/mediatedviews/InMobi/InMobiSDK/LICENSE-INMOBI.txt @@ -0,0 +1,46 @@ +End-User License Agreement for InMobi Software Product + +This End-User License Agreement (“EULA”) is a legal agreement between you (either an individual or a single entity) (“the End User”) and InMobi Pte Limited for the software product identified above, which includes computer software and may include associated media, printed materials, and “online” or electronic documentation (“Software Product”). + +By download, installing, copying or otherwise using the Software Product, you agree to be bound by the terms of this EULA. + +Software Product License + +InMobi is providing the Software Product solely for the purpose of allowing the End User to avail of or enjoy the benefits of the services provided by InMobi. The End User is NOT allowed to distribute this Software (either for profit or merely to recover your media and distribution costs) whether as a stand-alone product, or as part of a compilation or anthology, nor to use it for supporting your business or customers. It may be distributed freely on any website or through any other distribution mechanism, as long as no part of it is modified in any manner whatsoever. + +1. Grant of License + +This EULA grants you the following rights: + +a. Installation and Use. You may install and use an unlimited number of copies of the Software Product. + +b. Reproduction and Distribution. You may reproduce and distribute an unlimited number of copies of the Software Product; provided that each copy shall be a true and complete copy, including all copyright and trademark notices, and shall be accompanied by a copy of this EULA. + +c. Copies of the Software Product may be distributed as a standalone product or included with your own product as long as the Software Product is not sold or included in a product or package that intends to receive benefits through the inclusion of the Software Product. + +2. Description Of Other Rights And Limitations + +a. Limitations. You may not reverse engineer, decompile, or disassemble the Software Product. + +b. Update and Maintenance. InMobi SDK upgrades shall be free of charge. However, the End User shall be responsible to ensure that the InMobi SDK is updated as and when InMobi releases new updates or upgrades. + +c. Separation of Components. The Software Product is licensed as a single product. Its component parts may not be separated for use on more than one computer. + +d. Assignment. You may assign all of your rights under this EULA, provided the recipient agrees to the terms of this EULA and subject to the prior written consent of InMobi. + +e. Termination. Without prejudice to any other rights, InMobi may terminate this EULA if you fail to comply with the terms and conditions of this EULA. In such event, you shall destroy all copies of the Software Product and all of its component parts. + +3. Copyright + +All title and copyrights in and to the Software Product (including but not limited to any images, photographs, clipart, libraries, and examples incorporated into the Software Product), the accompanying printed materials, and any copies of the Software Product are owned by InMobi. The Software Product is protected by copyright laws and international treaty provisions. + +4. Limited Warranty + +a. No Warranties. InMobi expressly disclaims any and all warranties for the Software Product. The Software Product and any related documentation is provided “as is” without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or non-infringement. The entire risk arising out of use or performance of the Software Product shall remain with the End User. + +b. No Liability For Damages. In no event shall InMobi be liable for any direct, special, consequential, incidental or indirect damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this product, even if InMobi is aware of the possibility of such damages and known defects. + +5. Governing Law + +This EULA and all disputes arising thereof shall be subject to the laws of Singapore, where the courts at Singapore shall exclusive jurisdiction. + diff --git a/mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.1.a b/mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.3.a similarity index 82% rename from mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.1.a rename to mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.3.a index 5735f2c3e..34bdb2c25 100644 Binary files a/mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.1.a and b/mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.3.a differ diff --git a/mediation/mediatedviews/MoPub/ANAdAdapterInterstitialMoPub.m b/mediation/mediatedviews/MoPub/ANAdAdapterInterstitialMoPub.m index 9e1d8b4b3..2f5136f96 100644 --- a/mediation/mediatedviews/MoPub/ANAdAdapterInterstitialMoPub.m +++ b/mediation/mediatedviews/MoPub/ANAdAdapterInterstitialMoPub.m @@ -59,7 +59,7 @@ - (void)interstitialDidLoadAd:(MPInterstitialAdController *)interstitial { } - (void)interstitialDidFailToLoadAd:(MPInterstitialAdController *)interstitial { - [self.delegate didFailToLoadAd:ANAdResponseInternalError]; + [self.delegate didFailToLoadAd:ANAdResponseUnableToFill]; } - (void)interstitialWillAppear:(MPInterstitialAdController *)interstitial { diff --git a/mediation/mediatedviews/MoPub/ANAdAdapterNativeMoPub.m b/mediation/mediatedviews/MoPub/ANAdAdapterNativeMoPub.m index b5a151f90..6988e9b1c 100644 --- a/mediation/mediatedviews/MoPub/ANAdAdapterNativeMoPub.m +++ b/mediation/mediatedviews/MoPub/ANAdAdapterNativeMoPub.m @@ -47,7 +47,7 @@ - (void)requestNativeAdWithServerParameter:(NSString *)parameterString [nativeAdRequest startWithCompletionHandler:^(MPNativeAdRequest *request, MPNativeAd *response, NSError *error) { if (error) { ANLogError(@"Error loading MoPub native ad: %@", error); - [self.requestDelegate didFailToLoadNativeAd:ANAdResponseInternalError]; + [self.requestDelegate didFailToLoadNativeAd:ANAdResponseUnableToFill]; } else { [self processNativeAd:response]; } diff --git a/mediation/mediatedviews/MoPub/MoPubSDK/MPConstants.h b/mediation/mediatedviews/MoPub/MoPubSDK/MPConstants.h index 06fb29746..52a0600a5 100644 --- a/mediation/mediatedviews/MoPub/MoPubSDK/MPConstants.h +++ b/mediation/mediatedviews/MoPub/MoPubSDK/MPConstants.h @@ -14,9 +14,9 @@ #define MP_BUNDLE_IDENTIFIER @"com.mopub.mopub" #ifdef MP_FABRIC - #define MP_SDK_VERSION @"3.7.0+kit" + #define MP_SDK_VERSION @"3.8.0+kit" #else - #define MP_SDK_VERSION @"3.7.0" + #define MP_SDK_VERSION @"3.8.0" #endif // Sizing constants. diff --git a/mediation/mediatedviews/MoPub/MoPubSDK/libMoPubSDK.a b/mediation/mediatedviews/MoPub/MoPubSDK/libMoPubSDK.a index 84777bb39..18137c234 100644 Binary files a/mediation/mediatedviews/MoPub/MoPubSDK/libMoPubSDK.a and b/mediation/mediatedviews/MoPub/MoPubSDK/libMoPubSDK.a differ diff --git a/mediation/mediatedviews/README.txt b/mediation/mediatedviews/README.txt index 7a5150e40..c3edee46d 100644 --- a/mediation/mediatedviews/README.txt +++ b/mediation/mediatedviews/README.txt @@ -1,10 +1,10 @@ -AdMob SDK Version 7.2.1 (as of 05/06/2015) -Amazon SDK Version 2.2.6 (as of 05/06/2015) -Facebook SDK Version 4.1.0 (as of 05/06/2015) -Millennial Media SDK Version 5.4.1 (as of 05/06/2015) -MoPub SDK Version 3.7.0 (as of 05/06/2015) -InMobi SDK Version 4.5.1 (as of 05/06/2015) -VDOPIA Lightweight SDK Version 4 (as of 05/06/2015) -Vungle SDK 3.0.13 (as of 05/06/2015) -AdColony SDK 2.5.0 (as of 05/06/2015) -Chartboost SDK 5.2.1 (as of 05/06/2015) \ No newline at end of file +AdMob SDK Version 7.3.1 (as of 06/11/2015) +Amazon SDK Version 2.2.8 (as of 06/11/2015) +Facebook SDK Version 4.2.0 (as of 06/11/2015) +Millennial Media SDK Version 5.4.1 (as of 06/11/2015) +MoPub SDK Version 3.8.0 (as of 06/11/2015) +InMobi SDK Version 4.5.3 (as of 06/11/2015) +VDOPIA Lightweight SDK Version 4 (as of 06/11/2015) +Vungle SDK 3.0.13 (as of 06/11/2015) +AdColony SDK 2.5.1 (as of 06/11/2015) +Chartboost SDK 5.4.0 (as of 06/11/2015) \ No newline at end of file diff --git a/sdk/ANAdConstants.h b/sdk/ANAdConstants.h index 54c460de9..662a51b49 100644 --- a/sdk/ANAdConstants.h +++ b/sdk/ANAdConstants.h @@ -51,5 +51,6 @@ typedef NS_ENUM(NSUInteger, ANNativeAdNetworkCode) { ANNativeAdNetworkCodeMoPub, ANNativeAdNetworkCodeFacebook, ANNativeAdNetworkCodeInMobi, + ANNativeAdNetworkCodeAdColony, ANNativeAdNetworkCodeCustom, }; \ No newline at end of file diff --git a/sdk/internal/ANAdFetcher.m b/sdk/internal/ANAdFetcher.m index 10786a866..531f9a3b1 100644 --- a/sdk/internal/ANAdFetcher.m +++ b/sdk/internal/ANAdFetcher.m @@ -238,7 +238,7 @@ - (void)setupAutoRefreshTimerIfNecessary - (void)processAdResponse:(ANAdServerResponse *)response { [self clearMediationController]; - + BOOL responseAdsExist = response && response.containsAds; BOOL oldAdsExist = [self.mediatedAds count] > 0; @@ -368,6 +368,10 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d { - (void)connectionDidFinishLoading:(NSURLConnection *)connection { if (connection == self.connection) { ANAdServerResponse *adResponse = [ANAdServerResponse responseWithData:self.data]; + NSString *responseString = [[NSString alloc] initWithData:self.data + encoding:NSUTF8StringEncoding]; + ANPostNotifications(kANAdFetcherDidReceiveResponseNotification, self, + @{kANAdFetcherAdResponseKey: (responseString ? responseString : @"")}); [self processAdResponse:adResponse]; } } diff --git a/sdk/internal/ANAdServerResponse.m b/sdk/internal/ANAdServerResponse.m index 47426bd9a..7394991d3 100644 --- a/sdk/internal/ANAdServerResponse.m +++ b/sdk/internal/ANAdServerResponse.m @@ -128,9 +128,6 @@ + (NSDictionary *)jsonResponseFromData:(NSData *)data { return nil; } - ANPostNotifications(kANAdFetcherDidReceiveResponseNotification, self, - @{kANAdFetcherAdResponseKey: (responseString ? responseString : @"")}); - NSError *jsonParsingError = nil; id jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 diff --git a/sdk/internal/ANGlobal.h b/sdk/internal/ANGlobal.h index bfbc79618..17d796f5a 100644 --- a/sdk/internal/ANGlobal.h +++ b/sdk/internal/ANGlobal.h @@ -35,7 +35,7 @@ #define AN_ERROR_TABLE @"errors" #define AN_DEFAULT_PLACEMENT_ID @"default_placement_id" -#define AN_SDK_VERSION @"2.2" +#define AN_SDK_VERSION @"2.3" #define APPNEXUS_BANNER_SIZE CGSizeMake(320, 50) #define APPNEXUS_MEDIUM_RECT_SIZE CGSizeMake(300, 250) diff --git a/tests/KIF/Additions/CGGeometry-KIFAdditions.h b/tests/KIF/Additions/CGGeometry-KIFAdditions.h index e84ae2e71..a1e94fb0c 100755 --- a/tests/KIF/Additions/CGGeometry-KIFAdditions.h +++ b/tests/KIF/Additions/CGGeometry-KIFAdditions.h @@ -14,5 +14,5 @@ CG_INLINE CGPoint CGPointCenteredInRect(CGRect bounds) { } CG_INLINE CGPoint CGPointMidPoint(CGPoint point1, CGPoint point2) { - return CGPointMake((point1.x + point2.x) / 2.0, (point1.y + point2.y) / 2.0); + return CGPointMake((point1.x + point2.x) / 2.0f, (point1.y + point2.y) / 2.0f); } diff --git a/tests/KIF/Additions/UIApplication-KIFAdditions.h b/tests/KIF/Additions/UIApplication-KIFAdditions.h index 0ec04a3f7..95974908a 100755 --- a/tests/KIF/Additions/UIApplication-KIFAdditions.h +++ b/tests/KIF/Additions/UIApplication-KIFAdditions.h @@ -16,6 +16,11 @@ */ UIKIT_EXTERN NSString *const UIApplicationDidMockOpenURLNotification; +/*! + @abstract When mocking @c -canOpenURL:, this notification is posted. + */ +UIKIT_EXTERN NSString *const UIApplicationDidMockCanOpenURLNotification; + /*! @abstract The key for the opened URL in the @c UIApplicationDidMockOpenURLNotification notification. */ diff --git a/tests/KIF/Additions/UIApplication-KIFAdditions.m b/tests/KIF/Additions/UIApplication-KIFAdditions.m index 8028a1040..5d3779230 100755 --- a/tests/KIF/Additions/UIApplication-KIFAdditions.m +++ b/tests/KIF/Additions/UIApplication-KIFAdditions.m @@ -28,6 +28,7 @@ - (void)popRunLoopMode:(id)arg1 requester:(id)requester; @end NSString *const UIApplicationDidMockOpenURLNotification = @"UIApplicationDidMockOpenURLNotification"; +NSString *const UIApplicationDidMockCanOpenURLNotification = @"UIApplicationDidMockCanOpenURLNotification"; NSString *const UIApplicationOpenedURLKey = @"UIApplicationOpenedURL"; static const void *KIFRunLoopModesKey = &KIFRunLoopModesKey; @@ -146,7 +147,9 @@ - (BOOL)writeScreenshotForLine:(NSUInteger)lineNumber inFile:(NSString *)filenam NSError *directoryCreationError = nil; if (![[NSFileManager defaultManager] createDirectoryAtPath:outputPath withIntermediateDirectories:YES attributes:nil error:&directoryCreationError]) { - *error = [NSError KIFErrorWithFormat:@"Couldn't create directory at path %@ (details: %@)", outputPath, directoryCreationError]; + if (error) { + *error = [NSError KIFErrorWithFormat:@"Couldn't create directory at path %@ (details: %@)", outputPath, directoryCreationError]; + } return NO; } @@ -220,6 +223,16 @@ - (BOOL)KIF_openURL:(NSURL *)URL; } } +- (BOOL)KIF_canOpenURL:(NSURL *)URL; +{ + if (_KIF_UIApplicationMockOpenURL) { + [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidMockCanOpenURLNotification object:self userInfo:@{UIApplicationOpenedURLKey: URL}]; + return _KIF_UIApplicationMockOpenURL_returnValue; + } else { + return [self KIF_canOpenURL:URL]; + } +} + static inline void Swizzle(Class c, SEL orig, SEL new) { Method origMethod = class_getInstanceMethod(c, orig); @@ -248,6 +261,7 @@ + (void)startMockingOpenURLWithReturnValue:(BOOL)returnValue; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Swizzle(self, @selector(openURL:), @selector(KIF_openURL:)); + Swizzle(self, @selector(canOpenURL:), @selector(KIF_canOpenURL:)); }); _KIF_UIApplicationMockOpenURL = YES; diff --git a/tests/KIF/Additions/UIEvent+KIFAdditions.h b/tests/KIF/Additions/UIEvent+KIFAdditions.h new file mode 100755 index 000000000..bbbbc823f --- /dev/null +++ b/tests/KIF/Additions/UIEvent+KIFAdditions.h @@ -0,0 +1,19 @@ +// +// UIEvent+KIFAdditions.h +// KIF +// +// Created by Thomas on 3/1/15. +// +// + +#import + +// Exposes methods of UITouchesEvent so that the compiler doesn't complain +@interface UIEvent (KIFAdditionsPrivateHeaders) +- (void)_addTouch:(UITouch *)touch forDelayedDelivery:(BOOL)arg2; +- (void)_clearTouches; +@end + +@interface UIEvent (KIFAdditions) +- (void)kif_setEventWithTouches:(NSArray *)touches; +@end \ No newline at end of file diff --git a/tests/KIF/Additions/UIEvent+KIFAdditions.m b/tests/KIF/Additions/UIEvent+KIFAdditions.m new file mode 100755 index 000000000..33308758d --- /dev/null +++ b/tests/KIF/Additions/UIEvent+KIFAdditions.m @@ -0,0 +1,158 @@ +// +// UIEvent+KIFAdditions.m +// KIF +// +// Created by Thomas on 3/1/15. +// +// + +#import "UIEvent+KIFAdditions.h" +#import "LoadableCategory.h" +#import + +MAKE_CATEGORIES_LOADABLE(UIEvent_KIFAdditions) + +/* IOKit Private Headers */ +#ifdef __LP64__ +typedef double IOHIDFloat; +#else +typedef float IOHIDFloat; +#endif +typedef struct __IOHIDEvent * IOHIDEventRef; +typedef UInt32 IOOptionBits; +typedef uint32_t IOHIDDigitizerTransducerType; +void IOHIDEventAppendEvent(IOHIDEventRef event, IOHIDEventRef childEvent); +enum { + kIOHIDDigitizerTransducerTypeStylus = 0x20, + kIOHIDDigitizerTransducerTypePuck, + kIOHIDDigitizerTransducerTypeFinger, + kIOHIDDigitizerTransducerTypeHand +}; +enum { + kIOHIDDigitizerEventRange = 0x00000001, + kIOHIDDigitizerEventTouch = 0x00000002, + kIOHIDDigitizerEventPosition = 0x00000004, + kIOHIDDigitizerEventStop = 0x00000008, + kIOHIDDigitizerEventPeak = 0x00000010, + kIOHIDDigitizerEventIdentity = 0x00000020, + kIOHIDDigitizerEventAttribute = 0x00000040, + kIOHIDDigitizerEventCancel = 0x00000080, + kIOHIDDigitizerEventStart = 0x00000100, + kIOHIDDigitizerEventResting = 0x00000200, + kIOHIDDigitizerEventSwipeUp = 0x01000000, + kIOHIDDigitizerEventSwipeDown = 0x02000000, + kIOHIDDigitizerEventSwipeLeft = 0x04000000, + kIOHIDDigitizerEventSwipeRight = 0x08000000, + kIOHIDDigitizerEventSwipeMask = 0xFF000000, +}; +IOHIDEventRef IOHIDEventCreateDigitizerEvent(CFAllocatorRef allocator, AbsoluteTime timeStamp, IOHIDDigitizerTransducerType type, + uint32_t index, uint32_t identity, uint32_t eventMask, uint32_t buttonMask, + IOHIDFloat x, IOHIDFloat y, IOHIDFloat z, IOHIDFloat tipPressure, IOHIDFloat barrelPressure, + Boolean range, Boolean touch, IOOptionBits options); +IOHIDEventRef IOHIDEventCreateDigitizerFingerEventWithQuality(CFAllocatorRef allocator, AbsoluteTime timeStamp, + uint32_t index, uint32_t identity, uint32_t eventMask, + IOHIDFloat x, IOHIDFloat y, IOHIDFloat z, IOHIDFloat tipPressure, IOHIDFloat twist, + IOHIDFloat minorRadius, IOHIDFloat majorRadius, IOHIDFloat quality, IOHIDFloat density, IOHIDFloat irregularity, + Boolean range, Boolean touch, IOOptionBits options); + +/* END of IOKit Private Headers */ + +// +// GSEvent is an undeclared object. We don't need to use it ourselves but some +// Apple APIs (UIScrollView in particular) require the x and y fields to be present. +// +@interface KIFGSEventProxy : NSObject +{ +@public + unsigned int flags; + unsigned int type; + unsigned int ignored1; + float x1; + float y1; + float x2; + float y2; + unsigned int ignored2[10]; + unsigned int ignored3[7]; + float sizeX; + float sizeY; + float x3; + float y3; + unsigned int ignored4[3]; +} +@end + +@implementation KIFGSEventProxy +@end + +typedef struct __GSEvent * GSEventRef; + +@interface UIEvent (KIFAdditionsMorePrivateHeaders) +- (void)_setGSEvent:(GSEventRef)event; +- (void)_setHIDEvent:(IOHIDEventRef)event; +- (void)_setTimestamp:(NSTimeInterval)timestemp; +@end + +@implementation UIEvent (KIFAdditions) + +- (void)kif_setEventWithTouches:(NSArray *)touches +{ + NSOperatingSystemVersion iOS8 = {8, 0, 0}; + if ([NSProcessInfo instancesRespondToSelector:@selector(isOperatingSystemAtLeastVersion:)] + && [[NSProcessInfo new] isOperatingSystemAtLeastVersion:iOS8]) { + [self kif_setIOHIDEventWithTouches:touches]; + } else { + [self kif_setGSEventWithTouches:touches]; + } +} + +- (void)kif_setGSEventWithTouches:(NSArray *)touches +{ + UITouch *touch = touches[0]; + CGPoint location = [touch locationInView:touch.window]; + KIFGSEventProxy *gsEventProxy = [[KIFGSEventProxy alloc] init]; + gsEventProxy->x1 = location.x; + gsEventProxy->y1 = location.y; + gsEventProxy->x2 = location.x; + gsEventProxy->y2 = location.y; + gsEventProxy->x3 = location.x; + gsEventProxy->y3 = location.y; + gsEventProxy->sizeX = 1.0; + gsEventProxy->sizeY = 1.0; + gsEventProxy->flags = ([touch phase] == UITouchPhaseEnded) ? 0x1010180 : 0x3010180; + gsEventProxy->type = 3001; + + [self _setGSEvent:(GSEventRef)gsEventProxy]; + + [self _setTimestamp:(((UITouch*)touches[0]).timestamp)]; +} + +- (void)kif_setIOHIDEventWithTouches:(NSArray *)touches +{ + uint64_t abTime = mach_absolute_time(); + AbsoluteTime timeStamp; + timeStamp.hi = (UInt32)(abTime >> 32); + timeStamp.lo = (UInt32)(abTime); + + IOHIDEventRef handEvent = IOHIDEventCreateDigitizerEvent(kCFAllocatorDefault, timeStamp, kIOHIDDigitizerTransducerTypeHand, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + for (UITouch *touch in touches) + { + uint32_t eventMask = (touch.phase == UITouchPhaseMoved) ? kIOHIDDigitizerEventPosition : (kIOHIDDigitizerEventRange | kIOHIDDigitizerEventTouch); + uint32_t isTouching = (touch.phase == UITouchPhaseEnded) ? 0 : 1; + + CGPoint touchLocation = [touch locationInView:touch.window]; + + IOHIDEventRef fingerEvent = IOHIDEventCreateDigitizerFingerEventWithQuality(kCFAllocatorDefault, timeStamp, + (UInt32)[touches indexOfObject:touch], 2, + eventMask, (IOHIDFloat)touchLocation.x, (IOHIDFloat)touchLocation.y, + 0, 0, 0, 0, 0, 0, 0, 0, + (IOHIDFloat)isTouching, (IOHIDFloat)isTouching, 0); + IOHIDEventAppendEvent(handEvent, fingerEvent); + CFRelease(fingerEvent); + } + + [self _setHIDEvent:handEvent]; + CFRelease(handEvent); +} + +@end \ No newline at end of file diff --git a/tests/KIF/Additions/UIView-Debugging.h b/tests/KIF/Additions/UIView-Debugging.h new file mode 100755 index 000000000..cb7cfdf0e --- /dev/null +++ b/tests/KIF/Additions/UIView-Debugging.h @@ -0,0 +1,22 @@ +// +// UIView+Debugging.h +// KIF +// +// Created by Graeme Arthur on 02/05/15. +// + +#import +#import + +@interface UIView (Debugging) +/*! + @abstract Prints the view hiererchy, starting from the top window(s), along with accessibility information, which is more related to KIF than the usual information given by the 'description' method. + */ ++(void)printViewHierarchy; + +/*! + @abstract Prints the view hiererchy, starting from this view, along with accessibility information, which is more related to KIF than the usual information given by the 'description' method. + */ +-(void)printViewHierarchy; + +@end \ No newline at end of file diff --git a/tests/KIF/Additions/UIView-Debugging.m b/tests/KIF/Additions/UIView-Debugging.m new file mode 100755 index 000000000..96d860028 --- /dev/null +++ b/tests/KIF/Additions/UIView-Debugging.m @@ -0,0 +1,207 @@ +// +// UIView+Debugging.m +// KIF +// +// Created by Graeme Arthur on 02/05/15. +// + +#import "UIView-Debugging.h" + +@implementation UIView (Debugging) + ++(void)printViewHierarchy { + NSArray* windows = [UIApplication sharedApplication].windows; + if(windows.count == 1) { + [windows[0] printViewHierarchy]; + } else { + //more than one window, also print some information about each window + for (UIWindow* window in windows) { + printf("Window level %f", window.windowLevel); + if(window.isKeyWindow) printf(" (key window)"); + printf("\n"); + [window printViewHierarchy]; + printf("\n"); + } + } +} + +- (void)printViewHierarchy { + [self printViewHierarchyWithIndentation:0]; +} + +- (void)printViewHierarchyWithIndentation:(int)indent { + [self printIndentation:indent]; + [self printClassName]; + + [self printAccessibilityInfo]; + + if(self.hidden) { + printf(" (invisible)"); + } + + if([self isKindOfClass:[UIImageView class]]) { + [self printImageHighlightedState]; + } + + if([self isKindOfClass:[UIControl class]]) { + [self printControlState]; + } + printf("\n"); + + [self printAccessibilityElementsWithIndentation:indent]; + + for (UIView *subview in self.subviews) { + [subview printViewHierarchyWithIndentation:indent+1]; + } +} + +- (void)printIndentation:(int)indent { + for(int i = 0; i < indent; ++i) { + printf("|\t"); + } +} + +- (void)printClassName { + NSString* name = NSStringFromClass([self class]); + printf("%s", name.UTF8String); +} + +- (void)printAccessibilityInfo { + NSString* label = self.accessibilityLabel; + NSString* identifier = self.accessibilityIdentifier; + if(label != nil) { + printf(", label: %s", label.UTF8String); + } else if(identifier != nil) { + printf(", identifier: %s", identifier.UTF8String); + } +} + +- (void)printImageHighlightedState { + if(((UIImageView*)self).highlighted) { + printf(" (highlighted)"); + } else { + printf(" (not highlighted)"); + } +} + +- (void)printControlState { + UIControl* ctrl = (UIControl*)self; + ctrl.enabled ? printf(" (enabled)") : printf(" (not enabled)"); + ctrl.selected ? printf(" (selected)") : printf(" (not selected)"); + ctrl.highlighted ? printf(" (highlighted)") : printf(" (not highlighted)"); +} + +- (void)printAccessibilityElementsWithIndentation:(int)indent { + NSInteger numOfAccElements = self.accessibilityElementCount; + if(numOfAccElements != NSNotFound) { + for (NSInteger i = 0; i < numOfAccElements; ++i) { + [self printIndentation:indent]; + UIAccessibilityElement *e = [(UIAccessibilityElement*)self accessibilityElementAtIndex:i]; + printf("%s, label: %s", NSStringFromClass([e class]).UTF8String, e.accessibilityLabel.UTF8String); + if(e.accessibilityValue && e.accessibilityValue.length > 0) { + printf(", value: %s", e.accessibilityValue.UTF8String); + } + if(e.accessibilityHint && e.accessibilityHint.length > 0) { + printf(", hint: %s", e.accessibilityHint.UTF8String); + } + printf(", "); + [self printAccessibilityTraits:e.accessibilityTraits]; + printf("\n"); + } + } +} + +- (void)printAccessibilityTraits:(UIAccessibilityTraits)traits { + + printf("traits: "); + bool didPrintOne = false; + if(traits == UIAccessibilityTraitNone) { + printf("none"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitButton) { + if(didPrintOne) printf(", "); + printf("button"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitLink) { + if(didPrintOne) printf(", "); + printf("link"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitHeader) { + if(didPrintOne) printf(", "); + printf("header"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitSearchField) { + if(didPrintOne) printf(", "); + printf("search field"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitImage) { + if(didPrintOne) printf(", "); + printf("image"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitSelected) { + if(didPrintOne) printf(", "); + printf("selected"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitPlaysSound) { + if(didPrintOne) printf(", "); + printf("plays sound"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitKeyboardKey) { + if(didPrintOne) printf(", "); + printf("keyboard key"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitStaticText) { + if(didPrintOne) printf(", "); + printf("static text"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitSummaryElement) { + if(didPrintOne) printf(", "); + printf("summary element"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitNotEnabled) { + if(didPrintOne) printf(", "); + printf("not enabled"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitUpdatesFrequently) { + if(didPrintOne) printf(", "); + printf("updates frequently"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitStartsMediaSession) { + if(didPrintOne) printf(", "); + printf("starts media session"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitAdjustable) { + if(didPrintOne) printf(", "); + printf("adjustable"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitAllowsDirectInteraction) { + if(didPrintOne) printf(", "); + printf("allows direct interaction"); + didPrintOne = true; + } + if(traits & UIAccessibilityTraitCausesPageTurn) { + if(didPrintOne) printf(", "); + printf("causes page turn"); + didPrintOne = true; + } + if(!didPrintOne) { + printf("unknown flags (0x%llx)", traits); + } +} + +@end diff --git a/tests/KIF/Additions/UIView-KIFAdditions.h b/tests/KIF/Additions/UIView-KIFAdditions.h index a7dad07b5..746fde0be 100755 --- a/tests/KIF/Additions/UIView-KIFAdditions.h +++ b/tests/KIF/Additions/UIView-KIFAdditions.h @@ -9,6 +9,9 @@ #import +extern double KIFDegreesToRadians(double deg); +extern double KIFRadiansToDegrees(double rad); + typedef CGPoint KIFDisplacement; @interface UIView (KIFAdditions) @@ -36,6 +39,7 @@ typedef CGPoint KIFDisplacement; - (void)flash; - (void)tap; - (void)tapAtPoint:(CGPoint)point; +- (void)twoFingerTapAtPoint:(CGPoint)point; - (void)longPressAtPoint:(CGPoint)point duration:(NSTimeInterval)duration; /*! @@ -52,6 +56,7 @@ typedef CGPoint KIFDisplacement; - (void)twoFingerPanFromPoint:(CGPoint)startPoint toPoint:(CGPoint)toPoint steps:(NSUInteger)stepCount; - (void)pinchAtPoint:(CGPoint)centerPoint distance:(CGFloat)distance steps:(NSUInteger)stepCount; - (void)zoomAtPoint:(CGPoint)centerPoint distance:(CGFloat)distance steps:(NSUInteger)stepCount; +- (void)twoFingerRotateAtPoint:(CGPoint)centerPoint angle:(CGFloat)angleInDegrees; /*! @method isTappableWithHitTestResultView: @abstract Easy hook to override whether a hit test result makes a view tappable. diff --git a/tests/KIF/Additions/UIView-KIFAdditions.m b/tests/KIF/Additions/UIView-KIFAdditions.m index b7d0276a8..0293f4953 100755 --- a/tests/KIF/Additions/UIView-KIFAdditions.m +++ b/tests/KIF/Additions/UIView-KIFAdditions.m @@ -13,53 +13,22 @@ #import "UIApplication-KIFAdditions.h" #import "UITouch-KIFAdditions.h" #import +#import "UIEvent+KIFAdditions.h" -typedef struct __GSEvent * GSEventRef; - -static CGFloat const kTwoFingerConstantWidth = 40; - -// -// GSEvent is an undeclared object. We don't need to use it ourselves but some -// Apple APIs (UIScrollView in particular) require the x and y fields to be present. -// -@interface KIFEventProxy : NSObject -{ -@public - unsigned int flags; - unsigned int type; - unsigned int ignored1; - float x1; - float y1; - float x2; - float y2; - unsigned int ignored2[10]; - unsigned int ignored3[7]; - float sizeX; - float sizeY; - float x3; - float y3; - unsigned int ignored4[3]; +double KIFDegreesToRadians(double deg) { + return (deg) / 180.0 * M_PI; } -@end - -@implementation KIFEventProxy -@end - -// Exposes methods of UITouchesEvent so that the compiler doesn't complain -@interface UIEvent (KIFAdditionsPrivate) - -- (void)_addTouch:(id)arg1 forDelayedDelivery:(BOOL)arg2; -- (void)_clearTouches; -- (void)_setGSEvent:(GSEventRef)event; +double KIFRadiansToDegrees(double rad) { + return ((rad) * (180.0 / M_PI)); +} -@end +static CGFloat const kTwoFingerConstantWidth = 40; @interface UIApplication (KIFAdditionsPrivate) - (UIEvent *)_touchesEvent; @end - @interface NSObject (UIWebDocumentViewInternal) - (void)tapInteractionWithLocation:(CGPoint)point; @@ -84,14 +53,17 @@ NS_INLINE BOOL StringsMatchExceptLineBreaks(NSString *expected, NSString *actual return YES; } - if ([expected rangeOfString:@"\n"].location == NSNotFound) { + if ([expected rangeOfString:@"\n"].location == NSNotFound && + [actual rangeOfString:@"\n"].location == NSNotFound) { return NO; } for (NSUInteger i = 0; i < expected.length; i ++) { unichar expectedChar = [expected characterAtIndex:i]; unichar actualChar = [actual characterAtIndex:i]; - if (expectedChar != actualChar && !(expectedChar == '\n' && actualChar == ' ')) { + if (expectedChar != actualChar && + !(expectedChar == '\n' && actualChar == ' ') && + !(expectedChar == ' ' && actualChar == '\n')) { return NO; } } @@ -152,7 +124,12 @@ - (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label acce - (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessibilityElement *))matchBlock; { - if (self.hidden) { + return [self accessibilityElementMatchingBlock:matchBlock notHidden:YES]; +} + +- (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessibilityElement *))matchBlock notHidden:(BOOL)notHidden; +{ + if (notHidden && self.hidden) { return nil; } @@ -198,7 +175,7 @@ - (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessi while (elementStack.count) { UIAccessibilityElement *element = [elementStack lastObject]; [elementStack removeLastObject]; - + BOOL elementMatches = matchBlock(element); if (elementMatches) { @@ -224,45 +201,97 @@ - (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessi UIAccessibilityElement *subelement = [element accessibilityElementAtIndex:accessibilityElementIndex]; if (subelement) { + // Skip table view cell accessibility elements, they're handled below + if ([subelement isKindOfClass:NSClassFromString(@"UITableViewCellAccessibilityElement")]) { + continue; + } + [elementStack addObject:subelement]; } } } - if (!matchingButOccludedElement && [self isKindOfClass:[UICollectionView class]]) { - UICollectionView *collectionView = (UICollectionView *)self; - - NSArray *indexPathsForVisibleItems = [collectionView indexPathsForVisibleItems]; - - for (NSUInteger section = 0, numberOfSections = [collectionView numberOfSections]; section < numberOfSections; section++) { - for (NSUInteger item = 0, numberOfItems = [collectionView numberOfItemsInSection:section]; item < numberOfItems; item++) { - // Skip visible items because they are already handled - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section]; - if ([indexPathsForVisibleItems containsObject:indexPath]) { - continue; + if (!matchingButOccludedElement) { + if ([self isKindOfClass:[UITableView class]]) { + UITableView *tableView = (UITableView *)self; + + // Because of a bug in [UITableView indexPathsForVisibleRows] http://openradar.appspot.com/radar?id=5191284490764288 + // We use [UITableView visibleCells] to determine the index path of the visible cells + NSMutableArray *indexPathsForVisibleRows = [[NSMutableArray alloc] init]; + [[tableView visibleCells] enumerateObjectsUsingBlock:^(UITableViewCell *cell, NSUInteger idx, BOOL *stop) { + NSIndexPath *indexPath = [tableView indexPathForCell:cell]; + if (indexPath) { + [indexPathsForVisibleRows addObject:indexPath]; } - - @autoreleasepool { - // Get the cell directly from the dataSource because UICollectionView will only vend visible cells - UICollectionViewCell *cell = [collectionView.dataSource collectionView:collectionView cellForItemAtIndexPath:indexPath]; + }]; + + for (NSUInteger section = 0, numberOfSections = [tableView numberOfSections]; section < numberOfSections; section++) { + for (NSUInteger row = 0, numberOfRows = [tableView numberOfRowsInSection:section]; row < numberOfRows; row++) { + // Skip visible rows because they are already handled + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section]; + if ([indexPathsForVisibleRows containsObject:indexPath]) { + continue; + } - UIAccessibilityElement *element = [cell accessibilityElementMatchingBlock:matchBlock]; + @autoreleasepool { + // Get the cell directly from the dataSource because UITableView will only vend visible cells + UITableViewCell *cell = [tableView.dataSource tableView:tableView cellForRowAtIndexPath:indexPath]; + + UIAccessibilityElement *element = [cell accessibilityElementMatchingBlock:matchBlock notHidden:NO]; + + // Remove the cell from the table view so that it doesn't stick around + [cell removeFromSuperview]; + + // Skip this cell if it isn't the one we're looking for + if (!element) { + continue; + } + } - // Remove the cell from the collection view so that it doesn't stick around - [cell removeFromSuperview]; + // Scroll to the cell and wait for the animation to complete + [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:YES]; + CFRunLoopRunInMode(UIApplicationCurrentRunMode, 0.5, false); - // Skip this cell if it isn't the one we're looking for - if (!element) { + // Now try finding the element again + return [self accessibilityElementMatchingBlock:matchBlock]; + } + } + } else if ([self isKindOfClass:[UICollectionView class]]) { + UICollectionView *collectionView = (UICollectionView *)self; + + NSArray *indexPathsForVisibleItems = [collectionView indexPathsForVisibleItems]; + + for (NSUInteger section = 0, numberOfSections = [collectionView numberOfSections]; section < numberOfSections; section++) { + for (NSUInteger item = 0, numberOfItems = [collectionView numberOfItemsInSection:section]; item < numberOfItems; item++) { + // Skip visible items because they are already handled + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section]; + if ([indexPathsForVisibleItems containsObject:indexPath]) { continue; } + + @autoreleasepool { + // Get the cell directly from the dataSource because UICollectionView will only vend visible cells + UICollectionViewCell *cell = [collectionView.dataSource collectionView:collectionView cellForItemAtIndexPath:indexPath]; + + UIAccessibilityElement *element = [cell accessibilityElementMatchingBlock:matchBlock notHidden:NO]; + + // Remove the cell from the collection view so that it doesn't stick around + [cell removeFromSuperview]; + + // Skip this cell if it isn't the one we're looking for + // Sometimes we get cells with no size here which can cause an endless loop, so we ignore those + if (!element || CGSizeEqualToSize(cell.frame.size, CGSizeZero)) { + continue; + } + } + + // Scroll to the cell and wait for the animation to complete + [collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; + CFRunLoopRunInMode(UIApplicationCurrentRunMode, 0.5, false); + + // Now try finding the element again + return [self accessibilityElementMatchingBlock:matchBlock]; } - - // Scroll to the cell and wait for the animation to complete - [collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; - CFRunLoopRunInMode(UIApplicationCurrentRunMode, 0.5, false); - - // Now try finding the element again - return [self accessibilityElementMatchingBlock:matchBlock]; } } } @@ -403,6 +432,23 @@ - (void)tapAtPoint:(CGPoint)point; } +- (void)twoFingerTapAtPoint:(CGPoint)point { + CGPoint finger1 = CGPointMake(point.x - kTwoFingerConstantWidth, point.y - kTwoFingerConstantWidth); + CGPoint finger2 = CGPointMake(point.x + kTwoFingerConstantWidth, point.y + kTwoFingerConstantWidth); + UITouch *touch1 = [[UITouch alloc] initAtPoint:finger1 inView:self]; + UITouch *touch2 = [[UITouch alloc] initAtPoint:finger2 inView:self]; + [touch1 setPhaseAndUpdateTimestamp:UITouchPhaseBegan]; + [touch2 setPhaseAndUpdateTimestamp:UITouchPhaseBegan]; + + UIEvent *event = [self eventWithTouches:@[touch1, touch2]]; + [[UIApplication sharedApplication] sendEvent:event]; + + [touch1 setPhaseAndUpdateTimestamp:UITouchPhaseEnded]; + [touch2 setPhaseAndUpdateTimestamp:UITouchPhaseEnded]; + + [[UIApplication sharedApplication] sendEvent:event]; +} + #define DRAG_TOUCH_DELAY 0.01 - (void)longPressAtPoint:(CGPoint)point duration:(NSTimeInterval)duration @@ -498,6 +544,8 @@ - (void)dragPointsAlongPaths:(NSArray *)arrayOfPaths { } UIEvent *eventDown = [self eventWithTouches:[NSArray arrayWithArray:touches]]; [[UIApplication sharedApplication] sendEvent:eventDown]; + + CFRunLoopRunInMode(UIApplicationCurrentRunMode, DRAG_TOUCH_DELAY, false); } else { @@ -517,9 +565,13 @@ - (void)dragPointsAlongPaths:(NSArray *)arrayOfPaths { // The last point needs to also send a phase ended touch. if (pointIndex == pointsInPath - 1) { - [touch setPhaseAndUpdateTimestamp:UITouchPhaseEnded]; - UIEvent *eventUp = [self eventWithTouch:touch]; - [[UIApplication sharedApplication] sendEvent:eventUp]; + for (UITouch * touch in touches) { + [touch setPhaseAndUpdateTimestamp:UITouchPhaseEnded]; + UIEvent *eventUp = [self eventWithTouch:touch]; + [[UIApplication sharedApplication] sendEvent:eventUp]; + + } + } } } @@ -580,6 +632,35 @@ - (void)zoomAtPoint:(CGPoint)centerPoint distance:(CGFloat)distance steps:(NSUIn [self dragPointsAlongPaths:paths]; } +- (void)twoFingerRotateAtPoint:(CGPoint)centerPoint angle:(CGFloat)angleInDegrees { + NSInteger stepCount = ABS(angleInDegrees)/2; // very rough approximation. 90deg = ~45 steps, 360 deg = ~180 steps + CGFloat radius = kTwoFingerConstantWidth*2; + double angleInRadians = KIFDegreesToRadians(angleInDegrees); + + NSMutableArray *finger1Path = [NSMutableArray array]; + NSMutableArray *finger2Path = [NSMutableArray array]; + for (NSUInteger i = 0; i < stepCount; i++) { + double currentAngle = 0; + if (i == stepCount - 1) { + currentAngle = angleInRadians; // do not interpolate for the last step for maximum accuracy + } + else { + double interpolation = i/(double)stepCount; + currentAngle = interpolation * angleInRadians; + } + // interpolate betwen 0 and the target rotation + CGPoint offset1 = CGPointMake(radius * cos(currentAngle), radius * sin(currentAngle)); + CGPoint offset2 = CGPointMake(-offset1.x, -offset1.y); // second finger is just opposite of the first + + CGPoint finger1 = CGPointMake(centerPoint.x + offset1.x, centerPoint.y + offset1.y); + CGPoint finger2 = CGPointMake(centerPoint.x + offset2.x, centerPoint.y + offset2.y); + + [finger1Path addObject:[NSValue valueWithCGPoint:finger1]]; + [finger2Path addObject:[NSValue valueWithCGPoint:finger2]]; + } + [self dragPointsAlongPaths:@[[finger1Path copy], [finger2Path copy]]]; +} + - (NSArray *)pointsFromStartPoint:(CGPoint)startPoint toPoint:(CGPoint)toPoint steps:(NSUInteger)stepCount { CGPoint displacement = CGPointMake(toPoint.x - startPoint.x, toPoint.y - startPoint.y); @@ -704,22 +785,8 @@ - (UIEvent *)eventWithTouches:(NSArray *)touches // _touchesEvent is a private selector, interface is exposed in UIApplication(KIFAdditionsPrivate) UIEvent *event = [[UIApplication sharedApplication] _touchesEvent]; - UITouch *touch = touches[0]; - CGPoint location = [touch locationInView:touch.window]; - KIFEventProxy *eventProxy = [[KIFEventProxy alloc] init]; - eventProxy->x1 = location.x; - eventProxy->y1 = location.y; - eventProxy->x2 = location.x; - eventProxy->y2 = location.y; - eventProxy->x3 = location.x; - eventProxy->y3 = location.y; - eventProxy->sizeX = 1.0; - eventProxy->sizeY = 1.0; - eventProxy->flags = ([touch phase] == UITouchPhaseEnded) ? 0x1010180 : 0x3010180; - eventProxy->type = 3001; - [event _clearTouches]; - [event _setGSEvent:(struct __GSEvent *)eventProxy]; + [event kif_setEventWithTouches:touches]; for (UITouch *aTouch in touches) { [event _addTouch:aTouch forDelayedDelivery:NO]; @@ -830,4 +897,5 @@ - (void)performBlockOnAscendentViews:(void (^)(UIView *view, BOOL *stop))block } } + @end diff --git a/tests/KIF/Classes/KIFSystemTestActor.h b/tests/KIF/Classes/KIFSystemTestActor.h index 92e9e82ca..b5b5c2032 100755 --- a/tests/KIF/Classes/KIFSystemTestActor.h +++ b/tests/KIF/Classes/KIFSystemTestActor.h @@ -61,6 +61,14 @@ */ - (void)waitForApplicationToOpenAnyURLWhileExecutingBlock:(void(^)())block returning:(BOOL)returnValue; +/*! + @abstract Waits for the application to request any URL with the given URL Scheme while executing a block. + @param URLScheme The scheme component of the URL to detect. + @param block The block of code to be executed. + @param returnValue The value to return from @c +[UIApplication openURL:]. + */ +- (void)waitForApplicationToOpenURLWithScheme:(NSString *)URLScheme whileExecutingBlock:(void (^)())block returning:(BOOL)returnValue; + /*! @abstract Captured a screenshot of the current screen and writes it to disk with an optional description. @discussion This step will fail if the @c KIF_SCREENSHOTS environment variable is not set or if the screenshot cannot be written to disk. diff --git a/tests/KIF/Classes/KIFSystemTestActor.m b/tests/KIF/Classes/KIFSystemTestActor.m index 454c9389c..653090fb1 100755 --- a/tests/KIF/Classes/KIFSystemTestActor.m +++ b/tests/KIF/Classes/KIFSystemTestActor.m @@ -69,21 +69,48 @@ - (void)simulateDeviceRotationToOrientation:(UIDeviceOrientation)orientation } } + - (void)waitForApplicationToOpenAnyURLWhileExecutingBlock:(void (^)())block returning:(BOOL)returnValue { [self waitForApplicationToOpenURL:nil whileExecutingBlock:block returning:returnValue]; } -- (void)waitForApplicationToOpenURL:(NSString *)URLString whileExecutingBlock:(void (^)())block returning:(BOOL)returnValue +- (void)waitForApplicationToOpenURLWithScheme:(NSString *)URLScheme whileExecutingBlock:(void (^)())block returning:(BOOL)returnValue { + [self waitForApplicationToOpenURLMatchingBlock:^(NSURL *actualURL){ + if (URLScheme && ![URLScheme isEqualToString:actualURL.scheme]) { + [self failWithError:[NSError KIFErrorWithFormat:@"Expected %@ to start with %@", actualURL.absoluteString, URLScheme] stopTest:YES]; + } + } whileExecutingBlock:block returning:returnValue]; +} + +- (void)waitForApplicationToOpenURL:(NSString *)URLString whileExecutingBlock:(void (^)())block returning:(BOOL)returnValue { + [self waitForApplicationToOpenURLMatchingBlock:^(NSURL *actualURL){ + + if (URLString && ![[actualURL absoluteString] isEqualToString:URLString]) { + [self failWithError:[NSError KIFErrorWithFormat:@"Expected %@, got %@", URLString, actualURL.absoluteString] stopTest:YES]; + } + } whileExecutingBlock:block returning:returnValue]; +} + +- (void)waitForApplicationToOpenURLMatchingBlock:(void (^)(NSURL *actualURL))URLMatcherBlock whileExecutingBlock:(void (^)())block returning:(BOOL)returnValue { [UIApplication startMockingOpenURLWithReturnValue:returnValue]; + + id canOpenURLObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidMockCanOpenURLNotification object:[UIApplication sharedApplication] queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + if (URLMatcherBlock) { + NSURL *actualURL = [notification.userInfo objectForKey:UIApplicationOpenedURLKey]; + URLMatcherBlock(actualURL); + } + }]; + NSNotification *notification = [self waitForNotificationName:UIApplicationDidMockOpenURLNotification object:[UIApplication sharedApplication] whileExecutingBlock:block complete:^{ [UIApplication stopMockingOpenURL]; + [[NSNotificationCenter defaultCenter] removeObserver:canOpenURLObserver]; }]; - - NSString *actualURLString = [[notification.userInfo objectForKey:UIApplicationOpenedURLKey] absoluteString]; - if (URLString && ![URLString isEqualToString:actualURLString]) { - [self failWithError:[NSError KIFErrorWithFormat:@"Expected %@, got %@", URLString, actualURLString] stopTest:YES]; + + if (URLMatcherBlock) { + NSURL *actualURL = [notification.userInfo objectForKey:UIApplicationOpenedURLKey]; + URLMatcherBlock(actualURL); } } diff --git a/tests/KIF/Classes/KIFTestCase.m b/tests/KIF/Classes/KIFTestCase.m index 8a940eea2..53a8acb3c 100755 --- a/tests/KIF/Classes/KIFTestCase.m +++ b/tests/KIF/Classes/KIFTestCase.m @@ -81,9 +81,13 @@ + (void)tearDown + (void)performSetupTearDownWithSelector:(SEL)selector { KIFTestCase *testCase = [self testCaseWithSelector:selector]; - XCTestCaseRun *run = [XCTestCaseRun testRunWithTest:testCase]; - [testCase performTest:run]; - + if ([testCase respondsToSelector:selector]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [testCase performSelector:selector]; +#pragma clang diagnostic pop + } + if (testCase->_stoppingException) { [testCase->_stoppingException raise]; } diff --git a/tests/KIF/Classes/KIFTypist.m b/tests/KIF/Classes/KIFTypist.m index eb3765385..bb5dc57cd 100755 --- a/tests/KIF/Classes/KIFTypist.m +++ b/tests/KIF/Classes/KIFTypist.m @@ -53,18 +53,27 @@ - (instancetype)init - (void)registerForNotifications { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShowNotification:) name:UIKeyboardDidShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil]; -} - -- (void)keyboardDidShowNotification:(NSNotification *)notification -{ - self.keyboardHidden = NO; -} - -- (void)keyboardWillHideNotification:(NSNotification *)notification -{ - self.keyboardHidden = YES; + // Instead of listening to keyboard will show/hide notifications, this is more robust. When keyboard is split + // on a physical device, keyboard will show/hide notifications does not get fired, whereas this does. + __weak KIFTypist *weakSelf = self; + [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidChangeFrameNotification + object:nil + queue:[NSOperationQueue mainQueue] + usingBlock:^(NSNotification *note) { + CGRect keyboardEndFrame = + [[note.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + + CGRect screenRect = [[UIScreen mainScreen] bounds]; + + if (CGRectIntersectsRect(keyboardEndFrame, screenRect)) + { + weakSelf.keyboardHidden = NO; + } + else + { + weakSelf.keyboardHidden = YES; + } + }]; } + (BOOL)keyboardHidden diff --git a/tests/KIF/Classes/KIFUITestActor.h b/tests/KIF/Classes/KIFUITestActor.h index 710b3214a..be60b8af2 100755 --- a/tests/KIF/Classes/KIFUITestActor.h +++ b/tests/KIF/Classes/KIFUITestActor.h @@ -441,6 +441,14 @@ static inline KIFDisplacement KIFDisplacementForSwipingInDirection(KIFSwipeDirec */ - (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits inDirection:(KIFSwipeDirection)direction; +/*! + @abstract Swipes a particular view in the view heirarchy. + @discussion Unlike the -swipeViewWithAccessibilityLabel: family of methods, this method allows you to swipe an arbitrary element. Combined with -waitForAccessibilityElement:view:withLabel:value:traits:tappable: or +[UIAccessibilityElement accessibilityElement:view:withLabel:value:traits:tappable:error:] this provides an opportunity for more complex logic. + @param element The accessibility element to tap. + @param viewToSwipe The view containing the accessibility element. + */ +- (void)swipeAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)viewToSwipe inDirection:(KIFSwipeDirection)direction; + /*! @abstract Scrolls a particular view in the view hierarchy by an amount indicated as a fraction of its size. @discussion The view will get the view with the specified accessibility label and scroll it by the indicated fraction of its size, with the scroll centered on the center of the view. @@ -515,4 +523,20 @@ static inline KIFDisplacement KIFDisplacementForSwipingInDirection(KIFSwipeDirec @param identifier Accessibility identifier of the table view. */ - (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier; + +/*! + @abstract Swipes the row at indexPath in the given direction. + + @param indexPath Index path of the row to swipe. + @param tableView Table view to operate on. + @param direction Direction of the swipe. + */ +- (void)swipeRowAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView inDirection:(KIFSwipeDirection)direction; + +/*! + @abstract Backgrounds app using UIAutomation command, simulating pressing the Home button + @param duration Amount of time for a background event before the app becomes active again + */ +- (void)deactivateAppForDuration:(NSTimeInterval)duration; + @end diff --git a/tests/KIF/Classes/KIFUITestActor.m b/tests/KIF/Classes/KIFUITestActor.m index 6789afde6..6b794bea2 100755 --- a/tests/KIF/Classes/KIFUITestActor.m +++ b/tests/KIF/Classes/KIFUITestActor.m @@ -320,13 +320,13 @@ - (void)waitForKeyInputReady }]; } -- (void)enterTextIntoCurrentFirstResponder:(NSString *)text; +- (void)enterTextIntoCurrentFirstResponder:(NSString *)text { [self waitForKeyInputReady]; [self enterTextIntoCurrentFirstResponder:text fallbackView:nil]; } -- (void)enterTextIntoCurrentFirstResponder:(NSString *)text fallbackView:(UIView *)fallbackView; +- (void)enterTextIntoCurrentFirstResponder:(NSString *)text fallbackView:(UIView *)fallbackView { for (NSUInteger characterIndex = 0; characterIndex < [text length]; characterIndex++) { NSString *characterString = [text substringWithRange:NSMakeRange(characterIndex, 1)]; @@ -500,8 +500,12 @@ - (void)selectPickerViewRowWithTitle:(NSString *)title inComponent:(NSInteger)co UILabel *label = (labels.count > 0 ? labels[0] : nil); rowTitle = label.text; } - NSAssert(rowTitle != nil, @"Unknown picker type. Delegate responds neither to pickerView:titleForRow:forComponent: nor to pickerView:viewForRow:forComponent:reusingView:"); - [dataToSelect addObject: rowTitle]; + + if (rowTitle) { + [dataToSelect addObject: rowTitle]; + } else { + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Unknown picker type. Delegate responds neither to pickerView:titleForRow:forComponent: nor to pickerView:viewForRow:forComponent:reusingView:" userInfo:nil]; + } } } @@ -748,6 +752,21 @@ - (void)tapRowAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)ta [self waitForAnimationsToFinish]; } +- (void)swipeRowAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView inDirection:(KIFSwipeDirection)direction +{ + const NSUInteger kNumberOfPointsInSwipePath = 20; + + UITableViewCell *cell = [self waitForCellAtIndexPath:indexPath inTableView:tableView]; + CGRect cellFrame = [cell.contentView convertRect:cell.contentView.frame toView:tableView]; + CGPoint swipeStart = CGPointCenteredInRect(cellFrame); + KIFDisplacement swipeDisplacement = KIFDisplacementForSwipingInDirection(direction); + [tableView dragFromPoint:swipeStart displacement:swipeDisplacement steps:kNumberOfPointsInSwipePath]; + + // Wait for the view to stabilize. + [tester waitForTimeInterval:0.5]; + +} + - (void)tapItemAtIndexPath:(NSIndexPath *)indexPath inCollectionViewWithAccessibilityIdentifier:(NSString *)identifier { UICollectionView *collectionView; @@ -782,21 +801,26 @@ - (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)valu - (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits inDirection:(KIFSwipeDirection)direction { - const NSUInteger kNumberOfPointsInSwipePath = 20; - - // The original version of this came from http://groups.google.com/group/kif-framework/browse_thread/thread/df3f47eff9f5ac8c - UIView *viewToSwipe = nil; UIAccessibilityElement *element = nil; - [self waitForAccessibilityElement:&element view:&viewToSwipe withLabel:label value:value traits:traits tappable:NO]; + [self waitForAccessibilityElement:&element view:&viewToSwipe withLabel:label value:value traits:traits tappable:YES]; - // Within this method, all geometry is done in the coordinate system of the view to swipe. + [self swipeAccessibilityElement:element inView:viewToSwipe inDirection:direction]; +} +- (void)swipeAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)viewToSwipe inDirection:(KIFSwipeDirection)direction +{ + // The original version of this came from http://groups.google.com/group/kif-framework/browse_thread/thread/df3f47eff9f5ac8c + + const NSUInteger kNumberOfPointsInSwipePath = 20; + + // Within this method, all geometry is done in the coordinate system of the view to swipe. + CGRect elementFrame = [viewToSwipe.windowOrIdentityWindow convertRect:element.accessibilityFrame toView:viewToSwipe]; CGPoint swipeStart = CGPointCenteredInRect(elementFrame); KIFDisplacement swipeDisplacement = KIFDisplacementForSwipingInDirection(direction); - + [viewToSwipe dragFromPoint:swipeStart displacement:swipeDisplacement steps:kNumberOfPointsInSwipePath]; } @@ -956,9 +980,20 @@ - (UICollectionViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inColl [collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally | UICollectionViewScrollPositionCenteredVertically animated:YES]; - [self waitForTimeInterval:0.5]; + + [self waitForAnimationsToFinish]; UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; + //For big collection views with many cells the cell might not be ready yet. Relayout and try again. + if(cell == nil) { + [collectionView layoutIfNeeded]; + [collectionView scrollToItemAtIndexPath:indexPath + atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally | UICollectionViewScrollPositionCenteredVertically + animated:YES]; + [self waitForAnimationsToFinish]; + cell = [collectionView cellForItemAtIndexPath:indexPath]; + } + if (!cell) { [self failWithError:[NSError KIFErrorWithFormat: @"Collection view cell at index path %@ not found", indexPath] stopTest:YES]; } @@ -996,5 +1031,9 @@ - (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPa } } +- (void)deactivateAppForDuration:(NSTimeInterval)duration { + [UIAutomationHelper deactivateAppForDuration:@(duration)]; +} + @end diff --git a/tests/KIF/Classes/UIAutomationHelper.h b/tests/KIF/Classes/UIAutomationHelper.h index 78fe4de63..bc1e7559b 100755 --- a/tests/KIF/Classes/UIAutomationHelper.h +++ b/tests/KIF/Classes/UIAutomationHelper.h @@ -14,4 +14,6 @@ + (void)acknowledgeSystemAlert; ++ (void)deactivateAppForDuration:(NSNumber *)duration; + @end diff --git a/tests/KIF/Classes/UIAutomationHelper.m b/tests/KIF/Classes/UIAutomationHelper.m index e40071263..0f02e2a8d 100755 --- a/tests/KIF/Classes/UIAutomationHelper.m +++ b/tests/KIF/Classes/UIAutomationHelper.m @@ -24,6 +24,7 @@ - (UIAAlert *)alert; @interface UIATarget : UIAElement + (UIATarget *)localTarget; - (UIAApplication *)frontMostApp; +- (void)deactivateAppForDuration:(NSNumber *)duration; @end @interface UIAElementNil : UIAElement @@ -47,6 +48,10 @@ + (void)acknowledgeSystemAlert { [[self sharedHelper] acknowledgeSystemAlert]; } ++ (void)deactivateAppForDuration:(NSNumber *)duration { + [[self sharedHelper] deactivateAppForDuration:duration]; +} + - (void)acknowledgeSystemAlert { UIAApplication *application = [[self target] frontMostApp]; UIAAlert *alert = application.alert; @@ -57,6 +62,10 @@ - (void)acknowledgeSystemAlert { } } +- (void)deactivateAppForDuration:(NSNumber *)duration { + [[self target] deactivateAppForDuration:duration]; +} + #pragma mark - Private - (void)linkAutomationFramework { diff --git a/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.h b/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.h index 09ebdc1b5..bf088fea4 100755 --- a/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.h +++ b/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.h @@ -70,4 +70,19 @@ */ - (void)waitForFirstResponderWithAccessibilityIdentifier:(NSString *)accessibilityIdentifier; +/*! + @abstract returns YES or NO if the element is visible. + @discussion if the element described by the accessibility identifier is visible, the method returns true. + @param accessibilityIdentifier The accessibility identifier of the element to query for + */ +- (BOOL) tryFindingViewWithAccessibilityIdentifier:(NSString *) accessibilityIdentifier; + +/*! + @abstract Swipes a particular view in the view hierarchy in the given direction. + @discussion This step will get the view with the specified accessibility identifier and swipe the screen in the given direction from the view's center. + @param identifier The accessibility identifier of the view to swipe. + @param direction The direction in which to swipe. + */ +- (void)swipeViewWithAccessibilityIdentifier:(NSString *)identifier inDirection:(KIFSwipeDirection)direction; + @end diff --git a/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.m b/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.m index 649f7f678..6233d148c 100755 --- a/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.m +++ b/tests/KIF/IdentifierTests/KIFUITestActor-IdentifierTests.m @@ -196,7 +196,20 @@ - (void)waitForFirstResponderWithAccessibilityIdentifier:(NSString *)accessibili }]; } +- (BOOL) tryFindingViewWithAccessibilityIdentifier:(NSString *) accessibilityIdentifier +{ + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"accessibilityIdentifier = %@", accessibilityIdentifier]; + return [UIAccessibilityElement accessibilityElement:nil view:nil withElementMatchingPredicate:predicate tappable:NO error:nil]; +} +- (void)swipeViewWithAccessibilityIdentifier:(NSString *)identifier inDirection:(KIFSwipeDirection)direction +{ + UIView *viewToSwipe = nil; + UIAccessibilityElement *element = nil; + [self waitForAccessibilityElement: &element view:&viewToSwipe withIdentifier:identifier tappable:NO]; + + [self swipeAccessibilityElement:element inView:viewToSwipe inDirection:direction]; +} @end diff --git a/tests/KIF/KIF Tests/AccessibilityIdentifierTests.m b/tests/KIF/KIF Tests/AccessibilityIdentifierTests.m index 47f0de7c8..f0ecb6c7f 100755 --- a/tests/KIF/KIF Tests/AccessibilityIdentifierTests.m +++ b/tests/KIF/KIF Tests/AccessibilityIdentifierTests.m @@ -70,6 +70,18 @@ - (void)testClearingAndEnteringTextIntoViewWithAccessibilityLabel [tester clearTextFromAndThenEnterText:@"Yo" intoViewWithAccessibilityIdentifier:@"idGreeting"]; } +- (void)testTryFindingViewWithAccessibilityIdentifier +{ + if (![tester tryFindingViewWithAccessibilityIdentifier:@"idGreeting"]) + { + [tester fail]; + } + + if ([tester tryFindingViewWithAccessibilityIdentifier:@"idDoesNotExist"]) + { + [tester fail]; + } +} - (void)afterEach { diff --git a/tests/KIF/KIF Tests/BackgroundTests.m b/tests/KIF/KIF Tests/BackgroundTests.m new file mode 100755 index 000000000..ccbbaccc0 --- /dev/null +++ b/tests/KIF/KIF Tests/BackgroundTests.m @@ -0,0 +1,31 @@ +// +// BackgroundTests.m +// KIF +// +// Created by Jordan Zucker on 5/18/15. +// +// + +#import + +@interface BackgroundTests : KIFTestCase + +@end + +@implementation BackgroundTests + +- (void)beforeEach { + [tester tapViewWithAccessibilityLabel:@"Background"]; +} + +- (void)afterEach { + [tester tapViewWithAccessibilityLabel:@"Test Suite" traits:UIAccessibilityTraitButton]; +} + +- (void)testBackgroundApp { + [tester waitForViewWithAccessibilityLabel:@"Start"]; + [tester deactivateAppForDuration:5]; + [tester waitForViewWithAccessibilityLabel:@"Back"]; +} + +@end diff --git a/tests/KIF/KIF Tests/GestureTests.m b/tests/KIF/KIF Tests/GestureTests.m index fdf312cfd..769100f57 100755 --- a/tests/KIF/KIF Tests/GestureTests.m +++ b/tests/KIF/KIF Tests/GestureTests.m @@ -8,6 +8,17 @@ #import #import +#import +#import + +#define kPanMeAccessibilityString @"Pan Me" +#define kVelocityValueLabelAccessibilityString @"velocityValueLabel" + +#define kPanLeftRegex @"^X:-[0-9\\.]+ Y:0.00$" +#define kPanUpRegex @"^X:0.00 Y:-[0-9\\.]+$" +#define kPanRightRegex @"^X:[0-9\\.]+ Y:0.00$" +#define kPanDownRegex @"^X:0.00 Y:[0-9\\.]+$" +#define KPanNoVelocityValue @"^X:0.00 Y:0.00$" @interface GestureTests : KIFTestCase @end @@ -48,6 +59,79 @@ - (void)testSwipingDown [tester waitForViewWithAccessibilityLabel:@"Down"]; } +- (void)testPanningLeft +{ + NSString* regexPattern = kPanLeftRegex; + NSPredicate *resultTestPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexPattern]; + NSPredicate *noVelocityPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", KPanNoVelocityValue]; + + UIView* velocityResultView = [tester waitForViewWithAccessibilityLabel:kVelocityValueLabelAccessibilityString]; + XCTAssertTrue([velocityResultView isKindOfClass:[UILabel class]], @"Found view is not a UILabel instance!"); + UILabel* velocityLabel = (UILabel*)velocityResultView; + + UIView* panLabel = [tester waitForTappableViewWithAccessibilityLabel:kPanMeAccessibilityString]; + CGPoint centerInView = CGPointMake(panLabel.frame.size.width / 2.0, panLabel.frame.size.height / 2.0); + + [panLabel dragFromPoint:centerInView toPoint:CGPointMake(centerInView.x - 30, centerInView.y)]; + XCTAssertFalse([noVelocityPredicate evaluateWithObject:velocityLabel.text], @"No valocity value found!"); + XCTAssertTrue([resultTestPredicate evaluateWithObject:velocityLabel.text], @"The result doesn`t match the %@ regex pattern", regexPattern); +} + +- (void)testPanningRight +{ + NSString* regexPattern = kPanRightRegex; + NSPredicate *resultTestPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexPattern]; + NSPredicate *noVelocityPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", KPanNoVelocityValue]; + + UIView* velocityResultView = [tester waitForViewWithAccessibilityLabel:kVelocityValueLabelAccessibilityString]; + XCTAssertTrue([velocityResultView isKindOfClass:[UILabel class]], @"Found view is not a UILabel instance!"); + UILabel* velocityLabel = (UILabel*)velocityResultView; + + UIView* panLabel = [tester waitForTappableViewWithAccessibilityLabel:kPanMeAccessibilityString]; + CGPoint centerInView = CGPointMake(panLabel.frame.size.width / 2.0, panLabel.frame.size.height / 2.0); + + [panLabel dragFromPoint:centerInView toPoint:CGPointMake(centerInView.x + 30, centerInView.y)]; + XCTAssertFalse([noVelocityPredicate evaluateWithObject:velocityLabel.text], @"No valocity value found!"); + XCTAssertTrue([resultTestPredicate evaluateWithObject:velocityLabel.text], @"The result doesn`t match the %@ regex pattern", regexPattern); +} + +- (void)testPanningUp +{ + NSString* regexPattern = kPanUpRegex; + NSPredicate *resultTestPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexPattern]; + NSPredicate *noVelocityPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", KPanNoVelocityValue]; + + UIView* velocityResultView = [tester waitForViewWithAccessibilityLabel:kVelocityValueLabelAccessibilityString]; + XCTAssertTrue([velocityResultView isKindOfClass:[UILabel class]], @"Found view is not a UILabel instance!"); + UILabel* velocityLabel = (UILabel*)velocityResultView; + + UIView* panLabel = [tester waitForTappableViewWithAccessibilityLabel:kPanMeAccessibilityString]; + CGPoint centerInView = CGPointMake(panLabel.frame.size.width / 2.0, panLabel.frame.size.height / 2.0); + + [panLabel dragFromPoint:centerInView toPoint:CGPointMake(centerInView.x, centerInView.y - 30)]; + XCTAssertFalse([noVelocityPredicate evaluateWithObject:velocityLabel.text], @"No valocity value found!"); + XCTAssertTrue([resultTestPredicate evaluateWithObject:velocityLabel.text], @"The result doesn`t match the %@ regex pattern", regexPattern); +} + + +- (void)testPanningDown +{ + NSString* regexPattern = kPanDownRegex; + NSPredicate *resultTestPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexPattern]; + NSPredicate *noVelocityPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", KPanNoVelocityValue]; + + UIView* velocityResultView = [tester waitForViewWithAccessibilityLabel:kVelocityValueLabelAccessibilityString]; + XCTAssertTrue([velocityResultView isKindOfClass:[UILabel class]], @"Found view is not a UILabel instance!"); + UILabel* velocityLabel = (UILabel*)velocityResultView; + + UIView* panLabel = [tester waitForTappableViewWithAccessibilityLabel:kPanMeAccessibilityString]; + CGPoint centerInView = CGPointMake(panLabel.frame.size.width / 2.0, panLabel.frame.size.height / 2.0); + + [panLabel dragFromPoint:centerInView toPoint:CGPointMake(centerInView.x, centerInView.y + 30)]; + XCTAssertFalse([noVelocityPredicate evaluateWithObject:velocityLabel.text], @"No valocity value found!"); + XCTAssertTrue([resultTestPredicate evaluateWithObject:velocityLabel.text], @"The result doesn`t match the %@ regex pattern", regexPattern); +} + - (void)testMissingSwipeableElement { KIFExpectFailure([[tester usingTimeout:0.25] swipeViewWithAccessibilityLabel:@"Unknown" inDirection:KIFSwipeDirectionDown]); @@ -82,6 +166,30 @@ - (void)testMissingSwipeableElementWithTraits KIFExpectFailure([[tester usingTimeout:0.25] swipeViewWithAccessibilityLabel:@"Unknown" value:nil traits:UIAccessibilityTraitStaticText inDirection:KIFSwipeDirectionDown]); } +- (void)testSwipingLeftWithIdentifier +{ + [tester swipeViewWithAccessibilityIdentifier:@"gestures.swipeMe" inDirection:KIFSwipeDirectionLeft]; + [tester waitForViewWithAccessibilityLabel:@"Left"]; +} + +- (void)testSwipingRightWithIdentifier +{ + [tester swipeViewWithAccessibilityIdentifier:@"gestures.swipeMe" inDirection:KIFSwipeDirectionRight]; + [tester waitForViewWithAccessibilityLabel:@"Right"]; +} + +- (void)testSwipingUpWithIdentifier +{ + [tester swipeViewWithAccessibilityIdentifier:@"gestures.swipeMe" inDirection:KIFSwipeDirectionUp]; + [tester waitForViewWithAccessibilityLabel:@"Up"]; +} + +- (void)testSwipingDownWithIdentifier +{ + [tester swipeViewWithAccessibilityIdentifier:@"gestures.swipeMe" inDirection:KIFSwipeDirectionDown]; + [tester waitForViewWithAccessibilityLabel:@"Down"]; +} + - (void)testScrolling { [tester scrollViewWithAccessibilityIdentifier:@"Scroll View" byFractionOfSizeHorizontal:-0.9 vertical:-0.9]; diff --git a/tests/KIF/KIF Tests/MultiFingerTests.m b/tests/KIF/KIF Tests/MultiFingerTests.m index f296b7076..9f8660af9 100755 --- a/tests/KIF/KIF Tests/MultiFingerTests.m +++ b/tests/KIF/KIF Tests/MultiFingerTests.m @@ -11,8 +11,10 @@ #import @interface MultiFingerTests : KIFTestCase +@property (nonatomic, readwrite) BOOL twoFingerTapSuccess; @property (nonatomic, readwrite) BOOL twoFingerPanSuccess; @property (nonatomic, readwrite) BOOL zoomSuccess; +@property (nonatomic, readwrite) double latestRotation; @end @implementation MultiFingerTests @@ -25,15 +27,36 @@ - (void)beforeEach UIScrollView *scrollView = (UIScrollView *)[tester waitForViewWithAccessibilityLabel:@"Scroll View"]; scrollView.contentOffset = CGPointZero; + self.twoFingerTapSuccess = NO; self.twoFingerPanSuccess = NO; self.zoomSuccess = NO; + self.latestRotation = 0; } - (void)afterEach { [tester tapViewWithAccessibilityLabel:@"Test Suite" traits:UIAccessibilityTraitButton]; + self.twoFingerTapSuccess = NO; self.twoFingerPanSuccess = NO; self.zoomSuccess = NO; + self.latestRotation = 0; +} + +- (void)testTwoFingerTap { + UIScrollView *scrollView = (UIScrollView *)[tester waitForViewWithAccessibilityLabel:@"Scroll View"]; + UITapGestureRecognizer *twoFingerTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self + action:@selector(twoFingerTapped)]; + twoFingerTapRecognizer.numberOfTouchesRequired = 2; + [scrollView addGestureRecognizer:twoFingerTapRecognizer]; + + [scrollView twoFingerTapAtPoint:CGPointMake(CGRectGetMidX(scrollView.bounds), CGRectGetMidY(scrollView.bounds))]; + + __KIFAssertEqual(self.twoFingerTapSuccess, YES); + [scrollView removeGestureRecognizer:twoFingerTapRecognizer]; +} + +- (void)twoFingerTapped { + self.twoFingerTapSuccess = YES; } - (void)testTwoFingerPan @@ -41,7 +64,7 @@ - (void)testTwoFingerPan CGFloat offset = 50.0; UIScrollView *scrollView = (UIScrollView *)[tester waitForViewWithAccessibilityLabel:@"Scroll View"]; - UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPanned)]; + UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPanned:)]; panGestureRecognizer.minimumNumberOfTouches = 2; [scrollView addGestureRecognizer:panGestureRecognizer]; @@ -50,10 +73,15 @@ - (void)testTwoFingerPan [scrollView twoFingerPanFromPoint:startPoint toPoint:endPoint steps:10]; __KIFAssertEqual(self.twoFingerPanSuccess, YES); + [scrollView removeGestureRecognizer:panGestureRecognizer]; } -- (void)twoFingerPanned { - self.twoFingerPanSuccess = YES; +- (void)twoFingerPanned:(UIGestureRecognizer*) gr{ + + if (gr.state == UIGestureRecognizerStateEnded) { + self.twoFingerPanSuccess = YES; + } + } - (void)testZoom { @@ -69,6 +97,7 @@ - (void)testZoom { [scrollView zoomAtPoint:startPoint distance:distance steps:10]; __KIFAssertEqual(self.zoomSuccess, YES); + [scrollView removeGestureRecognizer:pinchRecognizer]; } - (void)zoomed:(UIPinchGestureRecognizer *)pinchRecognizer { @@ -83,4 +112,38 @@ - (void)zoomed:(UIPinchGestureRecognizer *)pinchRecognizer { } +- (void)testRotate { + UIScrollView *scrollView = (UIScrollView *)[tester waitForViewWithAccessibilityLabel:@"Scroll View"]; + UIRotationGestureRecognizer *rotateRecognizer = + [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotated:)]; + + [scrollView addGestureRecognizer:rotateRecognizer]; + + [self assertThatLatestRotationIsWithinThreshold:45]; + [self assertThatLatestRotationIsWithinThreshold:90]; + [self assertThatLatestRotationIsWithinThreshold:180]; + [self assertThatLatestRotationIsWithinThreshold:270]; + [self assertThatLatestRotationIsWithinThreshold:360]; + + [scrollView removeGestureRecognizer:rotateRecognizer]; +} + +- (void)assertThatLatestRotationIsWithinThreshold:(double)targetRotationInDegrees { + UIScrollView *scrollView = (UIScrollView *)[tester waitForViewWithAccessibilityLabel:@"Scroll View"]; + CGPoint startPoint = CGPointMake(CGRectGetMidX(scrollView.bounds), CGRectGetMidY(scrollView.bounds)); + [scrollView twoFingerRotateAtPoint:startPoint angle:targetRotationInDegrees]; + + // check we have rotated to within some small threshold of the target rotation amount + // 0.2 radians is ~12 degrees + BOOL withinThreshold = (self.latestRotation - KIFDegreesToRadians(targetRotationInDegrees)) < 0.2; + __KIFAssertEqual(withinThreshold, YES); +} + +- (void)rotated:(UIRotationGestureRecognizer *)recognizer { + if (recognizer.state == UIGestureRecognizerStateEnded) + { + self.latestRotation = recognizer.rotation; + } +} + @end diff --git a/tests/KIF/KIF Tests/PickerTests.m b/tests/KIF/KIF Tests/PickerTests.m index b90ac7878..62921a94f 100755 --- a/tests/KIF/KIF Tests/PickerTests.m +++ b/tests/KIF/KIF Tests/PickerTests.m @@ -38,8 +38,7 @@ - (void)testSelectingDateTime [tester tapViewWithAccessibilityLabel:@"Date Time Selection"]; NSArray *dateTime = @[@"Jun 17", @"6", @"43", @"AM"]; [tester selectDatePickerValue:dateTime]; - [tester waitForViewWithAccessibilityLabel:@"Date Time Selection" value:@"Sunday, Jun 17, 06:43 AM" traits:UIAccessibilityTraitNone]; - ; + [tester waitForViewWithAccessibilityLabel:@"Date Time Selection" value:@"Jun 17, 06:43 AM" traits:UIAccessibilityTraitNone]; } - (void)testSelectingTime diff --git a/tests/KIF/KIF Tests/SystemTests.m b/tests/KIF/KIF Tests/SystemTests.m index 1e1d937ae..42fe86573 100755 --- a/tests/KIF/KIF Tests/SystemTests.m +++ b/tests/KIF/KIF Tests/SystemTests.m @@ -78,22 +78,43 @@ - (void)testMemoryWarningSimulator - (void)testMockingOpenURL { - __block BOOL returnValue; + __block BOOL openURLReturnValue; + __block BOOL canOpenURLReturnValue; [system waitForApplicationToOpenURL:@"test123://" whileExecutingBlock:^{ - returnValue = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"test123://"]]; + NSURL *uninstalledAppURL = [NSURL URLWithString:@"test123://"]; + openURLReturnValue = [[UIApplication sharedApplication] canOpenURL:uninstalledAppURL]; + canOpenURLReturnValue = [[UIApplication sharedApplication] openURL:uninstalledAppURL]; } returning:NO]; - KIFAssertEqual(NO, returnValue, @"openURL: should have returned NO"); + KIFAssertEqual(NO, openURLReturnValue, @"openURL: should have returned NO"); + KIFAssertEqual(NO, canOpenURLReturnValue, @"openURL: should have returned NO"); [system waitForApplicationToOpenURL:@"test123://" whileExecutingBlock:^{ - returnValue = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"test123://"]]; + NSURL *installedAppURL = [NSURL URLWithString:@"test123://"]; + openURLReturnValue = [[UIApplication sharedApplication] canOpenURL:installedAppURL]; + canOpenURLReturnValue = [[UIApplication sharedApplication] openURL:installedAppURL]; } returning:YES]; - KIFAssertEqual(YES, returnValue, @"openURL: should have returned YES"); - + KIFAssertEqual(YES, openURLReturnValue, @"openURL: should have returned YES"); + KIFAssertEqual(YES, canOpenURLReturnValue, @"openURL: should have returned YES"); + + [system waitForApplicationToOpenURLWithScheme:@"test123" whileExecutingBlock:^{ + NSURL *installedAppURL = [NSURL URLWithString:@"test123://some/path?query"]; + openURLReturnValue = [[UIApplication sharedApplication] canOpenURL:installedAppURL]; + canOpenURLReturnValue = [[UIApplication sharedApplication] openURL:installedAppURL]; + } returning:YES]; + KIFAssertEqual(YES, openURLReturnValue, @"openURL: should have returned YES"); + KIFAssertEqual(YES, canOpenURLReturnValue, @"openURL: should have returned YES"); + [system waitForApplicationToOpenAnyURLWhileExecutingBlock:^{ - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"423543523454://"]]; + NSURL *someURL = [NSURL URLWithString:@"423543523454://"]; + openURLReturnValue = [[UIApplication sharedApplication] canOpenURL:someURL]; + canOpenURLReturnValue = [[UIApplication sharedApplication] openURL:someURL]; } returning:YES]; - - KIFAssertFalse([[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"this-is-a-fake-url://"]], @"Should no longer be mocking, reject bad URL."); + KIFAssertEqual(YES, openURLReturnValue, @"openURL: should have returned YES"); + KIFAssertEqual(YES, canOpenURLReturnValue, @"openURL: should have returned YES"); + + NSURL *fakeURL = [NSURL URLWithString:@"this-is-a-fake-url://"]; + KIFAssertFalse([[UIApplication sharedApplication] canOpenURL:fakeURL], @"Should no longer be mocking, reject bad URL."); + KIFAssertFalse([[UIApplication sharedApplication] openURL:fakeURL], @"Should no longer be mocking, reject bad URL."); } @end diff --git a/tests/KIF/KIF Tests/TableViewTests.m b/tests/KIF/KIF Tests/TableViewTests.m index ceb5c39d1..1fb048bbd 100755 --- a/tests/KIF/KIF Tests/TableViewTests.m +++ b/tests/KIF/KIF Tests/TableViewTests.m @@ -127,22 +127,20 @@ - (void)testTogglingSwitch - (void)testButtonAbsentAfterRemoveFromSuperview { - [tester waitForViewWithAccessibilityLabel:@"Button"]; - UIAccessibilityElement *element = [[UIApplication sharedApplication] accessibilityElementWithLabel:@"Button" accessibilityValue:nil traits:0]; - - [[(id)element view] removeFromSuperview]; + UIView *view = [tester waitForViewWithAccessibilityLabel:@"Button"]; + + [view removeFromSuperview]; [tester waitForAbsenceOfViewWithAccessibilityLabel:@"Button"]; } - (void)testButtonAbsentAfterSetHidden { - [tester waitForViewWithAccessibilityLabel:@"Button"]; - UIAccessibilityElement *element = [[UIApplication sharedApplication] accessibilityElementWithLabel:@"Button" accessibilityValue:nil traits:0]; - - [[(id)element view] setHidden:YES]; + UIView *view = [tester waitForViewWithAccessibilityLabel:@"Button"]; + + [view setHidden:YES]; [tester waitForAbsenceOfViewWithAccessibilityLabel:@"Button"]; - [[(id)element view] setHidden:NO]; + [view setHidden:NO]; [tester waitForViewWithAccessibilityLabel:@"Button"]; } @@ -151,4 +149,24 @@ - (void)testEnteringTextIntoATextFieldInATableCell [tester enterText:@"Test-Driven Development" intoViewWithAccessibilityLabel:@"TextField"]; } +// Delete first and last rows in table view +- (void)testSwipingRows { + + UITableView *tableView; + [tester waitForAccessibilityElement:NULL view:&tableView withIdentifier:@"TableView Tests Table" tappable:NO]; + + // First row + [tester swipeRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] inTableView:tableView inDirection:KIFSwipeDirectionLeft]; + [tester tapViewWithAccessibilityLabel:@"Delete"]; + + __KIFAssertEqualObjects([tester waitForCellAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] inTableViewWithAccessibilityIdentifier:@"TableView Tests Table"].textLabel.text, @"Deleted", @""); + + // Last row + [tester swipeRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:2] inTableView:tableView inDirection:KIFSwipeDirectionLeft]; + [tester tapViewWithAccessibilityLabel:@"Delete"]; + + __KIFAssertEqualObjects([tester waitForCellAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:2] inTableViewWithAccessibilityIdentifier:@"TableView Tests Table"].textLabel.text, @"Deleted", @""); + +} + @end diff --git a/tests/KIF/KIF.podspec b/tests/KIF/KIF.podspec index 65984ea59..c9018bf71 100755 --- a/tests/KIF/KIF.podspec +++ b/tests/KIF/KIF.podspec @@ -1,13 +1,13 @@ Pod::Spec.new do |s| s.name = "KIF" - s.version = "3.1.2" + s.version = "3.2.3" s.summary = "Keep It Functional - iOS UI acceptance testing in an XCUnit harness." s.homepage = "https://github.com/kif-framework/KIF/" s.license = 'Apache 2.0' s.authors = 'Eric Firestone', 'Jim Puls', 'Brian Nickel' - s.source = { :git => "https://github.com/kif-framework/KIF.git", :tag => "v3.1.2" } + s.source = { :git => "https://github.com/kif-framework/KIF.git", :tag => "v3.2.3" } s.platform = :ios, '5.1' - s.frameworks = 'CoreGraphics' + s.frameworks = 'CoreGraphics', 'IOKit' s.default_subspec = 'XCTest' s.requires_arc = true s.prefix_header_contents = '#import ' @@ -15,7 +15,7 @@ Pod::Spec.new do |s| s.subspec 'XCTest' do |xctest| xctest.source_files = 'Classes', 'Additions' xctest.exclude_files = 'Additions/SenTestCase-KIFAdditions.{h,m}' - xctest.public_header_files = 'Classes/**/*.h', 'Additions/**/*-KIFAdditions.h' + xctest.public_header_files = 'Classes/**/*.h', 'Additions/**/*-KIFAdditions.h', 'Additions/UIView-Debugging.h' xctest.framework = 'XCTest' xctest.compiler_flags = '-DKIF_XCTEST' xctest.xcconfig = { @@ -27,7 +27,7 @@ Pod::Spec.new do |s| s.subspec 'OCUnit' do |sentest| sentest.source_files = 'Classes', 'Additions' sentest.exclude_files = 'Additions/XCTestCase-KIFAdditions.{h,m}' - sentest.public_header_files = 'Classes/**/*.h', 'Additions/**/*-KIFAdditions.h' + sentest.public_header_files = 'Classes/**/*.h', 'Additions/**/*-KIFAdditions.h', 'Additions/UIView-Debugging.h' sentest.framework = 'SenTestingKit' sentest.compiler_flags = '-DKIF_SENTEST' sentest.xcconfig = { 'OTHER_CFLAGS' => '-DKIF_SENTEST' } diff --git a/tests/KIF/KIF.xcodeproj/project.pbxproj b/tests/KIF/KIF.xcodeproj/project.pbxproj index fab3aadc8..c98e27601 100755 --- a/tests/KIF/KIF.xcodeproj/project.pbxproj +++ b/tests/KIF/KIF.xcodeproj/project.pbxproj @@ -8,16 +8,83 @@ /* Begin PBXBuildFile section */ 2CDEE1CB181DBED200DF6E63 /* PickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CDEE1CA181DBED200DF6E63 /* PickerController.m */; }; + 2CED883E181F5EE1005ABD20 /* PickerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CED883D181F5EE1005ABD20 /* PickerTests.m */; }; 2EE12710198991920031D347 /* MultiFingerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EE1270F198991920031D347 /* MultiFingerTests.m */; }; + 2EE12711198991920031D347 /* MultiFingerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EE1270F198991920031D347 /* MultiFingerTests.m */; }; 3812FB611A1212A700335733 /* AnimationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3812FB601A1212A700335733 /* AnimationViewController.m */; }; 3812FB631A12188700335733 /* WaitForAnimationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3812FB621A12188700335733 /* WaitForAnimationTests.m */; }; + 3ADD2532FE4917CD5755AA59 /* UIView-Debugging.h in Headers */ = {isa = PBXBuildFile; fileRef = 3ADD26484C6C438B71DC15C5 /* UIView-Debugging.h */; }; + 3ADD25CC71BF27D675768787 /* UIView-Debugging.h in Headers */ = {isa = PBXBuildFile; fileRef = 3ADD26484C6C438B71DC15C5 /* UIView-Debugging.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A48107B19708CAB0003A32E /* ExistTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A48107A19708CAB0003A32E /* ExistTests.m */; }; + 4D2FD4EE1AF5936700E61192 /* UIView-Debugging.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ADD2160096BE41C780FBD95 /* UIView-Debugging.m */; }; + 4D2FD4EF1AF5936800E61192 /* UIView-Debugging.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ADD2160096BE41C780FBD95 /* UIView-Debugging.m */; }; + 5C877DD01B057E13006A3AC6 /* KIFUITestActor-IdentifierTests.h in Headers */ = {isa = PBXBuildFile; fileRef = EB1A44D31A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5C877DD11B0A8B8F006A3AC6 /* UIView-Debugging.h in Headers */ = {isa = PBXBuildFile; fileRef = 3ADD26484C6C438B71DC15C5 /* UIView-Debugging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5C877DD21B0A8B93006A3AC6 /* UIView-Debugging.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ADD2160096BE41C780FBD95 /* UIView-Debugging.m */; }; 84D293AD1A2C84F700C10944 /* SystemAlertViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D293AC1A2C84F700C10944 /* SystemAlertViewController.m */; }; 84D293AF1A2C867300C10944 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D293AE1A2C867300C10944 /* CoreLocation.framework */; }; 84D293B11A2C891700C10944 /* SystemAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D293B01A2C891700C10944 /* SystemAlertTests.m */; }; 84D293B81A2C8DF700C10944 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84D293B71A2C8DF700C10944 /* AddressBookUI.framework */; }; - 84D293BB1A2CC30B00C10944 /* UIAutomationHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D293B91A2CC30B00C10944 /* UIAutomationHelper.h */; }; + 84D293BB1A2CC30B00C10944 /* UIAutomationHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D293B91A2CC30B00C10944 /* UIAutomationHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 84D293BC1A2CC30B00C10944 /* UIAutomationHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D293B91A2CC30B00C10944 /* UIAutomationHelper.h */; }; 84D293BD1A2CC30B00C10944 /* UIAutomationHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D293BA1A2CC30B00C10944 /* UIAutomationHelper.m */; }; + 84D293BE1A2CC30B00C10944 /* UIAutomationHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D293BA1A2CC30B00C10944 /* UIAutomationHelper.m */; }; + 97E8A5CF1B0A62F700124E3B /* BackgroundViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 97E8A5CE1B0A62F700124E3B /* BackgroundViewController.m */; }; + 97E8A5D11B0A63D100124E3B /* BackgroundTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 97E8A5D01B0A63D100124E3B /* BackgroundTests.m */; }; + 9CC881A91AD4CE39002CD34C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB072B413971AEA008AF393 /* UIKit.framework */; }; + 9CC881AA1AD4CE45002CD34C /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9AD81F91AA180B900B369FD /* IOKit.framework */; }; + 9CC881AB1AD4CE47002CD34C /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EABD46AB1857A0EB00A5F081 /* XCTest.framework */; }; + 9CC881AC1AD4CE4B002CD34C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB0726B139719AC008AF393 /* Foundation.framework */; }; + 9CC881AD1AD4CE50002CD34C /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CC881A21AD4CAAC002CD34C /* CoreFoundation.framework */; }; + 9CC967401AD4B1B600576D13 /* KIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CC9673F1AD4B1B600576D13 /* KIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967561AD4B1F100576D13 /* LoadableCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 39160B1013D1E6BB00311E38 /* LoadableCategory.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967571AD4B1F100576D13 /* CGGeometry-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729413971AB2008AF393 /* CGGeometry-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967591AD4B1F100576D13 /* NSFileManager-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = CDFD8E84139728B4008D299F /* NSFileManager-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9675B1AD4B1F100576D13 /* UIAccessibilityElement-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729613971AB2008AF393 /* UIAccessibilityElement-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9675D1AD4B1F100576D13 /* UIApplication-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729813971AB2008AF393 /* UIApplication-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9675F1AD4B1F100576D13 /* UIScrollView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729A13971AB2008AF393 /* UIScrollView-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967611AD4B1F100576D13 /* UITouch-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729C13971AB2008AF393 /* UITouch-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967631AD4B1F100576D13 /* UIView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB072A013971AB2008AF393 /* UIView-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967651AD4B1F100576D13 /* UIWindow-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB072A213971AB2008AF393 /* UIWindow-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967671AD4B1F100576D13 /* UITableView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = D927B9DD18F9E46400DAD036 /* UITableView-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967691AD4B1F100576D13 /* NSBundle-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EBAE487A17A45A8E0005EE19 /* NSBundle-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9676B1AD4B1F100576D13 /* NSError-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EBAE487F17A460E50005EE19 /* NSError-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9676D1AD4B1F100576D13 /* XCTestCase-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EABD46751857A07600A5F081 /* XCTestCase-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9676F1AD4B1F100576D13 /* NSException-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EAC809681864F19C000E819F /* NSException-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967711AD4B1F100576D13 /* UIEvent+KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E977D1051AA4062B005645BF /* UIEvent+KIFAdditions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 9CC967731AD4B1FF00576D13 /* KIFSystemTestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3130167BA3AC00E31109 /* KIFSystemTestActor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967751AD4B1FF00576D13 /* KIFUITestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3132167BA3AC00E31109 /* KIFUITestActor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967771AD4B1FF00576D13 /* KIFUITestActor-ConditionalTests.h in Headers */ = {isa = PBXBuildFile; fileRef = EB2526461981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9677A1AD4B20700576D13 /* KIFTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3127167BA37B00E31109 /* KIFTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9677C1AD4B20700576D13 /* KIFTestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3123167BA37B00E31109 /* KIFTestActor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC9677F1AD4B20700576D13 /* KIFTypist.h in Headers */ = {isa = PBXBuildFile; fileRef = C194255615D83DE9004FC314 /* KIFTypist.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967811AD4B20700576D13 /* KIFTestStepValidation.h in Headers */ = {isa = PBXBuildFile; fileRef = EBAE488517A4E5C30005EE19 /* KIFTestStepValidation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9CC967841AD4B20700576D13 /* UIAutomationHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 84D293B91A2CC30B00C10944 /* UIAutomationHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 9CC967BE1AD4B55E00576D13 /* KIF-XCTestPrefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = EABD46D31857BE8600A5F081 /* KIF-XCTestPrefix.pch */; }; + 9CC967BF1AD4B58C00576D13 /* CGGeometry-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729513971AB2008AF393 /* CGGeometry-KIFAdditions.m */; }; + 9CC967C01AD4B58C00576D13 /* NSFileManager-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CDFD8E85139728B4008D299F /* NSFileManager-KIFAdditions.m */; }; + 9CC967C11AD4B58C00576D13 /* UIAccessibilityElement-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729713971AB2008AF393 /* UIAccessibilityElement-KIFAdditions.m */; }; + 9CC967C21AD4B58C00576D13 /* UIApplication-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729913971AB2008AF393 /* UIApplication-KIFAdditions.m */; }; + 9CC967C31AD4B58C00576D13 /* UIScrollView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729B13971AB2008AF393 /* UIScrollView-KIFAdditions.m */; }; + 9CC967C41AD4B58C00576D13 /* UITouch-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729D13971AB2008AF393 /* UITouch-KIFAdditions.m */; }; + 9CC967C51AD4B58C00576D13 /* UIView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB072A113971AB2008AF393 /* UIView-KIFAdditions.m */; }; + 9CC967C61AD4B58C00576D13 /* UIWindow-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB072A313971AB2008AF393 /* UIWindow-KIFAdditions.m */; }; + 9CC967C71AD4B58C00576D13 /* UITableView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = D927B9DE18F9E46400DAD036 /* UITableView-KIFAdditions.m */; }; + 9CC967C81AD4B58C00576D13 /* NSBundle-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EBAE487B17A45A8E0005EE19 /* NSBundle-KIFAdditions.m */; }; + 9CC967C91AD4B58C00576D13 /* NSError-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EBAE488017A460E50005EE19 /* NSError-KIFAdditions.m */; }; + 9CC967CA1AD4B58C00576D13 /* XCTestCase-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EABD46761857A07600A5F081 /* XCTestCase-KIFAdditions.m */; }; + 9CC967CB1AD4B58C00576D13 /* NSException-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EAC809691864F19C000E819F /* NSException-KIFAdditions.m */; }; + 9CC967CC1AD4B58C00576D13 /* UIEvent+KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E977D1061AA4062B005645BF /* UIEvent+KIFAdditions.m */; }; + 9CC967CD1AD4B59A00576D13 /* KIFSystemTestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3131167BA3AC00E31109 /* KIFSystemTestActor.m */; }; + 9CC967CE1AD4B59A00576D13 /* KIFUITestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3133167BA3AC00E31109 /* KIFUITestActor.m */; }; + 9CC967CF1AD4B59A00576D13 /* KIFUITestActor-ConditionalTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB2526471981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.m */; }; + 9CC967D01AD4B5B900576D13 /* KIFTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3128167BA37B00E31109 /* KIFTestCase.m */; }; + 9CC967D11AD4B5B900576D13 /* KIFTestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3124167BA37B00E31109 /* KIFTestActor.m */; }; + 9CC967D21AD4B5B900576D13 /* KIFTypist.m in Sources */ = {isa = PBXBuildFile; fileRef = C194255715D83DE9004FC314 /* KIFTypist.m */; }; + 9CC967D31AD4B5B900576D13 /* KIFTestStepValidation.m in Sources */ = {isa = PBXBuildFile; fileRef = EBAE488617A4E5C30005EE19 /* KIFTestStepValidation.m */; }; + 9CC967D41AD4B5B900576D13 /* UIAutomationHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D293BA1A2CC30B00C10944 /* UIAutomationHelper.m */; }; + 9CC967D51AD4B5B900576D13 /* KIFUITestActor-IdentifierTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB1A44D41A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.m */; }; + A88930121685098E00FC7C63 /* KIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A88930111685098E00FC7C63 /* KIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; AE62FCD01A1D20E5002B10DA /* WebViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = AE62FCCF1A1D20E5002B10DA /* WebViewTests.m */; }; AE62FCD61A1D2447002B10DA /* WebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AE62FCD51A1D2447002B10DA /* WebViewController.m */; }; AE62FCD81A1D2667002B10DA /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = AE62FCD71A1D2667002B10DA /* index.html */; }; @@ -25,8 +92,16 @@ D927B9DC18F9DF2D00DAD036 /* TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D927B9DB18F9DF2D00DAD036 /* TableViewController.m */; }; D927B9DF18F9E46400DAD036 /* UITableView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = D927B9DD18F9E46400DAD036 /* UITableView-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; D927B9E018F9E46400DAD036 /* UITableView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = D927B9DE18F9E46400DAD036 /* UITableView-KIFAdditions.m */; }; + D927B9E118F9E47000DAD036 /* UITableView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = D927B9DD18F9E46400DAD036 /* UITableView-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D927B9E218F9E47600DAD036 /* UITableView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = D927B9DE18F9E46400DAD036 /* UITableView-KIFAdditions.m */; }; D9EA274118F05A6000D87E57 /* ScrollViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D9EA274018F05A6000D87E57 /* ScrollViewTests.m */; }; D9EA274318F05A6700D87E57 /* ScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D9EA274218F05A6700D87E57 /* ScrollViewController.m */; }; + E977D1071AA4062B005645BF /* UIEvent+KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E977D1051AA4062B005645BF /* UIEvent+KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E977D1081AA4062B005645BF /* UIEvent+KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E977D1061AA4062B005645BF /* UIEvent+KIFAdditions.m */; }; + E977D1091AA40736005645BF /* UIEvent+KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E977D1061AA4062B005645BF /* UIEvent+KIFAdditions.m */; }; + E9AD81FA1AA180B900B369FD /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9AD81F91AA180B900B369FD /* IOKit.framework */; }; + E9F646F81AA3BABA00C37EA3 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9AD81F91AA180B900B369FD /* IOKit.framework */; }; + EA0F2547182979BE006FF825 /* CollectionViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EA0F2546182979BE006FF825 /* CollectionViewTests.m */; }; EA0F254A1829839E006FF825 /* CollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EA0F25491829839E006FF825 /* CollectionViewController.m */; }; EA4655881905B92500B2C60E /* PickerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CED883D181F5EE1005ABD20 /* PickerTests.m */; }; EA47DA2818EDFD6F0034D2F5 /* CollectionViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EA0F2546182979BE006FF825 /* CollectionViewTests.m */; }; @@ -89,15 +164,23 @@ EABD46C71857A0F300A5F081 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = EB60ECF2177F8DB3005A041A /* InfoPlist.strings */; }; EABD46CF1857A15400A5F081 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EABD46AB1857A0EB00A5F081 /* XCTest.framework */; }; EABD46D21857A24E00A5F081 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EABD46AB1857A0EB00A5F081 /* XCTest.framework */; }; - EABD46D51857C54500A5F081 /* KIF-XCTestPrefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = EABD46D31857BE8600A5F081 /* KIF-XCTestPrefix.pch */; }; EABD46D61858C8ED00A5F081 /* libKIF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EABD46AA1857A0C700A5F081 /* libKIF.a */; }; + EABD474B185F509E00A5F081 /* SenTestCase-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EABD4749185F509E00A5F081 /* SenTestCase-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EABD474C185F509E00A5F081 /* SenTestCase-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EABD474A185F509E00A5F081 /* SenTestCase-KIFAdditions.m */; }; EAC8096A1864F19C000E819F /* NSException-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EAC809681864F19C000E819F /* NSException-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; EAC8096B1864F19C000E819F /* NSException-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EAC809691864F19C000E819F /* NSException-KIFAdditions.m */; }; + EB02523E17AA109400A7D13A /* CompositionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB02523D17AA109400A7D13A /* CompositionTests.m */; }; + EB09001017E3696A00AA15B1 /* SearchFieldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB09000F17E3696A00AA15B1 /* SearchFieldTests.m */; }; EB1A44D51A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.h in Headers */ = {isa = PBXBuildFile; fileRef = EB1A44D31A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.h */; settings = {ATTRIBUTES = (Public, ); }; }; EB1A44D61A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB1A44D41A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.m */; }; + EB1A44D71A0C327D004A3F61 /* KIFUITestActor-IdentifierTests.h in Headers */ = {isa = PBXBuildFile; fileRef = EB1A44D31A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB1A44D81A0C3284004A3F61 /* KIFUITestActor-IdentifierTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB1A44D41A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.m */; }; EB1A44DA1A0C33AD004A3F61 /* AccessibilityIdentifierTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB1A44D91A0C33AD004A3F61 /* AccessibilityIdentifierTests.m */; }; + EB22B5B017AF52640090B848 /* CascadingFailureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB22B5AF17AF52640090B848 /* CascadingFailureTests.m */; }; EB2526481981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.h in Headers */ = {isa = PBXBuildFile; fileRef = EB2526461981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.h */; settings = {ATTRIBUTES = (Public, ); }; }; EB2526491981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB2526471981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.m */; }; + EB25264A1981BF8400DBC747 /* KIFUITestActor-ConditionalTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB2526471981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.m */; }; + EB3F654517AA0B8400469D18 /* TableViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3F654417AA0B8400469D18 /* TableViewTests.m */; }; EB60ECC2177F8C83005A041A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB072B413971AEA008AF393 /* UIKit.framework */; }; EB60ECC3177F8C83005A041A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB0726B139719AC008AF393 /* Foundation.framework */; }; EB60ECC5177F8C83005A041A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB60ECC4177F8C83005A041A /* CoreGraphics.framework */; }; @@ -106,12 +189,66 @@ EB60ECD3177F8C84005A041A /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = EB60ECD2177F8C84005A041A /* Default.png */; }; EB60ECD5177F8C84005A041A /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = EB60ECD4177F8C84005A041A /* Default@2x.png */; }; EB60ECD7177F8C84005A041A /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = EB60ECD6177F8C84005A041A /* Default-568h@2x.png */; }; + EB60ECEC177F8DB3005A041A /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB4C3138167BA3D200E31109 /* SenTestingKit.framework */; }; + EB60ECED177F8DB3005A041A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB072B413971AEA008AF393 /* UIKit.framework */; }; + EB60ECEE177F8DB3005A041A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB0726B139719AC008AF393 /* Foundation.framework */; }; + EB60ECF4177F8DB3005A041A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = EB60ECF2177F8DB3005A041A /* InfoPlist.strings */; }; EB60ED00177F9032005A041A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ECFC177F9031005A041A /* AppDelegate.m */; }; EB60ED01177F9032005A041A /* ShowHideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ECFD177F9031005A041A /* ShowHideViewController.m */; }; EB60ED02177F9032005A041A /* TapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ECFE177F9032005A041A /* TapViewController.m */; }; EB60ED03177F9032005A041A /* TestSuiteViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ECFF177F9032005A041A /* TestSuiteViewController.m */; }; EB60ED06177F9041005A041A /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EB60ED04177F9041005A041A /* MainStoryboard.storyboard */; }; + EB60ED10177F90BA005A041A /* LongPressTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED07177F90BA005A041A /* LongPressTests.m */; }; + EB60ED11177F90BA005A041A /* ModalViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED08177F90BA005A041A /* ModalViewTests.m */; }; + EB60ED12177F90BA005A041A /* SpecificControlTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED09177F90BA005A041A /* SpecificControlTests.m */; }; + EB60ED13177F90BA005A041A /* SystemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED0A177F90BA005A041A /* SystemTests.m */; }; + EB60ED14177F90BA005A041A /* TappingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED0B177F90BA005A041A /* TappingTests.m */; }; + EB60ED15177F90BA005A041A /* TypingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED0C177F90BA005A041A /* TypingTests.m */; }; + EB60ED16177F90BA005A041A /* WaitForAbscenceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED0D177F90BA005A041A /* WaitForAbscenceTests.m */; }; + EB60ED17177F90BA005A041A /* WaitForTappableViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED0E177F90BA005A041A /* WaitForTappableViewTests.m */; }; + EB60ED18177F90BA005A041A /* WaitForViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED0F177F90BA005A041A /* WaitForViewTests.m */; }; + EB60ED1A177F90C2005A041A /* GestureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB60ED19177F90C2005A041A /* GestureTests.m */; }; + EB60ED1B177F90EA005A041A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB60ECC4177F8C83005A041A /* CoreGraphics.framework */; }; + EB60ED1C177F90F0005A041A /* libKIF-OCUnit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB72047C1680DDAD00278DA2 /* libKIF-OCUnit.a */; }; + EB7204431680DDAD00278DA2 /* CGGeometry-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729513971AB2008AF393 /* CGGeometry-KIFAdditions.m */; }; + EB7204441680DDAD00278DA2 /* UIAccessibilityElement-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729713971AB2008AF393 /* UIAccessibilityElement-KIFAdditions.m */; }; + EB7204451680DDAD00278DA2 /* UIApplication-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729913971AB2008AF393 /* UIApplication-KIFAdditions.m */; }; + EB7204461680DDAD00278DA2 /* UIScrollView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729B13971AB2008AF393 /* UIScrollView-KIFAdditions.m */; }; + EB7204471680DDAD00278DA2 /* UITouch-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB0729D13971AB2008AF393 /* UITouch-KIFAdditions.m */; }; + EB7204481680DDAD00278DA2 /* UIView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB072A113971AB2008AF393 /* UIView-KIFAdditions.m */; }; + EB7204491680DDAD00278DA2 /* UIWindow-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAB072A313971AB2008AF393 /* UIWindow-KIFAdditions.m */; }; + EB72044A1680DDAD00278DA2 /* NSFileManager-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CDFD8E85139728B4008D299F /* NSFileManager-KIFAdditions.m */; }; + EB72044B1680DDAD00278DA2 /* KIFTypist.m in Sources */ = {isa = PBXBuildFile; fileRef = C194255715D83DE9004FC314 /* KIFTypist.m */; }; + EB72044C1680DDAD00278DA2 /* KIFTestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3124167BA37B00E31109 /* KIFTestActor.m */; }; + EB72044D1680DDAD00278DA2 /* KIFTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3128167BA37B00E31109 /* KIFTestCase.m */; }; + EB72044E1680DDAD00278DA2 /* KIFSystemTestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3131167BA3AC00E31109 /* KIFSystemTestActor.m */; }; + EB72044F1680DDAD00278DA2 /* KIFUITestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4C3133167BA3AC00E31109 /* KIFUITestActor.m */; }; + EB7204511680DDAD00278DA2 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB4C3138167BA3D200E31109 /* SenTestingKit.framework */; }; + EB7204521680DDAD00278DA2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB0726B139719AC008AF393 /* Foundation.framework */; }; + EB7204531680DDAD00278DA2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AAB072B413971AEA008AF393 /* UIKit.framework */; }; + EB7204551680DDAD00278DA2 /* KIF-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AAB0728113971A63008AF393 /* KIF-Prefix.pch */; }; + EB7204591680DDAD00278DA2 /* CGGeometry-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729413971AB2008AF393 /* CGGeometry-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB72045A1680DDAD00278DA2 /* UIAccessibilityElement-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729613971AB2008AF393 /* UIAccessibilityElement-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB72045B1680DDAD00278DA2 /* UIApplication-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729813971AB2008AF393 /* UIApplication-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB72045C1680DDAD00278DA2 /* UIScrollView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729A13971AB2008AF393 /* UIScrollView-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB72045D1680DDAD00278DA2 /* UITouch-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB0729C13971AB2008AF393 /* UITouch-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB72045E1680DDAD00278DA2 /* UIView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB072A013971AB2008AF393 /* UIView-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB72045F1680DDAD00278DA2 /* UIWindow-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AAB072A213971AB2008AF393 /* UIWindow-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB7204601680DDAD00278DA2 /* NSFileManager-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = CDFD8E84139728B4008D299F /* NSFileManager-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB7204611680DDAD00278DA2 /* LoadableCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 39160B1013D1E6BB00311E38 /* LoadableCategory.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB7204621680DDAD00278DA2 /* KIFTypist.h in Headers */ = {isa = PBXBuildFile; fileRef = C194255615D83DE9004FC314 /* KIFTypist.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB7204631680DDAD00278DA2 /* KIFTestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3123167BA37B00E31109 /* KIFTestActor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB7204641680DDAD00278DA2 /* KIFTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3127167BA37B00E31109 /* KIFTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB7204651680DDAD00278DA2 /* KIFSystemTestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3130167BA3AC00E31109 /* KIFSystemTestActor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB7204661680DDAD00278DA2 /* KIFUITestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = EB4C3132167BA3AC00E31109 /* KIFUITestActor.h */; settings = {ATTRIBUTES = (Public, ); }; }; EB9FB42717A5BACB00DDF160 /* GestureViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9FB42617A5BACB00DDF160 /* GestureViewController.m */; }; + EB9FC00517E144B700138266 /* LandscapeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EB9FC00417E144B700138266 /* LandscapeTests.m */; }; + EBAE487C17A45A8E0005EE19 /* NSBundle-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EBAE487A17A45A8E0005EE19 /* NSBundle-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBAE487D17A45A8E0005EE19 /* NSBundle-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EBAE487B17A45A8E0005EE19 /* NSBundle-KIFAdditions.m */; }; + EBAE488117A460E50005EE19 /* NSError-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EBAE487F17A460E50005EE19 /* NSError-KIFAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBAE488217A460E50005EE19 /* NSError-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = EBAE488017A460E50005EE19 /* NSError-KIFAdditions.m */; }; + EBAE488717A4E5C30005EE19 /* KIFTestStepValidation.h in Headers */ = {isa = PBXBuildFile; fileRef = EBAE488517A4E5C30005EE19 /* KIFTestStepValidation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EBAE488817A4E5C30005EE19 /* KIFTestStepValidation.m in Sources */ = {isa = PBXBuildFile; fileRef = EBAE488617A4E5C30005EE19 /* KIFTestStepValidation.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -122,6 +259,13 @@ remoteGlobalIDString = EB60ECC0177F8C83005A041A; remoteInfo = "Test Host"; }; + EB8C0CEC1780CBF5000DBC0B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = AAB0725F139719AC008AF393 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EB60ECC0177F8C83005A041A; + remoteInfo = "Test Host"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -131,6 +275,8 @@ 3812FB601A1212A700335733 /* AnimationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnimationViewController.m; sourceTree = ""; }; 3812FB621A12188700335733 /* WaitForAnimationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WaitForAnimationTests.m; sourceTree = ""; }; 39160B1013D1E6BB00311E38 /* LoadableCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoadableCategory.h; sourceTree = ""; }; + 3ADD2160096BE41C780FBD95 /* UIView-Debugging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView-Debugging.m"; sourceTree = ""; }; + 3ADD26484C6C438B71DC15C5 /* UIView-Debugging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView-Debugging.h"; sourceTree = ""; }; 4A48107A19708CAB0003A32E /* ExistTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExistTests.m; sourceTree = ""; }; 84D293AC1A2C84F700C10944 /* SystemAlertViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SystemAlertViewController.m; sourceTree = ""; }; 84D293AE1A2C867300C10944 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; @@ -138,6 +284,12 @@ 84D293B71A2C8DF700C10944 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; 84D293B91A2CC30B00C10944 /* UIAutomationHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAutomationHelper.h; sourceTree = ""; }; 84D293BA1A2CC30B00C10944 /* UIAutomationHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAutomationHelper.m; sourceTree = ""; }; + 97E8A5CE1B0A62F700124E3B /* BackgroundViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BackgroundViewController.m; sourceTree = ""; }; + 97E8A5D01B0A63D100124E3B /* BackgroundTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BackgroundTests.m; sourceTree = ""; }; + 9CC881A21AD4CAAC002CD34C /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; + 9CC9673B1AD4B1B600576D13 /* KIF.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KIF.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9CC9673E1AD4B1B600576D13 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9CC9673F1AD4B1B600576D13 /* KIF.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KIF.h; sourceTree = ""; }; A88930111685098E00FC7C63 /* KIF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = KIF.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; AAB0726B139719AC008AF393 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; AAB0728113971A63008AF393 /* KIF-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "KIF-Prefix.pch"; path = "Classes/KIF-Prefix.pch"; sourceTree = SOURCE_ROOT; }; @@ -170,6 +322,9 @@ D927B9DE18F9E46400DAD036 /* UITableView-KIFAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableView-KIFAdditions.m"; sourceTree = ""; }; D9EA274018F05A6000D87E57 /* ScrollViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollViewTests.m; sourceTree = ""; }; D9EA274218F05A6700D87E57 /* ScrollViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollViewController.m; sourceTree = ""; }; + E977D1051AA4062B005645BF /* UIEvent+KIFAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIEvent+KIFAdditions.h"; sourceTree = ""; }; + E977D1061AA4062B005645BF /* UIEvent+KIFAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIEvent+KIFAdditions.m"; sourceTree = ""; }; + E9AD81F91AA180B900B369FD /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; }; EA0F2546182979BE006FF825 /* CollectionViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionViewTests.m; sourceTree = ""; }; EA0F25491829839E006FF825 /* CollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionViewController.m; sourceTree = ""; }; EABD46751857A07600A5F081 /* XCTestCase-KIFAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "XCTestCase-KIFAdditions.h"; sourceTree = ""; }; @@ -210,6 +365,7 @@ EB60ECD2177F8C84005A041A /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; EB60ECD4177F8C84005A041A /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; EB60ECD6177F8C84005A041A /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + EB60ECEB177F8DB3005A041A /* KIF Tests-OCUnit.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "KIF Tests-OCUnit.octest"; sourceTree = BUILT_PRODUCTS_DIR; }; EB60ECF1177F8DB3005A041A /* KIF Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "KIF Tests-Info.plist"; sourceTree = ""; }; EB60ECF3177F8DB3005A041A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; EB60ECF8177F8DB3005A041A /* KIF Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "KIF Tests-Prefix.pch"; sourceTree = ""; }; @@ -228,6 +384,7 @@ EB60ED0E177F90BA005A041A /* WaitForTappableViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WaitForTappableViewTests.m; sourceTree = ""; }; EB60ED0F177F90BA005A041A /* WaitForViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WaitForViewTests.m; sourceTree = ""; }; EB60ED19177F90C2005A041A /* GestureTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GestureTests.m; sourceTree = ""; }; + EB72047C1680DDAD00278DA2 /* libKIF-OCUnit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libKIF-OCUnit.a"; sourceTree = BUILT_PRODUCTS_DIR; }; EB9FB42617A5BACB00DDF160 /* GestureViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GestureViewController.m; sourceTree = ""; }; EB9FC00417E144B700138266 /* LandscapeTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LandscapeTests.m; sourceTree = ""; }; EBAE487A17A45A8E0005EE19 /* NSBundle-KIFAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle-KIFAdditions.h"; sourceTree = ""; }; @@ -239,6 +396,18 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 9CC967371AD4B1B600576D13 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9CC881A91AD4CE39002CD34C /* UIKit.framework in Frameworks */, + 9CC881AC1AD4CE4B002CD34C /* Foundation.framework in Frameworks */, + 9CC881AA1AD4CE45002CD34C /* IOKit.framework in Frameworks */, + 9CC881AD1AD4CE50002CD34C /* CoreFoundation.framework in Frameworks */, + 9CC881AB1AD4CE47002CD34C /* XCTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EABD468C1857A0C700A5F081 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -246,6 +415,7 @@ EABD46D21857A24E00A5F081 /* XCTest.framework in Frameworks */, EABD468E1857A0C700A5F081 /* Foundation.framework in Frameworks */, EABD468F1857A0C700A5F081 /* UIKit.framework in Frameworks */, + E9AD81FA1AA180B900B369FD /* IOKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -258,6 +428,7 @@ EABD46C31857A0F300A5F081 /* UIKit.framework in Frameworks */, EABD46C41857A0F300A5F081 /* Foundation.framework in Frameworks */, EABD46C51857A0F300A5F081 /* CoreGraphics.framework in Frameworks */, + E9F646F81AA3BABA00C37EA3 /* IOKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -273,15 +444,56 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EB60ECE7177F8DB3005A041A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EB60ED1C177F90F0005A041A /* libKIF-OCUnit.a in Frameworks */, + EB60ECEC177F8DB3005A041A /* SenTestingKit.framework in Frameworks */, + EB60ECED177F8DB3005A041A /* UIKit.framework in Frameworks */, + EB60ECEE177F8DB3005A041A /* Foundation.framework in Frameworks */, + EB60ED1B177F90EA005A041A /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EB7204501680DDAD00278DA2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EB7204511680DDAD00278DA2 /* SenTestingKit.framework in Frameworks */, + EB7204521680DDAD00278DA2 /* Foundation.framework in Frameworks */, + EB7204531680DDAD00278DA2 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 9CC9673C1AD4B1B600576D13 /* KIF Framework */ = { + isa = PBXGroup; + children = ( + 9CC9673F1AD4B1B600576D13 /* KIF.h */, + 9CC9673D1AD4B1B600576D13 /* Supporting Files */, + ); + name = "KIF Framework"; + path = KIFFramework; + sourceTree = ""; + }; + 9CC9673D1AD4B1B600576D13 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9CC9673E1AD4B1B600576D13 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; AAB0725D139719AC008AF393 = { isa = PBXGroup; children = ( EB60ECBC177F8C51005A041A /* KIF */, EB60ECC6177F8C83005A041A /* Test Host */, EB60ECEF177F8DB3005A041A /* KIF Tests */, + 9CC9673C1AD4B1B600576D13 /* KIF Framework */, AAB0726A139719AC008AF393 /* Frameworks */, AAB07269139719AC008AF393 /* Products */, ); @@ -290,9 +502,12 @@ AAB07269139719AC008AF393 /* Products */ = { isa = PBXGroup; children = ( + EB72047C1680DDAD00278DA2 /* libKIF-OCUnit.a */, EB60ECC1177F8C83005A041A /* Test Host.app */, + EB60ECEB177F8DB3005A041A /* KIF Tests-OCUnit.octest */, EABD46AA1857A0C700A5F081 /* libKIF.a */, EABD46CD1857A0F300A5F081 /* KIF Tests - XCTest.xctest */, + 9CC9673B1AD4B1B600576D13 /* KIF.framework */, ); name = Products; sourceTree = ""; @@ -300,6 +515,8 @@ AAB0726A139719AC008AF393 /* Frameworks */ = { isa = PBXGroup; children = ( + 9CC881A21AD4CAAC002CD34C /* CoreFoundation.framework */, + E9AD81F91AA180B900B369FD /* IOKit.framework */, 84D293B71A2C8DF700C10944 /* AddressBookUI.framework */, 84D293AE1A2C867300C10944 /* CoreLocation.framework */, EABD46AB1857A0EB00A5F081 /* XCTest.framework */, @@ -373,6 +590,10 @@ EABD46761857A07600A5F081 /* XCTestCase-KIFAdditions.m */, EAC809681864F19C000E819F /* NSException-KIFAdditions.h */, EAC809691864F19C000E819F /* NSException-KIFAdditions.m */, + E977D1051AA4062B005645BF /* UIEvent+KIFAdditions.h */, + E977D1061AA4062B005645BF /* UIEvent+KIFAdditions.m */, + 3ADD2160096BE41C780FBD95 /* UIView-Debugging.m */, + 3ADD26484C6C438B71DC15C5 /* UIView-Debugging.h */, ); path = Additions; sourceTree = ""; @@ -426,6 +647,7 @@ D927B9DB18F9DF2D00DAD036 /* TableViewController.m */, AE62FCD51A1D2447002B10DA /* WebViewController.m */, 84D293AC1A2C84F700C10944 /* SystemAlertViewController.m */, + 97E8A5CE1B0A62F700124E3B /* BackgroundViewController.m */, EB60ECC7177F8C83005A041A /* Supporting Files */, ); path = "Test Host"; @@ -474,6 +696,7 @@ EB1A44D91A0C33AD004A3F61 /* AccessibilityIdentifierTests.m */, AE62FCCF1A1D20E5002B10DA /* WebViewTests.m */, 84D293B01A2C891700C10944 /* SystemAlertTests.m */, + 97E8A5D01B0A63D100124E3B /* BackgroundTests.m */, EB60ECF0177F8DB3005A041A /* Supporting Files */, ); path = "KIF Tests"; @@ -493,6 +716,39 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 9CC967381AD4B1B600576D13 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9CC967401AD4B1B600576D13 /* KIF.h in Headers */, + 9CC967561AD4B1F100576D13 /* LoadableCategory.h in Headers */, + 9CC967571AD4B1F100576D13 /* CGGeometry-KIFAdditions.h in Headers */, + 9CC967591AD4B1F100576D13 /* NSFileManager-KIFAdditions.h in Headers */, + 9CC9675B1AD4B1F100576D13 /* UIAccessibilityElement-KIFAdditions.h in Headers */, + 9CC9675D1AD4B1F100576D13 /* UIApplication-KIFAdditions.h in Headers */, + 9CC9675F1AD4B1F100576D13 /* UIScrollView-KIFAdditions.h in Headers */, + 9CC967731AD4B1FF00576D13 /* KIFSystemTestActor.h in Headers */, + 9CC9677A1AD4B20700576D13 /* KIFTestCase.h in Headers */, + 5C877DD01B057E13006A3AC6 /* KIFUITestActor-IdentifierTests.h in Headers */, + 9CC9677C1AD4B20700576D13 /* KIFTestActor.h in Headers */, + 9CC9677F1AD4B20700576D13 /* KIFTypist.h in Headers */, + 9CC967811AD4B20700576D13 /* KIFTestStepValidation.h in Headers */, + 9CC967751AD4B1FF00576D13 /* KIFUITestActor.h in Headers */, + 9CC967771AD4B1FF00576D13 /* KIFUITestActor-ConditionalTests.h in Headers */, + 9CC967611AD4B1F100576D13 /* UITouch-KIFAdditions.h in Headers */, + 9CC967631AD4B1F100576D13 /* UIView-KIFAdditions.h in Headers */, + 9CC967651AD4B1F100576D13 /* UIWindow-KIFAdditions.h in Headers */, + 9CC967671AD4B1F100576D13 /* UITableView-KIFAdditions.h in Headers */, + 9CC967691AD4B1F100576D13 /* NSBundle-KIFAdditions.h in Headers */, + 5C877DD11B0A8B8F006A3AC6 /* UIView-Debugging.h in Headers */, + 9CC9676B1AD4B1F100576D13 /* NSError-KIFAdditions.h in Headers */, + 9CC9676D1AD4B1F100576D13 /* XCTestCase-KIFAdditions.h in Headers */, + 9CC9676F1AD4B1F100576D13 /* NSException-KIFAdditions.h in Headers */, + 9CC967711AD4B1F100576D13 /* UIEvent+KIFAdditions.h in Headers */, + 9CC967841AD4B20700576D13 /* UIAutomationHelper.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EABD46901857A0C700A5F081 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -502,8 +758,8 @@ D927B9DF18F9E46400DAD036 /* UITableView-KIFAdditions.h in Headers */, EABD46921857A0C700A5F081 /* CGGeometry-KIFAdditions.h in Headers */, EABD46931857A0C700A5F081 /* UIAccessibilityElement-KIFAdditions.h in Headers */, + 9CC967BE1AD4B55E00576D13 /* KIF-XCTestPrefix.pch in Headers */, EABD46941857A0C700A5F081 /* UIApplication-KIFAdditions.h in Headers */, - 84D293BB1A2CC30B00C10944 /* UIAutomationHelper.h in Headers */, EABD46951857A0C700A5F081 /* UIScrollView-KIFAdditions.h in Headers */, EABD46971857A0C700A5F081 /* UITouch-KIFAdditions.h in Headers */, EABD46981857A0C700A5F081 /* UIView-KIFAdditions.h in Headers */, @@ -518,10 +774,43 @@ EABD46A11857A0C700A5F081 /* NSBundle-KIFAdditions.h in Headers */, EAC8096A1864F19C000E819F /* NSException-KIFAdditions.h in Headers */, EABD46961857A0C700A5F081 /* XCTestCase-KIFAdditions.h in Headers */, + 84D293BB1A2CC30B00C10944 /* UIAutomationHelper.h in Headers */, + E977D1071AA4062B005645BF /* UIEvent+KIFAdditions.h in Headers */, EABD46A21857A0C700A5F081 /* NSError-KIFAdditions.h in Headers */, EABD46A31857A0C700A5F081 /* KIFTestStepValidation.h in Headers */, + 3ADD25CC71BF27D675768787 /* UIView-Debugging.h in Headers */, EB2526481981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.h in Headers */, - EABD46D51857C54500A5F081 /* KIF-XCTestPrefix.pch in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EB7204541680DDAD00278DA2 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A88930121685098E00FC7C63 /* KIF.h in Headers */, + EB7204591680DDAD00278DA2 /* CGGeometry-KIFAdditions.h in Headers */, + EB72045A1680DDAD00278DA2 /* UIAccessibilityElement-KIFAdditions.h in Headers */, + EB72045B1680DDAD00278DA2 /* UIApplication-KIFAdditions.h in Headers */, + EB1A44D71A0C327D004A3F61 /* KIFUITestActor-IdentifierTests.h in Headers */, + EB72045C1680DDAD00278DA2 /* UIScrollView-KIFAdditions.h in Headers */, + EB72045D1680DDAD00278DA2 /* UITouch-KIFAdditions.h in Headers */, + EB72045E1680DDAD00278DA2 /* UIView-KIFAdditions.h in Headers */, + EB72045F1680DDAD00278DA2 /* UIWindow-KIFAdditions.h in Headers */, + EB7204601680DDAD00278DA2 /* NSFileManager-KIFAdditions.h in Headers */, + EB7204611680DDAD00278DA2 /* LoadableCategory.h in Headers */, + EB7204621680DDAD00278DA2 /* KIFTypist.h in Headers */, + EB7204631680DDAD00278DA2 /* KIFTestActor.h in Headers */, + 84D293BC1A2CC30B00C10944 /* UIAutomationHelper.h in Headers */, + EB7204641680DDAD00278DA2 /* KIFTestCase.h in Headers */, + EB7204651680DDAD00278DA2 /* KIFSystemTestActor.h in Headers */, + EB7204661680DDAD00278DA2 /* KIFUITestActor.h in Headers */, + EBAE487C17A45A8E0005EE19 /* NSBundle-KIFAdditions.h in Headers */, + EBAE488117A460E50005EE19 /* NSError-KIFAdditions.h in Headers */, + D927B9E118F9E47000DAD036 /* UITableView-KIFAdditions.h in Headers */, + EABD474B185F509E00A5F081 /* SenTestCase-KIFAdditions.h in Headers */, + EBAE488717A4E5C30005EE19 /* KIFTestStepValidation.h in Headers */, + EB7204551680DDAD00278DA2 /* KIF-Prefix.pch in Headers */, + 3ADD2532FE4917CD5755AA59 /* UIView-Debugging.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -545,6 +834,24 @@ /* End PBXLegacyTarget section */ /* Begin PBXNativeTarget section */ + 9CC9673A1AD4B1B600576D13 /* KIFFramework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9CC967541AD4B1B600576D13 /* Build configuration list for PBXNativeTarget "KIFFramework" */; + buildPhases = ( + 9CC967361AD4B1B600576D13 /* Sources */, + 9CC967371AD4B1B600576D13 /* Frameworks */, + 9CC967381AD4B1B600576D13 /* Headers */, + 9CC967391AD4B1B600576D13 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = KIFFramework; + productName = KIFFramework; + productReference = 9CC9673B1AD4B1B600576D13 /* KIF.framework */; + productType = "com.apple.product-type.framework"; + }; EABD46791857A0C700A5F081 /* KIF */ = { isa = PBXNativeTarget; buildConfigurationList = EABD46A61857A0C700A5F081 /* Build configuration list for PBXNativeTarget "KIF" */; @@ -598,14 +905,55 @@ productReference = EB60ECC1177F8C83005A041A /* Test Host.app */; productType = "com.apple.product-type.application"; }; + EB60ECEA177F8DB3005A041A /* KIF Tests-OCUnit */ = { + isa = PBXNativeTarget; + buildConfigurationList = EB60ECF9177F8DB3005A041A /* Build configuration list for PBXNativeTarget "KIF Tests-OCUnit" */; + buildPhases = ( + EB60ECE6177F8DB3005A041A /* Sources */, + EB60ECE7177F8DB3005A041A /* Frameworks */, + EB60ECE8177F8DB3005A041A /* Resources */, + EB60ECE9177F8DB3005A041A /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + EB8C0CED1780CBF5000DBC0B /* PBXTargetDependency */, + ); + name = "KIF Tests-OCUnit"; + productName = "KIF Tests"; + productReference = EB60ECEB177F8DB3005A041A /* KIF Tests-OCUnit.octest */; + productType = "com.apple.product-type.bundle.ocunit-test"; + }; + EB72043E1680DDAD00278DA2 /* KIF-OCUnit */ = { + isa = PBXNativeTarget; + buildConfigurationList = EB7204791680DDAD00278DA2 /* Build configuration list for PBXNativeTarget "KIF-OCUnit" */; + buildPhases = ( + EB72043F1680DDAD00278DA2 /* Sources */, + EB7204501680DDAD00278DA2 /* Frameworks */, + EB7204541680DDAD00278DA2 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "KIF-OCUnit"; + productName = KIFTestCase; + productReference = EB72047C1680DDAD00278DA2 /* libKIF-OCUnit.a */; + productType = "com.apple.product-type.library.static"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ AAB0725F139719AC008AF393 /* Project object */ = { isa = PBXProject; attributes = { - LastTestingUpgradeCheck = 0610; - LastUpgradeCheck = 0510; + LastTestingUpgradeCheck = 0510; + LastUpgradeCheck = 0620; + TargetAttributes = { + 9CC9673A1AD4B1B600576D13 = { + CreatedOnToolsVersion = 6.2; + }; + }; }; buildConfigurationList = AAB07262139719AC008AF393 /* Build configuration list for PBXProject "KIF" */; compatibilityVersion = "Xcode 3.2"; @@ -620,14 +968,24 @@ projectRoot = ""; targets = ( EABD46791857A0C700A5F081 /* KIF */, + EB72043E1680DDAD00278DA2 /* KIF-OCUnit */, A88930091685088F00FC7C63 /* KIF Documentation */, EB60ECC0177F8C83005A041A /* Test Host */, EABD46AD1857A0F300A5F081 /* KIF Tests */, + EB60ECEA177F8DB3005A041A /* KIF Tests-OCUnit */, + 9CC9673A1AD4B1B600576D13 /* KIFFramework */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 9CC967391AD4B1B600576D13 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; EABD46C61857A0F300A5F081 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -650,6 +1008,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EB60ECE8177F8DB3005A041A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EB60ECF4177F8DB3005A041A /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -666,9 +1032,53 @@ shellPath = /bin/sh; shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; }; + EB60ECE9177F8DB3005A041A /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 9CC967361AD4B1B600576D13 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9CC967D01AD4B5B900576D13 /* KIFTestCase.m in Sources */, + 9CC967D11AD4B5B900576D13 /* KIFTestActor.m in Sources */, + 9CC967D21AD4B5B900576D13 /* KIFTypist.m in Sources */, + 9CC967D31AD4B5B900576D13 /* KIFTestStepValidation.m in Sources */, + 9CC967D41AD4B5B900576D13 /* UIAutomationHelper.m in Sources */, + 9CC967D51AD4B5B900576D13 /* KIFUITestActor-IdentifierTests.m in Sources */, + 9CC967CD1AD4B59A00576D13 /* KIFSystemTestActor.m in Sources */, + 9CC967CE1AD4B59A00576D13 /* KIFUITestActor.m in Sources */, + 9CC967CF1AD4B59A00576D13 /* KIFUITestActor-ConditionalTests.m in Sources */, + 9CC967BF1AD4B58C00576D13 /* CGGeometry-KIFAdditions.m in Sources */, + 9CC967C01AD4B58C00576D13 /* NSFileManager-KIFAdditions.m in Sources */, + 9CC967C11AD4B58C00576D13 /* UIAccessibilityElement-KIFAdditions.m in Sources */, + 9CC967C21AD4B58C00576D13 /* UIApplication-KIFAdditions.m in Sources */, + 9CC967C31AD4B58C00576D13 /* UIScrollView-KIFAdditions.m in Sources */, + 9CC967C41AD4B58C00576D13 /* UITouch-KIFAdditions.m in Sources */, + 9CC967C51AD4B58C00576D13 /* UIView-KIFAdditions.m in Sources */, + 9CC967C61AD4B58C00576D13 /* UIWindow-KIFAdditions.m in Sources */, + 9CC967C71AD4B58C00576D13 /* UITableView-KIFAdditions.m in Sources */, + 9CC967C81AD4B58C00576D13 /* NSBundle-KIFAdditions.m in Sources */, + 9CC967C91AD4B58C00576D13 /* NSError-KIFAdditions.m in Sources */, + 9CC967CA1AD4B58C00576D13 /* XCTestCase-KIFAdditions.m in Sources */, + 9CC967CB1AD4B58C00576D13 /* NSException-KIFAdditions.m in Sources */, + 9CC967CC1AD4B58C00576D13 /* UIEvent+KIFAdditions.m in Sources */, + 5C877DD21B0A8B93006A3AC6 /* UIView-Debugging.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EABD467A1857A0C700A5F081 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -689,12 +1099,14 @@ EABD46861857A0C700A5F081 /* XCTestCase-KIFAdditions.m in Sources */, EB1A44D61A0C3268004A3F61 /* KIFUITestActor-IdentifierTests.m in Sources */, EB2526491981BF7A00DBC747 /* KIFUITestActor-ConditionalTests.m in Sources */, + E977D1081AA4062B005645BF /* UIEvent+KIFAdditions.m in Sources */, EABD46871857A0C700A5F081 /* KIFSystemTestActor.m in Sources */, EAC8096B1864F19C000E819F /* NSException-KIFAdditions.m in Sources */, EABD46881857A0C700A5F081 /* KIFUITestActor.m in Sources */, EABD46891857A0C700A5F081 /* NSBundle-KIFAdditions.m in Sources */, EABD468A1857A0C700A5F081 /* NSError-KIFAdditions.m in Sources */, EABD468B1857A0C700A5F081 /* KIFTestStepValidation.m in Sources */, + 4D2FD4EE1AF5936700E61192 /* UIView-Debugging.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -719,6 +1131,7 @@ EA47DA2818EDFD6F0034D2F5 /* CollectionViewTests.m in Sources */, EABD46BB1857A0F300A5F081 /* WaitForTappableViewTests.m in Sources */, EABD46BC1857A0F300A5F081 /* WaitForViewTests.m in Sources */, + 97E8A5D11B0A63D100124E3B /* BackgroundTests.m in Sources */, EABD46BD1857A0F300A5F081 /* LandscapeTests.m in Sources */, EABD46BE1857A0F300A5F081 /* TableViewTests.m in Sources */, EABD46BF1857A0F300A5F081 /* GestureTests.m in Sources */, @@ -733,6 +1146,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 97E8A5CF1B0A62F700124E3B /* BackgroundViewController.m in Sources */, EB9FB42717A5BACB00DDF160 /* GestureViewController.m in Sources */, EA0F254A1829839E006FF825 /* CollectionViewController.m in Sources */, 84D293AD1A2C84F700C10944 /* SystemAlertViewController.m in Sources */, @@ -749,6 +1163,61 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + EB60ECE6177F8DB3005A041A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2EE12711198991920031D347 /* MultiFingerTests.m in Sources */, + EB09001017E3696A00AA15B1 /* SearchFieldTests.m in Sources */, + EB22B5B017AF52640090B848 /* CascadingFailureTests.m in Sources */, + EB02523E17AA109400A7D13A /* CompositionTests.m in Sources */, + EB60ED10177F90BA005A041A /* LongPressTests.m in Sources */, + EB60ED11177F90BA005A041A /* ModalViewTests.m in Sources */, + EB60ED12177F90BA005A041A /* SpecificControlTests.m in Sources */, + EB60ED13177F90BA005A041A /* SystemTests.m in Sources */, + EB60ED14177F90BA005A041A /* TappingTests.m in Sources */, + 2CED883E181F5EE1005ABD20 /* PickerTests.m in Sources */, + EB60ED15177F90BA005A041A /* TypingTests.m in Sources */, + EB60ED16177F90BA005A041A /* WaitForAbscenceTests.m in Sources */, + EA0F2547182979BE006FF825 /* CollectionViewTests.m in Sources */, + EB60ED17177F90BA005A041A /* WaitForTappableViewTests.m in Sources */, + EB60ED18177F90BA005A041A /* WaitForViewTests.m in Sources */, + EB9FC00517E144B700138266 /* LandscapeTests.m in Sources */, + EB3F654517AA0B8400469D18 /* TableViewTests.m in Sources */, + EB60ED1A177F90C2005A041A /* GestureTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EB72043F1680DDAD00278DA2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EB7204431680DDAD00278DA2 /* CGGeometry-KIFAdditions.m in Sources */, + EB7204441680DDAD00278DA2 /* UIAccessibilityElement-KIFAdditions.m in Sources */, + EB7204451680DDAD00278DA2 /* UIApplication-KIFAdditions.m in Sources */, + EB7204461680DDAD00278DA2 /* UIScrollView-KIFAdditions.m in Sources */, + EB7204471680DDAD00278DA2 /* UITouch-KIFAdditions.m in Sources */, + EB7204481680DDAD00278DA2 /* UIView-KIFAdditions.m in Sources */, + D927B9E218F9E47600DAD036 /* UITableView-KIFAdditions.m in Sources */, + EB7204491680DDAD00278DA2 /* UIWindow-KIFAdditions.m in Sources */, + EB72044A1680DDAD00278DA2 /* NSFileManager-KIFAdditions.m in Sources */, + EB72044B1680DDAD00278DA2 /* KIFTypist.m in Sources */, + EB1A44D81A0C3284004A3F61 /* KIFUITestActor-IdentifierTests.m in Sources */, + EB25264A1981BF8400DBC747 /* KIFUITestActor-ConditionalTests.m in Sources */, + EB72044C1680DDAD00278DA2 /* KIFTestActor.m in Sources */, + EB72044D1680DDAD00278DA2 /* KIFTestCase.m in Sources */, + EB72044E1680DDAD00278DA2 /* KIFSystemTestActor.m in Sources */, + EB72044F1680DDAD00278DA2 /* KIFUITestActor.m in Sources */, + EBAE487D17A45A8E0005EE19 /* NSBundle-KIFAdditions.m in Sources */, + 84D293BE1A2CC30B00C10944 /* UIAutomationHelper.m in Sources */, + EBAE488217A460E50005EE19 /* NSError-KIFAdditions.m in Sources */, + EBAE488817A4E5C30005EE19 /* KIFTestStepValidation.m in Sources */, + EABD474C185F509E00A5F081 /* SenTestCase-KIFAdditions.m in Sources */, + E977D1091AA40736005645BF /* UIEvent+KIFAdditions.m in Sources */, + 4D2FD4EF1AF5936800E61192 /* UIView-Debugging.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -757,6 +1226,11 @@ target = EB60ECC0177F8C83005A041A /* Test Host */; targetProxy = EABD46AF1857A0F300A5F081 /* PBXContainerItemProxy */; }; + EB8C0CED1780CBF5000DBC0B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EB60ECC0177F8C83005A041A /* Test Host */; + targetProxy = EB8C0CEC1780CBF5000DBC0B /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -787,6 +1261,178 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 9CC9674E1AD4B1B600576D13 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD)", + i386, + x86_64, + ); + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREFIX_HEADER = "Classes/KIF-XCTestPrefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = KIFFramework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = KIF; + PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9CC9674F1AD4B1B600576D13 /* Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD)", + i386, + x86_64, + ); + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + ); + GCC_PREFIX_HEADER = "Classes/KIF-XCTestPrefix.pch"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = KIFFramework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = KIF; + PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Coverage; + }; + 9CC967501AD4B1B600576D13 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = ( + "$(ARCHS_STANDARD)", + i386, + x86_64, + ); + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + ); + GCC_PREFIX_HEADER = "Classes/KIF-XCTestPrefix.pch"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = KIFFramework/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = KIF; + PUBLIC_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/Headers"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; A889300B1685088F00FC7C63 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -888,12 +1534,14 @@ FRAMEWORK_SEARCH_PATHS = ( "$(PLATFORM_DIR)/Developer/Library/Frameworks", "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", ); GCC_PREFIX_HEADER = "Classes/KIF-XCTestPrefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( DEBUG, "KIF_XCTEST=1", ); + HEADER_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = KIF; }; @@ -908,12 +1556,14 @@ FRAMEWORK_SEARCH_PATHS = ( "$(PLATFORM_DIR)/Developer/Library/Frameworks", "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", ); GCC_PREFIX_HEADER = "Classes/KIF-XCTestPrefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( DEBUG, "KIF_XCTEST=1", ); + HEADER_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = KIF; }; @@ -928,8 +1578,10 @@ FRAMEWORK_SEARCH_PATHS = ( "$(PLATFORM_DIR)/Developer/Library/Frameworks", "$(DEVELOPER_FRAMEWORKS_DIR)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", ); GCC_PREFIX_HEADER = "Classes/KIF-XCTestPrefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = KIF; }; @@ -961,6 +1613,7 @@ "$(inherited)", ); GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "KIF Tests/KIF Tests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.1; ONLY_ACTIVE_ARCH = YES; @@ -998,6 +1651,7 @@ "KIF_XCTEST=1", ); GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "KIF Tests/KIF Tests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.1; ONLY_ACTIVE_ARCH = YES; @@ -1029,6 +1683,7 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "KIF Tests/KIF XCTests-Prefix.pch"; GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = "KIF Tests/KIF Tests-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.1; OTHER_LDFLAGS = "-ObjC"; @@ -1097,6 +1752,101 @@ }; name = Release; }; + EB60ECFA177F8DB3005A041A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Test Host.app/Test Host"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "\"$(SDKROOT)/Developer/Library/Frameworks\""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "KIF Tests/KIF Tests-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "KIF Tests/KIF Tests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + EB60ECFB177F8DB3005A041A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Test Host.app/Test Host"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = "\"$(SDKROOT)/Developer/Library/Frameworks\""; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "KIF Tests/KIF Tests-Prefix.pch"; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "KIF Tests/KIF Tests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; + EB72047A1680DDAD00278DA2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; + DSTROOT = /tmp/KIF.dst; + FRAMEWORK_SEARCH_PATHS = "\"$(SDKROOT)/Developer/Library/Frameworks\""; + GCC_PREFIX_HEADER = "Classes/KIF-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + DEBUG, + "KIF_SENTEST=1", + ); + HEADER_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "KIF-OCUnit"; + }; + name = Debug; + }; + EB72047B1680DDAD00278DA2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; + DSTROOT = /tmp/KIF.dst; + FRAMEWORK_SEARCH_PATHS = "\"$(SDKROOT)/Developer/Library/Frameworks\""; + GCC_PREFIX_HEADER = "Classes/KIF-Prefix.pch"; + HEADER_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "KIF-OCUnit"; + }; + name = Release; + }; EBAE48FF17A5B1380005EE19 /* Coverage */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1120,6 +1870,24 @@ }; name = Coverage; }; + EBAE490017A5B1380005EE19 /* Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_OBJC_ARC = YES; + DSTROOT = /tmp/KIF.dst; + FRAMEWORK_SEARCH_PATHS = "\"$(SDKROOT)/Developer/Library/Frameworks\""; + GCC_PREFIX_HEADER = "Classes/KIF-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + DEBUG, + "KIF_SENTEST=1", + ); + HEADER_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "KIF-OCUnit"; + }; + name = Coverage; + }; EBAE490117A5B1380005EE19 /* Coverage */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1181,9 +1949,54 @@ }; name = Coverage; }; + EBAE490317A5B1380005EE19 /* Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Test Host.app/Test Host"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "\"$(SDKROOT)/Developer/Library/Frameworks\""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "KIF Tests/KIF Tests-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "KIF_SENTEST=1", + ); + GCC_WARN_UNINITIALIZED_AUTOS = YES; + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = "KIF Tests/KIF Tests-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Coverage; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 9CC967541AD4B1B600576D13 /* Build configuration list for PBXNativeTarget "KIFFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9CC9674E1AD4B1B600576D13 /* Debug */, + 9CC9674F1AD4B1B600576D13 /* Coverage */, + 9CC967501AD4B1B600576D13 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; A889300A1685088F00FC7C63 /* Build configuration list for PBXLegacyTarget "KIF Documentation" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1234,6 +2047,26 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + EB60ECF9177F8DB3005A041A /* Build configuration list for PBXNativeTarget "KIF Tests-OCUnit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EB60ECFA177F8DB3005A041A /* Debug */, + EBAE490317A5B1380005EE19 /* Coverage */, + EB60ECFB177F8DB3005A041A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EB7204791680DDAD00278DA2 /* Build configuration list for PBXNativeTarget "KIF-OCUnit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EB72047A1680DDAD00278DA2 /* Debug */, + EBAE490017A5B1380005EE19 /* Coverage */, + EB72047B1680DDAD00278DA2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = AAB0725F139719AC008AF393 /* Project object */; diff --git a/tests/KIF/KIF.xcodeproj/xcshareddata/xcschemes/KIF.xcscheme b/tests/KIF/KIF.xcodeproj/xcshareddata/xcschemes/KIF.xcscheme index 088aafe7a..2a61d9741 100755 --- a/tests/KIF/KIF.xcodeproj/xcshareddata/xcschemes/KIF.xcscheme +++ b/tests/KIF/KIF.xcodeproj/xcshareddata/xcschemes/KIF.xcscheme @@ -49,6 +49,15 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" allowLocationSimulation = "YES"> + + + + diff --git a/tests/KIF/KIF.xcodeproj/xcshareddata/xcschemes/KIFFramework.xcscheme b/tests/KIF/KIF.xcodeproj/xcshareddata/xcschemes/KIFFramework.xcscheme new file mode 100755 index 000000000..a549a3e28 --- /dev/null +++ b/tests/KIF/KIF.xcodeproj/xcshareddata/xcschemes/KIFFramework.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/KIF/KIFFramework/Info.plist b/tests/KIF/KIFFramework/Info.plist new file mode 100755 index 000000000..f55e2460e --- /dev/null +++ b/tests/KIF/KIFFramework/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.square.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/tests/KIF/KIFFramework/KIF.h b/tests/KIF/KIFFramework/KIF.h new file mode 100755 index 000000000..ce3bc0300 --- /dev/null +++ b/tests/KIF/KIFFramework/KIF.h @@ -0,0 +1,42 @@ +// +// KIF.h +// KIF +// +// Created by Shane Zatezalo on 4/7/15. +// Copyright (c) 2015 Lottadot LLC. All rights reserved. +// + +#import +#import +#import + +//! Project version number for KIF. +FOUNDATION_EXPORT double KIFVersionNumber; + +//! Project version string for KIF. +FOUNDATION_EXPORT const unsigned char KIFVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import \ No newline at end of file diff --git a/tests/KIF/README.md b/tests/KIF/README.md index 4b1fb3236..87194efd3 100755 --- a/tests/KIF/README.md +++ b/tests/KIF/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/kif-framework/KIF.svg?branch=master)](https://travis-ci.org/kif-framework/KIF) +[![Build Status](https://travis-ci.org/kif-framework/KIF.svg?branch=master)](https://travis-ci.org/kif-framework/KIF) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) KIF iOS Integration Testing Framework ===================================== @@ -27,7 +27,7 @@ KIF's test suite has been run against iOS 5.1 and above (including iOS 8), thoug KIF attempts to imitate actual user input. Automation is done using tap events wherever possible. #### Automatic Integration with Xcode 5 Testing Tools -Xcode 5 introduces [new testing an continuous integration tools](https://developer.apple.com/technologies/tools/whats-new.html) built on the same testing platform as KIF. You can easily run a single KIF test with the Test Navigator or kick off nightly acceptance tests with Bots. +Xcode 5 introduces [new testing and continuous integration tools](https://developer.apple.com/technologies/tools/whats-new.html) built on the same testing platform as KIF. You can easily run a single KIF test with the Test Navigator or kick off nightly acceptance tests with Bots. See KIF in Action ----------------- @@ -100,7 +100,9 @@ Select your project in Xcode and click on "Add Target" in the bottom left corner The testing target will add a header and implementation file, likely "Acceptance_Tests.m/h" to match your target name. Delete those. ### Configure the Testing Target -Now that you have a target for your tests, add the tests to that target. With the project settings still selected in the Project Navigator, and the new integration tests target selected in the project settings, select the "Build Phases" tab. Under the "Link Binary With Libraries" section, hit the "+" button. In the sheet that appears, select "libKIF.a" and click "Add". Repeat the process for CoreGraphics.framework. +Now that you have a target for your tests, add the tests to that target. With the project settings still selected in the Project Navigator, and the new integration tests target selected in the project settings, select the "Build Phases" tab. Under the "Link Binary With Libraries" section, hit the "+" button. In the sheet that appears, select "libKIF.a" and click "Add". Repeat the process for CoreGraphics.framework. + +KIF requires the IOKit.framework. Unfortunately as of Xcode 6.3 you need to manually add IOKit from the Xcode.app bundle. After doing so remove `$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks` from the Framework Search Path setting (Xcode automatically adds it after manually importing). ![Add libKIF library screen shot](https://github.com/kif-framework/KIF/raw/master/Documentation/Images/Add Library.png) @@ -119,7 +121,7 @@ You need your tests to run hosted in your application. **Xcode does this for you First add your application by selecting "Build Phases", expanding the "Target Dependencies" section, clicking on the "+" button, and in the new sheet that appears selecting your application target and clicking "Add". -Next, configure your bundle loader. In "Build Settings", expand "Linking" and edit "Bundle Loader" to be `$(BUILT_PRODUCTS_DIR)/MyApplication.app/MyApplication` where *MyApplication* is the name of your app. Expand the "Unit Testing" section and edit "Test Host" to be `$(BUNDLE_LOADER)`. Also make sure that "Wrapper Extension" is set to "xctest". +Next, configure your bundle loader. In "Build Settings", expand "Linking" and edit "Bundle Loader" to be `$(BUILT_PRODUCTS_DIR)/MyApplication.app/MyApplication` where *MyApplication* is the name of your app. Expand the "Testing" section and edit "Test Host" to be `$(BUNDLE_LOADER)`. Also make sure that "Wrapper Extension" is set to "xctest". The last step is to configure your unit tests to run when you trigger a test (⌘U). Click on your scheme name and select "Edit Scheme…". Click on "Test" in the sidebar followed by the "+" in the bottom left corner. Select your testing target and click "OK". @@ -132,72 +134,80 @@ The first step is to create a test class to test some functionality. In our cas *LoginTestCase.h* - #import +```objective-c +#import - @interface LoginTests : KIFTestCase - @end +@interface LoginTests : KIFTestCase +@end +``` *LoginTestCase.m* - #import "LoginTests.h" - #import "KIFUITestActor+EXAdditions.h" +```objective-c +#import "LoginTests.h" +#import "KIFUITestActor+EXAdditions.h" - @implementation LoginTests +@implementation LoginTests - - (void)beforeEach - { - [tester navigateToLoginPage]; - } +- (void)beforeEach +{ + [tester navigateToLoginPage]; +} - - (void)afterEach - { - [tester returnToLoggedOutHomeScreen]; - } +- (void)afterEach +{ + [tester returnToLoggedOutHomeScreen]; +} - - (void)testSuccessfulLogin - { - [tester enterText:@"user@example.com" intoViewWithAccessibilityLabel:@"Login User Name"]; - [tester enterText:@"thisismypassword" intoViewWithAccessibilityLabel:@"Login Password"]; - [tester tapViewWithAccessibilityLabel:@"Log In"]; +- (void)testSuccessfulLogin +{ + [tester enterText:@"user@example.com" intoViewWithAccessibilityLabel:@"Login User Name"]; + [tester enterText:@"thisismypassword" intoViewWithAccessibilityLabel:@"Login Password"]; + [tester tapViewWithAccessibilityLabel:@"Log In"]; - // Verify that the login succeeded - [tester waitForTappableViewWithAccessibilityLabel:@"Welcome"]; - } + // Verify that the login succeeded + [tester waitForTappableViewWithAccessibilityLabel:@"Welcome"]; +} - @end +@end +``` Most of the tester actions in the test are already defined by the KIF framework, but `-navigateToLoginPage` and `-returnToLoggedOutHomeScreen` are not. These are examples of custom actions which are specific to your application. Adding such steps is easy, and is done using a factory method in a category of `KIFUITestActor`, similar to how we added the scenario. *KIFUITestActor+EXAdditions.h* - #import +```objective-c +#import - @interface KIFUITestActor (EXAdditions) +@interface KIFUITestActor (EXAdditions) - - (void)navigateToLoginPage; - - (void)returnToLoggedOutHomeScreen; +- (void)navigateToLoginPage; +- (void)returnToLoggedOutHomeScreen; - @end +@end +``` *KIFUITestActor+EXAdditions.m* - #import "KIFUITestActor+EXAdditions.h" +```objective-c +#import "KIFUITestActor+EXAdditions.h" - @implementation KIFUITestActor (EXAdditions) +@implementation KIFUITestActor (EXAdditions) - - (void)navigateToLoginPage - { - [self tapViewWithAccessibilityLabel:@"Login/Sign Up"]; - [self tapViewWithAccessibilityLabel:@"Skip this ad"]; - } +- (void)navigateToLoginPage +{ + [self tapViewWithAccessibilityLabel:@"Login/Sign Up"]; + [self tapViewWithAccessibilityLabel:@"Skip this ad"]; +} - - (void)returnToLoggedOutHomeScreen - { - [self tapViewWithAccessibilityLabel:@"Logout"]; - [self tapViewWithAccessibilityLabel:@"Logout"]; // Dismiss alert. - } +- (void)returnToLoggedOutHomeScreen +{ + [self tapViewWithAccessibilityLabel:@"Logout"]; + [self tapViewWithAccessibilityLabel:@"Logout"]; // Dismiss alert. +} - @end +@end +``` Everything should now be configured. When you run the integration tests using the test button, ⌘U, or the Xcode 5 Test Navigator (⌘5). @@ -208,21 +218,23 @@ Use with other testing frameworks For example, the following [Specta](https://github.com/specta/specta) test works without any changes to KIF or Specta: - #import - #import +```objective-c +#import +#import - SpecBegin(App) +SpecBegin(App) - describe(@"Tab controller", ^{ +describe(@"Tab controller", ^{ - it(@"should show second view when I tap on the second tab", ^{ - [tester tapViewWithAccessibilityLabel:@"Second" traits:UIAccessibilityTraitButton]; - [tester waitForViewWithAccessibilityLabel:@"Second View"]; - }); + it(@"should show second view when I tap on the second tab", ^{ + [tester tapViewWithAccessibilityLabel:@"Second" traits:UIAccessibilityTraitButton]; + [tester waitForViewWithAccessibilityLabel:@"Second View"]; + }); - }); +}); - SpecEnd +SpecEnd +``` If you want to use KIF with a test runner that does not subclass `XCTestCase`, your runner class just needs to implement the `KIFTestActorDelegate` protocol which contains two required methods. diff --git a/tests/KIF/Test Host/BackgroundViewController.m b/tests/KIF/Test Host/BackgroundViewController.m new file mode 100755 index 000000000..a0ef91a71 --- /dev/null +++ b/tests/KIF/Test Host/BackgroundViewController.m @@ -0,0 +1,33 @@ +// +// BackgroundViewController.m +// KIF +// +// Created by Jordan Zucker on 5/18/15. +// +// + +@interface BackgroundViewController : UIViewController +@property (nonatomic, weak) IBOutlet UILabel *label; +@end + +@implementation BackgroundViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleApplicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; + self.label.isAccessibilityElement = YES; + self.label.text = @"Start"; + self.label.accessibilityLabel = self.label.text; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)handleApplicationDidEnterBackground:(NSNotification *)notification { + self.label.text = @"Back"; + self.label.accessibilityLabel = self.label.text; +} + +@end diff --git a/tests/KIF/Test Host/GestureViewController.m b/tests/KIF/Test Host/GestureViewController.m index 3a26464cc..a41f701ab 100755 --- a/tests/KIF/Test Host/GestureViewController.m +++ b/tests/KIF/Test Host/GestureViewController.m @@ -10,8 +10,10 @@ @interface GestureViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *lastSwipeDescriptionLabel; +@property (weak, nonatomic) IBOutlet UILabel *lastVelocityVeluesLabel; @property (weak, nonatomic) IBOutlet UILabel *bottomRightLabel; @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; +@property (weak, nonatomic) IBOutlet UILabel *panAreaLabel; @end @@ -44,5 +46,14 @@ - (IBAction)swipedRight:(id)sender self.lastSwipeDescriptionLabel.text = @"Right"; } +- (IBAction)hadlePanGestureRecognizer:(UIPanGestureRecognizer *)sender +{ + self.lastVelocityVeluesLabel.text = [self formattedVelocityValues:[sender velocityInView:self.panAreaLabel]]; +} + +- (NSString*)formattedVelocityValues:(CGPoint)velocity +{ + return [NSString stringWithFormat:@"X:%.2f Y:%.2f", velocity.x, velocity.y]; +} @end diff --git a/tests/KIF/Test Host/PickerController.m b/tests/KIF/Test Host/PickerController.m index d4ffe323b..f468adca2 100755 --- a/tests/KIF/Test Host/PickerController.m +++ b/tests/KIF/Test Host/PickerController.m @@ -101,7 +101,7 @@ - (void)datePickerChanged:(id)sender { - (void)dateTimePickerChanged:(id)sender { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:@"cccc, MMM d, hh:mm aa"]; + [dateFormatter setDateFormat:@"MMM d, hh:mm aa"]; NSString *string = [NSString stringWithFormat:@"%@", [dateFormatter stringFromDate:dateTimePicker.date]]; self.dateTimeSelectionTextField.text = string; diff --git a/tests/KIF/Test Host/TableViewController.m b/tests/KIF/Test Host/TableViewController.m index 9a448046d..5b7104854 100755 --- a/tests/KIF/Test Host/TableViewController.m +++ b/tests/KIF/Test Host/TableViewController.m @@ -24,4 +24,32 @@ - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sou // Do nothing, this method is needed to activate reordering in edit mode } +- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { + + return YES; + +} + +- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { + + return UITableViewCellEditingStyleDelete; + +} + +- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { + + if (editingStyle == UITableViewCellEditingStyleDelete) { + // Since the table view uses static cells, it is not possible to remove the row, + // so let's just change the label to have something to check in unit tests + UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; + cell.textLabel.text = @"Deleted"; + [self.tableView setEditing:NO animated:YES]; + + // NOTE: These don't work very well + // [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; + // [self.tableView reloadData]; + } + +} + @end diff --git a/tests/KIF/Test Host/en.lproj/MainStoryboard.storyboard b/tests/KIF/Test Host/en.lproj/MainStoryboard.storyboard index 7aaee3bd1..af7b163c2 100755 --- a/tests/KIF/Test Host/en.lproj/MainStoryboard.storyboard +++ b/tests/KIF/Test Host/en.lproj/MainStoryboard.storyboard @@ -1,9 +1,9 @@ - + - + @@ -186,7 +186,7 @@ - + @@ -206,12 +206,33 @@ + + + + + + + + + + + + + + + - + @@ -230,7 +251,7 @@ - + @@ -251,7 +272,7 @@ - + @@ -270,7 +291,7 @@ - + @@ -313,6 +334,33 @@ + + + + + + + + + + + + + + + + + + + + + @@ -364,7 +412,7 @@ - + @@ -386,7 +434,7 @@ - + @@ -404,7 +452,7 @@ - + @@ -422,7 +470,7 @@ - + @@ -440,7 +488,7 @@ - + @@ -458,7 +506,7 @@ - + @@ -476,7 +524,7 @@ - + @@ -494,7 +542,7 @@ - + @@ -512,7 +560,7 @@ - + @@ -530,7 +578,7 @@ - + @@ -548,7 +596,7 @@ - + @@ -566,7 +614,7 @@ - + @@ -584,7 +632,7 @@ - + @@ -602,7 +650,7 @@ - + @@ -620,7 +668,7 @@ - + @@ -638,7 +686,7 @@ - + @@ -656,7 +704,7 @@ - + @@ -674,7 +722,7 @@ - + @@ -692,7 +740,7 @@ - + @@ -710,7 +758,7 @@ - + @@ -728,7 +776,7 @@ - + @@ -746,7 +794,7 @@ - + @@ -764,7 +812,7 @@ - + @@ -782,7 +830,7 @@ - + @@ -800,7 +848,7 @@ - + @@ -818,7 +866,7 @@ - + @@ -836,7 +884,7 @@ - + @@ -854,7 +902,7 @@ - + @@ -872,7 +920,7 @@ - + @@ -890,7 +938,7 @@ - + @@ -908,7 +956,7 @@ - + @@ -926,7 +974,7 @@ - + @@ -944,7 +992,7 @@ - + @@ -962,7 +1010,7 @@ - + @@ -980,7 +1028,7 @@ - + @@ -998,7 +1046,7 @@ - + @@ -1016,7 +1064,7 @@ - + @@ -1034,7 +1082,7 @@ - + @@ -1052,7 +1100,7 @@ - + @@ -1074,7 +1122,7 @@ - + @@ -1097,7 +1145,7 @@ - + @@ -1190,27 +1238,6 @@ - - @@ -1240,6 +1267,52 @@ + + + + @@ -1248,6 +1321,8 @@ + + @@ -1272,6 +1347,11 @@ + + + + + diff --git a/tests/MediationAdapterApp/ANMediationAdapterViewController.m b/tests/MediationAdapterApp/ANMediationAdapterViewController.m index c87594c3a..329cf38dc 100644 --- a/tests/MediationAdapterApp/ANMediationAdapterViewController.m +++ b/tests/MediationAdapterApp/ANMediationAdapterViewController.m @@ -24,6 +24,7 @@ #import "ANAdAdapterBaseChartboost.h" #import "ANNativeAdRequest.h" #import "ANNativeAdView.h" +#import "ANNativeAdColonyView.h" @interface ANMediationAdapterViewController () @property (weak, nonatomic) IBOutlet UIPickerView *pickerView; @@ -33,6 +34,7 @@ @interface ANMediationAdapterViewController () )delegate { [self stubAdColonyInterstitial]; - [ANAdAdapterBaseAdColony configureWithAppID:@"appe1ba2960e786424bb5" - zoneIDs:@[@"vzcc692652bbe74d4e92"]]; + static dispatch_once_t startToken; + dispatch_once(&startToken, ^{ + [ANAdAdapterBaseAdColony configureWithAppID:@"appe1ba2960e786424bb5" + zoneIDs:@[@"vzcc692652bbe74d4e92"]]; + }); return [self interstitialWithDelegate:delegate]; } @@ -444,6 +450,26 @@ - (void)stubAdColonyInterstitial { [self stubMediatedAd:mediatedAd]; } +- (ANNativeAdRequest *)loadAdColonyNativeWithDelegate:(id)delegate { + [self stubAdColonyNative]; + static dispatch_once_t startToken; + dispatch_once(&startToken, ^{ + [ANAdAdapterBaseAdColony configureWithAppID:@"app553a8f6740d84f3ba0" + zoneIDs:@[@"vzee73d915bab747ee8a"]]; + }); + ANNativeAdRequest *nativeAdRequest = [self nativeAdRequestWithDelegate:delegate]; + nativeAdRequest.shouldLoadIconImage = YES; + nativeAdRequest.shouldLoadMainImage = YES; + return nativeAdRequest; +} + +- (void)stubAdColonyNative { + ANMediatedAd *mediatedAd = [[ANMediatedAd alloc] init]; + mediatedAd.className = @"ANAdAdapterNativeAdColony"; + mediatedAd.adId = @"vzee73d915bab747ee8a"; + [self stubMediatedAd:mediatedAd]; +} + #pragma mark - Chartboost - (ANInterstitialAd *)loadChartboostInterstitialWithDelegate:(id)delegate { @@ -557,32 +583,53 @@ - (void)adWillLeaveApplication:(id)ad { #pragma mark - Native - (void)createMainImageNativeView { - UINib *adNib = [UINib nibWithNibName:@"ANNativeAdViewMainImage" bundle:[NSBundle bundleForClass:[self class]]]; - NSArray *array = [adNib instantiateWithOwner:self options:nil]; - self.nativeAdView = [array firstObject]; + if (self.nativeAdResponse.networkCode == ANNativeAdNetworkCodeAdColony) { + AdColonyNativeAdView *videoView = (AdColonyNativeAdView *)self.nativeAdResponse.customElements[kANAdAdapterNativeAdColonyVideoView]; + self.adColonyView = [[ANNativeAdColonyView alloc] initWithNativeAdView:videoView + frame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 480)]; + } else { + UINib *adNib = [UINib nibWithNibName:@"ANNativeAdViewMainImage" bundle:[NSBundle bundleForClass:[self class]]]; + NSArray *array = [adNib instantiateWithOwner:self options:nil]; + self.nativeAdView = [array firstObject]; + } } - (void)populateNativeViewWithResponse { ANNativeAdView *nativeAdView = self.nativeAdView; - nativeAdView.titleLabel.text = self.nativeAdResponse.title; - nativeAdView.bodyLabel.text = self.nativeAdResponse.body; - nativeAdView.iconImageView.image = self.nativeAdResponse.iconImage; - nativeAdView.mainImageView.image = self.nativeAdResponse.mainImage; - [nativeAdView.callToActionButton setTitle:self.nativeAdResponse.callToAction forState:UIControlStateNormal]; + if (self.nativeAdResponse.networkCode != ANNativeAdNetworkCodeAdColony) { + nativeAdView.iconImageView.image = self.nativeAdResponse.iconImage; + nativeAdView.titleLabel.text = self.nativeAdResponse.title; + nativeAdView.bodyLabel.text = self.nativeAdResponse.body; + nativeAdView.mainImageView.image = self.nativeAdResponse.mainImage; + [nativeAdView.callToActionButton setTitle:self.nativeAdResponse.callToAction forState:UIControlStateNormal]; + } } - (void)registerNativeView { NSError *registerError; UIViewController *rvc = [UIApplication sharedApplication].keyWindow.rootViewController; self.nativeAdResponse.delegate = self; - [self.nativeAdResponse registerViewForTracking:self.nativeAdView - withRootViewController:rvc - clickableViews:@[self.nativeAdView.callToActionButton] - error:®isterError]; + if (self.nativeAdResponse.networkCode == ANNativeAdNetworkCodeAdColony) { + [self.nativeAdResponse registerViewForTracking:self.adColonyView + withRootViewController:rvc + clickableViews:nil + error:®isterError]; + } else { + [self.nativeAdResponse registerViewForTracking:self.nativeAdView + withRootViewController:rvc + clickableViews:@[self.nativeAdView.callToActionButton] + error:®isterError]; + } } - (void)addNativeViewToViewHierarchy { - [self.view addSubview:self.nativeAdView]; + if (self.nativeAdResponse.networkCode == ANNativeAdNetworkCodeAdColony) { + CGSize fittingSize = [self.adColonyView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; + self.adColonyView.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.frame), fittingSize.height); + [self.view addSubview:self.adColonyView]; + } else { + [self.view addSubview:self.nativeAdView]; + } } # pragma mark - General diff --git a/tests/NativeUnitTests/ANNativeAdColonyView.h b/tests/NativeUnitTests/ANNativeAdColonyView.h new file mode 100644 index 000000000..8cf5ccdf6 --- /dev/null +++ b/tests/NativeUnitTests/ANNativeAdColonyView.h @@ -0,0 +1,25 @@ +/* Copyright 2015 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import + +@class AdColonyNativeAdView; + +@interface ANNativeAdColonyView : UIView + +- (instancetype)initWithNativeAdView:(AdColonyNativeAdView *)nativeAdView + frame:(CGRect)frame; + +@end \ No newline at end of file diff --git a/tests/NativeUnitTests/ANNativeAdColonyView.m b/tests/NativeUnitTests/ANNativeAdColonyView.m new file mode 100644 index 000000000..16e2d9613 --- /dev/null +++ b/tests/NativeUnitTests/ANNativeAdColonyView.m @@ -0,0 +1,119 @@ +/* Copyright 2015 APPNEXUS INC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#import "ANNativeAdColonyView.h" +#import + +@implementation ANNativeAdColonyView + +- (instancetype)initWithNativeAdView:(AdColonyNativeAdView *)nativeAdView + frame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self setupNativeAdView:nativeAdView]; + } + return self; +} + +- (void)setupNativeAdView:(AdColonyNativeAdView *)nativeAdView { + UILabel *advertiserName = [[UILabel alloc] init]; + advertiserName.text = nativeAdView.advertiserName; + advertiserName.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + + UILabel *sponsored = [[UILabel alloc] init]; + sponsored.text = @"Sponsored"; + sponsored.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + + UILabel *adDescription = [[UILabel alloc] init]; + adDescription.text = nativeAdView.adDescription; + adDescription.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + + UIView *videoView = nativeAdView; + UIImageView *iconImageView = [[UIImageView alloc] initWithImage:nativeAdView.advertiserIcon]; + + [self addSubview:advertiserName]; + [self addSubview:iconImageView]; + [self addSubview:videoView]; + [self addSubview:sponsored]; + + advertiserName.translatesAutoresizingMaskIntoConstraints = NO; + iconImageView.translatesAutoresizingMaskIntoConstraints = NO; + videoView.translatesAutoresizingMaskIntoConstraints = NO; + sponsored.translatesAutoresizingMaskIntoConstraints = NO; + + if (adDescription.text.length) { + [self addSubview:adDescription]; + adDescription.translatesAutoresizingMaskIntoConstraints = NO; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[title][adDescription]" + options:NSLayoutFormatAlignAllLeading + metrics:nil + views:@{@"title":advertiserName, + @"adDescription":adDescription}]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[adDescription]-[videoView]" + options:kNilOptions + metrics:nil + views:@{@"adDescription":adDescription, + @"videoView":videoView}]]; + } else { + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[title]-[videoView]" + options:kNilOptions + metrics:nil + views:@{@"title":advertiserName, + @"videoView":videoView}]]; + } + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[icon(==40)]-[title]-|" + options:kNilOptions + metrics:nil + views:@{@"icon":iconImageView, + @"title":advertiserName}]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[icon(==40)]" + options:kNilOptions + metrics:nil + views:@{@"icon":iconImageView}]]; + CGFloat width = self.frame.size.width - 16.0; + NSString *widthVisualFormat = [NSString stringWithFormat:@"H:[videoView(==%ld)]", (long)width]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:widthVisualFormat + options:kNilOptions + metrics:nil + views:@{@"videoView":videoView}]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:videoView + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterX + multiplier:1.0 + constant:0.0]]; + CGFloat height = [nativeAdView recommendedHeightForWidth:width]; + NSString *heightVisualFormat = [NSString stringWithFormat:@"V:[videoView(==%ld)]-[sponsored]", (long)height]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:heightVisualFormat + options:kNilOptions + metrics:nil + views:@{@"videoView":videoView, + @"sponsored":sponsored}]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[sponsored]-|" + options:kNilOptions + metrics:nil + views:@{@"sponsored":sponsored}]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[sponsored]-|" + options:kNilOptions + metrics:nil + views:@{@"sponsored":sponsored}]]; +} + ++ (BOOL)requiresConstraintBasedLayout { + return YES; +} + +@end diff --git a/tests/NewTestApp.xcodeproj/project.pbxproj b/tests/NewTestApp.xcodeproj/project.pbxproj index ebf65c2c9..dddd1a799 100644 --- a/tests/NewTestApp.xcodeproj/project.pbxproj +++ b/tests/NewTestApp.xcodeproj/project.pbxproj @@ -65,6 +65,7 @@ 8A549EBE1A706D6F009F797A /* nativeResponse4.json in Resources */ = {isa = PBXBuildFile; fileRef = 8A549EB91A706D6F009F797A /* nativeResponse4.json */; }; 8A549EBF1A706D6F009F797A /* nativeResponse5.json in Resources */ = {isa = PBXBuildFile; fileRef = 8A549EBA1A706D6F009F797A /* nativeResponse5.json */; }; 8A549EC01A706DA5009F797A /* SuccessfulMediationResponse.json in Resources */ = {isa = PBXBuildFile; fileRef = 8AA00A2019DB1E150090EBED /* SuccessfulMediationResponse.json */; }; + 8A56E6971B27483000642ACC /* ANNativeAdColonyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A56E68C1B27482700642ACC /* ANNativeAdColonyView.m */; }; 8A661ED01A85597E00117553 /* appnexus_click_fallback_example.json in Resources */ = {isa = PBXBuildFile; fileRef = 8A661ECF1A85597E00117553 /* appnexus_click_fallback_example.json */; }; 8A742A8E19CB2E4700D2AE6F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8AD0183A199932F9007874BA /* Main.storyboard */; }; 8A764F041A7078F500C02A97 /* ANReachability+ANTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A764F031A7078F500C02A97 /* ANReachability+ANTest.m */; }; @@ -80,6 +81,7 @@ 8A949AE51ADF23C500D83DCE /* libANSDKChartboostAdapter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A949AE41ADF23C500D83DCE /* libANSDKChartboostAdapter.a */; }; 8A949AEA1ADF23D900D83DCE /* Chartboost.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A949AE91ADF23D900D83DCE /* Chartboost.framework */; }; 8A9BF1441A7FE3B800C0D227 /* ANNativeAdViewMainImage.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8A9BF1431A7FE3B800C0D227 /* ANNativeAdViewMainImage.xib */; }; + 8A9FB01F1B29F9B6004EAC63 /* libInMobi-4.5.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A9FB01D1B29F9AE004EAC63 /* libInMobi-4.5.3.a */; }; 8AA0095A19DB16C50090EBED /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA0095519DB16C50090EBED /* AppDelegate.m */; }; 8AA0095B19DB16C50090EBED /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AA0095619DB16C50090EBED /* main.m */; }; 8AA0095C19DB16C50090EBED /* TestsStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8AA0095719DB16C50090EBED /* TestsStoryboard.storyboard */; }; @@ -154,8 +156,6 @@ 8AA3DA121AAA0DAD00255F94 /* ANNativeAdView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8AE7AD911A7AAE33009E2F2F /* ANNativeAdView.xib */; }; 8AA3DA131AAA0DAD00255F94 /* ANNativeAdViewMainImage.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8A9BF1431A7FE3B800C0D227 /* ANNativeAdViewMainImage.xib */; }; 8AA5B4F01AA90C3E00522E1C /* libANSDKInMobiAdapter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AA5B4EF1AA90C3E00522E1C /* libANSDKInMobiAdapter.a */; }; - 8AA5B4F51AA90C6D00522E1C /* libInMobi-4.5.1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AA5B4F41AA90C6D00522E1C /* libInMobi-4.5.1.a */; }; - 8AA5B4F71AA90CCE00522E1C /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AA5B4F61AA90CCE00522E1C /* libsqlite3.dylib */; }; 8AA5B4F91AA90CED00522E1C /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AA5B4F81AA90CED00522E1C /* libz.dylib */; }; 8AB078651AFA9A7600889AA4 /* CoreMotion.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A5D27BC199A9DAB00F2A516 /* CoreMotion.framework */; }; 8AB387F819DB1245006F9E15 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AB387F719DB1245006F9E15 /* UIKit.framework */; }; @@ -163,6 +163,10 @@ 8AB5324819F01FD700CA4427 /* ANAdAdapterBannerAdMob+ANTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AB5324719F01FD700CA4427 /* ANAdAdapterBannerAdMob+ANTest.m */; }; 8AB5326019F0469A00CA4427 /* libKIF.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AB5325719F0464B00CA4427 /* libKIF.a */; }; 8AB5326B19F0503E00CA4427 /* ANAdAdapterBannerMoPub+ANTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AB5326A19F0503E00CA4427 /* ANAdAdapterBannerMoPub+ANTest.m */; }; + 8AD011A71B2F652B001B0107 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AD011A61B2F652B001B0107 /* IOKit.framework */; }; + 8AD011A81B2F656B001B0107 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AD011A61B2F652B001B0107 /* IOKit.framework */; }; + 8AD011A91B2F657E001B0107 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AD011A61B2F652B001B0107 /* IOKit.framework */; }; + 8AD011B01B2F6C54001B0107 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AD011AF1B2F6C54001B0107 /* libsqlite3.dylib */; }; 8AD01833199932F9007874BA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AD01832199932F9007874BA /* main.m */; }; 8AD01836199932F9007874BA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AD01835199932F9007874BA /* AppDelegate.m */; }; 8AD01839199932F9007874BA /* ANNewTestAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AD01838199932F9007874BA /* ANNewTestAppViewController.m */; }; @@ -451,6 +455,27 @@ remoteGlobalIDString = EABD46791857A0C700A5F081; remoteInfo = KIF; }; + 8AD011A01B2F63CC001B0107 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8AB5324A19F0464B00CA4427 /* KIF.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB72047C1680DDAD00278DA2; + remoteInfo = "KIF-OCUnit"; + }; + 8AD011A21B2F63CC001B0107 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8AB5324A19F0464B00CA4427 /* KIF.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EB60ECEB177F8DB3005A041A; + remoteInfo = "KIF Tests-OCUnit"; + }; + 8AD011A41B2F63CC001B0107 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8AB5324A19F0464B00CA4427 /* KIF.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9CC9673B1AD4B1B600576D13; + remoteInfo = KIFFramework; + }; 8AD01844199932F9007874BA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 8AD01825199932F9007874BA /* Project object */; @@ -532,6 +557,8 @@ 8A549EB81A706D6F009F797A /* nativeResponse3.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = nativeResponse3.json; sourceTree = ""; }; 8A549EB91A706D6F009F797A /* nativeResponse4.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = nativeResponse4.json; sourceTree = ""; }; 8A549EBA1A706D6F009F797A /* nativeResponse5.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = nativeResponse5.json; sourceTree = ""; }; + 8A56E68B1B27482700642ACC /* ANNativeAdColonyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ANNativeAdColonyView.h; sourceTree = ""; }; + 8A56E68C1B27482700642ACC /* ANNativeAdColonyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ANNativeAdColonyView.m; sourceTree = ""; }; 8A5D27BC199A9DAB00F2A516 /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; 8A5D27CA199AB26B00F2A516 /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; }; 8A64C0B519D1CBE000B92D30 /* NewTestAppPrefixHeader.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NewTestAppPrefixHeader.pch; sourceTree = ""; }; @@ -549,6 +576,7 @@ 8A9BF1431A7FE3B800C0D227 /* ANNativeAdViewMainImage.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ANNativeAdViewMainImage.xib; sourceTree = ""; }; 8A9F94C019D1C37700AB739F /* MediationAdapterApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MediationAdapterApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8A9F94D819D1C37700AB739F /* MediationAdapterAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MediationAdapterAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A9FB01D1B29F9AE004EAC63 /* libInMobi-4.5.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libInMobi-4.5.3.a"; path = "../mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.3.a"; sourceTree = ""; }; 8AA0095419DB16C50090EBED /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 8AA0095519DB16C50090EBED /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 8AA0095619DB16C50090EBED /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -648,8 +676,6 @@ 8AA00A2219DB1E150090EBED /* SuccessfulMRAIDResponse.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = SuccessfulMRAIDResponse.json; sourceTree = ""; }; 8AA00A2B19DB1FC20090EBED /* ANAdAdapterBaseAmazon+ANTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ANAdAdapterBaseAmazon+ANTest.h"; sourceTree = ""; }; 8AA00A2C19DB1FC20090EBED /* ANAdAdapterBaseAmazon+ANTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ANAdAdapterBaseAmazon+ANTest.m"; sourceTree = ""; }; - 8AA5B4F41AA90C6D00522E1C /* libInMobi-4.5.1.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libInMobi-4.5.1.a"; path = "../mediation/mediatedviews/InMobi/InMobiSDK/libInMobi-4.5.1.a"; sourceTree = ""; }; - 8AA5B4F61AA90CCE00522E1C /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; 8AA5B4F81AA90CED00522E1C /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 8AB387A519DB0CA8006F9E15 /* OriginalUnitTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OriginalUnitTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8AB387BD19DB0CA8006F9E15 /* OriginalUnitTestAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OriginalUnitTestAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -659,6 +685,8 @@ 8AB5324A19F0464B00CA4427 /* KIF.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = KIF.xcodeproj; path = KIF/KIF.xcodeproj; sourceTree = ""; }; 8AB5326919F0503E00CA4427 /* ANAdAdapterBannerMoPub+ANTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ANAdAdapterBannerMoPub+ANTest.h"; sourceTree = ""; }; 8AB5326A19F0503E00CA4427 /* ANAdAdapterBannerMoPub+ANTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ANAdAdapterBannerMoPub+ANTest.m"; sourceTree = ""; }; + 8AD011A61B2F652B001B0107 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; }; + 8AD011AF1B2F6C54001B0107 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; 8AD0182D199932F9007874BA /* NewTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NewTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8AD01831199932F9007874BA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8AD01832199932F9007874BA /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -711,6 +739,7 @@ buildActionMask = 2147483647; files = ( 8AE7AD981A7AB348009E2F2F /* libKIF.a in Frameworks */, + 8AD011A91B2F657E001B0107 /* IOKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -718,6 +747,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 8AD011B01B2F6C54001B0107 /* libsqlite3.dylib in Frameworks */, 8AB078651AFA9A7600889AA4 /* CoreMotion.framework in Frameworks */, 8A1482811AD346430046F1B9 /* CoreMedia.framework in Frameworks */, 8A14827E1AD346220046F1B9 /* Social.framework in Frameworks */, @@ -726,7 +756,6 @@ 8AD7C50C1AD32B400049C997 /* VungleSDK.framework in Frameworks */, 8AD7C4E61AD3214B0049C997 /* libANSDKVungleAdapter.a in Frameworks */, 8AA5B4F91AA90CED00522E1C /* libz.dylib in Frameworks */, - 8AA5B4F71AA90CCE00522E1C /* libsqlite3.dylib in Frameworks */, 8AA009F019DB1DA50090EBED /* libANSDK.a in Frameworks */, 8AA009F219DB1DA50090EBED /* libANSDKGoogleAdMobAdapter.a in Frameworks */, 8A4018051A9500A300D56208 /* GoogleMobileAds.framework in Frameworks */, @@ -737,7 +766,6 @@ 8AA009F619DB1DA50090EBED /* libANSDKFacebookAdapter.a in Frameworks */, 8AA009F719DB1DA50090EBED /* libANSDKAmazonAdapter.a in Frameworks */, 8AA5B4F01AA90C3E00522E1C /* libANSDKInMobiAdapter.a in Frameworks */, - 8AA5B4F51AA90C6D00522E1C /* libInMobi-4.5.1.a in Frameworks */, 8AA009E619DB1D320090EBED /* FBAudienceNetwork.framework in Frameworks */, 8A3B37AF19D62A4E00CE24A5 /* iAd.framework in Frameworks */, 8A949AEA1ADF23D900D83DCE /* Chartboost.framework in Frameworks */, @@ -747,6 +775,8 @@ 8AA009E419DB1D270090EBED /* AmazonAd.framework in Frameworks */, 8A949AE51ADF23C500D83DCE /* libANSDKChartboostAdapter.a in Frameworks */, 8A4B96D81ACDEFBC00FFEB2A /* libANSDKVdopiaAdapter.a in Frameworks */, + 8AD011A71B2F652B001B0107 /* IOKit.framework in Frameworks */, + 8A9FB01F1B29F9B6004EAC63 /* libInMobi-4.5.3.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -755,6 +785,7 @@ buildActionMask = 2147483647; files = ( 8AB5326019F0469A00CA4427 /* libKIF.a in Frameworks */, + 8AD011A81B2F656B001B0107 /* IOKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -891,6 +922,8 @@ 8A549E9B1A706BA6009F797A /* Supporting Files */ = { isa = PBXGroup; children = ( + 8A56E68B1B27482700642ACC /* ANNativeAdColonyView.h */, + 8A56E68C1B27482700642ACC /* ANNativeAdColonyView.m */, 8AE7AD931A7AAE81009E2F2F /* ANNativeAdView.h */, 8AE7AD941A7AAE81009E2F2F /* ANNativeAdView.m */, 8AE7AD911A7AAE33009E2F2F /* ANNativeAdView.xib */, @@ -932,6 +965,8 @@ 8A65BE8A19A4FCDF00A72571 /* Frameworks */ = { isa = PBXGroup; children = ( + 8AD011AF1B2F6C54001B0107 /* libsqlite3.dylib */, + 8AD011A61B2F652B001B0107 /* IOKit.framework */, 8A949AE91ADF23D900D83DCE /* Chartboost.framework */, 8A4B96C91ACDEDFA00FFEB2A /* libLWSDK.a */, 8A1482801AD346430046F1B9 /* CoreMedia.framework */, @@ -939,13 +974,12 @@ 8A14826F1AD344B70046F1B9 /* AdColony.framework */, 8AD7C5041AD3253C0049C997 /* VungleSDK.embeddedframework */, 8AA5B4F81AA90CED00522E1C /* libz.dylib */, - 8AA5B4F61AA90CCE00522E1C /* libsqlite3.dylib */, 8A40180A1A95028700D56208 /* StoreKit.framework */, 8A4018071A95025C00D56208 /* CoreTelephony.framework */, 8A4018041A9500A300D56208 /* GoogleMobileAds.framework */, 8AE3999E1A42105B00C0D7B1 /* WebKit.framework */, 8AA009EB19DB1D530090EBED /* libMoPubSDK.a */, - 8AA5B4F41AA90C6D00522E1C /* libInMobi-4.5.1.a */, + 8A9FB01D1B29F9AE004EAC63 /* libInMobi-4.5.3.a */, 8AA009E919DB1D480090EBED /* MillennialMedia.framework */, 8AA009E519DB1D320090EBED /* FBAudienceNetwork.framework */, 8AA009E319DB1D270090EBED /* AmazonAd.framework */, @@ -1189,8 +1223,11 @@ isa = PBXGroup; children = ( 8AB5325719F0464B00CA4427 /* libKIF.a */, + 8AD011A11B2F63CC001B0107 /* libKIF-OCUnit.a */, 8AB5325B19F0464B00CA4427 /* Test Host.app */, 8AB5325D19F0464B00CA4427 /* KIF Tests - XCTest.xctest */, + 8AD011A31B2F63CC001B0107 /* KIF Tests-OCUnit.octest */, + 8AD011A51B2F63CC001B0107 /* KIF.framework */, ); name = Products; sourceTree = ""; @@ -1637,6 +1674,27 @@ remoteRef = 8AB5325C19F0464B00CA4427 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 8AD011A11B2F63CC001B0107 /* libKIF-OCUnit.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libKIF-OCUnit.a"; + remoteRef = 8AD011A01B2F63CC001B0107 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8AD011A31B2F63CC001B0107 /* KIF Tests-OCUnit.octest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "KIF Tests-OCUnit.octest"; + remoteRef = 8AD011A21B2F63CC001B0107 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 8AD011A51B2F63CC001B0107 /* KIF.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = KIF.framework; + remoteRef = 8AD011A41B2F63CC001B0107 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 8AD7C4E51AD3214B0049C997 /* libANSDKVungleAdapter.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1790,6 +1848,7 @@ 8AA009C519DB1B200090EBED /* AppDelegate.m in Sources */, 8AA00A2D19DB1FC20090EBED /* ANAdAdapterBaseAmazon+ANTest.m in Sources */, 8AA009CA19DB1B200090EBED /* main.m in Sources */, + 8A56E6971B27483000642ACC /* ANNativeAdColonyView.m in Sources */, 8AA00A3919DB22410090EBED /* ANAdView+ANTest.m in Sources */, 8AA3DA0A1AAA0D9D00255F94 /* ANNativeAdView.m in Sources */, 8AA00A3219DB204A0090EBED /* NSObject+Swizzling.m in Sources */,