From 462c315baae8494873c17f2d3b55c9eec4836920 Mon Sep 17 00:00:00 2001 From: Laura Skelton Date: Thu, 18 Jun 2015 17:21:43 -0700 Subject: [PATCH 1/3] JazzHands 2.0 --- Example/Docs/if-intro.gif | Bin 0 -> 558338 bytes .../JazzHandsDemo.xcodeproj/project.pbxproj | 30 +- .../IFTTTJazzHandsViewController.h | 2 +- .../IFTTTJazzHandsViewController.m | 322 +-- Example/JazzHandsDemo/MyCustomAnimation.h | 15 + Example/JazzHandsDemo/MyCustomAnimation.m | 24 + Example/JazzHandsTests/IFTTTAnimationSpec.m | 150 ++ .../JazzHandsTests/IFTTTEasingFunctionSpec.m | 102 + Example/JazzHandsTests/IFTTTFilmstripSpec.m | 104 + .../JazzHandsTests/IFTTTInterpolatableSpec.m | 66 + Example/JazzHandsTests/JazzHandsTests.m | 124 -- Example/Podfile | 4 +- Example/Podfile.lock | 18 +- .../Expecta/Expecta/EXPBlockDefinedMatcher.h | 25 + .../Expecta/Expecta/EXPBlockDefinedMatcher.m | 60 + Example/Pods/Expecta/Expecta/EXPDefines.h | 17 + Example/Pods/Expecta/Expecta/EXPDoubleTuple.h | 13 + Example/Pods/Expecta/Expecta/EXPDoubleTuple.m | 42 + Example/Pods/Expecta/Expecta/EXPExpect.h | 45 + Example/Pods/Expecta/Expecta/EXPExpect.m | 214 ++ Example/Pods/Expecta/Expecta/EXPFloatTuple.h | 13 + Example/Pods/Expecta/Expecta/EXPFloatTuple.m | 52 + Example/Pods/Expecta/Expecta/EXPMatcher.h | 20 + .../Expecta/Expecta/EXPUnsupportedObject.h | 11 + .../Expecta/Expecta/EXPUnsupportedObject.m | 20 + Example/Pods/Expecta/Expecta/Expecta.h | 15 + Example/Pods/Expecta/Expecta/ExpectaObject.h | 18 + Example/Pods/Expecta/Expecta/ExpectaObject.m | 15 + Example/Pods/Expecta/Expecta/ExpectaSupport.h | 73 + Example/Pods/Expecta/Expecta/ExpectaSupport.m | 176 ++ .../Expecta/Matchers/EXPMatcherHelpers.h | 4 + .../Expecta/Matchers/EXPMatcherHelpers.m | 9 + .../Expecta/Matchers/EXPMatchers+beCloseTo.h | 7 + .../Expecta/Matchers/EXPMatchers+beCloseTo.m | 49 + .../Expecta/Matchers/EXPMatchers+beFalsy.h | 3 + .../Expecta/Matchers/EXPMatchers+beFalsy.m | 24 + .../Matchers/EXPMatchers+beGreaterThan.h | 6 + .../Matchers/EXPMatchers+beGreaterThan.m | 20 + .../EXPMatchers+beGreaterThanOrEqualTo.h | 6 + .../EXPMatchers+beGreaterThanOrEqualTo.m | 20 + .../Matchers/EXPMatchers+beIdenticalTo.h | 10 + .../Matchers/EXPMatchers+beIdenticalTo.m | 24 + .../Matchers/EXPMatchers+beInTheRangeOf.h | 6 + .../Matchers/EXPMatchers+beInTheRangeOf.m | 30 + .../Matchers/EXPMatchers+beInstanceOf.h | 6 + .../Matchers/EXPMatchers+beInstanceOf.m | 31 + .../Expecta/Matchers/EXPMatchers+beKindOf.h | 4 + .../Expecta/Matchers/EXPMatchers+beKindOf.m | 29 + .../Expecta/Matchers/EXPMatchers+beLessThan.h | 6 + .../Expecta/Matchers/EXPMatchers+beLessThan.m | 20 + .../EXPMatchers+beLessThanOrEqualTo.h | 6 + .../EXPMatchers+beLessThanOrEqualTo.m | 20 + .../Expecta/Matchers/EXPMatchers+beNil.h | 4 + .../Expecta/Matchers/EXPMatchers+beNil.m | 18 + .../Matchers/EXPMatchers+beSubclassOf.h | 4 + .../Matchers/EXPMatchers+beSubclassOf.m | 29 + .../Matchers/EXPMatchers+beSupersetOf.h | 4 + .../Matchers/EXPMatchers+beSupersetOf.m | 62 + .../Expecta/Matchers/EXPMatchers+beTruthy.h | 3 + .../Expecta/Matchers/EXPMatchers+beTruthy.m | 24 + .../Expecta/Matchers/EXPMatchers+beginWith.h | 4 + .../Expecta/Matchers/EXPMatchers+beginWith.m | 51 + .../Expecta/Matchers/EXPMatchers+conformTo.h | 3 + .../Expecta/Matchers/EXPMatchers+conformTo.m | 33 + .../Expecta/Matchers/EXPMatchers+contain.h | 5 + .../Expecta/Matchers/EXPMatchers+contain.m | 38 + .../Expecta/Matchers/EXPMatchers+endWith.h | 3 + .../Expecta/Matchers/EXPMatchers+endWith.m | 49 + .../Expecta/Matchers/EXPMatchers+equal.h | 5 + .../Expecta/Matchers/EXPMatchers+equal.m | 31 + .../Matchers/EXPMatchers+haveCountOf.h | 10 + .../Matchers/EXPMatchers+haveCountOf.m | 42 + .../Expecta/Matchers/EXPMatchers+match.h | 3 + .../Expecta/Matchers/EXPMatchers+match.m | 38 + .../Matchers/EXPMatchers+postNotification.h | 4 + .../Matchers/EXPMatchers+postNotification.m | 88 + .../Expecta/Matchers/EXPMatchers+raise.h | 4 + .../Expecta/Matchers/EXPMatchers+raise.m | 30 + .../Matchers/EXPMatchers+raiseWithReason.h | 3 + .../Matchers/EXPMatchers+raiseWithReason.m | 35 + .../Expecta/Matchers/EXPMatchers+respondTo.h | 3 + .../Expecta/Matchers/EXPMatchers+respondTo.m | 28 + .../Expecta/Expecta/Matchers/EXPMatchers.h | 25 + .../Pods/Expecta/Expecta/NSObject+Expecta.h | 10 + .../Pods/Expecta/Expecta/NSValue+Expecta.h | 7 + .../Pods/Expecta/Expecta/NSValue+Expecta.m | 21 + Example/Pods/Expecta/LICENSE | 19 + Example/Pods/Expecta/README.md | 293 +++ .../FBSnapshotTestCase/FBSnapshotTestCase.h | 99 - .../FBSnapshotTestCase/FBSnapshotTestCase.m | 82 - .../FBSnapshotTestController.h | 152 -- .../FBSnapshotTestController.m | 392 ---- .../FBSnapshotTestCase/UIImage+Compare.h | 37 - .../FBSnapshotTestCase/UIImage+Compare.m | 91 - .../FBSnapshotTestCase/UIImage+Diff.h | 37 - .../FBSnapshotTestCase/UIImage+Diff.m | 56 - Example/Pods/FBSnapshotTestCase/LICENSE | 29 - Example/Pods/FBSnapshotTestCase/README.md | 90 - .../Private/Expecta/EXPBlockDefinedMatcher.h | 1 + .../Pods/Headers/Private/Expecta/EXPDefines.h | 1 + .../Headers/Private/Expecta/EXPDoubleTuple.h | 1 + .../Pods/Headers/Private/Expecta/EXPExpect.h | 1 + .../Headers/Private/Expecta/EXPFloatTuple.h | 1 + .../Pods/Headers/Private/Expecta/EXPMatcher.h | 1 + .../Private/Expecta/EXPMatcherHelpers.h | 1 + .../Private/Expecta/EXPMatchers+beCloseTo.h | 1 + .../Private/Expecta/EXPMatchers+beFalsy.h | 1 + .../Expecta/EXPMatchers+beGreaterThan.h | 1 + .../EXPMatchers+beGreaterThanOrEqualTo.h | 1 + .../Expecta/EXPMatchers+beIdenticalTo.h | 1 + .../Expecta/EXPMatchers+beInTheRangeOf.h | 1 + .../Expecta/EXPMatchers+beInstanceOf.h | 1 + .../Private/Expecta/EXPMatchers+beKindOf.h | 1 + .../Private/Expecta/EXPMatchers+beLessThan.h | 1 + .../Expecta/EXPMatchers+beLessThanOrEqualTo.h | 1 + .../Private/Expecta/EXPMatchers+beNil.h | 1 + .../Expecta/EXPMatchers+beSubclassOf.h | 1 + .../Expecta/EXPMatchers+beSupersetOf.h | 1 + .../Private/Expecta/EXPMatchers+beTruthy.h | 1 + .../Private/Expecta/EXPMatchers+beginWith.h | 1 + .../Private/Expecta/EXPMatchers+conformTo.h | 1 + .../Private/Expecta/EXPMatchers+contain.h | 1 + .../Private/Expecta/EXPMatchers+endWith.h | 1 + .../Private/Expecta/EXPMatchers+equal.h | 1 + .../Private/Expecta/EXPMatchers+haveCountOf.h | 1 + .../Private/Expecta/EXPMatchers+match.h | 1 + .../Expecta/EXPMatchers+postNotification.h | 1 + .../Private/Expecta/EXPMatchers+raise.h | 1 + .../Expecta/EXPMatchers+raiseWithReason.h | 1 + .../Private/Expecta/EXPMatchers+respondTo.h | 1 + .../Headers/Private/Expecta/EXPMatchers.h | 1 + .../Private/Expecta/EXPUnsupportedObject.h | 1 + .../Pods/Headers/Private/Expecta/Expecta.h | 1 + .../Headers/Private/Expecta/ExpectaObject.h | 1 + .../Headers/Private/Expecta/ExpectaSupport.h | 1 + .../Private/Expecta/NSObject+Expecta.h | 1 + .../Headers/Private/Expecta/NSValue+Expecta.h | 1 + .../FBSnapshotTestCase/FBSnapshotTestCase.h | 1 - .../FBSnapshotTestController.h | 1 - .../FBSnapshotTestCase/UIImage+Compare.h | 1 - .../Private/FBSnapshotTestCase/UIImage+Diff.h | 1 - .../Private/JazzHands/IFTTTAngleAnimation.h | 1 - .../Private/JazzHands/IFTTTAnimatable.h | 1 + .../IFTTTAnimatedPagingScrollViewController.h | 1 + .../Private/JazzHands/IFTTTAnimationFrame.h | 1 - .../JazzHands/IFTTTAnimationKeyFrame.h | 1 - .../IFTTTConstraintConstantAnimation.h | 1 + .../IFTTTConstraintMultiplierAnimation.h | 1 + .../JazzHands/IFTTTConstraintsAnimation.h | 1 - .../Private/JazzHands/IFTTTFilmstrip.h | 1 + .../Private/JazzHands/IFTTTInterpolatable.h | 1 + .../Private/JazzHands/IFTTTLabelAnimation.h | 1 + .../JazzHands/IFTTTRotationAnimation.h | 1 + .../IFTTTScrollViewPageConstraintAnimation.h | 1 + .../JazzHands/IFTTTShapeLayerAnimation.h | 1 + .../JazzHands/IFTTTTranslationAnimation.h | 1 + .../Private/JazzHands/IFTTTViewAnimation.h | 1 + .../Private/JazzHands/UIView+IFTTTJazzHands.h | 1 + .../Private/KIF/CGGeometry-KIFAdditions.h | 1 - Example/Pods/Headers/Private/KIF/KIF.h | 1 - .../Headers/Private/KIF/KIFSystemTestActor.h | 1 - .../Pods/Headers/Private/KIF/KIFTestActor.h | 1 - .../Pods/Headers/Private/KIF/KIFTestCase.h | 1 - .../Private/KIF/KIFTestStepValidation.h | 1 - Example/Pods/Headers/Private/KIF/KIFTypist.h | 1 - .../KIF/KIFUITestActor-ConditionalTests.h | 1 - .../Pods/Headers/Private/KIF/KIFUITestActor.h | 1 - .../Headers/Private/KIF/LoadableCategory.h | 1 - .../Private/KIF/NSBundle-KIFAdditions.h | 1 - .../Private/KIF/NSError-KIFAdditions.h | 1 - .../Private/KIF/NSException-KIFAdditions.h | 1 - .../Private/KIF/NSFileManager-KIFAdditions.h | 1 - .../KIF/UIAccessibilityElement-KIFAdditions.h | 1 - .../Private/KIF/UIApplication-KIFAdditions.h | 1 - .../Headers/Private/KIF/UIAutomationHelper.h | 1 - .../Private/KIF/UIEvent+KIFAdditions.h | 1 - .../Private/KIF/UIScrollView-KIFAdditions.h | 1 - .../Private/KIF/UITableView-KIFAdditions.h | 1 - .../Private/KIF/UITouch-KIFAdditions.h | 1 - .../Headers/Private/KIF/UIView-KIFAdditions.h | 1 - .../Private/KIF/UIWindow-KIFAdditions.h | 1 - .../Private/KIF/XCTestCase-KIFAdditions.h | 1 - .../Pods/Headers/Private/Specta/SPTCallSite.h | 1 + .../Private/Specta/SPTCompiledExample.h | 1 + .../Pods/Headers/Private/Specta/SPTExample.h | 1 + .../Headers/Private/Specta/SPTExampleGroup.h | 1 + .../Specta/SPTExcludeGlobalBeforeAfterEach.h | 1 + .../Private/Specta/SPTGlobalBeforeAfterEach.h | 1 + .../Private/Specta/SPTSharedExampleGroups.h | 1 + Example/Pods/Headers/Private/Specta/SPTSpec.h | 1 + .../Headers/Private/Specta/SPTTestSuite.h | 1 + Example/Pods/Headers/Private/Specta/Specta.h | 1 + .../Pods/Headers/Private/Specta/SpectaDSL.h | 1 + .../Pods/Headers/Private/Specta/SpectaTypes.h | 1 + .../Headers/Private/Specta/SpectaUtility.h | 1 + .../Headers/Private/Specta/XCTest+Private.h | 1 + .../Private/Specta/XCTestCase+Specta.h | 1 + .../Public/Expecta/EXPBlockDefinedMatcher.h | 1 + .../Pods/Headers/Public/Expecta/EXPDefines.h | 1 + .../Headers/Public/Expecta/EXPDoubleTuple.h | 1 + .../Pods/Headers/Public/Expecta/EXPExpect.h | 1 + .../Headers/Public/Expecta/EXPFloatTuple.h | 1 + .../Pods/Headers/Public/Expecta/EXPMatcher.h | 1 + .../Public/Expecta/EXPMatcherHelpers.h | 1 + .../Public/Expecta/EXPMatchers+beCloseTo.h | 1 + .../Public/Expecta/EXPMatchers+beFalsy.h | 1 + .../Expecta/EXPMatchers+beGreaterThan.h | 1 + .../EXPMatchers+beGreaterThanOrEqualTo.h | 1 + .../Expecta/EXPMatchers+beIdenticalTo.h | 1 + .../Expecta/EXPMatchers+beInTheRangeOf.h | 1 + .../Public/Expecta/EXPMatchers+beInstanceOf.h | 1 + .../Public/Expecta/EXPMatchers+beKindOf.h | 1 + .../Public/Expecta/EXPMatchers+beLessThan.h | 1 + .../Expecta/EXPMatchers+beLessThanOrEqualTo.h | 1 + .../Public/Expecta/EXPMatchers+beNil.h | 1 + .../Public/Expecta/EXPMatchers+beSubclassOf.h | 1 + .../Public/Expecta/EXPMatchers+beSupersetOf.h | 1 + .../Public/Expecta/EXPMatchers+beTruthy.h | 1 + .../Public/Expecta/EXPMatchers+beginWith.h | 1 + .../Public/Expecta/EXPMatchers+conformTo.h | 1 + .../Public/Expecta/EXPMatchers+contain.h | 1 + .../Public/Expecta/EXPMatchers+endWith.h | 1 + .../Public/Expecta/EXPMatchers+equal.h | 1 + .../Public/Expecta/EXPMatchers+haveCountOf.h | 1 + .../Public/Expecta/EXPMatchers+match.h | 1 + .../Expecta/EXPMatchers+postNotification.h | 1 + .../Public/Expecta/EXPMatchers+raise.h | 1 + .../Expecta/EXPMatchers+raiseWithReason.h | 1 + .../Public/Expecta/EXPMatchers+respondTo.h | 1 + .../Pods/Headers/Public/Expecta/EXPMatchers.h | 1 + .../Public/Expecta/EXPUnsupportedObject.h | 1 + Example/Pods/Headers/Public/Expecta/Expecta.h | 1 + .../Headers/Public/Expecta/ExpectaObject.h | 1 + .../Headers/Public/Expecta/ExpectaSupport.h | 1 + .../Headers/Public/Expecta/NSObject+Expecta.h | 1 + .../Headers/Public/Expecta/NSValue+Expecta.h | 1 + .../FBSnapshotTestCase/FBSnapshotTestCase.h | 1 - .../FBSnapshotTestController.h | 1 - .../FBSnapshotTestCase/UIImage+Compare.h | 1 - .../Public/FBSnapshotTestCase/UIImage+Diff.h | 1 - .../Public/JazzHands/IFTTTAngleAnimation.h | 1 - .../Public/JazzHands/IFTTTAnimatable.h | 1 + .../IFTTTAnimatedPagingScrollViewController.h | 1 + .../Public/JazzHands/IFTTTAnimationFrame.h | 1 - .../Public/JazzHands/IFTTTAnimationKeyFrame.h | 1 - .../IFTTTConstraintConstantAnimation.h | 1 + .../IFTTTConstraintMultiplierAnimation.h | 1 + .../JazzHands/IFTTTConstraintsAnimation.h | 1 - .../Headers/Public/JazzHands/IFTTTFilmstrip.h | 1 + .../Public/JazzHands/IFTTTInterpolatable.h | 1 + .../Public/JazzHands/IFTTTLabelAnimation.h | 1 + .../Public/JazzHands/IFTTTRotationAnimation.h | 1 + .../IFTTTScrollViewPageConstraintAnimation.h | 1 + .../JazzHands/IFTTTShapeLayerAnimation.h | 1 + .../JazzHands/IFTTTTranslationAnimation.h | 1 + .../Public/JazzHands/IFTTTViewAnimation.h | 1 + .../Public/JazzHands/UIView+IFTTTJazzHands.h | 1 + .../Public/KIF/CGGeometry-KIFAdditions.h | 1 - Example/Pods/Headers/Public/KIF/KIF.h | 1 - .../Headers/Public/KIF/KIFSystemTestActor.h | 1 - .../Pods/Headers/Public/KIF/KIFTestActor.h | 1 - Example/Pods/Headers/Public/KIF/KIFTestCase.h | 1 - .../Public/KIF/KIFTestStepValidation.h | 1 - Example/Pods/Headers/Public/KIF/KIFTypist.h | 1 - .../KIF/KIFUITestActor-ConditionalTests.h | 1 - .../Pods/Headers/Public/KIF/KIFUITestActor.h | 1 - .../Public/KIF/NSBundle-KIFAdditions.h | 1 - .../Headers/Public/KIF/NSError-KIFAdditions.h | 1 - .../Public/KIF/NSException-KIFAdditions.h | 1 - .../Public/KIF/NSFileManager-KIFAdditions.h | 1 - .../KIF/UIAccessibilityElement-KIFAdditions.h | 1 - .../Public/KIF/UIApplication-KIFAdditions.h | 1 - .../Headers/Public/KIF/UIAutomationHelper.h | 1 - .../Public/KIF/UIScrollView-KIFAdditions.h | 1 - .../Public/KIF/UITableView-KIFAdditions.h | 1 - .../Headers/Public/KIF/UITouch-KIFAdditions.h | 1 - .../Headers/Public/KIF/UIView-KIFAdditions.h | 1 - .../Public/KIF/UIWindow-KIFAdditions.h | 1 - .../Public/KIF/XCTestCase-KIFAdditions.h | 1 - .../Pods/Headers/Public/Specta/SPTCallSite.h | 1 + .../Public/Specta/SPTCompiledExample.h | 1 + .../Pods/Headers/Public/Specta/SPTExample.h | 1 + .../Headers/Public/Specta/SPTExampleGroup.h | 1 + .../Specta/SPTExcludeGlobalBeforeAfterEach.h | 1 + .../Public/Specta/SPTGlobalBeforeAfterEach.h | 1 + .../Public/Specta/SPTSharedExampleGroups.h | 1 + Example/Pods/Headers/Public/Specta/SPTSpec.h | 1 + .../Pods/Headers/Public/Specta/SPTTestSuite.h | 1 + Example/Pods/Headers/Public/Specta/Specta.h | 1 + .../Pods/Headers/Public/Specta/SpectaDSL.h | 1 + .../Pods/Headers/Public/Specta/SpectaTypes.h | 1 + .../Headers/Public/Specta/SpectaUtility.h | 1 + .../Headers/Public/Specta/XCTest+Private.h | 1 + .../Headers/Public/Specta/XCTestCase+Specta.h | 1 + .../KIF/Additions/CGGeometry-KIFAdditions.h | 18 - .../KIF/Additions/CGGeometry-KIFAdditions.m | 11 - Example/Pods/KIF/Additions/LoadableCategory.h | 18 - .../KIF/Additions/NSBundle-KIFAdditions.h | 15 - .../KIF/Additions/NSBundle-KIFAdditions.m | 27 - .../Pods/KIF/Additions/NSError-KIFAdditions.h | 16 - .../Pods/KIF/Additions/NSError-KIFAdditions.m | 39 - .../KIF/Additions/NSException-KIFAdditions.h | 15 - .../KIF/Additions/NSException-KIFAdditions.m | 28 - .../Additions/NSFileManager-KIFAdditions.h | 18 - .../Additions/NSFileManager-KIFAdditions.m | 67 - .../UIAccessibilityElement-KIFAdditions.h | 69 - .../UIAccessibilityElement-KIFAdditions.m | 177 -- .../Additions/UIApplication-KIFAdditions.h | 108 - .../Additions/UIApplication-KIFAdditions.m | 262 --- .../Pods/KIF/Additions/UIEvent+KIFAdditions.h | 19 - .../Pods/KIF/Additions/UIEvent+KIFAdditions.m | 152 -- .../KIF/Additions/UIScrollView-KIFAdditions.h | 17 - .../KIF/Additions/UIScrollView-KIFAdditions.m | 44 - .../KIF/Additions/UITableView-KIFAdditions.h | 16 - .../KIF/Additions/UITableView-KIFAdditions.m | 87 - .../Pods/KIF/Additions/UITouch-KIFAdditions.h | 21 - .../Pods/KIF/Additions/UITouch-KIFAdditions.m | 98 - .../Pods/KIF/Additions/UIView-KIFAdditions.h | 128 -- .../Pods/KIF/Additions/UIView-KIFAdditions.m | 1008 --------- .../KIF/Additions/UIWindow-KIFAdditions.h | 17 - .../KIF/Additions/UIWindow-KIFAdditions.m | 15 - .../KIF/Additions/XCTestCase-KIFAdditions.h | 14 - .../KIF/Additions/XCTestCase-KIFAdditions.m | 87 - Example/Pods/KIF/Classes/KIF.h | 20 - Example/Pods/KIF/Classes/KIFSystemTestActor.h | 79 - Example/Pods/KIF/Classes/KIFSystemTestActor.m | 116 - Example/Pods/KIF/Classes/KIFTestActor.h | 160 -- Example/Pods/KIF/Classes/KIFTestActor.m | 199 -- Example/Pods/KIF/Classes/KIFTestCase.h | 58 - Example/Pods/KIF/Classes/KIFTestCase.m | 176 -- .../Pods/KIF/Classes/KIFTestStepValidation.h | 61 - .../Pods/KIF/Classes/KIFTestStepValidation.m | 34 - Example/Pods/KIF/Classes/KIFTypist.h | 20 - Example/Pods/KIF/Classes/KIFTypist.m | 112 - .../Classes/KIFUITestActor-ConditionalTests.h | 68 - .../Classes/KIFUITestActor-ConditionalTests.m | 73 - Example/Pods/KIF/Classes/KIFUITestActor.h | 518 ----- Example/Pods/KIF/Classes/KIFUITestActor.m | 1015 --------- Example/Pods/KIF/Classes/UIAutomationHelper.h | 17 - Example/Pods/KIF/Classes/UIAutomationHelper.m | 84 - Example/Pods/KIF/LICENSE | 15 - Example/Pods/KIF/README.md | 312 --- .../Local Podspecs/JazzHands.podspec.json | 6 +- Example/Pods/Manifest.lock | 18 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 1920 ++++++++++------- .../Pods-JazzHandsDemo-JazzHands.xcscheme | 2 +- .../Pods-JazzHandsTests-JazzHands.xcscheme | 2 +- Example/Pods/Specta/LICENSE | 20 + Example/Pods/Specta/README.md | 176 ++ .../Pods/Specta/Specta/Specta/SPTCallSite.h | 12 + .../Pods/Specta/Specta/Specta/SPTCallSite.m | 18 + .../Specta/Specta/Specta/SPTCompiledExample.h | 17 + .../Specta/Specta/Specta/SPTCompiledExample.m | 17 + .../Pods/Specta/Specta/Specta/SPTExample.h | 17 + .../Pods/Specta/Specta/Specta/SPTExample.m | 17 + .../Specta/Specta/Specta/SPTExampleGroup.h | 36 + .../Specta/Specta/Specta/SPTExampleGroup.m | 335 +++ .../Specta/SPTExcludeGlobalBeforeAfterEach.h | 10 + .../Specta/Specta/SPTGlobalBeforeAfterEach.h | 15 + .../Specta/Specta/SPTSharedExampleGroups.h | 17 + .../Specta/Specta/SPTSharedExampleGroups.m | 74 + Example/Pods/Specta/Specta/Specta/SPTSpec.h | 28 + Example/Pods/Specta/Specta/Specta/SPTSpec.m | 209 ++ .../Pods/Specta/Specta/Specta/SPTTestSuite.h | 21 + .../Pods/Specta/Specta/Specta/SPTTestSuite.m | 31 + Example/Pods/Specta/Specta/Specta/Specta.h | 14 + Example/Pods/Specta/Specta/Specta/SpectaDSL.h | 90 + Example/Pods/Specta/Specta/Specta/SpectaDSL.m | 189 ++ .../Pods/Specta/Specta/Specta/SpectaTypes.h | 5 + .../Pods/Specta/Specta/Specta/SpectaUtility.h | 18 + .../Pods/Specta/Specta/Specta/SpectaUtility.m | 79 + .../Specta/Specta/Specta/XCTest+Private.h | 40 + .../Specta/Specta/Specta/XCTestCase+Specta.h | 7 + .../Specta/Specta/Specta/XCTestCase+Specta.m | 65 + ...s-JazzHandsDemo-JazzHands-Private.xcconfig | 2 +- .../Pods-JazzHandsDemo-environment.h | 6 +- .../Pods-JazzHandsDemo.debug.xcconfig | 4 +- .../Pods-JazzHandsDemo.release.xcconfig | 4 +- ...ds-JazzHandsTests-Expecta-Private.xcconfig | 7 + .../Pods-JazzHandsTests-Expecta-dummy.m | 5 + .../Pods-JazzHandsTests-Expecta-prefix.pch} | 0 .../Pods-JazzHandsTests-Expecta.xcconfig | 2 + ...sTests-FBSnapshotTestCase-Private.xcconfig | 7 - ...-JazzHandsTests-FBSnapshotTestCase-dummy.m | 5 - ...JazzHandsTests-FBSnapshotTestCase.xcconfig | 2 - ...-JazzHandsTests-JazzHands-Private.xcconfig | 2 +- .../Pods-JazzHandsTests-KIF-Private.xcconfig | 8 - .../Pods-JazzHandsTests-KIF-dummy.m | 5 - .../Pods-JazzHandsTests-KIF.xcconfig | 3 - ...ods-JazzHandsTests-Specta-Private.xcconfig | 7 + .../Pods-JazzHandsTests-Specta-dummy.m | 5 + .../Pods-JazzHandsTests-Specta-prefix.pch} | 1 - .../Pods-JazzHandsTests-Specta.xcconfig | 2 + ...s-JazzHandsTests-acknowledgements.markdown | 76 +- ...Pods-JazzHandsTests-acknowledgements.plist | 76 +- .../Pods-JazzHandsTests-environment.h | 32 +- .../Pods-JazzHandsTests.debug.xcconfig | 8 +- .../Pods-JazzHandsTests.release.xcconfig | 8 +- JazzHands.podspec | 4 +- JazzHands/IFTTTAlphaAnimation.h | 7 +- JazzHands/IFTTTAlphaAnimation.m | 36 +- JazzHands/IFTTTAngleAnimation.h | 13 - JazzHands/IFTTTAngleAnimation.m | 35 - JazzHands/IFTTTAnimatable.h | 15 + .../IFTTTAnimatedPagingScrollViewController.h | 29 + .../IFTTTAnimatedPagingScrollViewController.m | 220 ++ JazzHands/IFTTTAnimatedScrollViewController.m | 8 +- JazzHands/IFTTTAnimation.h | 31 +- JazzHands/IFTTTAnimation.m | 128 +- JazzHands/IFTTTAnimationFrame.h | 27 - JazzHands/IFTTTAnimationFrame.m | 13 - JazzHands/IFTTTAnimationKeyFrame.h | 68 - JazzHands/IFTTTAnimationKeyFrame.m | 492 ----- JazzHands/IFTTTAnimator.h | 6 +- JazzHands/IFTTTAnimator.m | 15 +- JazzHands/IFTTTColorAnimation.h | 7 +- JazzHands/IFTTTColorAnimation.m | 61 +- JazzHands/IFTTTConstraintConstantAnimation.h | 18 + JazzHands/IFTTTConstraintConstantAnimation.m | 51 + .../IFTTTConstraintMultiplierAnimation.h | 29 + .../IFTTTConstraintMultiplierAnimation.m | 92 + JazzHands/IFTTTConstraintsAnimation.h | 13 - JazzHands/IFTTTConstraintsAnimation.m | 38 - JazzHands/IFTTTCornerRadiusAnimation.h | 7 +- JazzHands/IFTTTCornerRadiusAnimation.m | 33 +- JazzHands/IFTTTEasingFunction.h | 4 - JazzHands/IFTTTEasingFunction.m | 16 - JazzHands/IFTTTFillColorAnimation.h | 7 +- JazzHands/IFTTTFillColorAnimation.m | 57 +- JazzHands/IFTTTFilmstrip.h | 20 + JazzHands/IFTTTFilmstrip.m | 123 ++ JazzHands/IFTTTFrameAnimation.h | 9 +- JazzHands/IFTTTFrameAnimation.m | 56 +- JazzHands/IFTTTHideAnimation.h | 10 +- JazzHands/IFTTTHideAnimation.m | 56 +- JazzHands/IFTTTInterpolatable.h | 51 + JazzHands/IFTTTInterpolatable.m | 184 ++ JazzHands/IFTTTJazzHands.h | 20 +- JazzHands/IFTTTLabelAnimation.h | 18 + JazzHands/IFTTTLabelAnimation.m | 32 + JazzHands/IFTTTRotationAnimation.h | 16 + JazzHands/IFTTTRotationAnimation.m | 41 + JazzHands/IFTTTScaleAnimation.h | 7 +- JazzHands/IFTTTScaleAnimation.m | 44 +- .../IFTTTScrollViewPageConstraintAnimation.h | 20 + .../IFTTTScrollViewPageConstraintAnimation.m | 53 + JazzHands/IFTTTShapeLayerAnimation.h | 18 + JazzHands/IFTTTShapeLayerAnimation.m | 32 + JazzHands/IFTTTStrokeEndAnimation.h | 7 +- JazzHands/IFTTTStrokeEndAnimation.m | 37 +- JazzHands/IFTTTStrokeStartAnimation.h | 7 +- JazzHands/IFTTTStrokeStartAnimation.m | 37 +- JazzHands/IFTTTTextColorAnimation.h | 11 +- JazzHands/IFTTTTextColorAnimation.m | 66 +- JazzHands/IFTTTTransform3DAnimation.h | 11 +- JazzHands/IFTTTTransform3DAnimation.m | 159 +- JazzHands/IFTTTTranslationAnimation.h | 16 + JazzHands/IFTTTTranslationAnimation.m | 40 + JazzHands/IFTTTViewAnimation.h | 18 + JazzHands/IFTTTViewAnimation.m | 32 + JazzHands/UIView+IFTTTJazzHands.h | 17 + JazzHands/UIView+IFTTTJazzHands.m | 44 + README.md | 65 +- 463 files changed, 7504 insertions(+), 9427 deletions(-) create mode 100644 Example/Docs/if-intro.gif create mode 100644 Example/JazzHandsDemo/MyCustomAnimation.h create mode 100644 Example/JazzHandsDemo/MyCustomAnimation.m create mode 100644 Example/JazzHandsTests/IFTTTAnimationSpec.m create mode 100644 Example/JazzHandsTests/IFTTTEasingFunctionSpec.m create mode 100644 Example/JazzHandsTests/IFTTTFilmstripSpec.m create mode 100644 Example/JazzHandsTests/IFTTTInterpolatableSpec.m delete mode 100644 Example/JazzHandsTests/JazzHandsTests.m create mode 100644 Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.h create mode 100644 Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.m create mode 100644 Example/Pods/Expecta/Expecta/EXPDefines.h create mode 100644 Example/Pods/Expecta/Expecta/EXPDoubleTuple.h create mode 100644 Example/Pods/Expecta/Expecta/EXPDoubleTuple.m create mode 100644 Example/Pods/Expecta/Expecta/EXPExpect.h create mode 100644 Example/Pods/Expecta/Expecta/EXPExpect.m create mode 100644 Example/Pods/Expecta/Expecta/EXPFloatTuple.h create mode 100644 Example/Pods/Expecta/Expecta/EXPFloatTuple.m create mode 100644 Example/Pods/Expecta/Expecta/EXPMatcher.h create mode 100644 Example/Pods/Expecta/Expecta/EXPUnsupportedObject.h create mode 100644 Example/Pods/Expecta/Expecta/EXPUnsupportedObject.m create mode 100644 Example/Pods/Expecta/Expecta/Expecta.h create mode 100644 Example/Pods/Expecta/Expecta/ExpectaObject.h create mode 100644 Example/Pods/Expecta/Expecta/ExpectaObject.m create mode 100644 Example/Pods/Expecta/Expecta/ExpectaSupport.h create mode 100644 Example/Pods/Expecta/Expecta/ExpectaSupport.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.h create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.m create mode 100644 Example/Pods/Expecta/Expecta/Matchers/EXPMatchers.h create mode 100644 Example/Pods/Expecta/Expecta/NSObject+Expecta.h create mode 100644 Example/Pods/Expecta/Expecta/NSValue+Expecta.h create mode 100644 Example/Pods/Expecta/Expecta/NSValue+Expecta.m create mode 100644 Example/Pods/Expecta/LICENSE create mode 100644 Example/Pods/Expecta/README.md delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.h delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.m delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.h delete mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.m delete mode 100644 Example/Pods/FBSnapshotTestCase/LICENSE delete mode 100644 Example/Pods/FBSnapshotTestCase/README.md create mode 120000 Example/Pods/Headers/Private/Expecta/EXPBlockDefinedMatcher.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPDefines.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPDoubleTuple.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPExpect.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPFloatTuple.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatcher.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatcherHelpers.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beCloseTo.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beFalsy.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThan.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beIdenticalTo.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beInTheRangeOf.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beInstanceOf.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beKindOf.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThan.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThanOrEqualTo.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beNil.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beSubclassOf.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beSupersetOf.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beTruthy.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+beginWith.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+conformTo.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+contain.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+endWith.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+equal.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+haveCountOf.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+match.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+postNotification.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+raise.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+raiseWithReason.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers+respondTo.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPMatchers.h create mode 120000 Example/Pods/Headers/Private/Expecta/EXPUnsupportedObject.h create mode 120000 Example/Pods/Headers/Private/Expecta/Expecta.h create mode 120000 Example/Pods/Headers/Private/Expecta/ExpectaObject.h create mode 120000 Example/Pods/Headers/Private/Expecta/ExpectaSupport.h create mode 120000 Example/Pods/Headers/Private/Expecta/NSObject+Expecta.h create mode 120000 Example/Pods/Headers/Private/Expecta/NSValue+Expecta.h delete mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h delete mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h delete mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h delete mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h delete mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTAngleAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTAnimatable.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTAnimatedPagingScrollViewController.h delete mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTAnimationFrame.h delete mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTAnimationKeyFrame.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTConstraintConstantAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTConstraintMultiplierAnimation.h delete mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTConstraintsAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTFilmstrip.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTInterpolatable.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTLabelAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTRotationAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTScrollViewPageConstraintAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTShapeLayerAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTTranslationAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/IFTTTViewAnimation.h create mode 120000 Example/Pods/Headers/Private/JazzHands/UIView+IFTTTJazzHands.h delete mode 120000 Example/Pods/Headers/Private/KIF/CGGeometry-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIF.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIFSystemTestActor.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIFTestActor.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIFTestCase.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIFTestStepValidation.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIFTypist.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIFUITestActor-ConditionalTests.h delete mode 120000 Example/Pods/Headers/Private/KIF/KIFUITestActor.h delete mode 120000 Example/Pods/Headers/Private/KIF/LoadableCategory.h delete mode 120000 Example/Pods/Headers/Private/KIF/NSBundle-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/NSError-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/NSException-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/NSFileManager-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UIAccessibilityElement-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UIApplication-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UIAutomationHelper.h delete mode 120000 Example/Pods/Headers/Private/KIF/UIEvent+KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UIScrollView-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UITableView-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UITouch-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UIView-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/UIWindow-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Private/KIF/XCTestCase-KIFAdditions.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTCallSite.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTCompiledExample.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTExample.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTExampleGroup.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTExcludeGlobalBeforeAfterEach.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTGlobalBeforeAfterEach.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTSharedExampleGroups.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTSpec.h create mode 120000 Example/Pods/Headers/Private/Specta/SPTTestSuite.h create mode 120000 Example/Pods/Headers/Private/Specta/Specta.h create mode 120000 Example/Pods/Headers/Private/Specta/SpectaDSL.h create mode 120000 Example/Pods/Headers/Private/Specta/SpectaTypes.h create mode 120000 Example/Pods/Headers/Private/Specta/SpectaUtility.h create mode 120000 Example/Pods/Headers/Private/Specta/XCTest+Private.h create mode 120000 Example/Pods/Headers/Private/Specta/XCTestCase+Specta.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPBlockDefinedMatcher.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPDefines.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPDoubleTuple.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPExpect.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPFloatTuple.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatcher.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatcherHelpers.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beCloseTo.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beFalsy.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThan.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beIdenticalTo.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beInTheRangeOf.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beInstanceOf.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beKindOf.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThan.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThanOrEqualTo.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beNil.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beSubclassOf.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beSupersetOf.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beTruthy.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+beginWith.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+conformTo.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+contain.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+endWith.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+equal.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+haveCountOf.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+match.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+postNotification.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+raise.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+raiseWithReason.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers+respondTo.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPMatchers.h create mode 120000 Example/Pods/Headers/Public/Expecta/EXPUnsupportedObject.h create mode 120000 Example/Pods/Headers/Public/Expecta/Expecta.h create mode 120000 Example/Pods/Headers/Public/Expecta/ExpectaObject.h create mode 120000 Example/Pods/Headers/Public/Expecta/ExpectaSupport.h create mode 120000 Example/Pods/Headers/Public/Expecta/NSObject+Expecta.h create mode 120000 Example/Pods/Headers/Public/Expecta/NSValue+Expecta.h delete mode 120000 Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestCase.h delete mode 120000 Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestController.h delete mode 120000 Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Compare.h delete mode 120000 Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Diff.h delete mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTAngleAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTAnimatable.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTAnimatedPagingScrollViewController.h delete mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTAnimationFrame.h delete mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTAnimationKeyFrame.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTConstraintConstantAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTConstraintMultiplierAnimation.h delete mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTConstraintsAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTFilmstrip.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTInterpolatable.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTLabelAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTRotationAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTScrollViewPageConstraintAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTShapeLayerAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTTranslationAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/IFTTTViewAnimation.h create mode 120000 Example/Pods/Headers/Public/JazzHands/UIView+IFTTTJazzHands.h delete mode 120000 Example/Pods/Headers/Public/KIF/CGGeometry-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIF.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIFSystemTestActor.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIFTestActor.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIFTestCase.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIFTestStepValidation.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIFTypist.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIFUITestActor-ConditionalTests.h delete mode 120000 Example/Pods/Headers/Public/KIF/KIFUITestActor.h delete mode 120000 Example/Pods/Headers/Public/KIF/NSBundle-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/NSError-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/NSException-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/NSFileManager-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/UIAccessibilityElement-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/UIApplication-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/UIAutomationHelper.h delete mode 120000 Example/Pods/Headers/Public/KIF/UIScrollView-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/UITableView-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/UITouch-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/UIView-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/UIWindow-KIFAdditions.h delete mode 120000 Example/Pods/Headers/Public/KIF/XCTestCase-KIFAdditions.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTCallSite.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTCompiledExample.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTExample.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTExampleGroup.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTExcludeGlobalBeforeAfterEach.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTGlobalBeforeAfterEach.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTSharedExampleGroups.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTSpec.h create mode 120000 Example/Pods/Headers/Public/Specta/SPTTestSuite.h create mode 120000 Example/Pods/Headers/Public/Specta/Specta.h create mode 120000 Example/Pods/Headers/Public/Specta/SpectaDSL.h create mode 120000 Example/Pods/Headers/Public/Specta/SpectaTypes.h create mode 120000 Example/Pods/Headers/Public/Specta/SpectaUtility.h create mode 120000 Example/Pods/Headers/Public/Specta/XCTest+Private.h create mode 120000 Example/Pods/Headers/Public/Specta/XCTestCase+Specta.h delete mode 100644 Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/LoadableCategory.h delete mode 100644 Example/Pods/KIF/Additions/NSBundle-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/NSBundle-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/NSError-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/NSError-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/NSException-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/NSException-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UIApplication-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UIApplication-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UIEvent+KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UIEvent+KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UITableView-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UITableView-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UITouch-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UITouch-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UIView-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UIView-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/UIWindow-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/UIWindow-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.h delete mode 100644 Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.m delete mode 100644 Example/Pods/KIF/Classes/KIF.h delete mode 100644 Example/Pods/KIF/Classes/KIFSystemTestActor.h delete mode 100644 Example/Pods/KIF/Classes/KIFSystemTestActor.m delete mode 100644 Example/Pods/KIF/Classes/KIFTestActor.h delete mode 100644 Example/Pods/KIF/Classes/KIFTestActor.m delete mode 100644 Example/Pods/KIF/Classes/KIFTestCase.h delete mode 100644 Example/Pods/KIF/Classes/KIFTestCase.m delete mode 100644 Example/Pods/KIF/Classes/KIFTestStepValidation.h delete mode 100644 Example/Pods/KIF/Classes/KIFTestStepValidation.m delete mode 100644 Example/Pods/KIF/Classes/KIFTypist.h delete mode 100644 Example/Pods/KIF/Classes/KIFTypist.m delete mode 100644 Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.h delete mode 100644 Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.m delete mode 100644 Example/Pods/KIF/Classes/KIFUITestActor.h delete mode 100644 Example/Pods/KIF/Classes/KIFUITestActor.m delete mode 100644 Example/Pods/KIF/Classes/UIAutomationHelper.h delete mode 100644 Example/Pods/KIF/Classes/UIAutomationHelper.m delete mode 100644 Example/Pods/KIF/LICENSE delete mode 100644 Example/Pods/KIF/README.md create mode 100644 Example/Pods/Specta/LICENSE create mode 100644 Example/Pods/Specta/README.md create mode 100644 Example/Pods/Specta/Specta/Specta/SPTCallSite.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTCallSite.m create mode 100644 Example/Pods/Specta/Specta/Specta/SPTCompiledExample.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTCompiledExample.m create mode 100644 Example/Pods/Specta/Specta/Specta/SPTExample.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTExample.m create mode 100644 Example/Pods/Specta/Specta/Specta/SPTExampleGroup.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTExampleGroup.m create mode 100644 Example/Pods/Specta/Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTGlobalBeforeAfterEach.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.m create mode 100644 Example/Pods/Specta/Specta/Specta/SPTSpec.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTSpec.m create mode 100644 Example/Pods/Specta/Specta/Specta/SPTTestSuite.h create mode 100644 Example/Pods/Specta/Specta/Specta/SPTTestSuite.m create mode 100644 Example/Pods/Specta/Specta/Specta/Specta.h create mode 100644 Example/Pods/Specta/Specta/Specta/SpectaDSL.h create mode 100644 Example/Pods/Specta/Specta/Specta/SpectaDSL.m create mode 100644 Example/Pods/Specta/Specta/Specta/SpectaTypes.h create mode 100644 Example/Pods/Specta/Specta/Specta/SpectaUtility.h create mode 100644 Example/Pods/Specta/Specta/Specta/SpectaUtility.m create mode 100644 Example/Pods/Specta/Specta/Specta/XCTest+Private.h create mode 100644 Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.h create mode 100644 Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.m create mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-Private.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-dummy.m rename Example/Pods/Target Support Files/{Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch => Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m delete mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-Private.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-dummy.m delete mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-Private.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-dummy.m rename Example/Pods/Target Support Files/{Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-prefix.pch => Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch} (70%) create mode 100644 Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta.xcconfig delete mode 100644 JazzHands/IFTTTAngleAnimation.h delete mode 100644 JazzHands/IFTTTAngleAnimation.m create mode 100644 JazzHands/IFTTTAnimatable.h create mode 100644 JazzHands/IFTTTAnimatedPagingScrollViewController.h create mode 100644 JazzHands/IFTTTAnimatedPagingScrollViewController.m delete mode 100755 JazzHands/IFTTTAnimationFrame.h delete mode 100644 JazzHands/IFTTTAnimationFrame.m delete mode 100755 JazzHands/IFTTTAnimationKeyFrame.h delete mode 100755 JazzHands/IFTTTAnimationKeyFrame.m create mode 100644 JazzHands/IFTTTConstraintConstantAnimation.h create mode 100644 JazzHands/IFTTTConstraintConstantAnimation.m create mode 100644 JazzHands/IFTTTConstraintMultiplierAnimation.h create mode 100644 JazzHands/IFTTTConstraintMultiplierAnimation.m delete mode 100644 JazzHands/IFTTTConstraintsAnimation.h delete mode 100644 JazzHands/IFTTTConstraintsAnimation.m create mode 100644 JazzHands/IFTTTFilmstrip.h create mode 100644 JazzHands/IFTTTFilmstrip.m create mode 100644 JazzHands/IFTTTInterpolatable.h create mode 100644 JazzHands/IFTTTInterpolatable.m create mode 100644 JazzHands/IFTTTLabelAnimation.h create mode 100644 JazzHands/IFTTTLabelAnimation.m create mode 100644 JazzHands/IFTTTRotationAnimation.h create mode 100644 JazzHands/IFTTTRotationAnimation.m create mode 100644 JazzHands/IFTTTScrollViewPageConstraintAnimation.h create mode 100644 JazzHands/IFTTTScrollViewPageConstraintAnimation.m create mode 100644 JazzHands/IFTTTShapeLayerAnimation.h create mode 100644 JazzHands/IFTTTShapeLayerAnimation.m create mode 100644 JazzHands/IFTTTTranslationAnimation.h create mode 100644 JazzHands/IFTTTTranslationAnimation.m create mode 100644 JazzHands/IFTTTViewAnimation.h create mode 100644 JazzHands/IFTTTViewAnimation.m create mode 100644 JazzHands/UIView+IFTTTJazzHands.h create mode 100644 JazzHands/UIView+IFTTTJazzHands.m diff --git a/Example/Docs/if-intro.gif b/Example/Docs/if-intro.gif new file mode 100644 index 0000000000000000000000000000000000000000..1aea78db8f114d9d2452b7ed2e5d600b044d2419 GIT binary patch literal 558338 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 q3bSL#7KJN&} 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�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%0Awgr;Mji`4U0f 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�>6e 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

1*5bP4s@6-0H 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� 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 X>31Uo3 +@interface IFTTTJazzHandsViewController : IFTTTAnimatedPagingScrollViewController @end diff --git a/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m b/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m index 251bdd3..5657041 100644 --- a/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m +++ b/Example/JazzHandsDemo/IFTTTJazzHandsViewController.m @@ -7,26 +7,43 @@ // #import "IFTTTJazzHandsViewController.h" - -#define NUMBER_OF_PAGES 4 - -#define timeForPage(page) (NSInteger)(self.view.frame.size.width * (page - 1)) +#import "MyCustomAnimation.h" @interface IFTTTJazzHandsViewController () -@property (strong, nonatomic) UIImageView *wordmark; -@property (strong, nonatomic) UIImageView *unicorn; -@property (strong, nonatomic) UILabel *lastLabel; -@property (strong, nonatomic) UILabel *firstLabel; +@property (nonatomic, strong) UIImageView *wordmark; +@property (nonatomic, strong) UIImageView *unicorn; +@property (nonatomic, strong) UILabel *firstLabel; +@property (nonatomic, strong) UILabel *secondLabel; +@property (nonatomic, strong) UILabel *thirdLabel; +@property (nonatomic, strong) UILabel *fourthLabel; @end @implementation IFTTTJazzHandsViewController -- (id)init +- (instancetype)init { if ((self = [super init])) { + self.numberOfPages = 4; + } + + return self; +} +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if ((self = [super initWithCoder:aDecoder])) { + self.numberOfPages = 4; + } + + return self; +} + +- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { + self.numberOfPages = 4; } return self; @@ -35,77 +52,165 @@ - (id)init - (void)viewDidLoad { [super viewDidLoad]; - - self.scrollView.contentSize = CGSizeMake(NUMBER_OF_PAGES * CGRectGetWidth(self.view.frame), - CGRectGetHeight(self.view.frame)); - - self.scrollView.pagingEnabled = YES; - self.scrollView.showsHorizontalScrollIndicator = NO; self.scrollView.accessibilityLabel = @"JazzHands"; self.scrollView.accessibilityIdentifier = @"JazzHands"; - [self placeViews]; - [self configureAnimation]; + self.view.backgroundColor = [UIColor whiteColor]; - self.delegate = self; + [self configureViews]; + [self configureAnimations]; } -- (void)placeViews +- (void)configureViews { - // put a unicorn in the middle of page two, hidden self.unicorn = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Unicorn"]]; - self.unicorn.center = self.view.center; - self.unicorn.frame = CGRectOffset( - self.unicorn.frame, - self.view.frame.size.width, - -100 - ); - self.unicorn.alpha = 0.0f; - [self.scrollView addSubview:self.unicorn]; - - // put a logo on top of it + [self.contentView addSubview:self.unicorn]; + self.wordmark = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IFTTT"]]; - self.wordmark.center = self.view.center; - self.wordmark.frame = CGRectOffset( - self.wordmark.frame, - self.view.frame.size.width, - -100 - ); - [self.scrollView addSubview:self.wordmark]; - - self.firstLabel = [[UILabel alloc] init]; + [self.contentView addSubview:self.wordmark]; + + self.firstLabel = [UILabel new]; self.firstLabel.text = @"Introducing Jazz Hands"; [self.firstLabel sizeToFit]; - self.firstLabel.center = self.view.center; - [self.scrollView addSubview:self.firstLabel]; - - UILabel *secondPageText = [[UILabel alloc] init]; - secondPageText.text = @"Brought to you by IFTTT"; - [secondPageText sizeToFit]; - secondPageText.center = self.view.center; - secondPageText.frame = CGRectOffset(secondPageText.frame, timeForPage(2), 180); - [self.scrollView addSubview:secondPageText]; - - UILabel *thirdPageText = [[UILabel alloc] init]; - thirdPageText.text = @"Simple keyframe animations"; - [thirdPageText sizeToFit]; - thirdPageText.center = self.view.center; - thirdPageText.frame = CGRectOffset(thirdPageText.frame, timeForPage(3), -100); - [self.scrollView addSubview:thirdPageText]; - - UILabel *fourthPageText = [[UILabel alloc] init]; - fourthPageText.text = @"Optimized for scrolling intros"; - [fourthPageText sizeToFit]; - fourthPageText.center = self.view.center; - fourthPageText.frame = CGRectOffset(fourthPageText.frame, timeForPage(4), 0); - [self.scrollView addSubview:fourthPageText]; - - self.lastLabel = fourthPageText; + [self.contentView addSubview:self.firstLabel]; + + self.secondLabel = [UILabel new]; + self.secondLabel.text = @"Brought to you by IFTTT"; + [self.secondLabel sizeToFit]; + [self.contentView addSubview:self.secondLabel]; + + self.thirdLabel = [UILabel new]; + self.thirdLabel.text = @"Simple keyframe animations"; + [self.thirdLabel sizeToFit]; + [self.contentView addSubview:self.thirdLabel]; + + self.fourthLabel = [UILabel new]; + self.fourthLabel.text = @"Optimized for scrolling intros"; + [self.fourthLabel sizeToFit]; + [self.contentView addSubview:self.fourthLabel]; +} + +- (void)configureAnimations +{ + [self configureScrollViewAnimations]; + [self configureUnicornAnimations]; + [self configureWordmarkAnimations]; + [self configureLabelAnimations]; + [self animateCurrentFrame]; +} + +- (void)configureScrollViewAnimations +{ + // change the scrollView's background color for each page + IFTTTColorAnimation *backgroundColorAnimation = [IFTTTColorAnimation animationWithView:self.scrollView]; + [backgroundColorAnimation addKeyframeForTime:0 color:[[UIColor blueColor] colorWithAlphaComponent:0.4f]]; + [backgroundColorAnimation addKeyframeForTime:1 color:[[UIColor cyanColor] colorWithAlphaComponent:0.4f]]; + [backgroundColorAnimation addKeyframeForTime:2 color:[[UIColor greenColor] colorWithAlphaComponent:0.4f]]; + [backgroundColorAnimation addKeyframeForTime:3 color:[[UIColor yellowColor] colorWithAlphaComponent:0.4f]]; + [self.animator addAnimation:backgroundColorAnimation]; +} + +- (void)configureUnicornAnimations +{ + // now, we animate the unicorn + // keep the unicorn centered when we're on pages 1 and 2. + // It will slide from the right between pages 0 and 1, and slide out to the left between pages 2 and 3. + [self keepView:self.unicorn onPages:@[ @(1), @(2) ]]; + + NSLayoutConstraint *unicornCenterYConstraint = [NSLayoutConstraint constraintWithItem:self.unicorn + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeCenterY + multiplier:1.f constant:0.f]; + [self.contentView addConstraint:unicornCenterYConstraint]; + + // Move the unicorn from a bit higher than center on page 1 to a bit lower on page 2, by an amount relative to the height of the view. + IFTTTConstraintMultiplierAnimation *unicornCenterYAnimation = [IFTTTConstraintMultiplierAnimation animationWithSuperview:self.contentView + constraint:unicornCenterYConstraint + attribute:IFTTTLayoutAttributeHeight + referenceView:self.contentView]; + [unicornCenterYAnimation addKeyframeForTime:1 multiplier:-0.1f withEasingFunction:IFTTTEasingFunctionEaseOutQuad]; + [unicornCenterYAnimation addKeyframeForTime:2 multiplier:0.2f]; + [self.animator addAnimation:unicornCenterYAnimation]; + + // Scale down the unicorn by 75% between pages 1 and 2 + IFTTTScaleAnimation *unicornScaleAnimation = [IFTTTScaleAnimation animationWithView:self.unicorn]; + [unicornScaleAnimation addKeyframeForTime:1 scale:1.f]; + [unicornScaleAnimation addKeyframeForTime:2 scale:0.75f]; + [self.animator addAnimation:unicornScaleAnimation]; + + // fade the unicorn in on page 1 and out on page 3 + IFTTTAlphaAnimation *unicornAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.unicorn]; + [unicornAlphaAnimation addKeyframeForTime:0 alpha:0.f]; + [unicornAlphaAnimation addKeyframeForTime:1 alpha:1.f]; + [unicornAlphaAnimation addKeyframeForTime:2 alpha:1.f]; + [unicornAlphaAnimation addKeyframeForTime:3 alpha:0.f]; + [self.animator addAnimation:unicornAlphaAnimation]; } -- (void)configureAnimation +- (void)configureWordmarkAnimations { - CGFloat dy = 240; + // let's animate the wordmark + // keep the wordmark centered on pages 1 and 2, slide it in fast from the right between page 0 and 1, and slide it out fast to the left between pages 2 and 3. + [self keepView:self.wordmark + onPages:@[ @(2), @(1), @(2), @(1) ] + atTimes:@[ @(0), @(1), @(2), @(3) ]]; + + // keep the wordmark vertically centered on top of the unicorn + [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.wordmark + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.unicorn + attribute:NSLayoutAttributeCenterY + multiplier:1.f constant:0.f]]; + + // Rotate the wordmark a full circle from page 1 to 2 + IFTTTRotationAnimation *wordmarkRotationAnimation = [IFTTTRotationAnimation animationWithView:self.wordmark]; + [wordmarkRotationAnimation addKeyframeForTime:1 rotation:0.f]; + [wordmarkRotationAnimation addKeyframeForTime:2 rotation:360.f]; + [self.animator addAnimation:wordmarkRotationAnimation]; + + // Scale down the wordmark by 75% between pages 1 and 2 + IFTTTScaleAnimation *wordmarkScaleAnimation = [IFTTTScaleAnimation animationWithView:self.wordmark]; + [wordmarkScaleAnimation addKeyframeForTime:1 scale:1.f]; + [wordmarkScaleAnimation addKeyframeForTime:2 scale:0.75f]; + [self.animator addAnimation:wordmarkScaleAnimation]; +} + +- (void)configureLabelAnimations +{ + // lay out labels' vertical positions + [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.firstLabel + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeCenterY + multiplier:1.f constant:0.f]]; + [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.secondLabel + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeCenterY + multiplier:1.5f constant:0.f]]; + [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.thirdLabel + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeCenterY + multiplier:0.5f constant:0.f]]; + [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.fourthLabel + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeCenterY + multiplier:1.f constant:0.f]]; + + // lay out the labels' horizontal positions (centered on each page) + [self keepView:self.firstLabel onPage:0]; + [self keepView:self.secondLabel onPage:1]; + [self keepView:self.thirdLabel onPage:2]; + [self keepView:self.fourthLabel onPage:3]; // apply a 3D zoom animation to the first label IFTTTTransform3DAnimation * labelTransform = [IFTTTTransform3DAnimation animationWithView:self.firstLabel]; @@ -114,75 +219,32 @@ - (void)configureAnimation tt2.rotate = (IFTTTTransform3DRotate){ -(CGFloat)(M_PI), 1, 0, 0 }; tt2.translate = (IFTTTTransform3DTranslate){ 0, 0, 50 }; tt2.scale = (IFTTTTransform3DScale){ 1.f, 2.f, 1.f }; - [labelTransform addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(0) - andAlpha:1.0f]]; - [labelTransform addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(1) - andTransform3D:tt1]]; - [labelTransform addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(1.5) - andTransform3D:tt2]]; - [labelTransform addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(1.5) + 1 - andAlpha:0.0f]]; + [labelTransform addKeyframeForTime:0 transform:tt1]; + [labelTransform addKeyframeForTime:0.5f transform:tt2]; [self.animator addAnimation:labelTransform]; - - // let's animate the wordmark - IFTTTFrameAnimation *wordmarkFrameAnimation = [IFTTTFrameAnimation animationWithView:self.wordmark]; - [self.animator addAnimation:wordmarkFrameAnimation]; - - [wordmarkFrameAnimation addKeyFrames:@[ - ({ - IFTTTAnimationKeyFrame *keyFrame = [IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(1) andFrame:CGRectOffset(self.wordmark.frame, 200, 0)]; - keyFrame.easingFunction = IFTTTEasingFunctionEaseInQuart; - keyFrame; - }), - [IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(2) andFrame:self.wordmark.frame], - [IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(3) andFrame:CGRectOffset(self.wordmark.frame, self.view.frame.size.width, dy)], - [IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(4) andFrame:CGRectOffset(self.wordmark.frame, 0, dy)], - ]]; - - // Rotate a full circle from page 2 to 3 - IFTTTAngleAnimation *wordmarkRotationAnimation = [IFTTTAngleAnimation animationWithView:self.wordmark]; - [self.animator addAnimation:wordmarkRotationAnimation]; - [wordmarkRotationAnimation addKeyFrames:@[ - [IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(2) andAngle:0.0f], - [IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(3) andAngle:(CGFloat)(2 * M_PI)], - ]]; - // now, we animate the unicorn - IFTTTFrameAnimation *unicornFrameAnimation = [IFTTTFrameAnimation animationWithView:self.unicorn]; - [self.animator addAnimation:unicornFrameAnimation]; + // fade out the first label + IFTTTAlphaAnimation *firstLabelAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.firstLabel]; + [firstLabelAlphaAnimation addKeyframeForTime:0 alpha:1.f]; + [firstLabelAlphaAnimation addKeyframeForTime:0.35f alpha:0.f]; + [self.animator addAnimation:firstLabelAlphaAnimation]; - CGFloat ds = 50; - - // move down and to the right, and shrink between pages 2 and 3 - [unicornFrameAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(2) andFrame:self.unicorn.frame]]; - [unicornFrameAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(3) - andFrame:CGRectOffset(CGRectInset(self.unicorn.frame, ds, ds), timeForPage(2), dy)]]; - // fade the unicorn in on page 2 and out on page 4 - IFTTTAlphaAnimation *unicornAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.unicorn]; - [self.animator addAnimation:unicornAlphaAnimation]; + // custom animate the third label + MyCustomAnimation *thirdLabelAnimation = [MyCustomAnimation animationWithView:self.thirdLabel]; + [thirdLabelAnimation addKeyframeForTime:1.5f shadowOpacity:0.f]; + [thirdLabelAnimation addKeyframeForTime:2 shadowOpacity:1.f]; + [thirdLabelAnimation addKeyframeForTime:2.5f shadowOpacity:0.f]; + [self.animator addAnimation:thirdLabelAnimation]; - [unicornAlphaAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(1) andAlpha:0.0f]]; - [unicornAlphaAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(2) andAlpha:1.0f]]; - [unicornAlphaAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(3) andAlpha:1.0f]]; - [unicornAlphaAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(4) andAlpha:0.0f]]; + self.thirdLabel.layer.shadowColor = [UIColor darkGrayColor].CGColor; + self.thirdLabel.layer.shadowRadius = 1.f; + self.thirdLabel.layer.shadowOffset = CGSizeMake(1.f, 1.f); - // Fade out the label by dragging on the last page - IFTTTAlphaAnimation *labelAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.lastLabel]; - [labelAlphaAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(4) andAlpha:1.0f]]; - [labelAlphaAnimation addKeyFrame:[IFTTTAnimationKeyFrame keyFrameWithTime:timeForPage(4.35f) andAlpha:0.0f]]; - [self.animator addAnimation:labelAlphaAnimation]; -} - -#pragma mark - IFTTTAnimatedScrollViewControllerDelegate - -- (void)animatedScrollViewControllerDidScrollToEnd:(IFTTTAnimatedScrollViewController *)animatedScrollViewController -{ - NSLog(@"Scrolled to end of scrollview!"); -} - -- (void)animatedScrollViewControllerDidEndDraggingAtEnd:(IFTTTAnimatedScrollViewController *)animatedScrollViewController -{ - NSLog(@"Ended dragging at end of scrollview!"); + // Fade out the last label by dragging on the last page + IFTTTAlphaAnimation *lastLabelAlphaAnimation = [IFTTTAlphaAnimation animationWithView:self.fourthLabel]; + [lastLabelAlphaAnimation addKeyframeForTime:3 alpha:1.f]; + [lastLabelAlphaAnimation addKeyframeForTime:3.35f alpha:0.f]; + [self.animator addAnimation:lastLabelAlphaAnimation]; } @end diff --git a/Example/JazzHandsDemo/MyCustomAnimation.h b/Example/JazzHandsDemo/MyCustomAnimation.h new file mode 100644 index 0000000..e2de532 --- /dev/null +++ b/Example/JazzHandsDemo/MyCustomAnimation.h @@ -0,0 +1,15 @@ +// +// MyCustomAnimation.h +// JazzHandsDemo +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "IFTTTViewAnimation.h" + +@interface MyCustomAnimation : IFTTTViewAnimation + +- (void)addKeyframeForTime:(CGFloat)time shadowOpacity:(CGFloat)shadowOpacity; + +@end diff --git a/Example/JazzHandsDemo/MyCustomAnimation.m b/Example/JazzHandsDemo/MyCustomAnimation.m new file mode 100644 index 0000000..f72415c --- /dev/null +++ b/Example/JazzHandsDemo/MyCustomAnimation.m @@ -0,0 +1,24 @@ +// +// MyCustomAnimation.m +// JazzHandsDemo +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "MyCustomAnimation.h" + +@implementation MyCustomAnimation + +- (void)addKeyframeForTime:(CGFloat)time shadowOpacity:(CGFloat)shadowOpacity +{ + [self addKeyframeForTime:time value:@(shadowOpacity)]; +} + +- (void)animate:(CGFloat)time +{ + if (!self.hasKeyframes) return; + self.view.layer.shadowOpacity = (float)[(NSNumber *)[self valueAtTime:time] floatValue]; +} + +@end diff --git a/Example/JazzHandsTests/IFTTTAnimationSpec.m b/Example/JazzHandsTests/IFTTTAnimationSpec.m new file mode 100644 index 0000000..2010bab --- /dev/null +++ b/Example/JazzHandsTests/IFTTTAnimationSpec.m @@ -0,0 +1,150 @@ +// +// IFTTTAnimationSpec.m +// JazzHandsDemo +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#define EXP_SHORTHAND +#import +#include +#include +#import + +SpecBegin(IFTTTAnimation) + +describe(@"IFTTTAnimation", ^{ + + describe(@"should apply all types of animation to the same view correctly", ^{ + __block UILabel *label; + __block CAShapeLayer *layer; + __block IFTTTTransform3D *tttransform; + + beforeAll(^{ + label = [UILabel new]; + label.text = @"some text"; + layer = [CAShapeLayer layer]; + label.layer.mask = layer; + IFTTTAnimator *animator = [IFTTTAnimator new]; + + IFTTTAlphaAnimation *alphaAnimation = [IFTTTAlphaAnimation animationWithView:label]; + IFTTTColorAnimation *colorAnimation = [IFTTTColorAnimation animationWithView:label]; + IFTTTCornerRadiusAnimation *cornerRadiusAnimation = [IFTTTCornerRadiusAnimation animationWithView:label]; + IFTTTFillColorAnimation *fillColorAnimation = [IFTTTFillColorAnimation animationWithLayer:layer]; + IFTTTHideAnimation *hideAnimation = [IFTTTHideAnimation animationWithView:label hideAt:2]; + IFTTTRotationAnimation *rotationAnimation = [IFTTTRotationAnimation animationWithView:label]; + IFTTTScaleAnimation *scaleAnimation = [IFTTTScaleAnimation animationWithView:label]; + IFTTTStrokeEndAnimation *strokeEndAnimation = [IFTTTStrokeEndAnimation animationWithLayer:layer]; + IFTTTStrokeStartAnimation *strokeStartAnimation = [IFTTTStrokeStartAnimation animationWithLayer:layer]; + IFTTTTextColorAnimation *textColorAnimation = [IFTTTTextColorAnimation animationWithLabel:label]; + IFTTTTransform3DAnimation *transformAnimation = [IFTTTTransform3DAnimation animationWithView:label]; + IFTTTTranslationAnimation *translationAnimation = [IFTTTTranslationAnimation animationWithView:label]; + + // Note: None of the three constraint animations can be used with each other or with the frame animation. + // They affect the same view properties. + + [alphaAnimation addKeyframeForTime:2 alpha:0.5f]; + [colorAnimation addKeyframeForTime:2 color:[UIColor redColor]]; + [cornerRadiusAnimation addKeyframeForTime:2 cornerRadius:3.f]; + [fillColorAnimation addKeyframeForTime:2 color:[UIColor blueColor]]; + [rotationAnimation addKeyframeForTime:2 rotation:45.f]; + [scaleAnimation addKeyframeForTime:2 scale:0.4f]; + [strokeEndAnimation addKeyframeForTime:2 strokeEnd:0.8f]; + [strokeStartAnimation addKeyframeForTime:2 strokeStart:0.1f]; + [textColorAnimation addKeyframeForTime:2 color:[UIColor greenColor]]; + [translationAnimation addKeyframeForTime:2 translation:CGPointMake(20.f, 30.f)]; + + tttransform = [IFTTTTransform3D transformWithM34:0.3f]; + tttransform.rotate = (IFTTTTransform3DRotate){ -(CGFloat)(M_PI), 1, 0, 0 }; + tttransform.translate = (IFTTTTransform3DTranslate){ 0, 0, 50 }; + tttransform.scale = (IFTTTTransform3DScale){ 1.f, 2.f, 1.f }; + + [transformAnimation addKeyframeForTime:2 transform:tttransform]; + + [animator addAnimation:alphaAnimation]; + [animator addAnimation:colorAnimation]; + [animator addAnimation:cornerRadiusAnimation]; + [animator addAnimation:fillColorAnimation]; + [animator addAnimation:rotationAnimation]; + [animator addAnimation:scaleAnimation]; + [animator addAnimation:strokeEndAnimation]; + [animator addAnimation:strokeStartAnimation]; + [animator addAnimation:textColorAnimation]; + [animator addAnimation:translationAnimation]; + [animator addAnimation:transformAnimation]; + [animator addAnimation:hideAnimation]; + + [animator animate:2]; + }); + + it(@"should have the correct alpha", ^{ + expect(label.alpha).to.beCloseTo(0.5f); + }); + + it(@"should have the correct background color", ^{ + expect(label.backgroundColor).to.equal([UIColor redColor]); + }); + + it(@"should have the correct corner radius", ^{ + expect(label.layer.cornerRadius).to.beCloseTo(3.f); + }); + + it(@"should have the correct fill color", ^{ + expect(layer.fillColor).to.equal([UIColor blueColor].CGColor); + }); + + it(@"should have the correct stroke end", ^{ + expect(layer.strokeEnd).to.beCloseTo(0.8f); + }); + + it(@"should have the correct stroke start", ^{ + expect(layer.strokeStart).to.beCloseTo(0.1f); + }); + + it(@"should have the correct text color", ^{ + expect(label.textColor).to.equal([UIColor greenColor]); + }); + + it(@"should have the correct hidden setting", ^{ + expect(label.hidden).to.beTruthy; + }); + + it(@"should have the correct view affine transform", ^{ + CGAffineTransform scaleTransform = CGAffineTransformMakeScale(0.4f, 0.4f); + CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(45.f * (CGFloat)(M_PI / -180.f)); + CGAffineTransform translationTransform = CGAffineTransformMakeTranslation(20.f, 30.f); + CGAffineTransform mixedTransform = CGAffineTransformConcat(translationTransform, CGAffineTransformConcat(scaleTransform, rotationTransform)); + + expect(CGAffineTransformEqualToTransform(label.transform, mixedTransform)).to.beTruthy; + }); + + it(@"should have the correct layer 3D transform", ^{ + CATransform3D transform3D = CATransform3DIdentity; + transform3D.m34 = tttransform.m34; + transform3D = CATransform3DRotate(transform3D, + tttransform.rotate.angle, + tttransform.rotate.x, + tttransform.rotate.y, + tttransform.rotate.z); + transform3D = CATransform3DScale(transform3D, + tttransform.scale.sx, + tttransform.scale.sy, + tttransform.scale.sz); + transform3D = CATransform3DTranslate(transform3D, + tttransform.translate.tx, + tttransform.translate.ty, + tttransform.translate.tz); + + expect(CATransform3DEqualToTransform(label.layer.transform, transform3D)).to.beTruthy; + }); + + afterAll(^{ + label = nil; + layer = nil; + tttransform = nil; + }); + }); +}); + +SpecEnd diff --git a/Example/JazzHandsTests/IFTTTEasingFunctionSpec.m b/Example/JazzHandsTests/IFTTTEasingFunctionSpec.m new file mode 100644 index 0000000..aa2a737 --- /dev/null +++ b/Example/JazzHandsTests/IFTTTEasingFunctionSpec.m @@ -0,0 +1,102 @@ +// +// IFTTTEasingFunctionSpec.m +// JazzHandsDemo +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#define EXP_SHORTHAND +#import +#include +#include +#import + +SpecBegin(IFTTTEasingFunction) + +describe(@"IFTTTEasingFunction", ^{ + + describe(@"IFTTTEasingFunctionLinear", ^{ + it(@"should return t", ^{ + expect(IFTTTEasingFunctionLinear(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionLinear(0.5f)).to.beCloseTo(0.5f); + expect(IFTTTEasingFunctionLinear(0.25f)).to.beCloseTo(0.25f); + expect(IFTTTEasingFunctionLinear(0.f)).to.beCloseTo(0.f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseInQuad", ^{ + it(@"should return t * t", ^{ + expect(IFTTTEasingFunctionEaseInQuad(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseInQuad(0.5f)).to.beCloseTo(0.25f); + expect(IFTTTEasingFunctionEaseInQuad(0.25f)).to.beCloseTo(0.0625f); + expect(IFTTTEasingFunctionEaseInQuad(0.f)).to.beCloseTo(0.f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseOutQuad", ^{ + it(@"should return between 0 and 1", ^{ + expect(IFTTTEasingFunctionEaseOutQuad(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseOutQuad(0.5f)).to.beLessThan(1.f); + expect(IFTTTEasingFunctionEaseOutQuad(0.5f)).to.beGreaterThan(0.f); + expect(IFTTTEasingFunctionEaseOutQuad(0.f)).to.beCloseTo(0.f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseInOutQuad", ^{ + it(@"should return between 0 and 1", ^{ + expect(IFTTTEasingFunctionEaseInOutQuad(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseInOutQuad(0.5f)).to.beLessThan(1.f); + expect(IFTTTEasingFunctionEaseInOutQuad(0.5f)).to.beGreaterThan(0.f); + expect(IFTTTEasingFunctionEaseInOutQuad(0.f)).to.beCloseTo(0.f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseInCubic", ^{ + it(@"should return t * t * t", ^{ + expect(IFTTTEasingFunctionEaseInCubic(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseInCubic(0.5f)).to.beCloseTo(0.125f); + expect(IFTTTEasingFunctionEaseInCubic(0.25f)).to.beCloseTo(0.015625f); + expect(IFTTTEasingFunctionEaseInCubic(0.f)).to.beCloseTo(0.f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseOutCubic", ^{ + it(@"should return between 0 and 1", ^{ + expect(IFTTTEasingFunctionEaseOutCubic(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseOutCubic(0.5f)).to.beLessThan(1.f); + expect(IFTTTEasingFunctionEaseOutCubic(0.5f)).to.beGreaterThan(0.f); + expect(IFTTTEasingFunctionEaseOutCubic(0.f)).to.beCloseTo(0.f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseInOutCubic", ^{ + it(@"should return between 0 and 1", ^{ + expect(IFTTTEasingFunctionEaseInOutCubic(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseInOutCubic(0.5f)).to.beLessThan(1.f); + expect(IFTTTEasingFunctionEaseInOutCubic(0.5f)).to.beGreaterThan(0.f); + expect(IFTTTEasingFunctionEaseInOutCubic(0.f)).to.beCloseTo(0.f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseInBounce", ^{ + it(@"should return between 0 and 1", ^{ + expect(IFTTTEasingFunctionEaseInBounce(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseInBounce(0.5f)).to.beLessThan(1.f); + expect(IFTTTEasingFunctionEaseInBounce(0.5f)).to.beGreaterThan(0.f); + expect(IFTTTEasingFunctionEaseInBounce(0.f)).to.beCloseToWithin(0.f, 0.1f); + }); + }); + + describe(@"IFTTTEasingFunctionEaseOutBounce", ^{ + it(@"should return between 0 and 1", ^{ + expect(IFTTTEasingFunctionEaseOutBounce(1.f)).to.beCloseTo(1.f); + expect(IFTTTEasingFunctionEaseOutBounce(0.5f)).to.beLessThan(1.f); + expect(IFTTTEasingFunctionEaseOutBounce(0.5f)).to.beGreaterThan(0.f); + expect(IFTTTEasingFunctionEaseOutBounce(0.f)).to.beCloseTo(0.f); + }); + }); + +}); + +SpecEnd diff --git a/Example/JazzHandsTests/IFTTTFilmstripSpec.m b/Example/JazzHandsTests/IFTTTFilmstripSpec.m new file mode 100644 index 0000000..a6662a3 --- /dev/null +++ b/Example/JazzHandsTests/IFTTTFilmstripSpec.m @@ -0,0 +1,104 @@ +// +// IFTTTFilmstripSpec.m +// JazzHandsDemo +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#define EXP_SHORTHAND +#import +#include +#include +#import + +SpecBegin(IFTTTFilmstrip) + +describe(@"IFTTTFilmstrip", ^{ + __block IFTTTFilmstrip *filmstrip; + + beforeEach(^{ + filmstrip = [IFTTTFilmstrip new]; + }); + + it(@"should start empty", ^{ + expect(filmstrip.isEmpty).to.beTruthy; + }); + + it(@"should set and get a number", ^{ + [filmstrip setValue:@(2) atTime:4.f]; + expect([(NSNumber *)[filmstrip valueAtTime:4.f] floatValue]).to.beCloseTo(2.f); + }); + + it(@"should set and get a color", ^{ + [filmstrip setValue:[UIColor redColor] atTime:4.f]; + expect([filmstrip valueAtTime:4.f]).to.equal([UIColor redColor]); + }); + + it(@"should set and get multiple numbers", ^{ + [filmstrip setValue:@(2) atTime:4.f]; + [filmstrip setValue:@(3) atTime:5.f]; + expect([(NSNumber *)[filmstrip valueAtTime:4.f] floatValue]).to.beCloseTo(2.f); + expect([(NSNumber *)[filmstrip valueAtTime:5.f] floatValue]).to.beCloseTo(3.f); + }); + + it(@"should set and get multiple colors", ^{ + [filmstrip setValue:[UIColor redColor] atTime:4.f]; + [filmstrip setValue:[UIColor blueColor] atTime:5.f]; + expect([filmstrip valueAtTime:4.f]).to.equal([UIColor redColor]); + expect([filmstrip valueAtTime:5.f]).to.equal([UIColor blueColor]); + }); + + it(@"should interpolate between numbers", ^{ + [filmstrip setValue:@(2) atTime:4.f]; + [filmstrip setValue:@(4) atTime:6.f]; + expect([(NSNumber *)[filmstrip valueAtTime:5.f] floatValue]).to.beCloseTo(3.f); + }); + + it(@"should return the first value for times before the start time", ^{ + [filmstrip setValue:@(2) atTime:4.f]; + [filmstrip setValue:@(3) atTime:5.f]; + expect([(NSNumber *)[filmstrip valueAtTime:0.f] floatValue]).to.beCloseTo(2.f); + expect([(NSNumber *)[filmstrip valueAtTime:1.f] floatValue]).to.beCloseTo(2.f); + }); + + it(@"should return the last value for times after the end time", ^{ + [filmstrip setValue:@(2) atTime:4.f]; + [filmstrip setValue:@(3) atTime:5.f]; + expect([(NSNumber *)[filmstrip valueAtTime:6.f] floatValue]).to.beCloseTo(3.f); + expect([(NSNumber *)[filmstrip valueAtTime:7.f] floatValue]).to.beCloseTo(3.f); + }); + + it(@"should work for negative times", ^{ + [filmstrip setValue:@(2) atTime:-4.f]; + [filmstrip setValue:@(3) atTime:5.f]; + expect([(NSNumber *)[filmstrip valueAtTime:-5.f] floatValue]).to.beCloseTo(2.f); + expect([(NSNumber *)[filmstrip valueAtTime:-4.f] floatValue]).to.beCloseTo(2.f); + expect([(NSNumber *)[filmstrip valueAtTime:5.f] floatValue]).to.beCloseTo(3.f); + }); + + it(@"should set a timing curve", ^{ + [filmstrip setValue:@(0.1f) atTime:1 withEasingFunction:IFTTTEasingFunctionEaseInQuad]; + [filmstrip setValue:@(0.2f) atTime:2]; + expect([(NSNumber *)[filmstrip valueAtTime:1.5f] floatValue]).to.beCloseTo(((0.5f * 0.5f) * 0.1f) + 0.1f); + }); + + it(@"should use the timing curve from the starting keyframe", ^{ + [filmstrip setValue:@(0.1f) atTime:1 withEasingFunction:IFTTTEasingFunctionEaseInQuad]; + [filmstrip setValue:@(0.2f) atTime:2 withEasingFunction:IFTTTEasingFunctionEaseOutBounce]; + expect([(NSNumber *)[filmstrip valueAtTime:1.5f] floatValue]).to.beCloseTo(((0.5f * 0.5f) * 0.1f) + 0.1f); + }); + + it(@"should use linear time for keyframes with no timing curve", ^{ + [filmstrip setValue:@(0.1f) atTime:1 withEasingFunction:IFTTTEasingFunctionEaseOutBounce]; + [filmstrip setValue:@(0.2f) atTime:2]; + [filmstrip setValue:@(0.3f) atTime:3]; + expect([(NSNumber *)[filmstrip valueAtTime:2.5f] floatValue]).to.beCloseTo(0.25f); + }); + + afterEach(^{ + filmstrip = nil; + }); +}); + +SpecEnd diff --git a/Example/JazzHandsTests/IFTTTInterpolatableSpec.m b/Example/JazzHandsTests/IFTTTInterpolatableSpec.m new file mode 100644 index 0000000..5d4925f --- /dev/null +++ b/Example/JazzHandsTests/IFTTTInterpolatableSpec.m @@ -0,0 +1,66 @@ +// +// IFTTTInterpolatableSpec.m +// JazzHandsDemo +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#define EXP_SHORTHAND +#import +#include +#include +#import + +SpecBegin(IFTTTInterpolatable) + +describe(@"IFTTTInterpolatable", ^{ + + it(@"should interpolate floats", ^{ + CGFloat floatBetween = [NSNumber interpolateCGFloatFrom:1.f to:2.f withProgress:0.5f]; + expect(floatBetween).to.beCloseTo(1.5f); + }); + + it(@"should interpolate numbers", ^{ + NSNumber *numberBetween = [@(1) interpolateTo:@(2) withProgress:0.5f]; + expect([numberBetween floatValue]).to.beCloseTo(1.5f); + }); + + it(@"should interpolate bools", ^{ + NSNumber *boolBetween = [@(NO) interpolateTo:@(YES) withProgress:0.5f]; + expect([boolBetween boolValue]).to.beTruthy; + }); + + it(@"should interpolate CGPoints", ^{ + CGPoint pointBetween = [NSValue interpolateCGPointFrom:CGPointMake(1.f, 10.f) to:CGPointMake(2.f, 20.f) withProgress:0.5f]; + expect(CGPointEqualToPoint(pointBetween, CGPointMake(1.5f, 15.f))).to.beTruthy; + }); + + it(@"should interpolate CGSizes", ^{ + CGSize sizeBetween = [NSValue interpolateCGSizeFrom:CGSizeMake(1.f, 10.f) to:CGSizeMake(2.f, 20.f) withProgress:0.5f]; + expect(CGSizeEqualToSize(sizeBetween, CGSizeMake(1.5f, 15.f))).to.beTruthy; + }); + + it(@"should interpolate CGRects", ^{ + CGRect rectBetween = [NSValue interpolateCGRectFrom:CGRectMake(1.f, 10.f, 100.f, 1000.f) to:CGRectMake(2.f, 20.f, 200.f, 2000.f) withProgress:0.5f]; + expect(CGRectEqualToRect(rectBetween, CGRectMake(1.5f, 15.f, 150.f, 1500.f))).to.beTruthy; + }); + + it(@"should interpolate CGPoint values", ^{ + NSValue *valueBetween = [[NSValue valueWithCGPoint:CGPointMake(1.f, 10.f)] interpolateTo:[NSValue valueWithCGPoint:CGPointMake(2.f, 20.f)] withProgress:0.5f]; + expect(CGPointEqualToPoint(valueBetween.CGPointValue, CGPointMake(1.5f, 15.f))).to.beTruthy; + }); + + it(@"should interpolate CGSize values", ^{ + NSValue *valueBetween = [[NSValue valueWithCGSize:CGSizeMake(1.f, 10.f)] interpolateTo:[NSValue valueWithCGSize:CGSizeMake(2.f, 20.f)] withProgress:0.5f]; + expect(CGSizeEqualToSize(valueBetween.CGSizeValue, CGSizeMake(1.5f, 15.f))).to.beTruthy; + }); + + it(@"should interpolate CGRect values", ^{ + NSValue *valueBetween = [[NSValue valueWithCGRect:CGRectMake(1.f, 10.f, 100.f, 1000.f)] interpolateTo:[NSValue valueWithCGRect:CGRectMake(2.f, 20.f, 200.f, 2000.f)] withProgress:0.5f]; + expect(CGRectEqualToRect(valueBetween.CGRectValue, CGRectMake(1.5f, 15.f, 150.f, 1500.f))).to.beTruthy; + }); + +}); + +SpecEnd diff --git a/Example/JazzHandsTests/JazzHandsTests.m b/Example/JazzHandsTests/JazzHandsTests.m deleted file mode 100644 index a1ee5f1..0000000 --- a/Example/JazzHandsTests/JazzHandsTests.m +++ /dev/null @@ -1,124 +0,0 @@ -// -// JazzHandsTests.m -// JazzHandsTests -// -// Created by Devin Foley on 9/27/13. -// Copyright (c) 2013 IFTTT Inc. All rights reserved. -// - -#import -#import -#import -#import - -#import "IFTTTJazzHandsAppDelegate.h" -#import "IFTTTJazzHandsViewController.h" - -@interface JazzHandsTests : FBSnapshotTestCase - -@property (nonatomic, weak, readonly) IFTTTJazzHandsViewController *rootViewController; -@property (nonatomic, weak, readonly) UIScrollView *rootScrollView; - -@end - -@implementation JazzHandsTests -{ - IFTTTAnimator *animator; -} - -#pragma mark - Test scaffolding - -- (void)setUp -{ - [super setUp]; - - animator = [IFTTTAnimator new]; - - // Enable recording mode to record and save reference images for tests -// self.recordMode = YES; -} - -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -CG_INLINE UIScrollView *IFTTTTestScrollView() -{ - IFTTTJazzHandsAppDelegate *delegate = (IFTTTJazzHandsAppDelegate *)[UIApplication sharedApplication].delegate; - return ((IFTTTJazzHandsViewController *)delegate.window.rootViewController).scrollView; -} - -- (void)IFTTTResetScrollOffset -{ - [tester swipeViewWithAccessibilityLabel:@"JazzHands" inDirection:KIFSwipeDirectionRight]; -} - -- (void)IFTTTScrollByPageOffset:(CGFloat)pageOffset -{ - CGFloat fullWidth = IFTTTTestScrollView().contentSize.width; - CGFloat pageSize = CGRectGetWidth(IFTTTTestScrollView().bounds); - - pageSize *= pageOffset; - - CGFloat sizeFraction = pageSize / fullWidth; - - [tester scrollViewWithAccessibilityIdentifier:@"JazzHands" byFractionOfSizeHorizontal:-sizeFraction vertical:0]; -} - -#pragma mark - Logic tests - -- (void)testInitializable -{ - XCTAssertNotNil(animator, @"Animator should be initializable"); -} - -#pragma mark - Dimensions tests - -- (void)testPhone6DeviceDimensions -{ - // Note: screenshots are made for iPhone 6 Simulator which has - // 2.0 screen scale and 320x568 dimensions. - - UIScrollView *scrollView = IFTTTTestScrollView(); - - XCTAssert(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone, @""); - XCTAssertEqualWithAccuracy([[UIScreen mainScreen] nativeScale], 2.0f, FLT_EPSILON, @""); - XCTAssertEqualWithAccuracy(CGRectGetWidth(scrollView.frame), 320.0f, FLT_EPSILON, @""); - XCTAssertEqualWithAccuracy(CGRectGetHeight(scrollView.frame), 568.0f, FLT_EPSILON, @""); -} - -#pragma mark - Snapshot tests - -- (void)testInitialScreenSnapshot -{ - [self IFTTTResetScrollOffset]; - FBSnapshotVerifyView(IFTTTTestScrollView().superview, nil); -} - -- (void)testFirstPageSnapshot -{ - [self IFTTTResetScrollOffset]; - [self IFTTTScrollByPageOffset:1.f]; - FBSnapshotVerifyView(IFTTTTestScrollView().superview, nil); -} - -- (void)testSecondPageSnapshot -{ - [self IFTTTResetScrollOffset]; - [self IFTTTScrollByPageOffset:1.f]; - [self IFTTTScrollByPageOffset:1.f]; - FBSnapshotVerifyView(IFTTTTestScrollView().superview, nil); -} - -- (void)testThirdPageSnapshot -{ - [self IFTTTResetScrollOffset]; - [self IFTTTScrollByPageOffset:1.f]; - [self IFTTTScrollByPageOffset:1.f]; - [self IFTTTScrollByPageOffset:1.f]; - FBSnapshotVerifyView(IFTTTTestScrollView().superview, nil); -} - -@end diff --git a/Example/Podfile b/Example/Podfile index d69fc43..93f10fc 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -14,6 +14,6 @@ end target :JazzHandsTests, :exclusive => true do install_pods - pod 'KIF' - pod 'FBSnapshotTestCase' + pod 'Specta' + pod 'Expecta' end diff --git a/Example/Podfile.lock b/Example/Podfile.lock index a8f22a5..26205df 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,22 +1,20 @@ PODS: - - FBSnapshotTestCase (1.6) - - JazzHands (0.2.1) - - KIF (3.2.1): - - KIF/XCTest (= 3.2.1) - - KIF/XCTest (3.2.1) + - Expecta (1.0.0) + - JazzHands (2.0.0) + - Specta (1.0.2) DEPENDENCIES: - - FBSnapshotTestCase + - Expecta - JazzHands (from `../JazzHands.podspec`) - - KIF + - Specta EXTERNAL SOURCES: JazzHands: :path: ../JazzHands.podspec SPEC CHECKSUMS: - FBSnapshotTestCase: 9d5fe43b29ae3a0ed8fc829477971b281038f748 - JazzHands: d2343c3f2f9d70598d0cad8f521ce3893842a44a - KIF: ef1691e54e1d969c3b4fd0b5b56a3d7ddf37f216 + Expecta: 32604574add2c46a36f8d2f716b6c5736eb75024 + JazzHands: 00002e9b1284e7fc1ac6555012e81b8942477242 + Specta: 9cec98310dca411f7c7ffd6943552b501622abfe COCOAPODS: 0.37.2 diff --git a/Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.h b/Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.h new file mode 100644 index 0000000..58b1282 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.h @@ -0,0 +1,25 @@ +// +// EXPRuntimeMatcher.h +// Expecta +// +// Created by Luke Redpath on 26/03/2012. +// Copyright (c) 2012 Peter Jihoon Kim. All rights reserved. +// + +#import +#import "EXPMatcher.h" +#import "EXPDefines.h" + +@interface EXPBlockDefinedMatcher : NSObject { + EXPBoolBlock prerequisiteBlock; + EXPBoolBlock matchBlock; + EXPStringBlock failureMessageForToBlock; + EXPStringBlock failureMessageForNotToBlock; +} + +@property(nonatomic, copy) EXPBoolBlock prerequisiteBlock; +@property(nonatomic, copy) EXPBoolBlock matchBlock; +@property(nonatomic, copy) EXPStringBlock failureMessageForToBlock; +@property(nonatomic, copy) EXPStringBlock failureMessageForNotToBlock; + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.m b/Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.m new file mode 100644 index 0000000..89bba37 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.m @@ -0,0 +1,60 @@ +// +// EXPRuntimeMatcher.m +// Expecta +// +// Created by Luke Redpath on 26/03/2012. +// Copyright (c) 2012 Peter Jihoon Kim. All rights reserved. +// + +#import "EXPBlockDefinedMatcher.h" + +@implementation EXPBlockDefinedMatcher + +- (void)dealloc +{ + self.prerequisiteBlock = nil; + self.matchBlock = nil; + self.failureMessageForToBlock = nil; + self.failureMessageForNotToBlock = nil; + + [super dealloc]; +} + +@synthesize prerequisiteBlock; +@synthesize matchBlock; +@synthesize failureMessageForToBlock; +@synthesize failureMessageForNotToBlock; + +- (BOOL)meetsPrerequesiteFor:(id)actual +{ + if (self.prerequisiteBlock) { + return self.prerequisiteBlock(); + } + return YES; +} + +- (BOOL)matches:(id)actual +{ + if (self.matchBlock) { + return self.matchBlock(); + } + return YES; +} + +- (NSString *)failureMessageForTo:(id)actual +{ + if (self.failureMessageForToBlock) { + return self.failureMessageForToBlock(); + } + return nil; +} + +- (NSString *)failureMessageForNotTo:(id)actual +{ + if (self.failureMessageForNotToBlock) { + return self.failureMessageForNotToBlock(); + } + return nil; +} + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPDefines.h b/Example/Pods/Expecta/Expecta/EXPDefines.h new file mode 100644 index 0000000..52af721 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPDefines.h @@ -0,0 +1,17 @@ +// +// EXPDefines.h +// Expecta +// +// Created by Luke Redpath on 26/03/2012. +// Copyright (c) 2012 Peter Jihoon Kim. All rights reserved. +// + +#ifndef Expecta_EXPDefines_h +#define Expecta_EXPDefines_h + +typedef void (^EXPBasicBlock)(); +typedef id (^EXPIdBlock)(); +typedef BOOL (^EXPBoolBlock)(); +typedef NSString *(^EXPStringBlock)(); + +#endif diff --git a/Example/Pods/Expecta/Expecta/EXPDoubleTuple.h b/Example/Pods/Expecta/Expecta/EXPDoubleTuple.h new file mode 100644 index 0000000..4bd231c --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPDoubleTuple.h @@ -0,0 +1,13 @@ +#import + +@interface EXPDoubleTuple : NSObject { + double *_values; + size_t _size; +} + +@property (nonatomic, assign) double *values; +@property (nonatomic, assign) size_t size; + +- (instancetype)initWithDoubleValues:(double *)values size:(size_t)size NS_DESIGNATED_INITIALIZER; + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPDoubleTuple.m b/Example/Pods/Expecta/Expecta/EXPDoubleTuple.m new file mode 100644 index 0000000..829e354 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPDoubleTuple.m @@ -0,0 +1,42 @@ +#import "EXPDoubleTuple.h" + +@implementation EXPDoubleTuple + +@synthesize values = _values, size = _size; + +- (instancetype)initWithDoubleValues:(double *)values size:(size_t)size { + if ((self = [super init])) { + self.values = malloc(sizeof(double) * size); + memcpy(self.values, values, sizeof(double) * size); + self.size = size; + } + return self; +} + +- (void)dealloc { + free(self.values); + [super dealloc]; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[EXPDoubleTuple class]]) return NO; + EXPDoubleTuple *other = (EXPDoubleTuple *)object; + if (self.size == other.size) { + for (int i = 0; i < self.size; ++i) { + if (self.values[i] != other.values[i]) return NO; + } + return YES; + } + return NO; +} + +- (NSString *)description { + if (self.size == 2) { + return [NSString stringWithFormat:@"Double tuple: {%f, %f}", self.values[0], self.values[1]]; + } else if (self.size == 4) { + return [NSString stringWithFormat:@"Double tuple: {%f, %f, %f, %f}", self.values[0], self.values[1], self.values[2], self.values[3]]; + } + return [NSString stringWithFormat:@"Double tuple of unexpected size %zd, sadly", self.size]; +} + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPExpect.h b/Example/Pods/Expecta/Expecta/EXPExpect.h new file mode 100644 index 0000000..985c120 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPExpect.h @@ -0,0 +1,45 @@ +#import +#import "EXPMatcher.h" +#import "EXPDefines.h" + +@interface EXPExpect : NSObject { + EXPIdBlock _actualBlock; + id _testCase; + int _lineNumber; + char *_fileName; + BOOL _negative; + BOOL _asynchronous; + NSTimeInterval _timeout; +} + +@property(nonatomic, copy) EXPIdBlock actualBlock; +@property(nonatomic, readonly) id actual; +@property(nonatomic, assign) id testCase; +@property(nonatomic) int lineNumber; +@property(nonatomic) const char *fileName; +@property(nonatomic) BOOL negative; +@property(nonatomic) BOOL asynchronous; +@property(nonatomic) NSTimeInterval timeout; + +@property(nonatomic, readonly) EXPExpect *to; +@property(nonatomic, readonly) EXPExpect *toNot; +@property(nonatomic, readonly) EXPExpect *notTo; +@property(nonatomic, readonly) EXPExpect *will; +@property(nonatomic, readonly) EXPExpect *willNot; +@property(nonatomic, readonly) EXPExpect *(^after)(NSTimeInterval timeInterval); + +- (instancetype)initWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName NS_DESIGNATED_INITIALIZER; ++ (EXPExpect *)expectWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName; + +- (void)applyMatcher:(id)matcher; +- (void)applyMatcher:(id)matcher to:(NSObject **)actual; + +@end + +@interface EXPDynamicPredicateMatcher : NSObject { + EXPExpect *_expectation; + SEL _selector; +} +- (instancetype)initWithExpectation:(EXPExpect *)expectation selector:(SEL)selector NS_DESIGNATED_INITIALIZER; +@property (nonatomic, readonly, copy) void (^dispatch)(void); +@end diff --git a/Example/Pods/Expecta/Expecta/EXPExpect.m b/Example/Pods/Expecta/Expecta/EXPExpect.m new file mode 100644 index 0000000..729794d --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPExpect.m @@ -0,0 +1,214 @@ +#import "EXPExpect.h" +#import "NSObject+Expecta.h" +#import "Expecta.h" +#import "EXPUnsupportedObject.h" +#import "EXPMatcher.h" +#import "EXPBlockDefinedMatcher.h" +#import + +@implementation EXPExpect + +@dynamic + actual, + to, + toNot, + notTo, + will, + willNot, + after; + +@synthesize + actualBlock=_actualBlock, + testCase=_testCase, + negative=_negative, + asynchronous=_asynchronous, + timeout=_timeout, + lineNumber=_lineNumber, + fileName=_fileName; + +- (instancetype)initWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName { + self = [super init]; + if(self) { + self.actualBlock = actualBlock; + self.testCase = testCase; + self.negative = NO; + self.asynchronous = NO; + self.timeout = [Expecta asynchronousTestTimeout]; + self.lineNumber = lineNumber; + self.fileName = fileName; + } + return self; +} + +- (void)dealloc +{ + _actualBlock = nil; + [super dealloc]; +} + ++ (EXPExpect *)expectWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName { + return [[[EXPExpect alloc] initWithActualBlock:actualBlock testCase:(id)testCase lineNumber:lineNumber fileName:fileName] autorelease]; +} + +#pragma mark - + +- (EXPExpect *)to { + return self; +} + +- (EXPExpect *)toNot { + self.negative = !self.negative; + return self; +} + +- (EXPExpect *)notTo { + return [self toNot]; +} + +- (EXPExpect *)will { + self.asynchronous = YES; + return self; +} + +- (EXPExpect *)willNot { + return self.will.toNot; +} + +- (EXPExpect *(^)(NSTimeInterval))after +{ + EXPExpect * (^block)(NSTimeInterval) = [^EXPExpect *(NSTimeInterval timeout) { + self.asynchronous = YES; + self.timeout = timeout; + return self; + } copy]; + + return [block autorelease]; +} + +#pragma mark - + +- (id)actual { + if(self.actualBlock) { + return self.actualBlock(); + } + return nil; +} + +- (void)applyMatcher:(id)matcher +{ + id actual = [self actual]; + [self applyMatcher:matcher to:&actual]; +} + +- (void)applyMatcher:(id)matcher to:(NSObject **)actual { + if([*actual isKindOfClass:[EXPUnsupportedObject class]]) { + EXPFail(self.testCase, self.lineNumber, self.fileName, + [NSString stringWithFormat:@"expecting a %@ is not supported", ((EXPUnsupportedObject *)*actual).type]); + } else { + BOOL failed = NO; + if([matcher respondsToSelector:@selector(meetsPrerequesiteFor:)] && + ![matcher meetsPrerequesiteFor:*actual]) { + failed = YES; + } else { + BOOL matchResult = NO; + if(self.asynchronous) { + NSTimeInterval timeOut = self.timeout; + NSDate *expiryDate = [NSDate dateWithTimeIntervalSinceNow:timeOut]; + while(1) { + matchResult = [matcher matches:*actual]; + failed = self.negative ? matchResult : !matchResult; + if(!failed || ([(NSDate *)[NSDate date] compare:expiryDate] == NSOrderedDescending)) { + break; + } + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; + OSMemoryBarrier(); + *actual = self.actual; + } + } else { + matchResult = [matcher matches:*actual]; + } + failed = self.negative ? matchResult : !matchResult; + } + if(failed) { + NSString *message = nil; + + if(self.negative) { + if ([matcher respondsToSelector:@selector(failureMessageForNotTo:)]) { + message = [matcher failureMessageForNotTo:*actual]; + } + } else { + if ([matcher respondsToSelector:@selector(failureMessageForTo:)]) { + message = [matcher failureMessageForTo:*actual]; + } + } + if (message == nil) { + message = @"Match Failed."; + } + + EXPFail(self.testCase, self.lineNumber, self.fileName, message); + } + } + self.negative = NO; +} + +#pragma mark - Dynamic predicate dispatch + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector +{ + if ([self.actual respondsToSelector:aSelector]) { + return [self.actual methodSignatureForSelector:aSelector]; + } + return [super methodSignatureForSelector:aSelector]; +} + +- (void)forwardInvocation:(NSInvocation *)anInvocation +{ + if ([self.actual respondsToSelector:anInvocation.selector]) { + EXPDynamicPredicateMatcher *matcher = [[EXPDynamicPredicateMatcher alloc] initWithExpectation:self selector:anInvocation.selector]; + [anInvocation setSelector:@selector(dispatch)]; + [anInvocation invokeWithTarget:matcher]; + [matcher release]; + } + else { + [super forwardInvocation:anInvocation]; + } +} + +@end + +@implementation EXPDynamicPredicateMatcher + +- (instancetype)initWithExpectation:(EXPExpect *)expectation selector:(SEL)selector +{ + if ((self = [super init])) { + _expectation = expectation; + _selector = selector; + } + return self; +} + +- (BOOL)matches:(id)actual +{ + return (BOOL)[actual performSelector:_selector]; +} + +- (NSString *)failureMessageForTo:(id)actual +{ + return [NSString stringWithFormat:@"expected %@ to be true", NSStringFromSelector(_selector)]; +} + +- (NSString *)failureMessageForNotTo:(id)actual +{ + return [NSString stringWithFormat:@"expected %@ to be false", NSStringFromSelector(_selector)]; +} + +- (void (^)(void))dispatch +{ + __block id blockExpectation = _expectation; + + return [[^{ + [blockExpectation applyMatcher:self]; + } copy] autorelease]; +} + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPFloatTuple.h b/Example/Pods/Expecta/Expecta/EXPFloatTuple.h new file mode 100644 index 0000000..ea8ee81 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPFloatTuple.h @@ -0,0 +1,13 @@ +#import + +@interface EXPFloatTuple : NSObject { + float *_values; + size_t _size; +} + +@property (nonatomic, assign) float *values; +@property (nonatomic, assign) size_t size; + +- (instancetype)initWithFloatValues:(float *)values size:(size_t)size NS_DESIGNATED_INITIALIZER; + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPFloatTuple.m b/Example/Pods/Expecta/Expecta/EXPFloatTuple.m new file mode 100644 index 0000000..8e8505b --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPFloatTuple.m @@ -0,0 +1,52 @@ +#import "EXPFloatTuple.h" + +@implementation EXPFloatTuple + +@synthesize values = _values, size = _size; + +- (instancetype)initWithFloatValues:(float *)values size:(size_t)size { + if ((self = [super init])) { + self.values = malloc(sizeof(float) * size); + memcpy(self.values, values, sizeof(float) * size); + self.size = size; + } + return self; +} + +- (void)dealloc { + free(self.values); + [super dealloc]; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[EXPFloatTuple class]]) return NO; + EXPFloatTuple *other = (EXPFloatTuple *)object; + if (self.size == other.size) { + for (int i = 0; i < self.size; ++i) { + if (self.values[i] != other.values[i]) return NO; + } + return YES; + } + return NO; +} + +- (NSUInteger)hash +{ + NSUInteger prime = 31; + NSUInteger hash = 0; + for (int i=0; i + +@protocol EXPMatcher + +- (BOOL)matches:(id)actual; + +@optional +- (BOOL)meetsPrerequesiteFor:(id)actual; +- (NSString *)failureMessageForTo:(id)actual; +- (NSString *)failureMessageForNotTo:(id)actual; + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPUnsupportedObject.h b/Example/Pods/Expecta/Expecta/EXPUnsupportedObject.h new file mode 100644 index 0000000..3ad0561 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPUnsupportedObject.h @@ -0,0 +1,11 @@ +#import + +@interface EXPUnsupportedObject : NSObject { + NSString *_type; +} + +@property (nonatomic, retain) NSString *type; + +- (instancetype)initWithType:(NSString *)type NS_DESIGNATED_INITIALIZER; + +@end diff --git a/Example/Pods/Expecta/Expecta/EXPUnsupportedObject.m b/Example/Pods/Expecta/Expecta/EXPUnsupportedObject.m new file mode 100644 index 0000000..4312bef --- /dev/null +++ b/Example/Pods/Expecta/Expecta/EXPUnsupportedObject.m @@ -0,0 +1,20 @@ +#import "EXPUnsupportedObject.h" + +@implementation EXPUnsupportedObject + +@synthesize type=_type; + +- (instancetype)initWithType:(NSString *)type { + self = [super init]; + if(self) { + self.type = type; + } + return self; +} + +- (void)dealloc { + self.type = nil; + [super dealloc]; +} + +@end diff --git a/Example/Pods/Expecta/Expecta/Expecta.h b/Example/Pods/Expecta/Expecta/Expecta.h new file mode 100644 index 0000000..6e5188e --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Expecta.h @@ -0,0 +1,15 @@ +#import + +//! Project version number for Expecta. +FOUNDATION_EXPORT double ExpectaVersionNumber; + +//! Project version string for Expecta. +FOUNDATION_EXPORT const unsigned char ExpectaVersionString[]; + +#import +#import +#import + +// Enable shorthand by default +#define expect(...) EXP_expect((__VA_ARGS__)) +#define failure(...) EXP_failure((__VA_ARGS__)) \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/ExpectaObject.h b/Example/Pods/Expecta/Expecta/ExpectaObject.h new file mode 100644 index 0000000..ef2a38a --- /dev/null +++ b/Example/Pods/Expecta/Expecta/ExpectaObject.h @@ -0,0 +1,18 @@ +#import + +#define EXPObjectify(value) _EXPObjectify(@encode(__typeof__((value))), (value)) +#define EXP_expect(actual) _EXP_expect(self, __LINE__, __FILE__, ^id{ return EXPObjectify((actual)); }) +#define EXPMatcherInterface(matcherName, matcherArguments) _EXPMatcherInterface(matcherName, matcherArguments) +#define EXPMatcherImplementationBegin(matcherName, matcherArguments) _EXPMatcherImplementationBegin(matcherName, matcherArguments) +#define EXPMatcherImplementationEnd _EXPMatcherImplementationEnd +#define EXPMatcherAliasImplementation(newMatcherName, oldMatcherName, matcherArguments) _EXPMatcherAliasImplementation(newMatcherName, oldMatcherName, matcherArguments) + +#define EXP_failure(message) EXPFail(self, __LINE__, __FILE__, message) + + +@interface Expecta : NSObject + ++ (NSTimeInterval)asynchronousTestTimeout; ++ (void)setAsynchronousTestTimeout:(NSTimeInterval)timeout; + +@end diff --git a/Example/Pods/Expecta/Expecta/ExpectaObject.m b/Example/Pods/Expecta/Expecta/ExpectaObject.m new file mode 100644 index 0000000..b51e00a --- /dev/null +++ b/Example/Pods/Expecta/Expecta/ExpectaObject.m @@ -0,0 +1,15 @@ +#import "ExpectaObject.h" + +@implementation Expecta + +static NSTimeInterval _asynchronousTestTimeout = 1.0; + ++ (NSTimeInterval)asynchronousTestTimeout { + return _asynchronousTestTimeout; +} + ++ (void)setAsynchronousTestTimeout:(NSTimeInterval)timeout { + _asynchronousTestTimeout = timeout; +} + +@end \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/ExpectaSupport.h b/Example/Pods/Expecta/Expecta/ExpectaSupport.h new file mode 100644 index 0000000..fb0ef4f --- /dev/null +++ b/Example/Pods/Expecta/Expecta/ExpectaSupport.h @@ -0,0 +1,73 @@ +#import "EXPExpect.h" +#import "EXPBlockDefinedMatcher.h" + +#ifdef __cplusplus +extern "C" { +#endif + +id _EXPObjectify(const char *type, ...); +EXPExpect *_EXP_expect(id testCase, int lineNumber, const char *fileName, EXPIdBlock actualBlock); + +void EXPFail(id testCase, int lineNumber, const char *fileName, NSString *message); +NSString *EXPDescribeObject(id obj); + +void EXP_prerequisite(EXPBoolBlock block); +void EXP_match(EXPBoolBlock block); +void EXP_failureMessageForTo(EXPStringBlock block); +void EXP_failureMessageForNotTo(EXPStringBlock block); + +#if __has_feature(objc_arc) +#define _EXP_release(x) +#define _EXP_autorelease(x) (x) + +#else +#define _EXP_release(x) [x release] +#define _EXP_autorelease(x) [x autorelease] +#endif + +// workaround for the categories bug: http://developer.apple.com/library/mac/#qa/qa1490/_index.html +#define EXPFixCategoriesBug(name) \ +__attribute__((constructor)) static void EXPFixCategoriesBug##name() {} + +#define _EXPMatcherInterface(matcherName, matcherArguments) \ +@interface EXPExpect (matcherName##Matcher) \ +@property (nonatomic, readonly) void(^ matcherName) matcherArguments; \ +@end + +#define _EXPMatcherImplementationBegin(matcherName, matcherArguments) \ +EXPFixCategoriesBug(EXPMatcher##matcherName##Matcher); \ +@implementation EXPExpect (matcherName##Matcher) \ +@dynamic matcherName;\ +- (void(^) matcherArguments) matcherName { \ + EXPBlockDefinedMatcher *matcher = [[EXPBlockDefinedMatcher alloc] init]; \ + [[[NSThread currentThread] threadDictionary] setObject:matcher forKey:@"EXP_currentMatcher"]; \ + __block id actual = self.actual; \ + __block void (^prerequisite)(EXPBoolBlock block) = ^(EXPBoolBlock block) { EXP_prerequisite(block); }; \ + __block void (^match)(EXPBoolBlock block) = ^(EXPBoolBlock block) { EXP_match(block); }; \ + __block void (^failureMessageForTo)(EXPStringBlock block) = ^(EXPStringBlock block) { EXP_failureMessageForTo(block); }; \ + __block void (^failureMessageForNotTo)(EXPStringBlock block) = ^(EXPStringBlock block) { EXP_failureMessageForNotTo(block); }; \ + prerequisite(nil); match(nil); failureMessageForTo(nil); failureMessageForNotTo(nil); \ + void (^matcherBlock) matcherArguments = [^ matcherArguments { \ + { + +#define _EXPMatcherImplementationEnd \ + } \ + [self applyMatcher:matcher to:&actual]; \ + } copy]; \ + _EXP_release(matcher); \ + return _EXP_autorelease(matcherBlock); \ +} \ +@end + +#define _EXPMatcherAliasImplementation(newMatcherName, oldMatcherName, matcherArguments) \ +EXPFixCategoriesBug(EXPMatcher##newMatcherName##Matcher); \ +@implementation EXPExpect (newMatcherName##Matcher) \ +@dynamic newMatcherName;\ +- (void(^) matcherArguments) newMatcherName { \ + return [self oldMatcherName]; \ +}\ +@end + +#ifdef __cplusplus +} +#endif diff --git a/Example/Pods/Expecta/Expecta/ExpectaSupport.m b/Example/Pods/Expecta/Expecta/ExpectaSupport.m new file mode 100644 index 0000000..8abe415 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/ExpectaSupport.m @@ -0,0 +1,176 @@ +#import "ExpectaSupport.h" +#import "NSValue+Expecta.h" +#import "NSObject+Expecta.h" +#import "EXPUnsupportedObject.h" +#import "EXPFloatTuple.h" +#import "EXPDoubleTuple.h" +#import "EXPDefines.h" +#import + +@interface NSObject (ExpectaXCTestRecordFailure) + +// suppress warning +- (void)recordFailureWithDescription:(NSString *)description inFile:(NSString *)filename atLine:(NSUInteger)lineNumber expected:(BOOL)expected; + +@end + +id _EXPObjectify(const char *type, ...) { + va_list v; + va_start(v, type); + id obj = nil; + if(strcmp(type, @encode(char)) == 0) { + char actual = (char)va_arg(v, int); + obj = @(actual); + } else if(strcmp(type, @encode(_Bool)) == 0) { + _Static_assert(sizeof(_Bool) <= sizeof(int), "Expected _Bool to be subject to vararg type promotion"); + _Bool actual = (_Bool)va_arg(v, int); + obj = @(actual); + } else if(strcmp(type, @encode(double)) == 0) { + double actual = (double)va_arg(v, double); + obj = @(actual); + } else if(strcmp(type, @encode(float)) == 0) { + float actual = (float)va_arg(v, double); + obj = @(actual); + } else if(strcmp(type, @encode(int)) == 0) { + int actual = (int)va_arg(v, int); + obj = @(actual); + } else if(strcmp(type, @encode(long)) == 0) { + long actual = (long)va_arg(v, long); + obj = @(actual); + } else if(strcmp(type, @encode(long long)) == 0) { + long long actual = (long long)va_arg(v, long long); + obj = @(actual); + } else if(strcmp(type, @encode(short)) == 0) { + short actual = (short)va_arg(v, int); + obj = @(actual); + } else if(strcmp(type, @encode(unsigned char)) == 0) { + unsigned char actual = (unsigned char)va_arg(v, unsigned int); + obj = @(actual); + } else if(strcmp(type, @encode(unsigned int)) == 0) { + unsigned int actual = (int)va_arg(v, unsigned int); + obj = @(actual); + } else if(strcmp(type, @encode(unsigned long)) == 0) { + unsigned long actual = (unsigned long)va_arg(v, unsigned long); + obj = @(actual); + } else if(strcmp(type, @encode(unsigned long long)) == 0) { + unsigned long long actual = (unsigned long long)va_arg(v, unsigned long long); + obj = @(actual); + } else if(strcmp(type, @encode(unsigned short)) == 0) { + unsigned short actual = (unsigned short)va_arg(v, unsigned int); + obj = @(actual); + } else if(strstr(type, @encode(EXPBasicBlock)) != NULL) { + // @encode(EXPBasicBlock) returns @? as of clang 4.1. + // This condition must occur before the test for id/class type, + // otherwise blocks will be treated as vanilla objects. + id actual = va_arg(v, EXPBasicBlock); + obj = [[actual copy] autorelease]; + } else if((strstr(type, @encode(id)) != NULL) || (strstr(type, @encode(Class)) != 0)) { + id actual = va_arg(v, id); + obj = actual; + } else if(strcmp(type, @encode(__typeof__(nil))) == 0) { + obj = nil; + } else if(strstr(type, "ff}{") != NULL) { //TODO: of course this only works for a 2x2 e.g. CGRect + obj = [[[EXPFloatTuple alloc] initWithFloatValues:(float *)va_arg(v, float[4]) size:4] autorelease]; + } else if(strstr(type, "=ff}") != NULL) { + obj = [[[EXPFloatTuple alloc] initWithFloatValues:(float *)va_arg(v, float[2]) size:2] autorelease]; + } else if(strstr(type, "=ffff}") != NULL) { + obj = [[[EXPFloatTuple alloc] initWithFloatValues:(float *)va_arg(v, float[4]) size:4] autorelease]; + } else if(strstr(type, "dd}{") != NULL) { //TODO: same here + obj = [[[EXPDoubleTuple alloc] initWithDoubleValues:(double *)va_arg(v, double[4]) size:4] autorelease]; + } else if(strstr(type, "=dd}") != NULL) { + obj = [[[EXPDoubleTuple alloc] initWithDoubleValues:(double *)va_arg(v, double[2]) size:2] autorelease]; + } else if(strstr(type, "=dddd}") != NULL) { + obj = [[[EXPDoubleTuple alloc] initWithDoubleValues:(double *)va_arg(v, double[4]) size:4] autorelease]; + } else if(type[0] == '{') { + EXPUnsupportedObject *actual = [[[EXPUnsupportedObject alloc] initWithType:@"struct"] autorelease]; + obj = actual; + } else if(type[0] == '(') { + EXPUnsupportedObject *actual = [[[EXPUnsupportedObject alloc] initWithType:@"union"] autorelease]; + obj = actual; + } else { + void *actual = va_arg(v, void *); + obj = (actual == NULL ? nil :[NSValue valueWithPointer:actual]); + } + if([obj isKindOfClass:[NSValue class]] && ![obj isKindOfClass:[NSNumber class]]) { + [(NSValue *)obj set_EXP_objCType:type]; + } + va_end(v); + return obj; +} + +EXPExpect *_EXP_expect(id testCase, int lineNumber, const char *fileName, EXPIdBlock actualBlock) { + return [EXPExpect expectWithActualBlock:actualBlock testCase:testCase lineNumber:lineNumber fileName:fileName]; +} + +void EXPFail(id testCase, int lineNumber, const char *fileName, NSString *message) { + NSLog(@"%s:%d %@", fileName, lineNumber, message); + NSString *reason = [NSString stringWithFormat:@"%s:%d %@", fileName, lineNumber, message]; + NSException *exception = [NSException exceptionWithName:@"Expecta Error" reason:reason userInfo:nil]; + + if(testCase && [testCase respondsToSelector:@selector(recordFailureWithDescription:inFile:atLine:expected:)]){ + [testCase recordFailureWithDescription:message + inFile:@(fileName) + atLine:lineNumber + expected:NO]; + } else { + [exception raise]; + } +} + +NSString *EXPDescribeObject(id obj) { + if(obj == nil) { + return @"nil/null"; + } else if([obj isKindOfClass:[NSValue class]] && ![obj isKindOfClass:[NSNumber class]]) { + const char *type = [(NSValue *)obj _EXP_objCType]; + if(type) { + if(strcmp(type, @encode(SEL)) == 0) { + return [NSString stringWithFormat:@"@selector(%@)", NSStringFromSelector([obj pointerValue])]; + } else if(strcmp(type, @encode(Class)) == 0) { + return NSStringFromClass([obj pointerValue]); + } + } + } + NSString *description = [obj description]; + if([obj isKindOfClass:[NSArray class]]) { + NSMutableArray *arr = [NSMutableArray arrayWithCapacity:[obj count]]; + for(id o in obj) { + [arr addObject:EXPDescribeObject(o)]; + } + description = [NSString stringWithFormat:@"(%@)", [arr componentsJoinedByString:@", "]]; + } else if([obj isKindOfClass:[NSSet class]] || [obj isKindOfClass:[NSOrderedSet class]]) { + NSMutableArray *arr = [NSMutableArray arrayWithCapacity:[obj count]]; + for(id o in obj) { + [arr addObject:EXPDescribeObject(o)]; + } + description = [NSString stringWithFormat:@"{(%@)}", [arr componentsJoinedByString:@", "]]; + } else if([obj isKindOfClass:[NSDictionary class]]) { + NSMutableArray *arr = [NSMutableArray arrayWithCapacity:[obj count]]; + for(id k in obj) { + id v = obj[k]; + [arr addObject:[NSString stringWithFormat:@"%@ = %@;",EXPDescribeObject(k), EXPDescribeObject(v)]]; + } + description = [NSString stringWithFormat:@"{%@}", [arr componentsJoinedByString:@" "]]; + } else if([obj isKindOfClass:[NSAttributedString class]]) { + description = [obj string]; + } else { + description = [description stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]; + } + return description; +} + +void EXP_prerequisite(EXPBoolBlock block) { + [[[NSThread currentThread] threadDictionary][@"EXP_currentMatcher"] setPrerequisiteBlock:block]; +} + +void EXP_match(EXPBoolBlock block) { + [[[NSThread currentThread] threadDictionary][@"EXP_currentMatcher"] setMatchBlock:block]; +} + +void EXP_failureMessageForTo(EXPStringBlock block) { + [[[NSThread currentThread] threadDictionary][@"EXP_currentMatcher"] setFailureMessageForToBlock:block]; +} + +void EXP_failureMessageForNotTo(EXPStringBlock block) { + [[[NSThread currentThread] threadDictionary][@"EXP_currentMatcher"] setFailureMessageForNotToBlock:block]; +} + diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.h new file mode 100644 index 0000000..5780ff6 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.h @@ -0,0 +1,4 @@ +#import + +BOOL EXPIsValuePointer(NSValue *value); +BOOL EXPIsNumberFloat(NSNumber *number); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.m new file mode 100644 index 0000000..cec0343 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.m @@ -0,0 +1,9 @@ +#import "EXPMatcherHelpers.h" + +BOOL EXPIsValuePointer(NSValue *value) { + return [value objCType][0] == @encode(void *)[0]; +} + +BOOL EXPIsNumberFloat(NSNumber *number) { + return strcmp([number objCType], @encode(float)) == 0; +} diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.h new file mode 100644 index 0000000..f683d6b --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.h @@ -0,0 +1,7 @@ +#import "Expecta.h" + +EXPMatcherInterface(_beCloseToWithin, (id expected, id within)); +EXPMatcherInterface(beCloseToWithin, (id expected, id within)); + +#define beCloseTo(expected) _beCloseToWithin(EXPObjectify((expected)), nil) +#define beCloseToWithin(expected, range) _beCloseToWithin(EXPObjectify((expected)), EXPObjectify((range))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.m new file mode 100644 index 0000000..c55431a --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.m @@ -0,0 +1,49 @@ +#import "EXPMatchers+beCloseTo.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_beCloseToWithin, (id expected, id within)) { + prerequisite(^BOOL{ + return [actual isKindOfClass:[NSNumber class]] && + [expected isKindOfClass:[NSNumber class]] && + ([within isKindOfClass:[NSNumber class]] || (within == nil)); + }); + + match(^BOOL{ + double actualValue = [actual doubleValue]; + double expectedValue = [expected doubleValue]; + + if (within != nil) { + double withinValue = [within doubleValue]; + double lowerBound = expectedValue - withinValue; + double upperBound = expectedValue + withinValue; + return (actualValue >= lowerBound) && (actualValue <= upperBound); + } else { + double diff = fabs(actualValue - expectedValue); + actualValue = fabs(actualValue); + expectedValue = fabs(expectedValue); + double largest = (expectedValue > actualValue) ? expectedValue : actualValue; + return (diff <= largest * FLT_EPSILON); + } + }); + + failureMessageForTo(^NSString *{ + if (within) { + return [NSString stringWithFormat:@"expected %@ to be close to %@ within %@", + EXPDescribeObject(actual), EXPDescribeObject(expected), EXPDescribeObject(within)]; + } else { + return [NSString stringWithFormat:@"expected %@ to be close to %@", + EXPDescribeObject(actual), EXPDescribeObject(expected)]; + } + }); + + failureMessageForNotTo(^NSString *{ + if (within) { + return [NSString stringWithFormat:@"expected %@ not to be close to %@ within %@", + EXPDescribeObject(actual), EXPDescribeObject(expected), EXPDescribeObject(within)]; + } else { + return [NSString stringWithFormat:@"expected %@ not to be close to %@", + EXPDescribeObject(actual), EXPDescribeObject(expected)]; + } + }); +} +EXPMatcherImplementationEnd \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.h new file mode 100644 index 0000000..89c8e00 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.h @@ -0,0 +1,3 @@ +#import "Expecta.h" + +EXPMatcherInterface(beFalsy, (void)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.m new file mode 100644 index 0000000..382cab8 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.m @@ -0,0 +1,24 @@ +#import "EXPMatchers+beFalsy.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(beFalsy, (void)) { + match(^BOOL{ + if([actual isKindOfClass:[NSNumber class]]) { + return ![(NSNumber *)actual boolValue]; + } else if([actual isKindOfClass:[NSValue class]]) { + if(EXPIsValuePointer((NSValue *)actual)) { + return ![(NSValue *)actual pointerValue]; + } + } + return !actual; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: a falsy value, got: %@, which is truthy", EXPDescribeObject(actual)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: a non-falsy value, got: %@, which is falsy", EXPDescribeObject(actual)]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.h new file mode 100644 index 0000000..a2f9fba --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.h @@ -0,0 +1,6 @@ +#import "Expecta.h" + +EXPMatcherInterface(_beGreaterThan, (id expected)); +EXPMatcherInterface(beGreaterThan, (id expected)); + +#define beGreaterThan(expected) _beGreaterThan(EXPObjectify((expected))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.m new file mode 100644 index 0000000..d725387 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.m @@ -0,0 +1,20 @@ +#import "EXPMatchers+beGreaterThan.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_beGreaterThan, (id expected)) { + match(^BOOL{ + if ([actual respondsToSelector:@selector(compare:)]) { + return [actual compare:expected] == NSOrderedDescending; + } + return NO; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ to be greater than %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ not to be greater than %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); +} +EXPMatcherImplementationEnd \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h new file mode 100644 index 0000000..3e91c64 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h @@ -0,0 +1,6 @@ +#import "Expecta.h" + +EXPMatcherInterface(_beGreaterThanOrEqualTo, (id expected)); +EXPMatcherInterface(beGreaterThanOrEqualTo, (id expected)); + +#define beGreaterThanOrEqualTo(expected) _beGreaterThanOrEqualTo(EXPObjectify((expected))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m new file mode 100644 index 0000000..3276344 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m @@ -0,0 +1,20 @@ +#import "EXPMatchers+beGreaterThanOrEqualTo.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_beGreaterThanOrEqualTo, (id expected)) { + match(^BOOL{ + if ([actual respondsToSelector:@selector(compare:)]) { + return [actual compare:expected] != NSOrderedAscending; + } + return NO; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ to be greater than or equal to %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ not to be greater than or equal to %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); +} +EXPMatcherImplementationEnd \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.h new file mode 100644 index 0000000..d13619f --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.h @@ -0,0 +1,10 @@ +#import "Expecta.h" + +EXPMatcherInterface(_beIdenticalTo, (void *expected)); +EXPMatcherInterface(beIdenticalTo, (void *expected)); // to aid code completion + +#if __has_feature(objc_arc) +#define beIdenticalTo(expected) _beIdenticalTo((__bridge void*)expected) +#else +#define beIdenticalTo(expected) _beIdenticalTo(expected) +#endif diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.m new file mode 100644 index 0000000..b62b0fe --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.m @@ -0,0 +1,24 @@ +#import "EXPMatchers+equal.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_beIdenticalTo, (void *expected)) { + match(^BOOL{ + if(actual == expected) { + return YES; + } else if([actual isKindOfClass:[NSValue class]] && EXPIsValuePointer((NSValue *)actual)) { + if([(NSValue *)actual pointerValue] == expected) { + return YES; + } + } + return NO; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: <%p>, got: <%p>", expected, actual]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: not <%p>, got: <%p>", expected, actual]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.h new file mode 100644 index 0000000..8ea990e --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.h @@ -0,0 +1,6 @@ +#import "Expecta.h" + +EXPMatcherInterface(_beInTheRangeOf, (id expectedLowerBound, id expectedUpperBound)); +EXPMatcherInterface(beInTheRangeOf, (id expectedLowerBound, id expectedUpperBound)); + +#define beInTheRangeOf(expectedLowerBound, expectedUpperBound) _beInTheRangeOf(EXPObjectify((expectedLowerBound)), EXPObjectify((expectedUpperBound))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.m new file mode 100644 index 0000000..1631f24 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.m @@ -0,0 +1,30 @@ +#import "EXPMatchers+beInTheRangeOf.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_beInTheRangeOf, (id expectedLowerBound, id expectedUpperBound)) { + match(^BOOL{ + if ([actual respondsToSelector:@selector(compare:)]) { + NSComparisonResult compareLowerBound = [expectedLowerBound compare: actual]; + NSComparisonResult compareUpperBound = [expectedUpperBound compare: actual]; + if (compareLowerBound == NSOrderedSame) { + return YES; + } + if (compareUpperBound == NSOrderedSame) { + return YES; + } + if ((compareLowerBound == NSOrderedAscending) && (compareUpperBound == NSOrderedDescending)) { + return YES; + } + } + return NO; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ to be in the range [%@, %@] (inclusive)", EXPDescribeObject(actual), EXPDescribeObject(expectedLowerBound), EXPDescribeObject(expectedUpperBound)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ not to be in the range [%@, %@] (inclusive)", EXPDescribeObject(actual), EXPDescribeObject(expectedLowerBound), EXPDescribeObject(expectedUpperBound)]; + }); +} +EXPMatcherImplementationEnd \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.h new file mode 100644 index 0000000..a8e8175 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.h @@ -0,0 +1,6 @@ +#import "Expecta.h" + +EXPMatcherInterface(beInstanceOf, (Class expected)); +EXPMatcherInterface(beAnInstanceOf, (Class expected)); +EXPMatcherInterface(beMemberOf, (Class expected)); +EXPMatcherInterface(beAMemberOf, (Class expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.m new file mode 100644 index 0000000..9535e1e --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.m @@ -0,0 +1,31 @@ +#import "EXPMatchers+beInstanceOf.h" + +EXPMatcherImplementationBegin(beInstanceOf, (Class expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + + prerequisite(^BOOL{ + return !(actualIsNil || expectedIsNil); + }); + + match(^BOOL{ + return [actual isMemberOfClass:expected]; + }); + + failureMessageForTo(^NSString *{ + if(actualIsNil) return @"the actual value is nil/null"; + if(expectedIsNil) return @"the expected value is nil/null"; + return [NSString stringWithFormat:@"expected: an instance of %@, got: an instance of %@", [expected class], [actual class]]; + }); + + failureMessageForNotTo(^NSString *{ + if(actualIsNil) return @"the actual value is nil/null"; + if(expectedIsNil) return @"the expected value is nil/null"; + return [NSString stringWithFormat:@"expected: not an instance of %@, got: an instance of %@", [expected class], [actual class]]; + }); +} +EXPMatcherImplementationEnd + +EXPMatcherAliasImplementation(beAnInstanceOf, beInstanceOf, (Class expected)); +EXPMatcherAliasImplementation(beMemberOf, beInstanceOf, (Class expected)); +EXPMatcherAliasImplementation(beAMemberOf, beInstanceOf, (Class expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.h new file mode 100644 index 0000000..b8623e0 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.h @@ -0,0 +1,4 @@ +#import "Expecta.h" + +EXPMatcherInterface(beKindOf, (Class expected)); +EXPMatcherInterface(beAKindOf, (Class expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.m new file mode 100644 index 0000000..f13ffb5 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.m @@ -0,0 +1,29 @@ +#import "EXPMatchers+beKindOf.h" + +EXPMatcherImplementationBegin(beKindOf, (Class expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + + prerequisite(^BOOL{ + return !(actualIsNil || expectedIsNil); + }); + + match(^BOOL{ + return [actual isKindOfClass:expected]; + }); + + failureMessageForTo(^NSString *{ + if(actualIsNil) return @"the actual value is nil/null"; + if(expectedIsNil) return @"the expected value is nil/null"; + return [NSString stringWithFormat:@"expected: a kind of %@, got: an instance of %@, which is not a kind of %@", [expected class], [actual class], [expected class]]; + }); + + failureMessageForNotTo(^NSString *{ + if(actualIsNil) return @"the actual value is nil/null"; + if(expectedIsNil) return @"the expected value is nil/null"; + return [NSString stringWithFormat:@"expected: not a kind of %@, got: an instance of %@, which is a kind of %@", [expected class], [actual class], [expected class]]; + }); +} +EXPMatcherImplementationEnd + +EXPMatcherAliasImplementation(beAKindOf, beKindOf, (Class expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.h new file mode 100644 index 0000000..5ed0a24 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.h @@ -0,0 +1,6 @@ +#import "Expecta.h" + +EXPMatcherInterface(_beLessThan, (id expected)); +EXPMatcherInterface(beLessThan, (id expected)); + +#define beLessThan(expected) _beLessThan(EXPObjectify((expected))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.m new file mode 100644 index 0000000..39b6883 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.m @@ -0,0 +1,20 @@ +#import "EXPMatchers+beLessThan.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_beLessThan, (id expected)) { + match(^BOOL{ + if ([actual respondsToSelector:@selector(compare:)]) { + return [actual compare:expected] == NSOrderedAscending; + } + return NO; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ to be less than %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ not to be less than %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); +} +EXPMatcherImplementationEnd \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h new file mode 100644 index 0000000..2c31341 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h @@ -0,0 +1,6 @@ +#import "Expecta.h" + +EXPMatcherInterface(_beLessThanOrEqualTo, (id expected)); +EXPMatcherInterface(beLessThanOrEqualTo, (id expected)); + +#define beLessThanOrEqualTo(expected) _beLessThanOrEqualTo(EXPObjectify((expected))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m new file mode 100644 index 0000000..401c194 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m @@ -0,0 +1,20 @@ +#import "EXPMatchers+beLessThanOrEqualTo.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_beLessThanOrEqualTo, (id expected)) { + match(^BOOL{ + if ([actual respondsToSelector:@selector(compare:)]) { + return [actual compare:expected] != NSOrderedDescending; + } + return NO; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ to be less than or equal to %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ not to be less than or equal to %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); +} +EXPMatcherImplementationEnd \ No newline at end of file diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.h new file mode 100644 index 0000000..6d78162 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.h @@ -0,0 +1,4 @@ +#import "Expecta.h" + +EXPMatcherInterface(beNil, (void)); +EXPMatcherInterface(beNull, (void)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.m new file mode 100644 index 0000000..161067f --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.m @@ -0,0 +1,18 @@ +#import "EXPMatchers+beNil.h" + +EXPMatcherImplementationBegin(beNil, (void)) { + match(^BOOL{ + return actual == nil; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: nil/null, got: %@", EXPDescribeObject(actual)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: not nil/null, got: %@", EXPDescribeObject(actual)]; + }); +} +EXPMatcherImplementationEnd + +EXPMatcherAliasImplementation(beNull, beNil, (void)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.h new file mode 100644 index 0000000..65401c5 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.h @@ -0,0 +1,4 @@ +#import "Expecta.h" + +EXPMatcherInterface(beSubclassOf, (Class expected)); +EXPMatcherInterface(beASubclassOf, (Class expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.m new file mode 100644 index 0000000..d4976d5 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.m @@ -0,0 +1,29 @@ +#import "EXPMatchers+beSubclassOf.h" +#import "NSValue+Expecta.h" +#import + +EXPMatcherImplementationBegin(beSubclassOf, (Class expected)) { + __block BOOL actualIsClass = YES; + + prerequisite(^BOOL { + actualIsClass = class_isMetaClass(object_getClass(actual)); + return actualIsClass; + }); + + match(^BOOL{ + return [actual isSubclassOfClass:expected]; + }); + + failureMessageForTo(^NSString *{ + if(!actualIsClass) return @"the actual value is not a Class"; + return [NSString stringWithFormat:@"expected: a subclass of %@, got: a class %@, which is not a subclass of %@", [expected class], actual, [expected class]]; + }); + + failureMessageForNotTo(^NSString *{ + if(!actualIsClass) return @"the actual value is not a Class"; + return [NSString stringWithFormat:@"expected: not a subclass of %@, got: a class %@, which is a subclass of %@", [expected class], actual, [expected class]]; + }); +} +EXPMatcherImplementationEnd + +EXPMatcherAliasImplementation(beASubclassOf, beSubclassOf, (Class expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.h new file mode 100644 index 0000000..f9a47ba --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.h @@ -0,0 +1,4 @@ +#import "Expecta.h" + +EXPMatcherInterface(beSupersetOf, (id subset)); + diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.m new file mode 100644 index 0000000..f4d05c0 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.m @@ -0,0 +1,62 @@ +#import "EXPMatchers+contain.h" + +EXPMatcherImplementationBegin(beSupersetOf, (id subset)) { + BOOL actualIsCompatible = [actual isKindOfClass:[NSDictionary class]] || [actual respondsToSelector:@selector(containsObject:)]; + BOOL subsetIsNil = (subset == nil); + + // For some instances the isKindOfClass: method returns false, even though + // they are both actually dictionaries. e.g. Comparing a NSCFDictionary and a + // NSDictionary. + // Or in cases when you compare NSMutableArray (which implementation is __NSArrayM:NSMutableArray:NSArray) + // and NSArray (which implementation is __NSArrayI:NSArray) + BOOL bothAreIdenticalCollectionClasses = ([actual isKindOfClass:[NSDictionary class]] && [subset isKindOfClass:[NSDictionary class]]) || + ([actual isKindOfClass:[NSArray class]] && [subset isKindOfClass:[NSArray class]]) || + ([actual isKindOfClass:[NSSet class]] && [subset isKindOfClass:[NSSet class]]) || + ([actual isKindOfClass:[NSOrderedSet class]] && [subset isKindOfClass:[NSOrderedSet class]]); + + BOOL classMatches = bothAreIdenticalCollectionClasses || [subset isKindOfClass:[actual class]]; + + prerequisite(^BOOL{ + return actualIsCompatible && !subsetIsNil && classMatches; + }); + + match(^BOOL{ + if(!actualIsCompatible) return NO; + + if([actual isKindOfClass:[NSDictionary class]]) { + for (id key in subset) { + id actualValue = [actual valueForKey:key]; + id subsetValue = [subset valueForKey:key]; + + if (![subsetValue isEqual:actualValue]) return NO; + } + } else { + for (id object in subset) { + if (![actual containsObject:object]) return NO; + } + } + + return YES; + }); + + failureMessageForTo(^NSString *{ + if(!actualIsCompatible) return [NSString stringWithFormat:@"%@ is not an instance of NSDictionary and does not implement -containsObject:", EXPDescribeObject(actual)]; + + if(subsetIsNil) return @"the expected value is nil/null"; + + if(!classMatches) return [NSString stringWithFormat:@"%@ does not match the class of %@", EXPDescribeObject(subset), EXPDescribeObject(actual)]; + + return [NSString stringWithFormat:@"expected %@ to be a superset of %@", EXPDescribeObject(actual), EXPDescribeObject(subset)]; + }); + + failureMessageForNotTo(^NSString *{ + if(!actualIsCompatible) return [NSString stringWithFormat:@"%@ is not an instance of NSDictionary and does not implement -containsObject:", EXPDescribeObject(actual)]; + + if(subsetIsNil) return @"the expected value is nil/null"; + + if(!classMatches) return [NSString stringWithFormat:@"%@ does not match the class of %@", EXPDescribeObject(subset), EXPDescribeObject(actual)]; + + return [NSString stringWithFormat:@"expected %@ not to be a superset of %@", EXPDescribeObject(actual), EXPDescribeObject(subset)]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.h new file mode 100644 index 0000000..1e4e78f --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.h @@ -0,0 +1,3 @@ +#import "Expecta.h" + +EXPMatcherInterface(beTruthy, (void)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.m new file mode 100644 index 0000000..02fa6e7 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.m @@ -0,0 +1,24 @@ +#import "EXPMatchers+beTruthy.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(beTruthy, (void)) { + match(^BOOL{ + if([actual isKindOfClass:[NSNumber class]]) { + return !![(NSNumber *)actual boolValue]; + } else if([actual isKindOfClass:[NSValue class]]) { + if(EXPIsValuePointer((NSValue *)actual)) { + return !![(NSValue *)actual pointerValue]; + } + } + return !!actual; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: a truthy value, got: %@, which is falsy", EXPDescribeObject(actual)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: a non-truthy value, got: %@, which is truthy", EXPDescribeObject(actual)]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.h new file mode 100644 index 0000000..07ddd6c --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.h @@ -0,0 +1,4 @@ +#import "Expecta.h" + +EXPMatcherInterface(beginWith, (id expected)); +EXPMatcherInterface(startWith, (id expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.m new file mode 100644 index 0000000..a7c9e59 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.m @@ -0,0 +1,51 @@ +#import "EXPMatchers+beginWith.h" + +EXPMatcherImplementationBegin(beginWith, (id expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + //This condition allows the comparison of an immutable string or ordered collection to the mutable type of the same + BOOL actualAndExpectedAreCompatible = (([actual isKindOfClass:[NSString class]] && [expected isKindOfClass:[NSString class]]) + || ([actual isKindOfClass:[NSArray class]] && [expected isKindOfClass:[NSArray class]]) + || ([actual isKindOfClass:[NSOrderedSet class]] && [expected isKindOfClass:[NSOrderedSet class]])); + + prerequisite(^BOOL { + return actualAndExpectedAreCompatible; + }); + + match(^BOOL { + if ([actual isKindOfClass:[NSString class]]) { + return [actual hasPrefix:expected]; + } else if ([actual isKindOfClass:[NSArray class]]) { + if ([expected count] > [actual count] || [expected count] == 0) { + return NO; + } + NSArray *subArray = [actual subarrayWithRange:NSMakeRange(0, [expected count])]; + return [subArray isEqualToArray:expected]; + } else { + if ([expected count] > [actual count] || [expected count] == 0) { + return NO; + } + + NSOrderedSet *subset = [NSOrderedSet orderedSetWithOrderedSet:actual range:NSMakeRange(0, [expected count]) copyItems:NO]; + return [subset isEqualToOrderedSet:expected]; + } + }); + + failureMessageForTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNil) return @"the expected value is nil/null"; + if (!actualAndExpectedAreCompatible) return [NSString stringWithFormat:@"%@ and %@ are not instances of one of %@, %@, or %@", EXPDescribeObject(actual), EXPDescribeObject(expected), [NSString class], [NSArray class], [NSOrderedSet class]]; + return [NSString stringWithFormat:@"expected: %@ to begin with %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNil) return @"the expected value is nil/null"; + if (!actualAndExpectedAreCompatible) return [NSString stringWithFormat:@"%@ and %@ are not instances of one of %@, %@, or %@", EXPDescribeObject(actual), EXPDescribeObject(expected), [NSString class], [NSArray class], [NSOrderedSet class]]; + + return [NSString stringWithFormat:@"expected: %@ not to begin with %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); +} +EXPMatcherImplementationEnd + +EXPMatcherAliasImplementation(startWith, beginWith, (id expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.h new file mode 100644 index 0000000..efc7b98 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.h @@ -0,0 +1,3 @@ +#import "Expecta.h" + +EXPMatcherInterface(conformTo, (Protocol *expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.m new file mode 100644 index 0000000..b88014d --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.m @@ -0,0 +1,33 @@ +#import "EXPMatchers+conformTo.h" +#import "NSValue+Expecta.h" +#import + +EXPMatcherImplementationBegin(conformTo, (Protocol *expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + + prerequisite(^BOOL{ + return !(actualIsNil || expectedIsNil); + }); + + match(^BOOL{ + return [actual conformsToProtocol:expected]; + }); + + failureMessageForTo(^NSString *{ + if(actualIsNil) return @"the object is nil/null"; + if(expectedIsNil) return @"the protocol is nil/null"; + + NSString *name = NSStringFromProtocol(expected); + return [NSString stringWithFormat:@"expected: %@ to conform to %@", actual, name]; + }); + + failureMessageForNotTo(^NSString *{ + if(actualIsNil) return @"the object is nil/null"; + if(expectedIsNil) return @"the protocol is nil/null"; + + NSString *name = NSStringFromProtocol(expected); + return [NSString stringWithFormat:@"expected: %@ not to conform to %@", actual, name]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.h new file mode 100644 index 0000000..5803146 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.h @@ -0,0 +1,5 @@ +#import "Expecta.h" + +EXPMatcherInterface(_contain, (id expected)); +EXPMatcherInterface(contain, (id expected)); // to aid code completion +#define contain(expected) _contain(EXPObjectify((expected))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.m new file mode 100644 index 0000000..b8a6f86 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.m @@ -0,0 +1,38 @@ +#import "EXPMatchers+contain.h" + +EXPMatcherImplementationBegin(_contain, (id expected)) { + BOOL actualIsCompatible = [actual isKindOfClass:[NSString class]] || [actual conformsToProtocol:@protocol(NSFastEnumeration)]; + BOOL expectedIsNil = (expected == nil); + + prerequisite(^BOOL{ + return actualIsCompatible && !expectedIsNil; + }); + + match(^BOOL{ + if(actualIsCompatible) { + if([actual isKindOfClass:[NSString class]]) { + return [(NSString *)actual rangeOfString:[expected description]].location != NSNotFound; + } else { + for (id object in actual) { + if ([object isEqual:expected]) { + return YES; + } + } + } + } + return NO; + }); + + failureMessageForTo(^NSString *{ + if(!actualIsCompatible) return [NSString stringWithFormat:@"%@ is not an instance of NSString or NSFastEnumeration", EXPDescribeObject(actual)]; + if(expectedIsNil) return @"the expected value is nil/null"; + return [NSString stringWithFormat:@"expected %@ to contain %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + if(!actualIsCompatible) return [NSString stringWithFormat:@"%@ is not an instance of NSString or NSFastEnumeration", EXPDescribeObject(actual)]; + if(expectedIsNil) return @"the expected value is nil/null"; + return [NSString stringWithFormat:@"expected %@ not to contain %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.h new file mode 100644 index 0000000..228cea9 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.h @@ -0,0 +1,3 @@ +#import "Expecta.h" + +EXPMatcherInterface(endWith, (id expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.m new file mode 100644 index 0000000..f34bd90 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.m @@ -0,0 +1,49 @@ +#import "EXPMatchers+endWith.h" + +EXPMatcherImplementationBegin(endWith, (id expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + //This condition allows the comparison of an immutable string or ordered collection to the mutable type of the same + BOOL actualAndExpectedAreCompatible = (([actual isKindOfClass:[NSString class]] && [expected isKindOfClass:[NSString class]]) + || ([actual isKindOfClass:[NSArray class]] && [expected isKindOfClass:[NSArray class]]) + || ([actual isKindOfClass:[NSOrderedSet class]] && [expected isKindOfClass:[NSOrderedSet class]])); + + prerequisite(^BOOL { + return actualAndExpectedAreCompatible; + }); + + match(^BOOL { + if ([actual isKindOfClass:[NSString class]]) { + return [actual hasSuffix:expected]; + } else if ([actual isKindOfClass:[NSArray class]]) { + if ([expected count] > [actual count] || [expected count] == 0) { + return NO; + } + NSArray *subArray = [actual subarrayWithRange:NSMakeRange([actual count] - [expected count], [expected count])]; + return [subArray isEqualToArray:expected]; + } else { + if ([expected count] > [actual count] || [expected count] == 0) { + return NO; + } + + NSOrderedSet *subset = [NSOrderedSet orderedSetWithOrderedSet:actual range:NSMakeRange([actual count] - [expected count], [expected count]) copyItems:NO]; + return [subset isEqualToOrderedSet:expected]; + } + }); + + failureMessageForTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNil) return @"the expected value is nil/null"; + if (!actualAndExpectedAreCompatible) return [NSString stringWithFormat:@"%@ and %@ are not instances of one of %@, %@, or %@", EXPDescribeObject(actual), EXPDescribeObject(expected), [NSString class], [NSArray class], [NSOrderedSet class]]; + return [NSString stringWithFormat:@"expected: %@ to end with %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNil) return @"the expected value is nil/null"; + if (!actualAndExpectedAreCompatible) return [NSString stringWithFormat:@"%@ and %@ are not instances of one of %@, %@, or %@", EXPDescribeObject(actual), EXPDescribeObject(expected), [NSString class], [NSArray class], [NSOrderedSet class]]; + + return [NSString stringWithFormat:@"expected: %@ not to end with %@", EXPDescribeObject(actual), EXPDescribeObject(expected)]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.h new file mode 100644 index 0000000..b4047c0 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.h @@ -0,0 +1,5 @@ +#import "Expecta.h" + +EXPMatcherInterface(_equal, (id expected)); +EXPMatcherInterface(equal, (id expected)); // to aid code completion +#define equal(...) _equal(EXPObjectify((__VA_ARGS__))) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.m new file mode 100644 index 0000000..a610df0 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.m @@ -0,0 +1,31 @@ +#import "EXPMatchers+equal.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(_equal, (id expected)) { + match(^BOOL{ + if((actual == expected) || [actual isEqual:expected]) { + return YES; + } else if([actual isKindOfClass:[NSNumber class]] && [expected isKindOfClass:[NSNumber class]]) { + if([actual isKindOfClass:[NSDecimalNumber class]] || [expected isKindOfClass:[NSDecimalNumber class]]) { + NSDecimalNumber *actualDecimalNumber = [NSDecimalNumber decimalNumberWithDecimal:[(NSNumber *) actual decimalValue]]; + NSDecimalNumber *expectedDecimalNumber = [NSDecimalNumber decimalNumberWithDecimal:[(NSNumber *) expected decimalValue]]; + return [actualDecimalNumber isEqualToNumber:expectedDecimalNumber]; + } + else { + if(EXPIsNumberFloat((NSNumber *)actual) || EXPIsNumberFloat((NSNumber *)expected)) { + return [(NSNumber *)actual floatValue] == [(NSNumber *)expected floatValue]; + } + } + } + return NO; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@, got: %@", EXPDescribeObject(expected), EXPDescribeObject(actual)]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: not %@, got: %@", EXPDescribeObject(expected), EXPDescribeObject(actual)]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.h new file mode 100644 index 0000000..2e9aef5 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.h @@ -0,0 +1,10 @@ +#import "Expecta.h" + +EXPMatcherInterface(haveCountOf, (NSUInteger expected)); +EXPMatcherInterface(haveCount, (NSUInteger expected)); +EXPMatcherInterface(haveACountOf, (NSUInteger expected)); +EXPMatcherInterface(haveLength, (NSUInteger expected)); +EXPMatcherInterface(haveLengthOf, (NSUInteger expected)); +EXPMatcherInterface(haveALengthOf, (NSUInteger expected)); + +#define beEmpty() haveCountOf(0) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.m new file mode 100644 index 0000000..ecc4831 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.m @@ -0,0 +1,42 @@ +#import "EXPMatchers+haveCountOf.h" + +EXPMatcherImplementationBegin(haveCountOf, (NSUInteger expected)) { + BOOL actualIsStringy = [actual isKindOfClass:[NSString class]] || [actual isKindOfClass:[NSAttributedString class]]; + BOOL actualIsCompatible = actualIsStringy || [actual respondsToSelector:@selector(count)]; + + prerequisite(^BOOL{ + return actualIsCompatible; + }); + + NSUInteger (^count)(id) = ^(id actual) { + if(actualIsStringy) { + return [actual length]; + } else { + return [actual count]; + } + }; + + match(^BOOL{ + if(actualIsCompatible) { + return count(actual) == expected; + } + return NO; + }); + + failureMessageForTo(^NSString *{ + if(!actualIsCompatible) return [NSString stringWithFormat:@"%@ is not an instance of NSString, NSAttributedString, NSArray, NSSet, NSOrderedSet, or NSDictionary", EXPDescribeObject(actual)]; + return [NSString stringWithFormat:@"expected %@ to have a count of %zi but got %zi", EXPDescribeObject(actual), expected, count(actual)]; + }); + + failureMessageForNotTo(^NSString *{ + if(!actualIsCompatible) return [NSString stringWithFormat:@"%@ is not an instance of NSString, NSAttributedString, NSArray, NSSet, NSOrderedSet, or NSDictionary", EXPDescribeObject(actual)]; + return [NSString stringWithFormat:@"expected %@ not to have a count of %zi", EXPDescribeObject(actual), expected]; + }); +} +EXPMatcherImplementationEnd + +EXPMatcherAliasImplementation(haveCount, haveCountOf, (NSUInteger expected)); +EXPMatcherAliasImplementation(haveACountOf, haveCountOf, (NSUInteger expected)); +EXPMatcherAliasImplementation(haveLength, haveCountOf, (NSUInteger expected)); +EXPMatcherAliasImplementation(haveLengthOf, haveCountOf, (NSUInteger expected)); +EXPMatcherAliasImplementation(haveALengthOf, haveCountOf, (NSUInteger expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.h new file mode 100644 index 0000000..4f0e8e4 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.h @@ -0,0 +1,3 @@ +#import "Expecta.h" + +EXPMatcherInterface(match, (NSString *expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.m new file mode 100644 index 0000000..a217467 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.m @@ -0,0 +1,38 @@ +#import "EXPMatchers+match.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(match, (NSString *expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + + __block NSRegularExpression *regex = nil; + __block NSError *regexError = nil; + + prerequisite (^BOOL { + BOOL nilInput = (actualIsNil || expectedIsNil); + if (!nilInput) { + regex = [NSRegularExpression regularExpressionWithPattern:expected options:0 error:®exError]; + } + return !nilInput && regex; + }); + + match(^BOOL { + NSRange range = [regex rangeOfFirstMatchInString:actual options:0 range:NSMakeRange(0, [actual length])]; + return !NSEqualRanges(range, NSMakeRange(NSNotFound, 0)); + }); + + failureMessageForTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNil) return @"the expression is nil/null"; + if (regexError) return [NSString stringWithFormat:@"unable to create regular expression from given parameter: %@", [regexError localizedDescription]]; + return [NSString stringWithFormat:@"expected: %@ to match to %@", EXPDescribeObject(actual), expected]; + }); + + failureMessageForNotTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNil) return @"the expression is nil/null"; + if (regexError) return [NSString stringWithFormat:@"unable to create regular expression from given parameter: %@", [regexError localizedDescription]]; + return [NSString stringWithFormat:@"expected: %@ not to match to %@", EXPDescribeObject(actual), expected]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.h new file mode 100644 index 0000000..cdba4a3 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.h @@ -0,0 +1,4 @@ +#import "Expecta.h" + +EXPMatcherInterface(postNotification, (id expectedNotification)); +EXPMatcherInterface(notify, (id expectedNotification)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.m new file mode 100644 index 0000000..6e517c4 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.m @@ -0,0 +1,88 @@ +#import "EXPMatchers+postNotification.h" + +@implementation NSNotification (EXPEquality) + +- (BOOL)exp_isFunctionallyEqualTo:(NSNotification *)otherNotification +{ + if (![otherNotification isKindOfClass:[NSNotification class]]) return NO; + + BOOL namesMatch = [otherNotification.name isEqualToString:self.name]; + + BOOL objectsMatch = YES; + if (otherNotification.object || self.object) { + objectsMatch = [otherNotification.object isEqual:self.object]; + } + + BOOL userInfoMatches = YES; + if (otherNotification.userInfo || self.userInfo) { + userInfoMatches = [otherNotification.userInfo isEqual:self.userInfo]; + } + + return (namesMatch && objectsMatch && userInfoMatches); +} + +@end + +EXPMatcherImplementationBegin(postNotification, (id expected)){ + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + BOOL isNotification = [expected isKindOfClass:[NSNotification class]]; + BOOL isName = [expected isKindOfClass:[NSString class]]; + + __block NSString *expectedName; + __block BOOL expectedNotificationOccurred = NO; + __block id observer; + + prerequisite(^BOOL{ + expectedNotificationOccurred = NO; + if (actualIsNil || expectedIsNil) return NO; + if (isNotification) { + expectedName = [expected name]; + }else if(isName) { + expectedName = expected; + }else{ + return NO; + } + + observer = [[NSNotificationCenter defaultCenter] addObserverForName:expectedName object:nil queue:nil usingBlock:^(NSNotification *note){ + if (isNotification) { + expectedNotificationOccurred |= [expected exp_isFunctionallyEqualTo:note]; + }else{ + expectedNotificationOccurred = YES; + } + }]; + ((EXPBasicBlock)actual)(); + return YES; + }); + + match(^BOOL{ + if(expectedNotificationOccurred) { + [[NSNotificationCenter defaultCenter] removeObserver:observer]; + } + return expectedNotificationOccurred; + }); + + failureMessageForTo(^NSString *{ + if (observer) { + [[NSNotificationCenter defaultCenter] removeObserver:observer]; + } + if(actualIsNil) return @"the actual value is nil/null"; + if(expectedIsNil) return @"the expected value is nil/null"; + if(!(isNotification || isName)) return @"the actual value is not a notification or string"; + return [NSString stringWithFormat:@"expected: %@, got: none",expectedName]; + }); + + failureMessageForNotTo(^NSString *{ + if (observer) { + [[NSNotificationCenter defaultCenter] removeObserver:observer]; + } + if(actualIsNil) return @"the actual value is nil/null"; + if(expectedIsNil) return @"the expected value is nil/null"; + if(!(isNotification || isName)) return @"the actual value is not a notification or string"; + return [NSString stringWithFormat:@"expected: none, got: %@", expectedName]; + }); +} + +EXPMatcherImplementationEnd + +EXPMatcherAliasImplementation(notify, postNotification, (id expectedNotification)) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.h new file mode 100644 index 0000000..1f7fae0 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.h @@ -0,0 +1,4 @@ +#import "Expecta.h" + +EXPMatcherInterface(raise, (NSString *expectedExceptionName)); +#define raiseAny() raise(nil) diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.m new file mode 100644 index 0000000..26f3c55 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.m @@ -0,0 +1,30 @@ +#import "EXPMatchers+raise.h" +#import "EXPDefines.h" + +EXPMatcherImplementationBegin(raise, (NSString *expectedExceptionName)) { + __block NSException *exceptionCaught = nil; + + match(^BOOL{ + BOOL expectedExceptionCaught = NO; + @try { + ((EXPBasicBlock)actual)(); + } @catch(NSException *e) { + exceptionCaught = e; + expectedExceptionCaught = (expectedExceptionName == nil) || [[exceptionCaught name] isEqualToString:expectedExceptionName]; + } + return expectedExceptionCaught; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@, got: %@", + expectedExceptionName ? expectedExceptionName : @"any exception", + exceptionCaught ? [exceptionCaught name] : @"no exception"]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@, got: %@", + expectedExceptionName ? [NSString stringWithFormat:@"not %@", expectedExceptionName] : @"no exception", + exceptionCaught ? [exceptionCaught name] : @"no exception"]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.h new file mode 100644 index 0000000..2cf5a5d --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.h @@ -0,0 +1,3 @@ +#import "Expecta.h" + +EXPMatcherInterface(raiseWithReason, (NSString *expectedExceptionName, NSString *expectedReason)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.m new file mode 100644 index 0000000..3943d38 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.m @@ -0,0 +1,35 @@ +#import "EXPMatchers+raiseWithReason.h" +#import "EXPDefines.h" + +EXPMatcherImplementationBegin(raiseWithReason, (NSString *expectedExceptionName, NSString *expectedReason)) { + __block NSException *exceptionCaught = nil; + + match(^BOOL{ + BOOL expectedExceptionCaught = NO; + @try { + ((EXPBasicBlock)actual)(); + } @catch(NSException *e) { + exceptionCaught = e; + expectedExceptionCaught = (((expectedExceptionName == nil) || [[exceptionCaught name] isEqualToString:expectedExceptionName]) && + ((expectedReason == nil) || ([[exceptionCaught reason] isEqualToString:expectedReason]))); + } + return expectedExceptionCaught; + }); + + failureMessageForTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ (%@), got: %@ (%@)", + expectedExceptionName ?: @"any exception", + expectedReason ?: @"any reason", + exceptionCaught ? [exceptionCaught name] : @"no exception", + exceptionCaught ? [exceptionCaught reason] : @""]; + }); + + failureMessageForNotTo(^NSString *{ + return [NSString stringWithFormat:@"expected: %@ (%@), got: %@ (%@)", + expectedExceptionName ? [NSString stringWithFormat:@"not %@", expectedExceptionName] : @"no exception", + expectedReason ? [NSString stringWithFormat:@"not '%@'", expectedReason] : @"no reason", + exceptionCaught ? [exceptionCaught name] : @"no exception", + exceptionCaught ? [exceptionCaught reason] : @"no reason"]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.h new file mode 100644 index 0000000..279131d --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.h @@ -0,0 +1,3 @@ +#import "Expecta.h" + +EXPMatcherInterface(respondTo, (SEL expected)); diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.m b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.m new file mode 100644 index 0000000..d294113 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.m @@ -0,0 +1,28 @@ +#import "EXPMatchers+respondTo.h" +#import "EXPMatcherHelpers.h" + +EXPMatcherImplementationBegin(respondTo, (SEL expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNull = (expected == NULL); + + prerequisite (^BOOL { + return !(actualIsNil || expectedIsNull); + }); + + match(^BOOL { + return [actual respondsToSelector:expected]; + }); + + failureMessageForTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNull) return @"the selector is null"; + return [NSString stringWithFormat:@"expected: %@ to respond to %@", EXPDescribeObject(actual), NSStringFromSelector(expected)]; + }); + + failureMessageForNotTo(^NSString *{ + if (actualIsNil) return @"the object is nil/null"; + if (expectedIsNull) return @"the selector is null"; + return [NSString stringWithFormat:@"expected: %@ not to respond to %@", EXPDescribeObject(actual), NSStringFromSelector(expected)]; + }); +} +EXPMatcherImplementationEnd diff --git a/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers.h b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers.h new file mode 100644 index 0000000..ed6ef85 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/Matchers/EXPMatchers.h @@ -0,0 +1,25 @@ +#import "EXPMatchers+beNil.h" +#import "EXPMatchers+equal.h" +#import "EXPMatchers+beInstanceOf.h" +#import "EXPMatchers+beKindOf.h" +#import "EXPMatchers+beSubclassOf.h" +#import "EXPMatchers+conformTo.h" +#import "EXPMatchers+beTruthy.h" +#import "EXPMatchers+beFalsy.h" +#import "EXPMatchers+contain.h" +#import "EXPMatchers+beSupersetOf.h" +#import "EXPMatchers+haveCountOf.h" +#import "EXPMatchers+beIdenticalTo.h" +#import "EXPMatchers+beGreaterThan.h" +#import "EXPMatchers+beGreaterThanOrEqualTo.h" +#import "EXPMatchers+beLessThan.h" +#import "EXPMatchers+beLessThanOrEqualTo.h" +#import "EXPMatchers+beInTheRangeOf.h" +#import "EXPMatchers+beCloseTo.h" +#import "EXPMatchers+raise.h" +#import "EXPMatchers+raiseWithReason.h" +#import "EXPMatchers+respondTo.h" +#import "EXPMatchers+postNotification.h" +#import "EXPMatchers+beginWith.h" +#import "EXPMatchers+endWith.h" +#import "EXPMatchers+match.h" diff --git a/Example/Pods/Expecta/Expecta/NSObject+Expecta.h b/Example/Pods/Expecta/Expecta/NSObject+Expecta.h new file mode 100644 index 0000000..5920e31 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/NSObject+Expecta.h @@ -0,0 +1,10 @@ +#import + +@interface NSObject (Expecta) + +- (void)recordFailureWithDescription:(NSString *)description + inFile:(NSString *)filename + atLine:(NSUInteger)lineNumber + expected:(BOOL)expected; + +@end diff --git a/Example/Pods/Expecta/Expecta/NSValue+Expecta.h b/Example/Pods/Expecta/Expecta/NSValue+Expecta.h new file mode 100644 index 0000000..e8ff6a4 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/NSValue+Expecta.h @@ -0,0 +1,7 @@ +#import + +@interface NSValue (Expecta) + +@property (nonatomic) const char *_EXP_objCType; + +@end diff --git a/Example/Pods/Expecta/Expecta/NSValue+Expecta.m b/Example/Pods/Expecta/Expecta/NSValue+Expecta.m new file mode 100644 index 0000000..f660996 --- /dev/null +++ b/Example/Pods/Expecta/Expecta/NSValue+Expecta.m @@ -0,0 +1,21 @@ +#import "NSValue+Expecta.h" +#import +#import "Expecta.h" + +EXPFixCategoriesBug(NSValue_Expecta); + +@implementation NSValue (Expecta) + +static char _EXP_typeKey; + +- (const char *)_EXP_objCType { + return [(NSString *)objc_getAssociatedObject(self, &_EXP_typeKey) cStringUsingEncoding:NSASCIIStringEncoding]; +} + +- (void)set_EXP_objCType:(const char *)_EXP_objCType { + objc_setAssociatedObject(self, &_EXP_typeKey, + @(_EXP_objCType), + OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +@end diff --git a/Example/Pods/Expecta/LICENSE b/Example/Pods/Expecta/LICENSE new file mode 100644 index 0000000..a036c85 --- /dev/null +++ b/Example/Pods/Expecta/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2015 Specta Team - https://github.com/specta + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission 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. diff --git a/Example/Pods/Expecta/README.md b/Example/Pods/Expecta/README.md new file mode 100644 index 0000000..c3eb648 --- /dev/null +++ b/Example/Pods/Expecta/README.md @@ -0,0 +1,293 @@ +#Expecta + +[![Build Status](http://img.shields.io/travis/specta/expecta/master.svg?style=flat)](https://travis-ci.org/specta/expecta) +[![Pod Version](http://img.shields.io/cocoapods/v/Expecta.svg?style=flat)](http://cocoadocs.org/docsets/Expecta/) +[![Pod Platform](http://img.shields.io/cocoapods/p/Expecta.svg?style=flat)](http://cocoadocs.org/docsets/Expecta/) +[![Pod License](http://img.shields.io/cocoapods/l/Expecta.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) + +A matcher framework for Objective-C and Cocoa. + +## Introduction + +The main advantage of using Expecta over other matcher frameworks is that you do not have to specify the data types. Also, the syntax of Expecta matchers is much more readable and does not suffer from parenthesitis. + +```objective-c +expect(@"foo").to.equal(@"foo"); // `to` is a syntactic sugar and can be safely omitted. +expect(foo).notTo.equal(1); +expect([bar isBar]).to.equal(YES); +expect(baz).to.equal(3.14159); +``` + +Expecta is framework-agnostic: it works well with XCTest and XCTest-compatible test frameworks such as [Specta](http://github.com/petejkim/specta/). + + +## Setup + +You can setup Expecta using [Carthage](https://github.com/Carthage/Carthage), [CocoaPods](http://github.com/CocoaPods/CocoaPods) or [completely manually](#setting-up-manually). + +### Carthage + +1. Add Expecta to your project's `Cartfile.private`: + + ```ruby + github "specta/expecta" "master" + ``` + +2. Run `carthage update` in your project directory. +3. Drag the appropriate **Expecta.framework** for your platform (located in `Carthage/Build/`) into your application’s Xcode project, and add it to your test target(s). + +### CocoaPods + +1. Add Expecta to your project's `Podfile`: + + ```ruby + target :MyApp do + # Your app's dependencies + end + + target :MyAppTests do + pod 'Expecta', '~> 0.2.4' + end + ``` + +2. Run `pod update` or `pod install` in your project directory. + +### Setting Up Manually + +1. Clone Expecta from Github. +2. Run `rake` in your project directory to build the frameworks and libraries. +3. Add a Cocoa or Cocoa Touch Unit Testing Bundle target to your Xcode project if you don't already have one. +4. For **OS X projects**, copy and add `Expecta.framework` in the `Products/osx` folder to your project's test target. + + For **iOS projects**, copy and add `Expecta.framework` in the `Products/ios` folder to your project's test target. + + You can also use `libExpecta.a` if you prefer to link Expecta as a static library — iOS 7.x and below require this. + +6. Add `-ObjC` and `-all_load` to the **Other Linker Flags** build setting for the test target in your Xcode project. +7. You can now use Expecta in your test classes by adding the following import: + + ```objective-c + @import Expecta; // If you're using Expecta.framework + + // OR + + #import // If you're using the static library, or the framework + ``` + +## Built-in Matchers + +> `expect(x).to.equal(y);` compares objects or primitives x and y and passes if they are identical (==) or equivalent isEqual:). + +> `expect(x).to.beIdenticalTo(y);` compares objects x and y and passes if they are identical and have the same memory address. + +> `expect(x).to.beNil();` passes if x is nil. + +> `expect(x).to.beTruthy();` passes if x evaluates to true (non-zero). + +> `expect(x).to.beFalsy();` passes if x evaluates to false (zero). + +> `expect(x).to.contain(y);` passes if an instance of NSArray or NSString x contains y. + +> `expect(x).to.beSupersetOf(y);` passes if an instance of NSArray, NSSet, NSDictionary or NSOrderedSet x contains all elements of y. + +> `expect(x).to.haveCountOf(y);` passes if an instance of NSArray, NSSet, NSDictionary or NSString x has a count or length of y. + +> `expect(x).to.beEmpty();` passes if an instance of NSArray, NSSet, NSDictionary or NSString x has a count or length of . + +> `expect(x).to.beInstanceOf([Foo class]);` passes if x is an instance of a class Foo. + +> `expect(x).to.beKindOf([Foo class]);` passes if x is an instance of a class Foo or if x is an instance of any class that inherits from the class Foo. + +> `expect([Foo class]).to.beSubclassOf([Bar class]);` passes if the class Foo is a subclass of the class Bar or if it is identical to the class Bar. Use beKindOf() for class clusters. + +> `expect(x).to.beLessThan(y);` passes if `x` is less than `y`. + +> `expect(x).to.beLessThanOrEqualTo(y);` passes if `x` is less than or equal to `y`. + +> `expect(x).to.beGreaterThan(y);` passes if `x` is greater than `y`. + +> `expect(x).to.beGreaterThanOrEqualTo(y);` passes if `x` is greater than or equal to `y`. + +> `expect(x).to.beInTheRangeOf(y,z);` passes if `x` is in the range of `y` and `z`. + +> `expect(x).to.beCloseTo(y);` passes if `x` is close to `y`. + +> `expect(x).to.beCloseToWithin(y, z);` passes if `x` is close to `y` within `z`. + +> `expect(^{ /* code */ }).to.raise(@"ExceptionName");` passes if a given block of code raises an exception named `ExceptionName`. + +> `expect(^{ /* code */ }).to.raiseAny();` passes if a given block of code raises any exception. + +> `expect(x).to.conformTo(y);` passes if `x` conforms to the protocol `y`. + +> `expect(x).to.respondTo(y);` passes if `x` responds to the selector `y`. + +> `expect(^{ /* code */ }).to.notify(@"NotificationName");` passes if a given block of code generates an NSNotification amed `NotificationName`. + +> `expect(^{ /* code */ }).to.notify(notification);` passes if a given block of code generates an NSNotification equal to the passed `notification`. + +> `expect(x).to.beginWith(y);` passes if an instance of NSString, NSArray, or NSOrderedSet `x` begins with `y`. Also liased by `startWith` + +> `expect(x).to.endWith(y);` passes if an instance of NSString, NSArray, or NSOrderedSet `x` ends with `y`. + +> `expect(x).to.match(y);` passes if an instance of NSString `x` matches regular expression (given as NSString) `y` one or more times. + +## Inverting Matchers + +Every matcher's criteria can be inverted by prepending `.notTo` or `.toNot`: + +>`expect(x).notTo.equal(y);` compares objects or primitives x and y and passes if they are *not* equivalent. + +## Asynchronous Testing + +Every matcher can be made to perform asynchronous testing by prepending `.will`, `.willNot` or `after(...)`: + +>`expect(x).will.beNil();` passes if x becomes nil before the default timeout. +> +>`expect(x).willNot.beNil();` passes if x becomes non-nil before the default timeout. +> +>`expect(x).after(3).to.beNil();` passes if x becoms nil after 3.0 seconds. +> +>`expect(x).after(2.5).notTo.equal(42);` passes if x doesn't equal 42 after 2.5 seconds. + +The default timeout is 1.0 second and is used for all matchers if not otherwise specified. This setting can be changed by calling `[Expecta setAsynchronousTestTimeout:x]`, where `x` is the desired timeout in seconds. + +```objective-c +describe(@"Foo", ^{ + beforeAll(^{ + // All asynchronous matching using `will` and `willNot` + // will have a timeout of 2.0 seconds + [Expecta setAsynchronousTestTimeout:2]; + }); + + it(@"will not be nil", ^{ + // Test case where default timeout is used + expect(foo).willNot.beNil(); + }); + + it(@"should equal 42 after 3 seconds", ^{ + // Signle case where timeout differs from the default + expect(foo).after(3).to.equal(42); + }); +}); +``` + +## Forced Failing + +You can fail a test by using the `failure` attribute. This can be used to test branching. + +> `failure(@"This should not happen");` outright fails a test. + + +## Writing New Matchers + +Writing a new matcher is easy with special macros provided by Expecta. Take a look at how `.beKindOf()` matcher is defined: + +`EXPMatchers+beKindOf.h` + +```objective-c +#import "Expecta.h" + +EXPMatcherInterface(beKindOf, (Class expected)); +// 1st argument is the name of the matcher function +// 2nd argument is the list of arguments that may be passed in the function +// call. +// Multiple arguments are fine. (e.g. (int foo, float bar)) + +#define beAKindOf beKindOf +``` + +`EXPMatchers+beKindOf.m` + +```objective-c +#import "EXPMatchers+beKindOf.h" + +EXPMatcherImplementationBegin(beKindOf, (Class expected)) { + BOOL actualIsNil = (actual == nil); + BOOL expectedIsNil = (expected == nil); + + prerequisite(^BOOL { + return !(actualIsNil || expectedIsNil); + // Return `NO` if matcher should fail whether or not the result is inverted + // using `.Not`. + }); + + match(^BOOL { + return [actual isKindOfClass:expected]; + // Return `YES` if the matcher should pass, `NO` if it should not. + // The actual value/object is passed as `actual`. + // Please note that primitive values will be wrapped in NSNumber/NSValue. + }); + + failureMessageForTo(^NSString * { + if (actualIsNil) + return @"the actual value is nil/null"; + if (expectedIsNil) + return @"the expected value is nil/null"; + return [NSString + stringWithFormat:@"expected: a kind of %@, " + "got: an instance of %@, which is not a kind of %@", + [expected class], [actual class], [expected class]]; + // Return the message to be displayed when the match function returns `YES`. + }); + + failureMessageForNotTo(^NSString * { + if (actualIsNil) + return @"the actual value is nil/null"; + if (expectedIsNil) + return @"the expected value is nil/null"; + return [NSString + stringWithFormat:@"expected: not a kind of %@, " + "got: an instance of %@, which is a kind of %@", + [expected class], [actual class], [expected class]]; + // Return the message to be displayed when the match function returns `NO`. + }); +} +EXPMatcherImplementationEnd +``` + +## Dynamic Predicate Matchers + +It is possible to add predicate matchers by simply defining the matcher interface, with the matcher implementation being handled at runtime by delegating to the predicate method on your object. + +For instance, if you have the following class: + +```objc +@interface LightSwitch : NSObject +@property (nonatomic, assign, getter=isTurnedOn) BOOL turnedOn; +@end + +@implementation LightSwitch +@synthesize turnedOn; +@end +``` + +The normal way to write an assertion that the switch is turned on would be: + +```objc +expect([lightSwitch isTurnedOn]).to.beTruthy(); +``` + +However, if we define a custom predicate matcher: + +```objc +EXPMatcherInterface(isTurnedOn, (void)); +``` + +(Note: we haven't defined the matcher implementation, just it's interface) + +You can now write your assertion as follows: + +```objc +expect(lightSwitch).isTurnedOn(); +``` + +## Contribution Guidelines + +* Please use only spaces and indent 2 spaces at a time. +* Please prefix instance variable names with a single underscore (`_`). +* Please prefix custom classes and functions defined in the global scope with `EXP`. + +## License + +Copyright (c) 2012-2015 [Specta Team](https://github.com/specta?tab=members). This software is licensed under the [MIT License](http://github.com/specta/specta/raw/master/LICENSE). diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h deleted file mode 100644 index 063e32a..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2013, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -#import - -#import - -#ifndef FB_REFERENCE_IMAGE_DIR -#define FB_REFERENCE_IMAGE_DIR "\"$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages\"" -#endif - -/** - Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. - @param view The view to snapshot - @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. - @param referenceImageDirectorySuffix An optional suffix, appended to the reference image directory path, such as "_iOS8" - */ -#define FBSnapshotVerifyViewWithReferenceDirectorySuffix(view__, identifier__, referenceImagesDirectorySuffix__) \ -{ \ -NSError *error__ = nil; \ -NSString *referenceImagesDirectory__ = [NSString stringWithFormat:@"%s%@", FB_REFERENCE_IMAGE_DIR, referenceImagesDirectorySuffix__]; \ -BOOL comparisonSuccess__ = [self compareSnapshotOfView:(view__) referenceImagesDirectory:referenceImagesDirectory__ identifier:(identifier__) error:&error__]; \ -XCTAssertTrue(comparisonSuccess__, @"Snapshot comparison failed: %@", error__); \ -} - -#define FBSnapshotVerifyView(view__, identifier__) \ -{ \ -FBSnapshotVerifyViewWithReferenceDirectorySuffix(view__, identifier__, @""); \ -} - -/** - Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. - @param layer The layer to snapshot - @param identifier An optional identifier, used is there are multiple snapshot tests in a given -test method. - @param referenceImageDirectorySuffix An optional suffix, appended to the reference image directory path, such as "_iOS8" - */ -#define FBSnapshotVerifyLayerWithReferenceDirectorySuffix(layer__, identifier__, referenceImagesDirectorySuffix__) \ -{ \ -NSError *error__ = nil; \ -NSString *referenceImagesDirectory__ = [NSString stringWithFormat:@"%s%@", FB_REFERENCE_IMAGE_DIR, referenceImagesDirectorySuffix__]; \ -BOOL comparisonSuccess__ = [self compareSnapshotOfLayer:(layer__) referenceImagesDirectory:referenceImagesDirectory__ identifier:(identifier__) error:&error__]; \ -XCTAssertTrue(comparisonSuccess__, @"Snapshot comparison failed: %@", error__); \ -} - -#define FBSnapshotVerifyLayer(layer__, identifier__) \ -{ \ -FBSnapshotVerifyLayerWithReferenceDirectorySuffix(layer__, identifier__, @""); \ -} - -/** - The base class of view snapshotting tests. If you have small UI component, it's often easier to configure it in a test - and compare an image of the view to a reference image that write lots of complex layout-code tests. - - In order to flip the tests in your subclass to record the reference images set `recordMode` to YES before calling - -[super setUp]. - */ -@interface FBSnapshotTestCase : XCTestCase - -/** - When YES, the test macros will save reference images, rather than performing an actual test. - */ -@property (readwrite, nonatomic, assign) BOOL recordMode; - -/** - Performs the comparisong or records a snapshot of the layer if recordMode is YES. - @param layer The Layer to snapshot - @param referenceImagesDirectory The directory in which reference images are stored. - @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). - @returns YES if the comparison (or saving of the reference image) succeeded. - */ -- (BOOL)compareSnapshotOfLayer:(CALayer *)layer - referenceImagesDirectory:(NSString *)referenceImagesDirectory - identifier:(NSString *)identifier - error:(NSError **)errorPtr; - -/** - Performs the comparisong or records a snapshot of the view if recordMode is YES. - @param view The view to snapshot - @param referenceImagesDirectory The directory in which reference images are stored. - @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). - @returns YES if the comparison (or saving of the reference image) succeeded. - */ -- (BOOL)compareSnapshotOfView:(UIView *)view - referenceImagesDirectory:(NSString *)referenceImagesDirectory - identifier:(NSString *)identifier - error:(NSError **)errorPtr; - -@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m deleted file mode 100644 index ebd311c..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2013, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import "FBSnapshotTestCase.h" - -#import "FBSnapshotTestController.h" - -@interface FBSnapshotTestCase () - -@property (readwrite, nonatomic, retain) FBSnapshotTestController *snapshotController; - -@end - -@implementation FBSnapshotTestCase - -- (void)setUp -{ - [super setUp]; - self.snapshotController = [[FBSnapshotTestController alloc] initWithTestName:NSStringFromClass([self class])]; -} - -- (void)tearDown -{ - self.snapshotController = nil; - [super tearDown]; -} - -- (BOOL)recordMode -{ - return self.snapshotController.recordMode; -} - -- (void)setRecordMode:(BOOL)recordMode -{ - self.snapshotController.recordMode = recordMode; -} - -- (BOOL)compareSnapshotOfLayer:(CALayer *)layer - referenceImagesDirectory:(NSString *)referenceImagesDirectory - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - return [self _compareSnapshotOfViewOrLayer:layer - referenceImagesDirectory:referenceImagesDirectory - identifier:identifier - error:errorPtr]; -} - -- (BOOL)compareSnapshotOfView:(UIView *)view - referenceImagesDirectory:(NSString *)referenceImagesDirectory - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - return [self _compareSnapshotOfViewOrLayer:view - referenceImagesDirectory:referenceImagesDirectory - identifier:identifier - error:errorPtr]; -} - -#pragma mark - -#pragma mark Private API - -- (BOOL)_compareSnapshotOfViewOrLayer:(id)viewOrLayer - referenceImagesDirectory:(NSString *)referenceImagesDirectory - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - _snapshotController.referenceImagesDirectory = referenceImagesDirectory; - return [_snapshotController compareSnapshotOfViewOrLayer:viewOrLayer - selector:self.invocation.selector - identifier:identifier - error:errorPtr]; -} - -@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h deleted file mode 100644 index 349384d..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2013, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import -#import - -typedef NS_ENUM(NSInteger, FBSnapshotTestControllerErrorCode) { - FBSnapshotTestControllerErrorCodeUnknown, - FBSnapshotTestControllerErrorCodeNeedsRecord, - FBSnapshotTestControllerErrorCodePNGCreationFailed, - FBSnapshotTestControllerErrorCodeImagesDifferentSizes, - FBSnapshotTestControllerErrorCodeImagesDifferent, -}; -/** - Errors returned by the methods of FBSnapshotTestController use this domain. - */ -extern NSString *const FBSnapshotTestControllerErrorDomain; - -/** - Errors returned by the methods of FBSnapshotTestController sometimes contain this key in the `userInfo` dictionary. - */ -extern NSString *const FBReferenceImageFilePathKey; - -/** - Provides the heavy-lifting for FBSnapshotTestCase. It loads and saves images, along with performing the actual pixel- - by-pixel comparison of images. - Instances are initialized with the test class, and directories to read and write to. - */ -@interface FBSnapshotTestController : NSObject - -/** - Record snapshots. - **/ -@property(readwrite, nonatomic, assign) BOOL recordMode; - -/** - @param testClass The subclass of FBSnapshotTestCase that is using this controller. - @param referenceImagesDirectory The directory where the reference images are stored. - @returns An instance of FBSnapshotTestController. - */ -- (id)initWithTestClass:(Class)testClass; - -/** - Designated initializer. - @param testName The name of the tests. - @param referenceImagesDirectory The directory where the reference images are stored. - @returns An instance of FBSnapshotTestController. - */ -- (id)initWithTestName:(NSString *)testName; - - -/** - Performs the comparison of the layer. - @param layer The Layer to snapshot. - @param referenceImagesDirectory The directory in which reference images are stored. - @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). - @returns YES if the comparison (or saving of the reference image) succeeded. - */ -- (BOOL)compareSnapshotOfLayer:(CALayer *)layer - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr; - -/** - Performs the comparison of the view. - @param view The view to snapshot. - @param referenceImagesDirectory The directory in which reference images are stored. - @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). - @returns YES if the comparison (or saving of the reference image) succeeded. - */ -- (BOOL)compareSnapshotOfView:(UIView *)view - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr; - -/** - Performs the comparison of a view or layer. - @param view The view or layer to snapshot. - @param referenceImagesDirectory The directory in which reference images are stored. - @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. - @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). - @returns YES if the comparison (or saving of the reference image) succeeded. - */ -- (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr; - - -/** - The directory in which referfence images are stored. - */ -@property (readwrite, nonatomic, copy) NSString *referenceImagesDirectory; - -/** - Loads a reference image. - @param selector The test method being run. - @param identifier The optional identifier, used when multiple images are tested in a single -test method. - @param error An error, if this methods returns nil, the error will be something useful. - @returns An image. - */ -- (UIImage *)referenceImageForSelector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)error; - -/** - Saves a reference image. - @param selector The test method being run. - @param identifier The optional identifier, used when multiple images are tested in a single -test method. - @param error An error, if this methods returns NO, the error will be something useful. - @returns An image. - */ -- (BOOL)saveReferenceImage:(UIImage *)image - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr; - -/** - Performs a pixel-by-pixel comparison of the two images. - @param referenceImage The reference (correct) image. - @param image The image to test against the reference. - @param error An error that indicates why the comparison failed if it does. - @param YES if the comparison succeeded and the images are the same. - */ -- (BOOL)compareReferenceImage:(UIImage *)referenceImage - toImage:(UIImage *)image - error:(NSError **)errorPtr; - -/** - Saves the reference image and the test image to `failedOutputDirectory`. - @param referenceImage The reference (correct) image. - @param testImage The image to test against the reference. - @param selector The test method being run. - @param identifier The optional identifier, used when multiple images are tested in a single -test method. - @param error An error that indicates why the comparison failed if it does. - @param YES if the save succeeded. - */ -- (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage - testImage:(UIImage *)testImage - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr; -@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m deleted file mode 100644 index 7d12736..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m +++ /dev/null @@ -1,392 +0,0 @@ -/* - * Copyright (c) 2013, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import "FBSnapshotTestController.h" - -#import "UIImage+Compare.h" -#import "UIImage+Diff.h" - -#import - -#import - -NSString *const FBSnapshotTestControllerErrorDomain = @"FBSnapshotTestControllerErrorDomain"; - -NSString *const FBReferenceImageFilePathKey = @"FBReferenceImageFilePathKey"; - -typedef struct RGBAPixel { - char r; - char g; - char b; - char a; -} RGBAPixel; - -@interface FBSnapshotTestController () - -@property (readonly, nonatomic, copy) NSString *testName; - -@end - -@implementation FBSnapshotTestController -{ - NSFileManager *_fileManager; -} - -#pragma mark - -#pragma mark Lifecycle - -- (id)initWithTestClass:(Class)testClass; -{ - return [self initWithTestName:NSStringFromClass(testClass)]; -} - -- (id)initWithTestName:(NSString *)testName -{ - if ((self = [super init])) { - _testName = [testName copy]; - _fileManager = [[NSFileManager alloc] init]; - } - return self; -} - -#pragma mark - -#pragma mark Properties - -- (NSString *)description -{ - return [NSString stringWithFormat:@"%@ %@", [super description], _referenceImagesDirectory]; -} - -#pragma mark - -#pragma mark Public API - -- (UIImage *)referenceImageForSelector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; - UIImage *image = [UIImage imageWithContentsOfFile:filePath]; - if (nil == image && NULL != errorPtr) { - BOOL exists = [_fileManager fileExistsAtPath:filePath]; - if (!exists) { - *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain - code:FBSnapshotTestControllerErrorCodeNeedsRecord - userInfo:@{ - FBReferenceImageFilePathKey: filePath, - NSLocalizedDescriptionKey: @"Unable to load reference image.", - NSLocalizedFailureReasonErrorKey: @"Reference image not found. You need to run the test in record mode", - }]; - } else { - *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain - code:FBSnapshotTestControllerErrorCodeUnknown - userInfo:nil]; - } - } - return image; -} - -- (BOOL)saveReferenceImage:(UIImage *)image - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - BOOL didWrite = NO; - if (nil != image) { - NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; - NSData *pngData = UIImagePNGRepresentation(image); - if (nil != pngData) { - NSError *creationError = nil; - BOOL didCreateDir = [_fileManager createDirectoryAtPath:[filePath stringByDeletingLastPathComponent] - withIntermediateDirectories:YES - attributes:nil - error:&creationError]; - if (!didCreateDir) { - if (NULL != errorPtr) { - *errorPtr = creationError; - } - return NO; - } - didWrite = [pngData writeToFile:filePath options:NSDataWritingAtomic error:errorPtr]; - if (didWrite) { - NSLog(@"Reference image save at: %@", filePath); - } - } else { - if (nil != errorPtr) { - *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain - code:FBSnapshotTestControllerErrorCodePNGCreationFailed - userInfo:@{ - FBReferenceImageFilePathKey: filePath, - }]; - } - } - } - return didWrite; -} - -- (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage - testImage:(UIImage *)testImage - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - NSData *referencePNGData = UIImagePNGRepresentation(referenceImage); - NSData *testPNGData = UIImagePNGRepresentation(testImage); - - NSString *referencePath = [self _failedFilePathForSelector:selector - identifier:identifier - fileNameType:FBTestSnapshotFileNameTypeFailedReference]; - - NSError *creationError = nil; - BOOL didCreateDir = [_fileManager createDirectoryAtPath:[referencePath stringByDeletingLastPathComponent] - withIntermediateDirectories:YES - attributes:nil - error:&creationError]; - if (!didCreateDir) { - if (NULL != errorPtr) { - *errorPtr = creationError; - } - return NO; - } - - if (![referencePNGData writeToFile:referencePath options:NSDataWritingAtomic error:errorPtr]) { - return NO; - } - - NSString *testPath = [self _failedFilePathForSelector:selector - identifier:identifier - fileNameType:FBTestSnapshotFileNameTypeFailedTest]; - - if (![testPNGData writeToFile:testPath options:NSDataWritingAtomic error:errorPtr]) { - return NO; - } - - NSString *diffPath = [self _failedFilePathForSelector:selector - identifier:identifier - fileNameType:FBTestSnapshotFileNameTypeFailedTestDiff]; - - UIImage *diffImage = [referenceImage diffWithImage:testImage]; - NSData *diffImageData = UIImagePNGRepresentation(diffImage); - - if (![diffImageData writeToFile:diffPath options:NSDataWritingAtomic error:errorPtr]) { - return NO; - } - - NSLog(@"If you have Kaleidoscope installed you can run this command to see an image diff:\n" - @"ksdiff \"%@\" \"%@\"", referencePath, testPath); - - return YES; -} - -- (BOOL)compareReferenceImage:(UIImage *)referenceImage toImage:(UIImage *)image error:(NSError **)errorPtr -{ - if (CGSizeEqualToSize(referenceImage.size, image.size)) { - - BOOL imagesEqual = [referenceImage compareWithImage:image]; - if (NULL != errorPtr) { - *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain - code:FBSnapshotTestControllerErrorCodeImagesDifferent - userInfo:@{ - NSLocalizedDescriptionKey: @"Images different", - }]; - } - return imagesEqual; - } - if (NULL != errorPtr) { - *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain - code:FBSnapshotTestControllerErrorCodeImagesDifferentSizes - userInfo:@{ - NSLocalizedDescriptionKey: @"Images different sizes", - NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"referenceImage:%@, image:%@", - NSStringFromCGSize(referenceImage.size), - NSStringFromCGSize(image.size)], - }]; - } - return NO; -} - -#pragma mark - -#pragma mark Private API - -typedef NS_ENUM(NSUInteger, FBTestSnapshotFileNameType) { - FBTestSnapshotFileNameTypeReference, - FBTestSnapshotFileNameTypeFailedReference, - FBTestSnapshotFileNameTypeFailedTest, - FBTestSnapshotFileNameTypeFailedTestDiff, -}; - -- (NSString *)_fileNameForSelector:(SEL)selector - identifier:(NSString *)identifier - fileNameType:(FBTestSnapshotFileNameType)fileNameType -{ - NSString *fileName = nil; - switch (fileNameType) { - case FBTestSnapshotFileNameTypeFailedReference: - fileName = @"reference_"; - break; - case FBTestSnapshotFileNameTypeFailedTest: - fileName = @"failed_"; - break; - case FBTestSnapshotFileNameTypeFailedTestDiff: - fileName = @"diff_"; - break; - default: - fileName = @""; - break; - } - fileName = [fileName stringByAppendingString:NSStringFromSelector(selector)]; - if (0 < identifier.length) { - fileName = [fileName stringByAppendingFormat:@"_%@", identifier]; - } - if ([[UIScreen mainScreen] scale] > 1.0) { - fileName = [fileName stringByAppendingFormat:@"@%.fx", [[UIScreen mainScreen] scale]]; - } - fileName = [fileName stringByAppendingPathExtension:@"png"]; - return fileName; -} - -- (NSString *)_referenceFilePathForSelector:(SEL)selector identifier:(NSString *)identifier -{ - NSString *fileName = [self _fileNameForSelector:selector - identifier:identifier - fileNameType:FBTestSnapshotFileNameTypeReference]; - NSString *filePath = [_referenceImagesDirectory stringByAppendingPathComponent:_testName]; - filePath = [filePath stringByAppendingPathComponent:fileName]; - return filePath; -} - -- (NSString *)_failedFilePathForSelector:(SEL)selector - identifier:(NSString *)identifier - fileNameType:(FBTestSnapshotFileNameType)fileNameType -{ - NSString *fileName = [self _fileNameForSelector:selector - identifier:identifier - fileNameType:fileNameType]; - NSString *folderPath = NSTemporaryDirectory(); - if (getenv("IMAGE_DIFF_DIR")) { - folderPath = @(getenv("IMAGE_DIFF_DIR")); - } - NSString *filePath = [folderPath stringByAppendingPathComponent:_testName]; - filePath = [filePath stringByAppendingPathComponent:fileName]; - return filePath; -} - -- (BOOL)compareSnapshotOfLayer:(CALayer *)layer - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - return [self compareSnapshotOfViewOrLayer:layer - selector:selector - identifier:identifier - error:errorPtr]; -} - -- (BOOL)compareSnapshotOfView:(UIView *)view - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - return [self compareSnapshotOfViewOrLayer:view - selector:selector - identifier:identifier - error:errorPtr]; -} - -- (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - if (self.recordMode) { - return [self _recordSnapshotOfViewOrLayer:viewOrLayer selector:selector identifier:identifier error:errorPtr]; - } else { - return [self _performPixelComparisonWithViewOrLayer:viewOrLayer selector:selector identifier:identifier error:errorPtr]; - } -} - -#pragma mark - -#pragma mark Private API - -- (BOOL)_performPixelComparisonWithViewOrLayer:(UIView *)viewOrLayer - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - UIImage *referenceImage = [self referenceImageForSelector:selector identifier:identifier error:errorPtr]; - if (nil != referenceImage) { - UIImage *snapshot = [self _snapshotViewOrLayer:viewOrLayer]; - BOOL imagesSame = [self compareReferenceImage:referenceImage toImage:snapshot error:errorPtr]; - if (!imagesSame) { - [self saveFailedReferenceImage:referenceImage - testImage:snapshot - selector:selector - identifier:identifier - error:errorPtr]; - } - return imagesSame; - } - return NO; -} - -- (BOOL)_recordSnapshotOfViewOrLayer:(id)viewOrLayer - selector:(SEL)selector - identifier:(NSString *)identifier - error:(NSError **)errorPtr -{ - UIImage *snapshot = [self _snapshotViewOrLayer:viewOrLayer]; - return [self saveReferenceImage:snapshot selector:selector identifier:identifier error:errorPtr]; -} - -- (UIImage *)_snapshotViewOrLayer:(id)viewOrLayer -{ - CALayer *layer = nil; - - if ([viewOrLayer isKindOfClass:[UIView class]]) { - return [self _renderView:viewOrLayer]; - } else if ([viewOrLayer isKindOfClass:[CALayer class]]) { - layer = (CALayer *)viewOrLayer; - [layer layoutIfNeeded]; - return [self _renderLayer:layer]; - } else { - [NSException raise:@"Only UIView and CALayer classes can be snapshotted" format:@"%@", viewOrLayer]; - } - return nil; -} - -- (UIImage *)_renderLayer:(CALayer *)layer -{ - CGRect bounds = layer.bounds; - - NSAssert1(CGRectGetWidth(bounds), @"Zero width for layer %@", layer); - NSAssert1(CGRectGetHeight(bounds), @"Zero height for layer %@", layer); - - UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); - CGContextRef context = UIGraphicsGetCurrentContext(); - NSAssert1(context, @"Could not generate context for layer %@", layer); - - CGContextSaveGState(context); - { - [layer renderInContext:context]; - } - CGContextRestoreGState(context); - - UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return snapshot; -} - -- (UIImage *)_renderView:(UIView *)view -{ - [view layoutIfNeeded]; - return [self _renderLayer:view.layer]; -} - -@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.h deleted file mode 100644 index 11c6fa6..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// Created by Gabriel Handford on 3/1/09. -// Copyright 2009-2013. All rights reserved. -// Created by John Boiles on 10/20/11. -// Copyright (c) 2011. All rights reserved -// Modified by Felix Schulze on 2/11/13. -// Copyright 2013. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission 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. -// - -#import - -@interface UIImage (Compare) - -- (BOOL)compareWithImage:(UIImage *)image; - -@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.m deleted file mode 100644 index e38c6e4..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.m +++ /dev/null @@ -1,91 +0,0 @@ -// -// Created by Gabriel Handford on 3/1/09. -// Copyright 2009-2013. All rights reserved. -// Created by John Boiles on 10/20/11. -// Copyright (c) 2011. All rights reserved -// Modified by Felix Schulze on 2/11/13. -// Copyright 2013. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission 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. -// - -#import "UIImage+Compare.h" - -@implementation UIImage (Compare) - -- (BOOL)compareWithImage:(UIImage *)image -{ - NSAssert(CGSizeEqualToSize(self.size, image.size), @"Images must be same size."); - - // The images have the equal size, so we could use the smallest amount of bytes because of byte padding - size_t minBytesPerRow = MIN(CGImageGetBytesPerRow(self.CGImage), CGImageGetBytesPerRow(image.CGImage)); - size_t referenceImageSizeBytes = CGImageGetHeight(self.CGImage) * minBytesPerRow; - void *referenceImagePixels = calloc(1, referenceImageSizeBytes); - void *imagePixels = calloc(1, referenceImageSizeBytes); - - if (!referenceImagePixels || !imagePixels) { - free(referenceImagePixels); - free(imagePixels); - return NO; - } - - CGContextRef referenceImageContext = CGBitmapContextCreate(referenceImagePixels, - CGImageGetWidth(self.CGImage), - CGImageGetHeight(self.CGImage), - CGImageGetBitsPerComponent(self.CGImage), - minBytesPerRow, - CGImageGetColorSpace(self.CGImage), - (CGBitmapInfo)kCGImageAlphaPremultipliedLast - ); - CGContextRef imageContext = CGBitmapContextCreate(imagePixels, - CGImageGetWidth(image.CGImage), - CGImageGetHeight(image.CGImage), - CGImageGetBitsPerComponent(image.CGImage), - minBytesPerRow, - CGImageGetColorSpace(image.CGImage), - (CGBitmapInfo)kCGImageAlphaPremultipliedLast - ); - - CGFloat scaleFactor = [[UIScreen mainScreen] scale]; - CGContextScaleCTM(referenceImageContext, scaleFactor, scaleFactor); - CGContextScaleCTM(imageContext, scaleFactor, scaleFactor); - - if (!referenceImageContext || !imageContext) { - CGContextRelease(referenceImageContext); - CGContextRelease(imageContext); - free(referenceImagePixels); - free(imagePixels); - return NO; - } - - CGContextDrawImage(referenceImageContext, CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), self.CGImage); - CGContextDrawImage(imageContext, CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), image.CGImage); - CGContextRelease(referenceImageContext); - CGContextRelease(imageContext); - - BOOL imageEqual = (memcmp(referenceImagePixels, imagePixels, referenceImageSizeBytes) == 0); - free(referenceImagePixels); - free(imagePixels); - return imageEqual; -} - -@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.h deleted file mode 100644 index 3559584..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// Created by Gabriel Handford on 3/1/09. -// Copyright 2009-2013. All rights reserved. -// Created by John Boiles on 10/20/11. -// Copyright (c) 2011. All rights reserved -// Modified by Felix Schulze on 2/11/13. -// Copyright 2013. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission 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. -// - -#import - -@interface UIImage (Diff) - -- (UIImage *)diffWithImage:(UIImage *)image; - -@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.m deleted file mode 100644 index 44ecb59..0000000 --- a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.m +++ /dev/null @@ -1,56 +0,0 @@ -// -// Created by Gabriel Handford on 3/1/09. -// Copyright 2009-2013. All rights reserved. -// Created by John Boiles on 10/20/11. -// Copyright (c) 2011. All rights reserved -// Modified by Felix Schulze on 2/11/13. -// Copyright 2013. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: -// -// The above copyright notice and this permission 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. -// - -#import "UIImage+Diff.h" - -@implementation UIImage (Diff) - -- (UIImage *)diffWithImage:(UIImage *)image -{ - if (!image) { - return nil; - } - CGSize imageSize = CGSizeMake(MAX(self.size.width, image.size.width), MAX(self.size.height, image.size.height)); - UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0.0); - CGContextRef context = UIGraphicsGetCurrentContext(); - [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)]; - CGContextSetAlpha(context, 0.5f); - CGContextBeginTransparencyLayer(context, NULL); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - CGContextSetBlendMode(context, kCGBlendModeDifference); - CGContextSetFillColorWithColor(context,[UIColor whiteColor].CGColor); - CGContextFillRect(context, CGRectMake(0, 0, self.size.width, self.size.height)); - CGContextEndTransparencyLayer(context); - UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return returnImage; -} - -@end diff --git a/Example/Pods/FBSnapshotTestCase/LICENSE b/Example/Pods/FBSnapshotTestCase/LICENSE deleted file mode 100644 index 2dd780c..0000000 --- a/Example/Pods/FBSnapshotTestCase/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD License - -For the FBSnapshotTestCase software - -Copyright (c) 2013, Facebook, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Example/Pods/FBSnapshotTestCase/README.md b/Example/Pods/FBSnapshotTestCase/README.md deleted file mode 100644 index 0a7c625..0000000 --- a/Example/Pods/FBSnapshotTestCase/README.md +++ /dev/null @@ -1,90 +0,0 @@ -FBSnapshotTestCase -====================== - -[![Build Status](https://travis-ci.org/facebook/ios-snapshot-test-case.svg)](https://travis-ci.org/facebook/ios-snapshot-test-case) - -What it does ------------- - -A "snapshot test case" takes a configured `UIView` or `CALayer` and uses the -`renderInContext:` method to get an image snapshot of its contents. It -compares this snapshot to a "reference image" stored in your source code -repository and fails the test if the two images don't match. - -Why? ----- - -At Facebook we write a lot of UI code. As you might imagine, each type of -feed story is rendered using a subclass of `UIView`. There are a lot of edge -cases that we want to handle correctly: - -- What if there is more text than can fit in the space available? -- What if an image doesn't match the size of an image view? -- What should the highlighted state look like? - -It's straightforward to test logic code, but less obvious how you should test -views. You can do a lot of rectangle asserts, but these are hard to understand -or visualize. Looking at an image diff shows you exactly what changed and how -it will look to users. - -We developed `FBSnapshotTestCase` to make snapshot tests easy. - -Installation with CocoaPods ---------------------------- - -1. Add the following lines to your Podfile: - - ``` - target "Tests" do - pod 'FBSnapshotTestCase' - end - ``` - - Replace "Tests" with the name of your test project. - -2. Define `FB_REFERENCE_IMAGE_DIR` in `GCC_PREPROCESSOR_DEFINITIONS`. This should - point to the directory where you want reference images to be stored. At Facebook, - we normally use this: - - `GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FB_REFERENCE_IMAGE_DIR="\"$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages\""` - -Creating a snapshot test ------------------------- - -1. Subclass `FBSnapshotTestCase` instead of `XCTestCase`. -2. From within your test, use `FBSnapshotVerifyView`. -3. Run the test once with `self.recordMode = YES;` in the test's `-setUp` - method. (This creates the reference images on disk.) -4. Remove the line enabling record mode and run the test. - -Features --------- - -- Automatically names reference images on disk according to test class and - selector. -- Prints a descriptive error message to the console on failure. (Bonus: - failure message includes a one-line command to see an image diff if - you have [Kaleidoscope](http://www.kaleidoscopeapp.com) installed.) -- Supply an optional "identifier" if you want to perform multiple snapshots - in a single test method. -- Support for `CALayer` via `FBSnapshotVerifyLayer`. - -Notes ------ - -Your unit test must be an "application test", not a "logic test." (That is, it -must be run within the Simulator so that it has access to UIKit.) In Xcode 5 -and later new projects only offer application tests, but older projects will -have separate targets for the two types. - -Authors -------- - -`FBSnapshotTestCase` was written at Facebook by -[Jonathan Dann](https://facebook.com/j.p.dann) with significant contributions by -[Todd Krabach](https://facebook.com/toddkrabach). - -License -------- - -`FBSnapshotTestCase` is BSD-licensed. See `LICENSE`. diff --git a/Example/Pods/Headers/Private/Expecta/EXPBlockDefinedMatcher.h b/Example/Pods/Headers/Private/Expecta/EXPBlockDefinedMatcher.h new file mode 120000 index 0000000..ebefa87 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPBlockDefinedMatcher.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPBlockDefinedMatcher.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPDefines.h b/Example/Pods/Headers/Private/Expecta/EXPDefines.h new file mode 120000 index 0000000..22add0c --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPDefines.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPDefines.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPDoubleTuple.h b/Example/Pods/Headers/Private/Expecta/EXPDoubleTuple.h new file mode 120000 index 0000000..54aa0b5 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPDoubleTuple.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPDoubleTuple.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPExpect.h b/Example/Pods/Headers/Private/Expecta/EXPExpect.h new file mode 120000 index 0000000..a677bdd --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPExpect.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPExpect.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPFloatTuple.h b/Example/Pods/Headers/Private/Expecta/EXPFloatTuple.h new file mode 120000 index 0000000..2b40569 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPFloatTuple.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPFloatTuple.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatcher.h b/Example/Pods/Headers/Private/Expecta/EXPMatcher.h new file mode 120000 index 0000000..3b20a12 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatcher.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPMatcher.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatcherHelpers.h b/Example/Pods/Headers/Private/Expecta/EXPMatcherHelpers.h new file mode 120000 index 0000000..697385b --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatcherHelpers.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatcherHelpers.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beCloseTo.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beCloseTo.h new file mode 120000 index 0000000..0eed377 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beCloseTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beFalsy.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beFalsy.h new file mode 120000 index 0000000..92643c4 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beFalsy.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beFalsy.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThan.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThan.h new file mode 120000 index 0000000..1ccc62b --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThan.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h new file mode 120000 index 0000000..db5bf96 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beIdenticalTo.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beIdenticalTo.h new file mode 120000 index 0000000..6e17ea4 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beIdenticalTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beInTheRangeOf.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beInTheRangeOf.h new file mode 120000 index 0000000..362d8a7 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beInTheRangeOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beInstanceOf.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beInstanceOf.h new file mode 120000 index 0000000..4dd6063 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beInstanceOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beKindOf.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beKindOf.h new file mode 120000 index 0000000..113c7d3 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beKindOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beKindOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThan.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThan.h new file mode 120000 index 0000000..675e86a --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThan.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beLessThan.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThanOrEqualTo.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThanOrEqualTo.h new file mode 120000 index 0000000..c16df2f --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beLessThanOrEqualTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beNil.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beNil.h new file mode 120000 index 0000000..9f65a6c --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beNil.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beNil.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beSubclassOf.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beSubclassOf.h new file mode 120000 index 0000000..27aa7be --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beSubclassOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beSupersetOf.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beSupersetOf.h new file mode 120000 index 0000000..ea3f770 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beSupersetOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beTruthy.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beTruthy.h new file mode 120000 index 0000000..192ac76 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beTruthy.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beTruthy.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+beginWith.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beginWith.h new file mode 120000 index 0000000..2efba8f --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+beginWith.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beginWith.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+conformTo.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+conformTo.h new file mode 120000 index 0000000..062fb51 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+conformTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+conformTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+contain.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+contain.h new file mode 120000 index 0000000..3661fe5 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+contain.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+contain.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+endWith.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+endWith.h new file mode 120000 index 0000000..7e6c9cf --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+endWith.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+endWith.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+equal.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+equal.h new file mode 120000 index 0000000..7bee788 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+equal.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+equal.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+haveCountOf.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+haveCountOf.h new file mode 120000 index 0000000..f46d23a --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+haveCountOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+match.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+match.h new file mode 120000 index 0000000..18f995d --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+match.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+match.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+postNotification.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+postNotification.h new file mode 120000 index 0000000..c9422e3 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+postNotification.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+postNotification.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+raise.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+raise.h new file mode 120000 index 0000000..901e04c --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+raise.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+raise.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+raiseWithReason.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+raiseWithReason.h new file mode 120000 index 0000000..5b063b6 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+raiseWithReason.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers+respondTo.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers+respondTo.h new file mode 120000 index 0000000..e7a5fad --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers+respondTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+respondTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPMatchers.h b/Example/Pods/Headers/Private/Expecta/EXPMatchers.h new file mode 120000 index 0000000..a454dc4 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPMatchers.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/EXPUnsupportedObject.h b/Example/Pods/Headers/Private/Expecta/EXPUnsupportedObject.h new file mode 120000 index 0000000..60fae89 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/EXPUnsupportedObject.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPUnsupportedObject.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/Expecta.h b/Example/Pods/Headers/Private/Expecta/Expecta.h new file mode 120000 index 0000000..45ef877 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/Expecta.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Expecta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/ExpectaObject.h b/Example/Pods/Headers/Private/Expecta/ExpectaObject.h new file mode 120000 index 0000000..36a99e1 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/ExpectaObject.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/ExpectaObject.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/ExpectaSupport.h b/Example/Pods/Headers/Private/Expecta/ExpectaSupport.h new file mode 120000 index 0000000..c59d3fc --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/ExpectaSupport.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/ExpectaSupport.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/NSObject+Expecta.h b/Example/Pods/Headers/Private/Expecta/NSObject+Expecta.h new file mode 120000 index 0000000..55c3635 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/NSObject+Expecta.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/NSObject+Expecta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Expecta/NSValue+Expecta.h b/Example/Pods/Headers/Private/Expecta/NSValue+Expecta.h new file mode 120000 index 0000000..ee557b8 --- /dev/null +++ b/Example/Pods/Headers/Private/Expecta/NSValue+Expecta.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/NSValue+Expecta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h deleted file mode 120000 index 2925eab..0000000 --- a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h deleted file mode 120000 index 4a7dea1..0000000 --- a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h deleted file mode 120000 index a68eafb..0000000 --- a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h deleted file mode 120000 index f21e64d..0000000 --- a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTAngleAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTAngleAnimation.h deleted file mode 120000 index 9d1da32..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTAngleAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTAngleAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTAnimatable.h b/Example/Pods/Headers/Private/JazzHands/IFTTTAnimatable.h new file mode 120000 index 0000000..255148e --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTAnimatable.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTAnimatable.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTAnimatedPagingScrollViewController.h b/Example/Pods/Headers/Private/JazzHands/IFTTTAnimatedPagingScrollViewController.h new file mode 120000 index 0000000..e8f1846 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTAnimatedPagingScrollViewController.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTAnimatedPagingScrollViewController.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTAnimationFrame.h b/Example/Pods/Headers/Private/JazzHands/IFTTTAnimationFrame.h deleted file mode 120000 index e2104eb..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTAnimationFrame.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTAnimationFrame.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTAnimationKeyFrame.h b/Example/Pods/Headers/Private/JazzHands/IFTTTAnimationKeyFrame.h deleted file mode 120000 index 0ee0254..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTAnimationKeyFrame.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTAnimationKeyFrame.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintConstantAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintConstantAnimation.h new file mode 120000 index 0000000..c0abf7d --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintConstantAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTConstraintConstantAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintMultiplierAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintMultiplierAnimation.h new file mode 120000 index 0000000..e3a602e --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintMultiplierAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTConstraintMultiplierAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintsAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintsAnimation.h deleted file mode 120000 index e6332ed..0000000 --- a/Example/Pods/Headers/Private/JazzHands/IFTTTConstraintsAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTConstraintsAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTFilmstrip.h b/Example/Pods/Headers/Private/JazzHands/IFTTTFilmstrip.h new file mode 120000 index 0000000..daea4f2 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTFilmstrip.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTFilmstrip.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTInterpolatable.h b/Example/Pods/Headers/Private/JazzHands/IFTTTInterpolatable.h new file mode 120000 index 0000000..1d7dfb3 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTInterpolatable.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTInterpolatable.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTLabelAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTLabelAnimation.h new file mode 120000 index 0000000..81ee329 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTLabelAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLabelAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTRotationAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTRotationAnimation.h new file mode 120000 index 0000000..43d4981 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTRotationAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTRotationAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTScrollViewPageConstraintAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTScrollViewPageConstraintAnimation.h new file mode 120000 index 0000000..160f7ca --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTScrollViewPageConstraintAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTScrollViewPageConstraintAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTShapeLayerAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTShapeLayerAnimation.h new file mode 120000 index 0000000..cbf690c --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTShapeLayerAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTShapeLayerAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTTranslationAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTTranslationAnimation.h new file mode 120000 index 0000000..1553271 --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTTranslationAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTTranslationAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/IFTTTViewAnimation.h b/Example/Pods/Headers/Private/JazzHands/IFTTTViewAnimation.h new file mode 120000 index 0000000..96aad4a --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/IFTTTViewAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTViewAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/JazzHands/UIView+IFTTTJazzHands.h b/Example/Pods/Headers/Private/JazzHands/UIView+IFTTTJazzHands.h new file mode 120000 index 0000000..e1cfdfd --- /dev/null +++ b/Example/Pods/Headers/Private/JazzHands/UIView+IFTTTJazzHands.h @@ -0,0 +1 @@ +../../../../../JazzHands/UIView+IFTTTJazzHands.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/CGGeometry-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/CGGeometry-KIFAdditions.h deleted file mode 120000 index 84c9be7..0000000 --- a/Example/Pods/Headers/Private/KIF/CGGeometry-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/CGGeometry-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIF.h b/Example/Pods/Headers/Private/KIF/KIF.h deleted file mode 120000 index b0b5d2e..0000000 --- a/Example/Pods/Headers/Private/KIF/KIF.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIF.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIFSystemTestActor.h b/Example/Pods/Headers/Private/KIF/KIFSystemTestActor.h deleted file mode 120000 index 422681e..0000000 --- a/Example/Pods/Headers/Private/KIF/KIFSystemTestActor.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFSystemTestActor.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIFTestActor.h b/Example/Pods/Headers/Private/KIF/KIFTestActor.h deleted file mode 120000 index 4546348..0000000 --- a/Example/Pods/Headers/Private/KIF/KIFTestActor.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTestActor.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIFTestCase.h b/Example/Pods/Headers/Private/KIF/KIFTestCase.h deleted file mode 120000 index 5a6627d..0000000 --- a/Example/Pods/Headers/Private/KIF/KIFTestCase.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTestCase.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIFTestStepValidation.h b/Example/Pods/Headers/Private/KIF/KIFTestStepValidation.h deleted file mode 120000 index e50e6a3..0000000 --- a/Example/Pods/Headers/Private/KIF/KIFTestStepValidation.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTestStepValidation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIFTypist.h b/Example/Pods/Headers/Private/KIF/KIFTypist.h deleted file mode 120000 index b0207cc..0000000 --- a/Example/Pods/Headers/Private/KIF/KIFTypist.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTypist.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIFUITestActor-ConditionalTests.h b/Example/Pods/Headers/Private/KIF/KIFUITestActor-ConditionalTests.h deleted file mode 120000 index 8311121..0000000 --- a/Example/Pods/Headers/Private/KIF/KIFUITestActor-ConditionalTests.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFUITestActor-ConditionalTests.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/KIFUITestActor.h b/Example/Pods/Headers/Private/KIF/KIFUITestActor.h deleted file mode 120000 index 23ec5bc..0000000 --- a/Example/Pods/Headers/Private/KIF/KIFUITestActor.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFUITestActor.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/LoadableCategory.h b/Example/Pods/Headers/Private/KIF/LoadableCategory.h deleted file mode 120000 index 550a0af..0000000 --- a/Example/Pods/Headers/Private/KIF/LoadableCategory.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/LoadableCategory.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/NSBundle-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/NSBundle-KIFAdditions.h deleted file mode 120000 index 87d8127..0000000 --- a/Example/Pods/Headers/Private/KIF/NSBundle-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSBundle-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/NSError-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/NSError-KIFAdditions.h deleted file mode 120000 index 58e4a2f..0000000 --- a/Example/Pods/Headers/Private/KIF/NSError-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSError-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/NSException-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/NSException-KIFAdditions.h deleted file mode 120000 index 78b8206..0000000 --- a/Example/Pods/Headers/Private/KIF/NSException-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSException-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/NSFileManager-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/NSFileManager-KIFAdditions.h deleted file mode 120000 index 2278526..0000000 --- a/Example/Pods/Headers/Private/KIF/NSFileManager-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSFileManager-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UIAccessibilityElement-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UIAccessibilityElement-KIFAdditions.h deleted file mode 120000 index cba324f..0000000 --- a/Example/Pods/Headers/Private/KIF/UIAccessibilityElement-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIAccessibilityElement-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UIApplication-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UIApplication-KIFAdditions.h deleted file mode 120000 index 40e0a6e..0000000 --- a/Example/Pods/Headers/Private/KIF/UIApplication-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIApplication-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UIAutomationHelper.h b/Example/Pods/Headers/Private/KIF/UIAutomationHelper.h deleted file mode 120000 index 5373531..0000000 --- a/Example/Pods/Headers/Private/KIF/UIAutomationHelper.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/UIAutomationHelper.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UIEvent+KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UIEvent+KIFAdditions.h deleted file mode 120000 index 56b8184..0000000 --- a/Example/Pods/Headers/Private/KIF/UIEvent+KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIEvent+KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UIScrollView-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UIScrollView-KIFAdditions.h deleted file mode 120000 index 9c52ef0..0000000 --- a/Example/Pods/Headers/Private/KIF/UIScrollView-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIScrollView-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UITableView-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UITableView-KIFAdditions.h deleted file mode 120000 index 25a738c..0000000 --- a/Example/Pods/Headers/Private/KIF/UITableView-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UITableView-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UITouch-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UITouch-KIFAdditions.h deleted file mode 120000 index 417aa10..0000000 --- a/Example/Pods/Headers/Private/KIF/UITouch-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UITouch-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UIView-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UIView-KIFAdditions.h deleted file mode 120000 index fdefd8d..0000000 --- a/Example/Pods/Headers/Private/KIF/UIView-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIView-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/UIWindow-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/UIWindow-KIFAdditions.h deleted file mode 120000 index aa7b1f2..0000000 --- a/Example/Pods/Headers/Private/KIF/UIWindow-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIWindow-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/KIF/XCTestCase-KIFAdditions.h b/Example/Pods/Headers/Private/KIF/XCTestCase-KIFAdditions.h deleted file mode 120000 index d6f1e02..0000000 --- a/Example/Pods/Headers/Private/KIF/XCTestCase-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/XCTestCase-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTCallSite.h b/Example/Pods/Headers/Private/Specta/SPTCallSite.h new file mode 120000 index 0000000..dbb535a --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTCallSite.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTCallSite.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTCompiledExample.h b/Example/Pods/Headers/Private/Specta/SPTCompiledExample.h new file mode 120000 index 0000000..6597704 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTCompiledExample.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTCompiledExample.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTExample.h b/Example/Pods/Headers/Private/Specta/SPTExample.h new file mode 120000 index 0000000..79a18d4 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTExample.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTExample.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTExampleGroup.h b/Example/Pods/Headers/Private/Specta/SPTExampleGroup.h new file mode 120000 index 0000000..1effac5 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTExampleGroup.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTExampleGroup.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTExcludeGlobalBeforeAfterEach.h b/Example/Pods/Headers/Private/Specta/SPTExcludeGlobalBeforeAfterEach.h new file mode 120000 index 0000000..64df734 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTExcludeGlobalBeforeAfterEach.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTGlobalBeforeAfterEach.h b/Example/Pods/Headers/Private/Specta/SPTGlobalBeforeAfterEach.h new file mode 120000 index 0000000..7f83b65 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTGlobalBeforeAfterEach.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTGlobalBeforeAfterEach.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTSharedExampleGroups.h b/Example/Pods/Headers/Private/Specta/SPTSharedExampleGroups.h new file mode 120000 index 0000000..579d360 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTSharedExampleGroups.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTSharedExampleGroups.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTSpec.h b/Example/Pods/Headers/Private/Specta/SPTSpec.h new file mode 120000 index 0000000..3b1679a --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTSpec.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTSpec.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SPTTestSuite.h b/Example/Pods/Headers/Private/Specta/SPTTestSuite.h new file mode 120000 index 0000000..2f607e4 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SPTTestSuite.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTTestSuite.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/Specta.h b/Example/Pods/Headers/Private/Specta/Specta.h new file mode 120000 index 0000000..111c968 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/Specta.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/Specta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SpectaDSL.h b/Example/Pods/Headers/Private/Specta/SpectaDSL.h new file mode 120000 index 0000000..fd1ad37 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SpectaDSL.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SpectaDSL.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SpectaTypes.h b/Example/Pods/Headers/Private/Specta/SpectaTypes.h new file mode 120000 index 0000000..9428b13 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SpectaTypes.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SpectaTypes.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/SpectaUtility.h b/Example/Pods/Headers/Private/Specta/SpectaUtility.h new file mode 120000 index 0000000..5762480 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/SpectaUtility.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SpectaUtility.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/XCTest+Private.h b/Example/Pods/Headers/Private/Specta/XCTest+Private.h new file mode 120000 index 0000000..bb4a8e0 --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/XCTest+Private.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/XCTest+Private.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Specta/XCTestCase+Specta.h b/Example/Pods/Headers/Private/Specta/XCTestCase+Specta.h new file mode 120000 index 0000000..95f58cc --- /dev/null +++ b/Example/Pods/Headers/Private/Specta/XCTestCase+Specta.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/XCTestCase+Specta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPBlockDefinedMatcher.h b/Example/Pods/Headers/Public/Expecta/EXPBlockDefinedMatcher.h new file mode 120000 index 0000000..ebefa87 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPBlockDefinedMatcher.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPBlockDefinedMatcher.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPDefines.h b/Example/Pods/Headers/Public/Expecta/EXPDefines.h new file mode 120000 index 0000000..22add0c --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPDefines.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPDefines.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPDoubleTuple.h b/Example/Pods/Headers/Public/Expecta/EXPDoubleTuple.h new file mode 120000 index 0000000..54aa0b5 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPDoubleTuple.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPDoubleTuple.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPExpect.h b/Example/Pods/Headers/Public/Expecta/EXPExpect.h new file mode 120000 index 0000000..a677bdd --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPExpect.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPExpect.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPFloatTuple.h b/Example/Pods/Headers/Public/Expecta/EXPFloatTuple.h new file mode 120000 index 0000000..2b40569 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPFloatTuple.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPFloatTuple.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatcher.h b/Example/Pods/Headers/Public/Expecta/EXPMatcher.h new file mode 120000 index 0000000..3b20a12 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatcher.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPMatcher.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatcherHelpers.h b/Example/Pods/Headers/Public/Expecta/EXPMatcherHelpers.h new file mode 120000 index 0000000..697385b --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatcherHelpers.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatcherHelpers.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beCloseTo.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beCloseTo.h new file mode 120000 index 0000000..0eed377 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beCloseTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beFalsy.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beFalsy.h new file mode 120000 index 0000000..92643c4 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beFalsy.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beFalsy.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThan.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThan.h new file mode 120000 index 0000000..1ccc62b --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThan.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h new file mode 120000 index 0000000..db5bf96 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beIdenticalTo.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beIdenticalTo.h new file mode 120000 index 0000000..6e17ea4 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beIdenticalTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beInTheRangeOf.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beInTheRangeOf.h new file mode 120000 index 0000000..362d8a7 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beInTheRangeOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beInstanceOf.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beInstanceOf.h new file mode 120000 index 0000000..4dd6063 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beInstanceOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beKindOf.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beKindOf.h new file mode 120000 index 0000000..113c7d3 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beKindOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beKindOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThan.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThan.h new file mode 120000 index 0000000..675e86a --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThan.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beLessThan.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThanOrEqualTo.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThanOrEqualTo.h new file mode 120000 index 0000000..c16df2f --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beLessThanOrEqualTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beNil.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beNil.h new file mode 120000 index 0000000..9f65a6c --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beNil.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beNil.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beSubclassOf.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beSubclassOf.h new file mode 120000 index 0000000..27aa7be --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beSubclassOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beSupersetOf.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beSupersetOf.h new file mode 120000 index 0000000..ea3f770 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beSupersetOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beTruthy.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beTruthy.h new file mode 120000 index 0000000..192ac76 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beTruthy.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beTruthy.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+beginWith.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beginWith.h new file mode 120000 index 0000000..2efba8f --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+beginWith.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+beginWith.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+conformTo.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+conformTo.h new file mode 120000 index 0000000..062fb51 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+conformTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+conformTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+contain.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+contain.h new file mode 120000 index 0000000..3661fe5 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+contain.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+contain.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+endWith.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+endWith.h new file mode 120000 index 0000000..7e6c9cf --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+endWith.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+endWith.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+equal.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+equal.h new file mode 120000 index 0000000..7bee788 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+equal.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+equal.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+haveCountOf.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+haveCountOf.h new file mode 120000 index 0000000..f46d23a --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+haveCountOf.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+match.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+match.h new file mode 120000 index 0000000..18f995d --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+match.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+match.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+postNotification.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+postNotification.h new file mode 120000 index 0000000..c9422e3 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+postNotification.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+postNotification.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+raise.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+raise.h new file mode 120000 index 0000000..901e04c --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+raise.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+raise.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+raiseWithReason.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+raiseWithReason.h new file mode 120000 index 0000000..5b063b6 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+raiseWithReason.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers+respondTo.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers+respondTo.h new file mode 120000 index 0000000..e7a5fad --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers+respondTo.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers+respondTo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPMatchers.h b/Example/Pods/Headers/Public/Expecta/EXPMatchers.h new file mode 120000 index 0000000..a454dc4 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPMatchers.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Matchers/EXPMatchers.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/EXPUnsupportedObject.h b/Example/Pods/Headers/Public/Expecta/EXPUnsupportedObject.h new file mode 120000 index 0000000..60fae89 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/EXPUnsupportedObject.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/EXPUnsupportedObject.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/Expecta.h b/Example/Pods/Headers/Public/Expecta/Expecta.h new file mode 120000 index 0000000..45ef877 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/Expecta.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/Expecta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/ExpectaObject.h b/Example/Pods/Headers/Public/Expecta/ExpectaObject.h new file mode 120000 index 0000000..36a99e1 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/ExpectaObject.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/ExpectaObject.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/ExpectaSupport.h b/Example/Pods/Headers/Public/Expecta/ExpectaSupport.h new file mode 120000 index 0000000..c59d3fc --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/ExpectaSupport.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/ExpectaSupport.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/NSObject+Expecta.h b/Example/Pods/Headers/Public/Expecta/NSObject+Expecta.h new file mode 120000 index 0000000..55c3635 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/NSObject+Expecta.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/NSObject+Expecta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Expecta/NSValue+Expecta.h b/Example/Pods/Headers/Public/Expecta/NSValue+Expecta.h new file mode 120000 index 0000000..ee557b8 --- /dev/null +++ b/Example/Pods/Headers/Public/Expecta/NSValue+Expecta.h @@ -0,0 +1 @@ +../../../Expecta/Expecta/NSValue+Expecta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestCase.h b/Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestCase.h deleted file mode 120000 index 2925eab..0000000 --- a/Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestCase.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestController.h b/Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestController.h deleted file mode 120000 index 4a7dea1..0000000 --- a/Example/Pods/Headers/Public/FBSnapshotTestCase/FBSnapshotTestController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Compare.h b/Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Compare.h deleted file mode 120000 index a68eafb..0000000 --- a/Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Compare.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Compare.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Diff.h b/Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Diff.h deleted file mode 120000 index f21e64d..0000000 --- a/Example/Pods/Headers/Public/FBSnapshotTestCase/UIImage+Diff.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBSnapshotTestCase/FBSnapshotTestCase/UIImage+Diff.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTAngleAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTAngleAnimation.h deleted file mode 120000 index 9d1da32..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTAngleAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTAngleAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTAnimatable.h b/Example/Pods/Headers/Public/JazzHands/IFTTTAnimatable.h new file mode 120000 index 0000000..255148e --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTAnimatable.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTAnimatable.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTAnimatedPagingScrollViewController.h b/Example/Pods/Headers/Public/JazzHands/IFTTTAnimatedPagingScrollViewController.h new file mode 120000 index 0000000..e8f1846 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTAnimatedPagingScrollViewController.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTAnimatedPagingScrollViewController.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTAnimationFrame.h b/Example/Pods/Headers/Public/JazzHands/IFTTTAnimationFrame.h deleted file mode 120000 index e2104eb..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTAnimationFrame.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTAnimationFrame.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTAnimationKeyFrame.h b/Example/Pods/Headers/Public/JazzHands/IFTTTAnimationKeyFrame.h deleted file mode 120000 index 0ee0254..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTAnimationKeyFrame.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTAnimationKeyFrame.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintConstantAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintConstantAnimation.h new file mode 120000 index 0000000..c0abf7d --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintConstantAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTConstraintConstantAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintMultiplierAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintMultiplierAnimation.h new file mode 120000 index 0000000..e3a602e --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintMultiplierAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTConstraintMultiplierAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintsAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintsAnimation.h deleted file mode 120000 index e6332ed..0000000 --- a/Example/Pods/Headers/Public/JazzHands/IFTTTConstraintsAnimation.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../JazzHands/IFTTTConstraintsAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTFilmstrip.h b/Example/Pods/Headers/Public/JazzHands/IFTTTFilmstrip.h new file mode 120000 index 0000000..daea4f2 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTFilmstrip.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTFilmstrip.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTInterpolatable.h b/Example/Pods/Headers/Public/JazzHands/IFTTTInterpolatable.h new file mode 120000 index 0000000..1d7dfb3 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTInterpolatable.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTInterpolatable.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTLabelAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTLabelAnimation.h new file mode 120000 index 0000000..81ee329 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTLabelAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTLabelAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTRotationAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTRotationAnimation.h new file mode 120000 index 0000000..43d4981 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTRotationAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTRotationAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTScrollViewPageConstraintAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTScrollViewPageConstraintAnimation.h new file mode 120000 index 0000000..160f7ca --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTScrollViewPageConstraintAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTScrollViewPageConstraintAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTShapeLayerAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTShapeLayerAnimation.h new file mode 120000 index 0000000..cbf690c --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTShapeLayerAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTShapeLayerAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTTranslationAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTTranslationAnimation.h new file mode 120000 index 0000000..1553271 --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTTranslationAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTTranslationAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/IFTTTViewAnimation.h b/Example/Pods/Headers/Public/JazzHands/IFTTTViewAnimation.h new file mode 120000 index 0000000..96aad4a --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/IFTTTViewAnimation.h @@ -0,0 +1 @@ +../../../../../JazzHands/IFTTTViewAnimation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/JazzHands/UIView+IFTTTJazzHands.h b/Example/Pods/Headers/Public/JazzHands/UIView+IFTTTJazzHands.h new file mode 120000 index 0000000..e1cfdfd --- /dev/null +++ b/Example/Pods/Headers/Public/JazzHands/UIView+IFTTTJazzHands.h @@ -0,0 +1 @@ +../../../../../JazzHands/UIView+IFTTTJazzHands.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/CGGeometry-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/CGGeometry-KIFAdditions.h deleted file mode 120000 index 84c9be7..0000000 --- a/Example/Pods/Headers/Public/KIF/CGGeometry-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/CGGeometry-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIF.h b/Example/Pods/Headers/Public/KIF/KIF.h deleted file mode 120000 index b0b5d2e..0000000 --- a/Example/Pods/Headers/Public/KIF/KIF.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIF.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIFSystemTestActor.h b/Example/Pods/Headers/Public/KIF/KIFSystemTestActor.h deleted file mode 120000 index 422681e..0000000 --- a/Example/Pods/Headers/Public/KIF/KIFSystemTestActor.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFSystemTestActor.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIFTestActor.h b/Example/Pods/Headers/Public/KIF/KIFTestActor.h deleted file mode 120000 index 4546348..0000000 --- a/Example/Pods/Headers/Public/KIF/KIFTestActor.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTestActor.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIFTestCase.h b/Example/Pods/Headers/Public/KIF/KIFTestCase.h deleted file mode 120000 index 5a6627d..0000000 --- a/Example/Pods/Headers/Public/KIF/KIFTestCase.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTestCase.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIFTestStepValidation.h b/Example/Pods/Headers/Public/KIF/KIFTestStepValidation.h deleted file mode 120000 index e50e6a3..0000000 --- a/Example/Pods/Headers/Public/KIF/KIFTestStepValidation.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTestStepValidation.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIFTypist.h b/Example/Pods/Headers/Public/KIF/KIFTypist.h deleted file mode 120000 index b0207cc..0000000 --- a/Example/Pods/Headers/Public/KIF/KIFTypist.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFTypist.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIFUITestActor-ConditionalTests.h b/Example/Pods/Headers/Public/KIF/KIFUITestActor-ConditionalTests.h deleted file mode 120000 index 8311121..0000000 --- a/Example/Pods/Headers/Public/KIF/KIFUITestActor-ConditionalTests.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFUITestActor-ConditionalTests.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/KIFUITestActor.h b/Example/Pods/Headers/Public/KIF/KIFUITestActor.h deleted file mode 120000 index 23ec5bc..0000000 --- a/Example/Pods/Headers/Public/KIF/KIFUITestActor.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/KIFUITestActor.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/NSBundle-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/NSBundle-KIFAdditions.h deleted file mode 120000 index 87d8127..0000000 --- a/Example/Pods/Headers/Public/KIF/NSBundle-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSBundle-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/NSError-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/NSError-KIFAdditions.h deleted file mode 120000 index 58e4a2f..0000000 --- a/Example/Pods/Headers/Public/KIF/NSError-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSError-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/NSException-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/NSException-KIFAdditions.h deleted file mode 120000 index 78b8206..0000000 --- a/Example/Pods/Headers/Public/KIF/NSException-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSException-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/NSFileManager-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/NSFileManager-KIFAdditions.h deleted file mode 120000 index 2278526..0000000 --- a/Example/Pods/Headers/Public/KIF/NSFileManager-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/NSFileManager-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UIAccessibilityElement-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/UIAccessibilityElement-KIFAdditions.h deleted file mode 120000 index cba324f..0000000 --- a/Example/Pods/Headers/Public/KIF/UIAccessibilityElement-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIAccessibilityElement-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UIApplication-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/UIApplication-KIFAdditions.h deleted file mode 120000 index 40e0a6e..0000000 --- a/Example/Pods/Headers/Public/KIF/UIApplication-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIApplication-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UIAutomationHelper.h b/Example/Pods/Headers/Public/KIF/UIAutomationHelper.h deleted file mode 120000 index 5373531..0000000 --- a/Example/Pods/Headers/Public/KIF/UIAutomationHelper.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Classes/UIAutomationHelper.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UIScrollView-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/UIScrollView-KIFAdditions.h deleted file mode 120000 index 9c52ef0..0000000 --- a/Example/Pods/Headers/Public/KIF/UIScrollView-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIScrollView-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UITableView-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/UITableView-KIFAdditions.h deleted file mode 120000 index 25a738c..0000000 --- a/Example/Pods/Headers/Public/KIF/UITableView-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UITableView-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UITouch-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/UITouch-KIFAdditions.h deleted file mode 120000 index 417aa10..0000000 --- a/Example/Pods/Headers/Public/KIF/UITouch-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UITouch-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UIView-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/UIView-KIFAdditions.h deleted file mode 120000 index fdefd8d..0000000 --- a/Example/Pods/Headers/Public/KIF/UIView-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIView-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/UIWindow-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/UIWindow-KIFAdditions.h deleted file mode 120000 index aa7b1f2..0000000 --- a/Example/Pods/Headers/Public/KIF/UIWindow-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/UIWindow-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/KIF/XCTestCase-KIFAdditions.h b/Example/Pods/Headers/Public/KIF/XCTestCase-KIFAdditions.h deleted file mode 120000 index d6f1e02..0000000 --- a/Example/Pods/Headers/Public/KIF/XCTestCase-KIFAdditions.h +++ /dev/null @@ -1 +0,0 @@ -../../../KIF/Additions/XCTestCase-KIFAdditions.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTCallSite.h b/Example/Pods/Headers/Public/Specta/SPTCallSite.h new file mode 120000 index 0000000..dbb535a --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTCallSite.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTCallSite.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTCompiledExample.h b/Example/Pods/Headers/Public/Specta/SPTCompiledExample.h new file mode 120000 index 0000000..6597704 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTCompiledExample.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTCompiledExample.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTExample.h b/Example/Pods/Headers/Public/Specta/SPTExample.h new file mode 120000 index 0000000..79a18d4 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTExample.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTExample.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTExampleGroup.h b/Example/Pods/Headers/Public/Specta/SPTExampleGroup.h new file mode 120000 index 0000000..1effac5 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTExampleGroup.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTExampleGroup.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTExcludeGlobalBeforeAfterEach.h b/Example/Pods/Headers/Public/Specta/SPTExcludeGlobalBeforeAfterEach.h new file mode 120000 index 0000000..64df734 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTExcludeGlobalBeforeAfterEach.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTGlobalBeforeAfterEach.h b/Example/Pods/Headers/Public/Specta/SPTGlobalBeforeAfterEach.h new file mode 120000 index 0000000..7f83b65 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTGlobalBeforeAfterEach.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTGlobalBeforeAfterEach.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTSharedExampleGroups.h b/Example/Pods/Headers/Public/Specta/SPTSharedExampleGroups.h new file mode 120000 index 0000000..579d360 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTSharedExampleGroups.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTSharedExampleGroups.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTSpec.h b/Example/Pods/Headers/Public/Specta/SPTSpec.h new file mode 120000 index 0000000..3b1679a --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTSpec.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTSpec.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SPTTestSuite.h b/Example/Pods/Headers/Public/Specta/SPTTestSuite.h new file mode 120000 index 0000000..2f607e4 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SPTTestSuite.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SPTTestSuite.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/Specta.h b/Example/Pods/Headers/Public/Specta/Specta.h new file mode 120000 index 0000000..111c968 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/Specta.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/Specta.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SpectaDSL.h b/Example/Pods/Headers/Public/Specta/SpectaDSL.h new file mode 120000 index 0000000..fd1ad37 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SpectaDSL.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SpectaDSL.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SpectaTypes.h b/Example/Pods/Headers/Public/Specta/SpectaTypes.h new file mode 120000 index 0000000..9428b13 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SpectaTypes.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SpectaTypes.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/SpectaUtility.h b/Example/Pods/Headers/Public/Specta/SpectaUtility.h new file mode 120000 index 0000000..5762480 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/SpectaUtility.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/SpectaUtility.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/XCTest+Private.h b/Example/Pods/Headers/Public/Specta/XCTest+Private.h new file mode 120000 index 0000000..bb4a8e0 --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/XCTest+Private.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/XCTest+Private.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Specta/XCTestCase+Specta.h b/Example/Pods/Headers/Public/Specta/XCTestCase+Specta.h new file mode 120000 index 0000000..95f58cc --- /dev/null +++ b/Example/Pods/Headers/Public/Specta/XCTestCase+Specta.h @@ -0,0 +1 @@ +../../../Specta/Specta/Specta/XCTestCase+Specta.h \ No newline at end of file diff --git a/Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.h b/Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.h deleted file mode 100644 index e84ae2e..0000000 --- a/Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// CGGeometry-KIFAdditions.h -// KIF -// -// Created by Eric Firestone on 5/22/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - -CG_INLINE CGPoint CGPointCenteredInRect(CGRect bounds) { - return CGPointMake(bounds.origin.x + bounds.size.width * 0.5f, bounds.origin.y + bounds.size.height * 0.5f); -} - -CG_INLINE CGPoint CGPointMidPoint(CGPoint point1, CGPoint point2) { - return CGPointMake((point1.x + point2.x) / 2.0, (point1.y + point2.y) / 2.0); -} diff --git a/Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.m b/Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.m deleted file mode 100644 index bb4062b..0000000 --- a/Example/Pods/KIF/Additions/CGGeometry-KIFAdditions.m +++ /dev/null @@ -1,11 +0,0 @@ -// -// CGGeometry-KIFAdditions.m -// KIF -// -// Created by Eric Firestone on 5/22/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "CGGeometry-KIFAdditions.h" - diff --git a/Example/Pods/KIF/Additions/LoadableCategory.h b/Example/Pods/KIF/Additions/LoadableCategory.h deleted file mode 100644 index 92259bb..0000000 --- a/Example/Pods/KIF/Additions/LoadableCategory.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// LoadableCategory.h -// KIF -// -// Created by Karl Stenerud on 7/16/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -/** Make all categories in the current file loadable without using -load-all. - * - * Normally, compilers will skip linking files that contain only categories. - * Adding a call to this macro adds a dummy class, which causes the linker - * to add the file. - * - * @param UNIQUE_NAME A globally unique name. - */ -#define MAKE_CATEGORIES_LOADABLE(UNIQUE_NAME) @interface FORCELOAD_##UNIQUE_NAME : NSObject @end @implementation FORCELOAD_##UNIQUE_NAME @end diff --git a/Example/Pods/KIF/Additions/NSBundle-KIFAdditions.h b/Example/Pods/KIF/Additions/NSBundle-KIFAdditions.h deleted file mode 100644 index 60cbe68..0000000 --- a/Example/Pods/KIF/Additions/NSBundle-KIFAdditions.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// NSBundle+KIFAdditions.h -// KIF -// -// Created by Brian Nickel on 7/27/13. -// -// - -#import - -@interface NSBundle (KIFAdditions) - -+ (NSBundle *)KIFTestBundle; - -@end diff --git a/Example/Pods/KIF/Additions/NSBundle-KIFAdditions.m b/Example/Pods/KIF/Additions/NSBundle-KIFAdditions.m deleted file mode 100644 index 8b34f69..0000000 --- a/Example/Pods/KIF/Additions/NSBundle-KIFAdditions.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// NSBundle+KIFAdditions.m -// KIF -// -// Created by Brian Nickel on 7/27/13. -// -// - -#import "NSBundle-KIFAdditions.h" -#import "KIFTestCase.h" -#import "LoadableCategory.h" - -MAKE_CATEGORIES_LOADABLE(NSBundle_KIFAdditions) - -@implementation NSBundle (KIFAdditions) - -+ (NSBundle *)KIFTestBundle -{ - static NSBundle *bundle; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - bundle = [self bundleForClass:[KIFTestCase class]]; - }); - return bundle; -} - -@end diff --git a/Example/Pods/KIF/Additions/NSError-KIFAdditions.h b/Example/Pods/KIF/Additions/NSError-KIFAdditions.h deleted file mode 100644 index 9232560..0000000 --- a/Example/Pods/KIF/Additions/NSError-KIFAdditions.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// NSError+KIFAdditions.h -// KIF -// -// Created by Brian Nickel on 7/27/13. -// -// - -#import - -@interface NSError (KIFAdditions) - -+ (instancetype)KIFErrorWithUnderlyingError:(NSError *)underlyingError format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3); -+ (instancetype)KIFErrorWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); - -@end diff --git a/Example/Pods/KIF/Additions/NSError-KIFAdditions.m b/Example/Pods/KIF/Additions/NSError-KIFAdditions.m deleted file mode 100644 index 226309f..0000000 --- a/Example/Pods/KIF/Additions/NSError-KIFAdditions.m +++ /dev/null @@ -1,39 +0,0 @@ -// -// NSError+KIFAdditions.m -// KIF -// -// Created by Brian Nickel on 7/27/13. -// -// - -#import "NSError-KIFAdditions.h" -#import "LoadableCategory.h" -#import "KIFTestActor.h" - -MAKE_CATEGORIES_LOADABLE(NSError_KIFAdditions) - -@implementation NSError (KIFAdditions) - -+ (instancetype)KIFErrorWithFormat:(NSString *)format, ... -{ - va_list args; - va_start(args, format); - NSString *description = [[NSString alloc] initWithFormat:format arguments:args]; - va_end(args); - - return [self errorWithDomain:@"KIFTest" code:KIFTestStepResultFailure userInfo:@{NSLocalizedDescriptionKey: description}]; -} - -+ (instancetype)KIFErrorWithUnderlyingError:(NSError *)underlyingError format:(NSString *)format, ... -{ - va_list args; - va_start(args, format); - NSString *description = [[NSString alloc] initWithFormat:format arguments:args]; - va_end(args); - - NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:description, NSLocalizedDescriptionKey, underlyingError, NSUnderlyingErrorKey, nil]; - - return [self errorWithDomain:@"KIFTest" code:KIFTestStepResultFailure userInfo:userInfo]; -} - -@end diff --git a/Example/Pods/KIF/Additions/NSException-KIFAdditions.h b/Example/Pods/KIF/Additions/NSException-KIFAdditions.h deleted file mode 100644 index 487fc0b..0000000 --- a/Example/Pods/KIF/Additions/NSException-KIFAdditions.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// NSException-KIFAdditions.h -// KIF -// -// Created by Tony DiPasquale on 12/20/13. -// -// - -#import - -@interface NSException (KIFAdditions) - -+ (NSException *)failureInFile:(NSString *)file atLine:(NSInteger)line withDescription:(NSString *)formatString, ...; - -@end diff --git a/Example/Pods/KIF/Additions/NSException-KIFAdditions.m b/Example/Pods/KIF/Additions/NSException-KIFAdditions.m deleted file mode 100644 index 15c0cf1..0000000 --- a/Example/Pods/KIF/Additions/NSException-KIFAdditions.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// NSException-KIFAdditions.m -// KIF -// -// Created by Tony DiPasquale on 12/20/13. -// -// - -#import "NSException-KIFAdditions.h" - -@implementation NSException (KIFAdditions) - -+ (NSException *)failureInFile:(NSString *)file atLine:(NSInteger)line withDescription:(NSString *)formatString, ... -{ - va_list argumentList; - va_start(argumentList, formatString); - - NSString *reason = [[NSString alloc] initWithFormat:formatString arguments:argumentList]; - - va_end(argumentList); - - return [NSException exceptionWithName:@"KIFFailureException" - reason: reason - userInfo:@{@"SenTestFilenameKey": file, - @"SenTestLineNumberKey": @(line)}]; -} - -@end diff --git a/Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.h b/Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.h deleted file mode 100644 index 5875d54..0000000 --- a/Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// NSFileManager-KIFAdditions.h -// KIF -// -// Created by Michael Thole on 6/1/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - - -@interface NSFileManager (KIFAdditions) - -- (NSString *)createUserDirectory:(NSSearchPathDirectory)searchPath; -- (BOOL)recursivelyCreateDirectory:(NSString *)path; - -@end diff --git a/Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.m b/Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.m deleted file mode 100644 index b41f4a5..0000000 --- a/Example/Pods/KIF/Additions/NSFileManager-KIFAdditions.m +++ /dev/null @@ -1,67 +0,0 @@ -// -// NSFileManager-KIFAdditions.m -// KIF -// -// Created by Michael Thole on 6/1/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "NSFileManager-KIFAdditions.h" -#import "LoadableCategory.h" - - -MAKE_CATEGORIES_LOADABLE(NSFileManager_KIFAdditions) - - -@implementation NSFileManager (KIFAdditions) - -#pragma mark Public Methods - -- (NSString *)createUserDirectory:(NSSearchPathDirectory)searchPath; -{ - NSArray *paths = NSSearchPathForDirectoriesInDomains(searchPath, NSUserDomainMask, YES); - if (!paths.count) { - return nil; - } - - NSString *rootDirectory = paths[0]; - - BOOL isDir; - BOOL created = NO; - if ([self fileExistsAtPath:rootDirectory isDirectory:&isDir] && isDir) { - created = YES; - } else { - created = [self recursivelyCreateDirectory:rootDirectory]; - } - - return created ? rootDirectory : nil; -} - -- (BOOL)recursivelyCreateDirectory:(NSString *)path; -{ - BOOL isDir = NO; - BOOL isParentADir = NO; - NSString *parentDir = nil; - - if (![self fileExistsAtPath:path isDirectory:&isDir]) { - // if file doesn't exist, first create parent - parentDir = [path stringByDeletingLastPathComponent]; - - if (!parentDir.length || [parentDir isEqualToString:@"/"]) { - isParentADir = YES; - } else { - isParentADir = [self recursivelyCreateDirectory:parentDir]; - } - - if (isParentADir) { - isDir = [self createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil]; - } else { - return NO; - } - } - - return isDir; -} - -@end diff --git a/Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.h b/Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.h deleted file mode 100644 index d8aee6c..0000000 --- a/Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// UIAccessibilityElement-KIFAdditions.h -// KIF -// -// Created by Eric Firestone on 5/23/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - - -@interface UIAccessibilityElement (KIFAdditions) - -/*! - @abstract Finds the first view that the accessibility element is part of. - @discussion There is not always a one-to-one mapping between views and accessibility elements. Accessibility elements may not even map to the view you will expect. For instance, table view cell accessibility elements return the @c UITableView and keyboard keys map to the keyboard as a whole. - - @param element The accessibility element. - @return The first matching @c UIView as determined by the accessibility API. - */ -+ (UIView *)viewContainingAccessibilityElement:(UIAccessibilityElement *)element; - -/*! - @abstract Finds an accessibility element and view with a matching label, value, and traits, optionally passing a tappability test. - @discussion This method combines @c +accessibilityElementWithLabel:value:traits:error: and @c +viewContainingAccessibilityElement:tappable:error: for convenience. - @param foundElement The found accessibility element or @c nil if the method returns @c NO. Can be @c NULL. - @param foundView The first matching view for @c foundElement as determined by the accessibility API or @c nil if the view is hidden or fails the tappability test. Can be @c NULL. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - @param error A reference to an error object to be populated when no matching element or view is found. Can be @c NULL. - @result @c YES if the element and view were found. Otherwise @c NO. - */ -+ (BOOL)accessibilityElement:(out UIAccessibilityElement **)foundElement view:(out UIView **)foundView withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable error:(out NSError **)error; - -/*! - @abstract Finds an accessibility element with a matching label, value, and traits. - @discussion This functionality is identical to -[UIApplication accessibilityElementWithLabel:accessibilityValue:traits:] except that it detailed error messaging in the case where the element cannot be found. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - @param error A reference to an error object to be populated when no element is found. Can be @c NULL. - @return The found accessibility element. If @c nil see the @c error for a detailed reason. - */ -+ (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - -/*! - @abstract Finds an accessibility element and view where the element passes the predicate, optionally passing a tappability test. - @param foundElement The found accessibility element or @c nil if the method returns @c NO. Can be @c NULL. - @param foundView The first matching view for @c foundElement as determined by the accessibility API or @c nil if the view is hidden or fails the tappability test. Can be @c NULL. - @param predicate The predicate to test the accessibility element on. - @param error A reference to an error object to be populated when no matching element or view is found. Can be @c NULL. - @result @c YES if the element and view were found. Otherwise @c NO. - */ -+ (BOOL)accessibilityElement:(out UIAccessibilityElement **)foundElement view:(out UIView **)foundView withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable error:(out NSError **)error; - -/*! - @abstract Finds and attempts to make visible a view for a given accessibility element. - @discussion If the element is found, off screen, and is inside a scroll view, this method will attempt to programmatically scroll the view onto the screen before performing any logic as to if the view is tappable. - - @param element The accessibility element. - @param mustBeTappable If @c YES, a tappability test will be performed. - @param error A reference to an error object to be populated when no element is found. Can be @c NULL. - @return The first matching view as determined by the accessibility API or nil if the view is hidden or fails the tappability test. - */ -+ (UIView *)viewContainingAccessibilityElement:(UIAccessibilityElement *)element tappable:(BOOL)mustBeTappable error:(NSError **)error; - -@end diff --git a/Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.m b/Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.m deleted file mode 100644 index d0c8774..0000000 --- a/Example/Pods/KIF/Additions/UIAccessibilityElement-KIFAdditions.m +++ /dev/null @@ -1,177 +0,0 @@ -// -// UIAccessibilityElement-KIFAdditions.m -// KIF -// -// Created by Eric Firestone on 5/23/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "NSError-KIFAdditions.h" -#import "UIAccessibilityElement-KIFAdditions.h" -#import "UIApplication-KIFAdditions.h" -#import "UIScrollView-KIFAdditions.h" -#import "UIView-KIFAdditions.h" -#import "LoadableCategory.h" -#import "KIFTestActor.h" - -MAKE_CATEGORIES_LOADABLE(UIAccessibilityElement_KIFAdditions) - - -@implementation UIAccessibilityElement (KIFAdditions) - -+ (UIView *)viewContainingAccessibilityElement:(UIAccessibilityElement *)element; -{ - while (element && ![element isKindOfClass:[UIView class]]) { - // Sometimes accessibilityContainer will return a view that's too far up the view hierarchy - // UIAccessibilityElement instances will sometimes respond to view, so try to use that and then fall back to accessibilityContainer - id view = [element respondsToSelector:@selector(view)] ? [(id)element view] : nil; - - if (view) { - element = view; - } else { - element = [element accessibilityContainer]; - } - } - - return (UIView *)element; -} - -+ (BOOL)accessibilityElement:(out UIAccessibilityElement **)foundElement view:(out UIView **)foundView withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable error:(out NSError **)error; -{ - UIAccessibilityElement *element = [self accessibilityElementWithLabel:label value:value traits:traits error:error]; - if (!element) { - return NO; - } - - UIView *view = [self viewContainingAccessibilityElement:element tappable:mustBeTappable error:error]; - if (!view) { - return NO; - } - - if (foundElement) { *foundElement = element; } - if (foundView) { *foundView = view; } - return YES; -} - -+ (BOOL)accessibilityElement:(out UIAccessibilityElement **)foundElement view:(out UIView **)foundView withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable error:(out NSError **)error; -{ - UIAccessibilityElement *element = [[UIApplication sharedApplication] accessibilityElementMatchingBlock:^BOOL(UIAccessibilityElement *element) { - return [predicate evaluateWithObject:element]; - }]; - - if (!element) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Could not find view matching: %@", predicate]; - } - return NO; - } - - UIView *view = [UIAccessibilityElement viewContainingAccessibilityElement:element tappable:mustBeTappable error:error]; - if (!view) { - return NO; - } - - if (foundElement) { *foundElement = element; } - if (foundView) { *foundView = view; } - return YES; -} - -+ (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error; -{ - UIAccessibilityElement *element = [[UIApplication sharedApplication] accessibilityElementWithLabel:label accessibilityValue:value traits:traits]; - if (element || !error) { - return element; - } - - element = [[UIApplication sharedApplication] accessibilityElementWithLabel:label accessibilityValue:nil traits:traits]; - // For purposes of a better error message, see if we can find the view, just not a view with the specified value. - if (value && element) { - *error = [NSError KIFErrorWithFormat:@"Found an accessibility element with the label \"%@\", but with the value \"%@\", not \"%@\"", label, element.accessibilityValue, value]; - return nil; - } - - // Check the traits, too. - element = [[UIApplication sharedApplication] accessibilityElementWithLabel:label accessibilityValue:nil traits:UIAccessibilityTraitNone]; - if (traits != UIAccessibilityTraitNone && element) { - *error = [NSError KIFErrorWithFormat:@"Found an accessibility element with the label \"%@\", but not with the traits \"%llu\"", label, traits]; - return nil; - } - - *error = [NSError KIFErrorWithFormat:@"Failed to find accessibility element with the label \"%@\"", label]; - return nil; -} - -+ (UIView *)viewContainingAccessibilityElement:(UIAccessibilityElement *)element tappable:(BOOL)mustBeTappable error:(NSError **)error; -{ - // Small safety mechanism. If someone calls this method after a failing call to accessibilityElementWithLabel:..., we don't want to wipe out the error message. - if (!element && error && *error) { - return nil; - } - - // Make sure the element is visible - UIView *view = [UIAccessibilityElement viewContainingAccessibilityElement:element]; - if (!view) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Cannot find view containing accessibility element with the label \"%@\"", element.accessibilityLabel]; - } - return nil; - } - - // Scroll the view (and superviews) to be visible if necessary - UIView *superview = (UIScrollView *)view; - while (superview) { - // Fix for iOS7 table view cells containing scroll views - if ([superview.superview isKindOfClass:[UITableViewCell class]]) { - break; - } - - if ([superview isKindOfClass:[UIScrollView class]]) { - UIScrollView *scrollView = (UIScrollView *)superview; - - if (((UIAccessibilityElement *)view == element) && ![view isKindOfClass:[UITableViewCell class]]) { - [scrollView scrollViewToVisible:view animated:YES]; - } else { - CGRect elementFrame = [view.window convertRect:element.accessibilityFrame toView:scrollView]; - CGRect visibleRect = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y, CGRectGetWidth(scrollView.bounds), CGRectGetHeight(scrollView.bounds)); - - // Only call scrollRectToVisible if the element isn't already visible - // iOS 8 will sometimes incorrectly scroll table views so the element scrolls out of view - if (!CGRectContainsRect(visibleRect, elementFrame)) { - [scrollView scrollRectToVisible:elementFrame animated:YES]; - } - } - - // Give the scroll view a small amount of time to perform the scroll. - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.3, false); - } - - superview = superview.superview; - } - - if ([[UIApplication sharedApplication] isIgnoringInteractionEvents]) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Application is ignoring interaction events"]; - } - return nil; - } - - // If we don't require tappability, at least make sure it's not hidden - if ([view isHidden]) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Accessibility element with label \"%@\" is hidden.", element.accessibilityLabel]; - } - return nil; - } - - if (mustBeTappable && !view.isProbablyTappable) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Accessibility element with label \"%@\" is not tappable. It may be blocked by other views.", element.accessibilityLabel]; - } - return nil; - } - - return view; -} - -@end diff --git a/Example/Pods/KIF/Additions/UIApplication-KIFAdditions.h b/Example/Pods/KIF/Additions/UIApplication-KIFAdditions.h deleted file mode 100644 index 0ec04a3..0000000 --- a/Example/Pods/KIF/Additions/UIApplication-KIFAdditions.h +++ /dev/null @@ -1,108 +0,0 @@ -// -// UIApplication-KIFAdditions.h -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - -#define UIApplicationCurrentRunMode ([[UIApplication sharedApplication] currentRunLoopMode]) - -/*! - @abstract When mocking @c -openURL:, this notification is posted. - */ -UIKIT_EXTERN NSString *const UIApplicationDidMockOpenURLNotification; - -/*! - @abstract The key for the opened URL in the @c UIApplicationDidMockOpenURLNotification notification. - */ -UIKIT_EXTERN NSString *const UIApplicationOpenedURLKey; - -@interface UIApplication (KIFAdditions) - -/*! - @abstract Finds an accessibility element with a matching label, value, and traits across all windows in the application starting at the frontmost window. - @param label The accessibility label of the element to search for. - @param value The accessibility value of the element to search for. If @c nil, all values will be accepted. - @param traits The accessibility traits of the element to search for. Elements that do not include at least these traits are ignored. - @return The found accessibility element or @c nil if the element could not be found. - */ -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label accessibilityValue:(NSString *)value traits:(UIAccessibilityTraits)traits; - -/*! - @abstract Finds an accessibility element where @c matchBlock returns @c YES, across all windows in the application starting at the fronmost window. - @discussion This method should be used if @c accessibilityElementWithLabel:accessibilityValue:traits: does not meet your requirements. For example, if you are searching for an element that begins with a pattern or if of a certain view type. - @param matchBlock A block to be performed on each element to see if it passes. - */ -- (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessibilityElement *))matchBlock; - -/*! - @returns The window containing the keyboard or @c nil if the keyboard is not visible. - */ -- (UIWindow *)keyboardWindow; - -/*! - @returns The topmost window containing a @c UIDatePicker. - */ -- (UIWindow *)datePickerWindow; - -/*! - @returns The topmost window containing a @c UIPickerView. - */ -- (UIWindow *)pickerViewWindow; - -/*! - @returns The topmost window containing a @c UIDimmingView. - */ -- (UIWindow *)dimmingViewWindow; - -/*! - @returns All windows in the application, including the key window even if it does not appear in @c -windows. - */ -- (NSArray *)windowsWithKeyWindow; - -/*! - @abstract Writes a screenshot to disk. - @discussion This method only works if the @c KIF_SCREENSHOTS environment variable is set. - @param lineNumber The line number in the code at which the screenshot was taken. - @param filename The name of the file in which the screenshot was taken. - @param description An optional description of the scene being captured. - @param error If the method returns @c YES, this optional parameter provides additional information as to why it failed. - @returns @c YES if the screenshot was written to disk, otherwise @c NO. - */ -- (BOOL)writeScreenshotForLine:(NSUInteger)lineNumber inFile:(NSString *)filename description:(NSString *)description error:(NSError **)error; - -/*! - @returns The current run loop mode. - */ -- (CFStringRef)currentRunLoopMode; - -/*! - @abstract Swizzles the run loop modes so KIF can better switch between them. - */ -+ (void)swizzleRunLoop; - -/*! - @abstract Starts mocking requests to @c -openURL:, announcing all requests with a notification. - @discussion After calling this method, whenever @c -openURL: is called a notification named @c UIApplicationDidMockOpenURLNotification with the URL in the @c UIApplicationOpenedURL will be raised and the normal behavior will be cancelled. - @param returnValue The value to return when @c -openURL: is called. - */ -+ (void)startMockingOpenURLWithReturnValue:(BOOL)returnValue; - -/*! - @abstract Stops the application from mocking requests to @c -openURL:. - */ -+ (void)stopMockingOpenURL; - -@end - -@interface UIApplication (Private) -- (BOOL)rotateIfNeeded:(UIDeviceOrientation)orientation; -- (void)rotateIfNeeded:(UIDeviceOrientation)orientation completion:(void (^)(void))completion; -- (UIWindow *)statusBarWindow; -@property(getter=isStatusBarHidden) BOOL statusBarHidden; -@end - diff --git a/Example/Pods/KIF/Additions/UIApplication-KIFAdditions.m b/Example/Pods/KIF/Additions/UIApplication-KIFAdditions.m deleted file mode 100644 index 8028a10..0000000 --- a/Example/Pods/KIF/Additions/UIApplication-KIFAdditions.m +++ /dev/null @@ -1,262 +0,0 @@ -// -// UIApplication-KIFAdditions.m -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "UIApplication-KIFAdditions.h" -#import "LoadableCategory.h" -#import "UIView-KIFAdditions.h" -#import "NSError-KIFAdditions.h" -#import -#import -#import - -MAKE_CATEGORIES_LOADABLE(UIApplication_KIFAdditions) - -static BOOL _KIF_UIApplicationMockOpenURL = NO; -static BOOL _KIF_UIApplicationMockOpenURL_returnValue = NO; - -@interface UIApplication (Undocumented) -- (void)pushRunLoopMode:(id)arg1; -- (void)pushRunLoopMode:(id)arg1 requester:(id)requester; -- (void)popRunLoopMode:(id)arg1; -- (void)popRunLoopMode:(id)arg1 requester:(id)requester; -@end - -NSString *const UIApplicationDidMockOpenURLNotification = @"UIApplicationDidMockOpenURLNotification"; -NSString *const UIApplicationOpenedURLKey = @"UIApplicationOpenedURL"; -static const void *KIFRunLoopModesKey = &KIFRunLoopModesKey; - -@implementation UIApplication (KIFAdditions) - -#pragma mark - Finding elements - -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label accessibilityValue:(NSString *)value traits:(UIAccessibilityTraits)traits; -{ - // Go through the array of windows in reverse order to process the frontmost window first. - // When several elements with the same accessibilitylabel are present the one in front will be picked. - for (UIWindow *window in [self.windowsWithKeyWindow reverseObjectEnumerator]) { - UIAccessibilityElement *element = [window accessibilityElementWithLabel:label accessibilityValue:value traits:traits]; - if (element) { - return element; - } - } - - return nil; -} - -- (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessibilityElement *))matchBlock; -{ - for (UIWindow *window in [self.windowsWithKeyWindow reverseObjectEnumerator]) { - UIAccessibilityElement *element = [window accessibilityElementMatchingBlock:matchBlock]; - if (element) { - return element; - } - } - - return nil; -} - -#pragma mark - Interesting windows - -- (UIWindow *)keyboardWindow; -{ - for (UIWindow *window in self.windowsWithKeyWindow) { - if ([NSStringFromClass([window class]) isEqual:@"UITextEffectsWindow"]) { - return window; - } - } - - return nil; -} - -- (UIWindow *)datePickerWindow; -{ - return [self getWindowForSubviewClass:@"UIDatePicker"]; -} - -- (UIWindow *)pickerViewWindow; -{ - return [self getWindowForSubviewClass:@"UIPickerView"]; -} - -- (UIWindow *)dimmingViewWindow; -{ - return [self getWindowForSubviewClass:@"UIDimmingView"]; -} - -- (UIWindow *)getWindowForSubviewClass:(NSString*)className; -{ - for (UIWindow *window in self.windowsWithKeyWindow) { - NSArray *subViews = [window subviewsWithClassNameOrSuperClassNamePrefix:className]; - if (subViews.count > 0) { - return window; - } - } - - return nil; -} - -- (NSArray *)windowsWithKeyWindow -{ - NSMutableArray *windows = self.windows.mutableCopy; - UIWindow *keyWindow = self.keyWindow; - if (![windows containsObject:keyWindow]) { - [windows addObject:keyWindow]; - } - return windows; -} - -#pragma mark - Screenshotting - -- (BOOL)writeScreenshotForLine:(NSUInteger)lineNumber inFile:(NSString *)filename description:(NSString *)description error:(NSError **)error; -{ - NSString *outputPath = [[[NSProcessInfo processInfo] environment] objectForKey:@"KIF_SCREENSHOTS"]; - if (!outputPath) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Screenshot path not defined. Please set KIF_SCREENSHOTS environment variable."]; - } - return NO; - } - - NSArray *windows = [self windowsWithKeyWindow]; - if (windows.count == 0) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Could not take screenshot. No windows were available."]; - } - return NO; - } - - UIGraphicsBeginImageContextWithOptions([[windows objectAtIndex:0] bounds].size, YES, 0); - for (UIWindow *window in windows) { - if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { - [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES]; - } else { - [window.layer renderInContext:UIGraphicsGetCurrentContext()]; - } - } - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - outputPath = [outputPath stringByExpandingTildeInPath]; - - 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]; - return NO; - } - - NSString *imageName = [NSString stringWithFormat:@"%@, line %lu", [filename lastPathComponent], (unsigned long)lineNumber]; - if (description) { - imageName = [imageName stringByAppendingFormat:@", %@", description]; - } - - outputPath = [outputPath stringByAppendingPathComponent:imageName]; - outputPath = [outputPath stringByAppendingPathExtension:@"png"]; - - if (![UIImagePNGRepresentation(image) writeToFile:outputPath atomically:YES]) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Could not write file at path %@", outputPath]; - } - return NO; - } - - return YES; -} - -#pragma mark - Run loop monitoring - -- (NSMutableArray *)KIF_runLoopModes; -{ - NSMutableArray *modes = objc_getAssociatedObject(self, KIFRunLoopModesKey); - if (!modes) { - modes = [NSMutableArray arrayWithObject:(id)kCFRunLoopDefaultMode]; - objc_setAssociatedObject(self, KIFRunLoopModesKey, modes, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - return modes; -} - -- (CFStringRef)currentRunLoopMode; -{ - return (__bridge CFStringRef)[self KIF_runLoopModes].lastObject; -} - -- (void)KIF_pushRunLoopMode:(NSString *)mode; -{ - [[self KIF_runLoopModes] addObject:mode]; - [self KIF_pushRunLoopMode:mode]; -} - -- (void)KIF_pushRunLoopMode:(NSString *)mode requester:(id)requester; -{ - [[self KIF_runLoopModes] addObject:mode]; - [self KIF_pushRunLoopMode:mode requester:requester]; -} - -- (void)KIF_popRunLoopMode:(NSString *)mode; -{ - [[self KIF_runLoopModes] removeLastObject]; - [self KIF_popRunLoopMode:mode]; -} - - -- (void)KIF_popRunLoopMode:(NSString *)mode requester:(id)requester; -{ - [[self KIF_runLoopModes] removeLastObject]; - [self KIF_popRunLoopMode:mode requester:requester]; -} - -- (BOOL)KIF_openURL:(NSURL *)URL; -{ - if (_KIF_UIApplicationMockOpenURL) { - [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidMockOpenURLNotification object:self userInfo:@{UIApplicationOpenedURLKey: URL}]; - return _KIF_UIApplicationMockOpenURL_returnValue; - } else { - return [self KIF_openURL:URL]; - } -} - -static inline void Swizzle(Class c, SEL orig, SEL new) -{ - Method origMethod = class_getInstanceMethod(c, orig); - Method newMethod = class_getInstanceMethod(c, new); - if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) - class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); - else - method_exchangeImplementations(origMethod, newMethod); -} - -+ (void)swizzleRunLoop; -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - Swizzle(self, @selector(pushRunLoopMode:), @selector(KIF_pushRunLoopMode:)); - Swizzle(self, @selector(pushRunLoopMode:requester:), @selector(KIF_pushRunLoopMode:requester:)); - Swizzle(self, @selector(popRunLoopMode:), @selector(KIF_popRunLoopMode:)); - Swizzle(self, @selector(popRunLoopMode:requester:), @selector(KIF_popRunLoopMode:requester:)); - }); -} - -#pragma mark - openURL mocking - -+ (void)startMockingOpenURLWithReturnValue:(BOOL)returnValue; -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - Swizzle(self, @selector(openURL:), @selector(KIF_openURL:)); - }); - - _KIF_UIApplicationMockOpenURL = YES; - _KIF_UIApplicationMockOpenURL_returnValue = returnValue; -} - -+ (void)stopMockingOpenURL; -{ - _KIF_UIApplicationMockOpenURL = NO; -} - -@end diff --git a/Example/Pods/KIF/Additions/UIEvent+KIFAdditions.h b/Example/Pods/KIF/Additions/UIEvent+KIFAdditions.h deleted file mode 100644 index bbbbc82..0000000 --- a/Example/Pods/KIF/Additions/UIEvent+KIFAdditions.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// 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/Example/Pods/KIF/Additions/UIEvent+KIFAdditions.m b/Example/Pods/KIF/Additions/UIEvent+KIFAdditions.m deleted file mode 100644 index 4dcd73d..0000000 --- a/Example/Pods/KIF/Additions/UIEvent+KIFAdditions.m +++ /dev/null @@ -1,152 +0,0 @@ -// -// 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; -@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]; - -} - -- (void)kif_setIOHIDEventWithTouches:(NSArray *)touches -{ - uint64_t abTime = mach_absolute_time(); - AbsoluteTime timeStamp = *(AbsoluteTime *) &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); - } - - [self _setHIDEvent:handEvent]; -} - -@end \ No newline at end of file diff --git a/Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.h b/Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.h deleted file mode 100644 index a97480e..0000000 --- a/Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// UIScrollView-KIFAdditions.h -// KIF -// -// Created by Eric Firestone on 5/22/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - - -@interface UIScrollView (KIFAdditions) - -- (void)scrollViewToVisible:(UIView *)view animated:(BOOL)animated; - -@end diff --git a/Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.m b/Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.m deleted file mode 100644 index a1e2245..0000000 --- a/Example/Pods/KIF/Additions/UIScrollView-KIFAdditions.m +++ /dev/null @@ -1,44 +0,0 @@ -// -// UIScrollView-KIFAdditions.m -// KIF -// -// Created by Eric Firestone on 5/22/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "UIScrollView-KIFAdditions.h" -#import "LoadableCategory.h" -#import "UIApplication-KIFAdditions.h" -#import "UIView-KIFAdditions.h" - - -MAKE_CATEGORIES_LOADABLE(UIScrollView_KIFAdditions) - - -@implementation UIScrollView (KIFAdditions) - -- (void)scrollViewToVisible:(UIView *)view animated:(BOOL)animated; -{ - CGRect viewFrame = [self convertRect:view.bounds fromView:view]; - CGPoint contentOffset = self.contentOffset; - - if (CGRectGetMaxX(viewFrame) > self.contentOffset.x + CGRectGetWidth(self.bounds)) { - contentOffset.x = MIN(CGRectGetMaxX(viewFrame) - CGRectGetWidth(self.bounds), CGRectGetMinX(viewFrame)); - } else if (CGRectGetMinX(viewFrame) < self.contentOffset.x) { - contentOffset.x = MAX(CGRectGetMaxX(viewFrame) - CGRectGetWidth(self.bounds), CGRectGetMinX(viewFrame)); - } - - if (CGRectGetMaxY(viewFrame) > self.contentOffset.y + CGRectGetHeight(self.bounds)) { - contentOffset.y = MIN(CGRectGetMaxY(viewFrame) - CGRectGetHeight(self.bounds), CGRectGetMinY(viewFrame)); - } else if (CGRectGetMinY(viewFrame) < self.contentOffset.y) { - contentOffset.y = MAX(CGRectGetMaxY(viewFrame) - CGRectGetHeight(self.bounds), CGRectGetMinY(viewFrame)); - } - - if (!CGPointEqualToPoint(contentOffset, self.contentOffset)) { - [self setContentOffset:contentOffset animated:animated]; - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.2, false); - } -} - -@end diff --git a/Example/Pods/KIF/Additions/UITableView-KIFAdditions.h b/Example/Pods/KIF/Additions/UITableView-KIFAdditions.h deleted file mode 100644 index 5dfc987..0000000 --- a/Example/Pods/KIF/Additions/UITableView-KIFAdditions.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// UITableView-KIFAdditions.h -// KIF -// -// Created by Hilton Campbell on 4/12/14. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - -@interface UITableView (KIFAdditions) - -- (BOOL)dragCell:(UITableViewCell *)cell toIndexPath:(NSIndexPath *)indexPath error:(NSError **)error; - -@end diff --git a/Example/Pods/KIF/Additions/UITableView-KIFAdditions.m b/Example/Pods/KIF/Additions/UITableView-KIFAdditions.m deleted file mode 100644 index e3bbab0..0000000 --- a/Example/Pods/KIF/Additions/UITableView-KIFAdditions.m +++ /dev/null @@ -1,87 +0,0 @@ -// -// UITableView-KIFAdditions.m -// KIF -// -// Created by Hilton Campbell on 4/12/14. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "UITableView-KIFAdditions.h" -#import "UIView-KIFAdditions.h" -#import "UIApplication-KIFAdditions.h" -#import "UITouch-KIFAdditions.h" -#import "CGGeometry-KIFAdditions.h" -#import "NSError-KIFAdditions.h" - -@implementation UITableView (KIFAdditions) - -#define DRAG_STEP_DISTANCE 5 - -- (BOOL)dragCell:(UITableViewCell *)cell toIndexPath:(NSIndexPath *)indexPath error:(NSError **)error; -{ - UIView *sourceReorderControl = [[cell subviewsWithClassNameOrSuperClassNamePrefix:@"UITableViewCellReorderControl"] lastObject]; - if (!sourceReorderControl) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Failed to find reorder control for cell"]; - } - return NO; - } - - CGPoint sourcePoint = [self convertPoint:CGPointCenteredInRect(sourceReorderControl.bounds) fromView:sourceReorderControl]; - - // If section < 0, search from the end of the table. - if (indexPath.section < 0) { - indexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:self.numberOfSections + indexPath.section]; - } - - // If row < 0, search from the end of the section. - if (indexPath.row < 0) { - indexPath = [NSIndexPath indexPathForRow:[self numberOfRowsInSection:indexPath.section] + indexPath.row inSection:indexPath.section]; - } - - CGPoint destinationPoint = CGPointMake(sourcePoint.x, CGPointCenteredInRect([self rectForRowAtIndexPath:indexPath]).y); - - // Create the touch (there should only be one touch object for the whole drag) - UITouch *touch = [[UITouch alloc] initAtPoint:sourcePoint inView:self]; - [touch setPhaseAndUpdateTimestamp:UITouchPhaseBegan]; - - UIEvent *eventDown = [self eventWithTouch:touch]; - [[UIApplication sharedApplication] sendEvent:eventDown]; - - // Hold long enough to enter reordering mode - CFRunLoopRunInMode(UIApplicationCurrentRunMode, 0.2, false); - - CGPoint currentLocation = sourcePoint; - while (currentLocation.y < destinationPoint.y - DRAG_STEP_DISTANCE || currentLocation.y > destinationPoint.y + DRAG_STEP_DISTANCE) { - if (currentLocation.y < destinationPoint.y) { - currentLocation.y += DRAG_STEP_DISTANCE; - } else { - currentLocation.y -= DRAG_STEP_DISTANCE; - } - - [touch setLocationInWindow:[self.window convertPoint:currentLocation fromView:self]]; - [touch setPhaseAndUpdateTimestamp:UITouchPhaseMoved]; - - UIEvent *eventDrag = [self eventWithTouch:touch]; - [[UIApplication sharedApplication] sendEvent:eventDrag]; - - CFRunLoopRunInMode(UIApplicationCurrentRunMode, 0.01, false); - } - - // Hold long enough for the animations to catch up - CFRunLoopRunInMode(UIApplicationCurrentRunMode, 0.2, false); - - [touch setPhaseAndUpdateTimestamp:UITouchPhaseEnded]; - - UIEvent *eventUp = [self eventWithTouch:touch]; - [[UIApplication sharedApplication] sendEvent:eventUp]; - - // Dispatching the event doesn't actually update the first responder, so fake it - if (touch.view == self && [self canBecomeFirstResponder]) { - [self becomeFirstResponder]; - } - return YES; -} - -@end diff --git a/Example/Pods/KIF/Additions/UITouch-KIFAdditions.h b/Example/Pods/KIF/Additions/UITouch-KIFAdditions.h deleted file mode 100644 index ea8dc35..0000000 --- a/Example/Pods/KIF/Additions/UITouch-KIFAdditions.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// UITouch-KIFAdditions.h -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - - -@interface UITouch (KIFAdditions) - -- (id)initInView:(UIView *)view; -- (id)initAtPoint:(CGPoint)point inView:(UIView *)view; - -- (void)setLocationInWindow:(CGPoint)location; -- (void)setPhaseAndUpdateTimestamp:(UITouchPhase)phase; - -@end diff --git a/Example/Pods/KIF/Additions/UITouch-KIFAdditions.m b/Example/Pods/KIF/Additions/UITouch-KIFAdditions.m deleted file mode 100644 index d702dab..0000000 --- a/Example/Pods/KIF/Additions/UITouch-KIFAdditions.m +++ /dev/null @@ -1,98 +0,0 @@ -// -// UITouch-KIFAdditions.m -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "UITouch-KIFAdditions.h" -#import "LoadableCategory.h" -#import - -MAKE_CATEGORIES_LOADABLE(UITouch_KIFAdditions) - -typedef struct { - unsigned int _firstTouchForView:1; - unsigned int _isTap:1; - unsigned int _isDelayed:1; - unsigned int _sentTouchesEnded:1; - unsigned int _abandonForwardingRecord:1; -} UITouchFlags; - -@interface UITouch () - -@property(assign) BOOL isTap; -@property(assign) NSUInteger tapCount; -@property(assign) UITouchPhase phase; -@property(retain) UIView *view; -@property(retain) UIWindow *window; -@property(assign) NSTimeInterval timestamp; - -- (void)setGestureView:(UIView *)view; -- (void)_setLocationInWindow:(CGPoint)location resetPrevious:(BOOL)resetPrevious; -- (void)_setIsFirstTouchForView:(BOOL)firstTouchForView; - -@end - -@implementation UITouch (KIFAdditions) - -- (id)initInView:(UIView *)view; -{ - CGRect frame = view.frame; - CGPoint centerPoint = CGPointMake(frame.size.width * 0.5f, frame.size.height * 0.5f); - return [self initAtPoint:centerPoint inView:view]; -} - -- (id)initAtPoint:(CGPoint)point inWindow:(UIWindow *)window; -{ - self = [super init]; - if (self == nil) { - return nil; - } - - // Create a fake tap touch - [self setWindow:window]; // Wipes out some values. Needs to be first. - - [self setTapCount:1]; - [self _setLocationInWindow:point resetPrevious:YES]; - - UIView *hitTestView = [window hitTest:point withEvent:nil]; - - [self setView:hitTestView]; - [self setPhase:UITouchPhaseBegan]; - [self _setIsFirstTouchForView:YES]; - [self setIsTap:YES]; - [self setTimestamp:[[NSProcessInfo processInfo] systemUptime]]; - - if ([self respondsToSelector:@selector(setGestureView:)]) { - [self setGestureView:hitTestView]; - } - - return self; -} - -- (id)initAtPoint:(CGPoint)point inView:(UIView *)view; -{ - return [self initAtPoint:[view.window convertPoint:point fromView:view] inWindow:view.window]; -} - -// -// setLocationInWindow: -// -// Setter to allow access to the _locationInWindow member. -// -- (void)setLocationInWindow:(CGPoint)location -{ - [self setTimestamp:[[NSProcessInfo processInfo] systemUptime]]; - [self _setLocationInWindow:location resetPrevious:NO]; -} - -- (void)setPhaseAndUpdateTimestamp:(UITouchPhase)phase -{ - [self setTimestamp:[[NSProcessInfo processInfo] systemUptime]]; - [self setPhase:phase]; -} - -@end diff --git a/Example/Pods/KIF/Additions/UIView-KIFAdditions.h b/Example/Pods/KIF/Additions/UIView-KIFAdditions.h deleted file mode 100644 index e91ec37..0000000 --- a/Example/Pods/KIF/Additions/UIView-KIFAdditions.h +++ /dev/null @@ -1,128 +0,0 @@ -// -// UIView-KIFAdditions.h -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - -extern double KIFDegreesToRadians(double deg); -extern double KIFRadiansToDegrees(double rad); - -typedef CGPoint KIFDisplacement; - -@interface UIView (KIFAdditions) - -@property (nonatomic, readonly, getter=isProbablyTappable) BOOL probablyTappable; - -- (BOOL)isDescendantOfFirstResponder; -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label; -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label accessibilityValue:(NSString *)value traits:(UIAccessibilityTraits)traits; - -/*! - @method accessibilityElementMatchingBlock: - @abstract Finds the descendent accessibility element that matches the conditions defined by the match block. - @param matchBlock A block which returns YES for matching elements. - @result The matching accessibility element. - */ -- (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessibilityElement *))matchBlock; - -- (UIView *)subviewWithClassNamePrefix:(NSString *)prefix __deprecated; -- (NSArray *)subviewsWithClassNamePrefix:(NSString *)prefix; -- (UIView *)subviewWithClassNameOrSuperClassNamePrefix:(NSString *)prefix __deprecated; -- (NSArray *)subviewsWithClassNameOrSuperClassNamePrefix:(NSString *)prefix; - -- (void)flash; -- (void)tap; -- (void)tapAtPoint:(CGPoint)point; -- (void)twoFingerTapAtPoint:(CGPoint)point; -- (void)longPressAtPoint:(CGPoint)point duration:(NSTimeInterval)duration; - -/*! - @method dragFromPoint:toPoint: - @abstract Simulates dragging a finger on the screen between the given points. - @discussion Causes the application to dispatch a sequence of touch events which simulate dragging a finger from startPoint to endPoint. - @param startPoint The point at which to start the drag, in the coordinate system of the receiver. - @param endPoint The point at which to end the drag, in the coordinate system of the receiver. - */ -- (void)dragFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint; -- (void)dragFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint steps:(NSUInteger)stepCount; -- (void)dragFromPoint:(CGPoint)startPoint displacement:(KIFDisplacement)displacement steps:(NSUInteger)stepCount; -- (void)dragAlongPathWithPoints:(CGPoint *)points count:(NSInteger)count; -- (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. - @discussion Some times, your view hierarchies involve putting overlays over views that would otherwise be tappable. Since KIF doesn't know about these exceptions, you can override this method as a convenient way of hooking in to the check for something being tappable. Your implementation will probably want to call up to super. - @param hitView The view -hitTest: returned when trying to tap on a point inside your view's bounds - @result Whether or not the view is tappable. - */ -- (BOOL)isTappableWithHitTestResultView:(UIView *)hitView; - -/*! - @method isTappableInRect: - @abstract Whether or not the receiver can be tapped inside the given rectangular area. - @discussion Determines whether or not tapping within the given rectangle would actually hit the receiver or one of its children. This is useful for determining if the view is actually on screen and enabled. - @param rect A rectangle specifying an area in the receiver in the receiver's frame coordinates. - @result Whether or not the view is tappable. - */ -- (BOOL)isTappableInRect:(CGRect)rect; - -/*! - @method tappablePointInRect:(CGRect)rect; - @abstract Finds a point in the receiver that is tappable. - @discussion Finds a tappable point in the receiver, where tappable is defined as a point that, when tapped, will hit the receiver. - @param rect A rectangle specifying an area in the receiver in the receiver's frame coordinates. - @result A tappable point in the receivers frame coordinates. - */ -- (CGPoint)tappablePointInRect:(CGRect)rect; - -- (UIEvent *)eventWithTouch:(UITouch *)touch; - -/*! - @abstract Evaluates if user interaction is enabled including edge cases. - */ -- (BOOL)isUserInteractionActuallyEnabled; - -/*! - @abstract Evaluates if the view and all its superviews are visible. - */ -- (BOOL)isVisibleInViewHierarchy; - -/*! - @method performBlockOnDescendentViews: - @abstract Calls a block on the view itself and on all its descendent views. - @param block The block that will be called on the views. Stop the traversation of the views by assigning YES to the stop-parameter of the block. - */ -- (void)performBlockOnDescendentViews:(void (^)(UIView *view, BOOL *stop))block; - -/*! - @method performBlockOnAscendentViews: - @abstract Calls a block on the view itself and on all its superviews. - @param block The block that will be called on the views. Stop the traversation of the views by assigning YES to the stop-parameter of the block. - */ -- (void)performBlockOnAscendentViews:(void (^)(UIView *view, BOOL *stop))block; - -/*! - @abstract Returns either the current window or another window if a transform is applied. Returns `nil` if all windows in the application have transforms. - */ -@property (nonatomic, readonly) UIWindow *windowOrIdentityWindow; - -/*! - @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 diff --git a/Example/Pods/KIF/Additions/UIView-KIFAdditions.m b/Example/Pods/KIF/Additions/UIView-KIFAdditions.m deleted file mode 100644 index 655e88b..0000000 --- a/Example/Pods/KIF/Additions/UIView-KIFAdditions.m +++ /dev/null @@ -1,1008 +0,0 @@ -// -// UIView-KIFAdditions.m -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "UIView-KIFAdditions.h" -#import "CGGeometry-KIFAdditions.h" -#import "UIAccessibilityElement-KIFAdditions.h" -#import "UIApplication-KIFAdditions.h" -#import "UITouch-KIFAdditions.h" -#import -#import "UIEvent+KIFAdditions.h" - -double KIFDegreesToRadians(double deg) { - return (deg) / 180.0 * M_PI; -} - -double KIFRadiansToDegrees(double rad) { - return ((rad) * (180.0 / M_PI)); -} - -static CGFloat const kTwoFingerConstantWidth = 40; - -@interface UIApplication (KIFAdditionsPrivate) -- (UIEvent *)_touchesEvent; -@end - -@interface NSObject (UIWebDocumentViewInternal) - -- (void)tapInteractionWithLocation:(CGPoint)point; - -@end - -// On iOS 6 the accessibility label may contain line breaks, so when trying to find the -// element, these line breaks are necessary. But on iOS 7 the system replaces them with -// spaces. So the same test breaks on either iOS 6 or iOS 7. iOS8 befuddles this again by -//limiting replacement to spaces in between strings. To work around this replace -// the line breaks in both and try again. -NS_INLINE BOOL StringsMatchExceptLineBreaks(NSString *expected, NSString *actual) { - if (expected == actual) { - return YES; - } - - if (expected.length != actual.length) { - return NO; - } - - if ([expected isEqualToString:actual]) { - return YES; - } - - if ([expected 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 == ' ')) { - return NO; - } - } - - return YES; -} - - -@implementation UIView (KIFAdditions) - -+ (NSSet *)classesToSkipAccessibilitySearchRecursion -{ - static NSSet *classesToSkip; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - // UIDatePicker contains hundreds of thousands of placeholder accessibility elements that aren't useful to KIF, - // so don't recurse into a date picker when searching for matching accessibility elements - classesToSkip = [[NSSet alloc] initWithObjects:[UIDatePicker class], nil]; - }); - - return classesToSkip; -} - -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label -{ - return [self accessibilityElementWithLabel:label traits:UIAccessibilityTraitNone]; -} - -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; -{ - return [self accessibilityElementWithLabel:label accessibilityValue:nil traits:traits]; -} - -- (UIAccessibilityElement *)accessibilityElementWithLabel:(NSString *)label accessibilityValue:(NSString *)value traits:(UIAccessibilityTraits)traits; -{ - return [self accessibilityElementMatchingBlock:^(UIAccessibilityElement *element) { - - // TODO: This is a temporary fix for an SDK defect. - NSString *accessibilityValue = nil; - @try { - accessibilityValue = element.accessibilityValue; - } - @catch (NSException *exception) { - NSLog(@"KIF: Unable to access accessibilityValue for element %@ because of exception: %@", element, exception.reason); - } - - if ([accessibilityValue isKindOfClass:[NSAttributedString class]]) { - accessibilityValue = [(NSAttributedString *)accessibilityValue string]; - } - - BOOL labelsMatch = StringsMatchExceptLineBreaks(label, element.accessibilityLabel); - BOOL traitsMatch = ((element.accessibilityTraits) & traits) == traits; - BOOL valuesMatch = !value || [value isEqual:accessibilityValue]; - - return (BOOL)(labelsMatch && traitsMatch && valuesMatch); - }]; -} - -- (UIAccessibilityElement *)accessibilityElementMatchingBlock:(BOOL(^)(UIAccessibilityElement *))matchBlock; -{ - if (self.hidden) { - return nil; - } - - // In case multiple elements with the same label exist, prefer ones that are currently visible - UIAccessibilityElement *matchingButOccludedElement = nil; - - BOOL elementMatches = matchBlock((UIAccessibilityElement *)self); - - if (elementMatches) { - if (self.isTappable) { - return (UIAccessibilityElement *)self; - } else { - matchingButOccludedElement = (UIAccessibilityElement *)self; - } - } - - if ([[[self class] classesToSkipAccessibilitySearchRecursion] containsObject:[self class]]) { - return matchingButOccludedElement; - } - - // Check the subviews first. Even if the receiver says it's an accessibility container, - // the returned objects are UIAccessibilityElementMockViews (which aren't actually views) - // rather than the real subviews it contains. We want the real views if possible. - // UITableViewCell is such an offender. - for (UIView *view in [self.subviews reverseObjectEnumerator]) { - UIAccessibilityElement *element = [view accessibilityElementMatchingBlock:matchBlock]; - if (!element) { - continue; - } - - UIView *viewForElement = [UIAccessibilityElement viewContainingAccessibilityElement:element]; - CGRect accessibilityFrame = [viewForElement.window convertRect:element.accessibilityFrame toView:viewForElement]; - - if ([viewForElement isTappableInRect:accessibilityFrame]) { - return element; - } else { - matchingButOccludedElement = element; - } - } - - NSMutableArray *elementStack = [NSMutableArray arrayWithObject:self]; - - while (elementStack.count) { - UIAccessibilityElement *element = [elementStack lastObject]; - [elementStack removeLastObject]; - - BOOL elementMatches = matchBlock(element); - - if (elementMatches) { - UIView *viewForElement = [UIAccessibilityElement viewContainingAccessibilityElement:element]; - CGRect accessibilityFrame = [viewForElement.window convertRect:element.accessibilityFrame toView:viewForElement]; - - if ([viewForElement isTappableInRect:accessibilityFrame]) { - return element; - } else { - matchingButOccludedElement = element; - continue; - } - } - - // If the view is an accessibility container, and we didn't find a matching subview, - // then check the actual accessibility elements - NSInteger accessibilityElementCount = element.accessibilityElementCount; - if (accessibilityElementCount == 0 || accessibilityElementCount == NSNotFound) { - continue; - } - - for (NSInteger accessibilityElementIndex = 0; accessibilityElementIndex < accessibilityElementCount; accessibilityElementIndex++) { - UIAccessibilityElement *subelement = [element accessibilityElementAtIndex:accessibilityElementIndex]; - - if (subelement) { - [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; - } - - @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]; - - // 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]; - } - } - } - - return matchingButOccludedElement; -} - -- (UIView *)subviewWithClassNamePrefix:(NSString *)prefix; -{ - NSArray *subviews = [self subviewsWithClassNamePrefix:prefix]; - if ([subviews count] == 0) { - return nil; - } - - return subviews[0]; -} - -- (NSArray *)subviewsWithClassNamePrefix:(NSString *)prefix; -{ - NSMutableArray *result = [NSMutableArray array]; - - // Breadth-first population of matching subviews - // First traverse the next level of subviews, adding matches. - for (UIView *view in self.subviews) { - if ([NSStringFromClass([view class]) hasPrefix:prefix]) { - [result addObject:view]; - } - } - - // Now traverse the subviews of the subviews, adding matches. - for (UIView *view in self.subviews) { - NSArray *matchingSubviews = [view subviewsWithClassNamePrefix:prefix]; - [result addObjectsFromArray:matchingSubviews]; - } - - return result; -} - -- (UIView *)subviewWithClassNameOrSuperClassNamePrefix:(NSString *)prefix; -{ - NSArray *subviews = [self subviewsWithClassNameOrSuperClassNamePrefix:prefix]; - if ([subviews count] == 0) { - return nil; - } - - return subviews[0]; -} - -- (NSArray *)subviewsWithClassNameOrSuperClassNamePrefix:(NSString *)prefix; -{ - NSMutableArray * result = [NSMutableArray array]; - - // Breadth-first population of matching subviews - // First traverse the next level of subviews, adding matches - for (UIView *view in self.subviews) { - Class klass = [view class]; - while (klass) { - if ([NSStringFromClass(klass) hasPrefix:prefix]) { - [result addObject:view]; - break; - } - - klass = [klass superclass]; - } - } - - // Now traverse the subviews of the subviews, adding matches - for (UIView *view in self.subviews) { - NSArray * matchingSubviews = [view subviewsWithClassNameOrSuperClassNamePrefix:prefix]; - [result addObjectsFromArray:matchingSubviews]; - } - - return result; -} - - -- (BOOL)isDescendantOfFirstResponder; -{ - if ([self isFirstResponder]) { - return YES; - } - return [self.superview isDescendantOfFirstResponder]; -} - -- (void)flash; -{ - UIColor *originalBackgroundColor = self.backgroundColor; - for (NSUInteger i = 0; i < 5; i++) { - self.backgroundColor = [UIColor yellowColor]; - CFRunLoopRunInMode(kCFRunLoopDefaultMode, .05, false); - self.backgroundColor = [UIColor blueColor]; - CFRunLoopRunInMode(kCFRunLoopDefaultMode, .05, false); - } - self.backgroundColor = originalBackgroundColor; -} - -- (void)tap; -{ - CGPoint centerPoint = CGPointMake(self.frame.size.width * 0.5f, self.frame.size.height * 0.5f); - - [self tapAtPoint:centerPoint]; -} - -- (void)tapAtPoint:(CGPoint)point; -{ - // Web views don't handle touches in a normal fashion, but they do have a method we can call to tap them - // This may not be necessary anymore. We didn't properly support controls that used gesture recognizers - // when this was added, but we now do. It needs to be tested before we can get rid of it. - id /*UIWebBrowserView*/ webBrowserView = nil; - - if ([NSStringFromClass([self class]) isEqual:@"UIWebBrowserView"]) { - webBrowserView = self; - } else if ([self isKindOfClass:[UIWebView class]]) { - id webViewInternal = [self valueForKey:@"_internal"]; - webBrowserView = [webViewInternal valueForKey:@"browserView"]; - } - - if (webBrowserView) { - [webBrowserView tapInteractionWithLocation:point]; - return; - } - - // Handle touches in the normal way for other views - UITouch *touch = [[UITouch alloc] initAtPoint:point inView:self]; - [touch setPhaseAndUpdateTimestamp:UITouchPhaseBegan]; - - UIEvent *event = [self eventWithTouch:touch]; - - [[UIApplication sharedApplication] sendEvent:event]; - - [touch setPhaseAndUpdateTimestamp:UITouchPhaseEnded]; - [[UIApplication sharedApplication] sendEvent:event]; - - // Dispatching the event doesn't actually update the first responder, so fake it - if ([touch.view isDescendantOfView:self] && [self canBecomeFirstResponder]) { - [self becomeFirstResponder]; - } - -} - -- (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 -{ - UITouch *touch = [[UITouch alloc] initAtPoint:point inView:self]; - [touch setPhaseAndUpdateTimestamp:UITouchPhaseBegan]; - - UIEvent *eventDown = [self eventWithTouch:touch]; - [[UIApplication sharedApplication] sendEvent:eventDown]; - - CFRunLoopRunInMode(kCFRunLoopDefaultMode, DRAG_TOUCH_DELAY, false); - - for (NSTimeInterval timeSpent = DRAG_TOUCH_DELAY; timeSpent < duration; timeSpent += DRAG_TOUCH_DELAY) - { - [touch setPhaseAndUpdateTimestamp:UITouchPhaseStationary]; - - UIEvent *eventStillDown = [self eventWithTouch:touch]; - [[UIApplication sharedApplication] sendEvent:eventStillDown]; - - CFRunLoopRunInMode(kCFRunLoopDefaultMode, DRAG_TOUCH_DELAY, false); - } - - [touch setPhaseAndUpdateTimestamp:UITouchPhaseEnded]; - UIEvent *eventUp = [self eventWithTouch:touch]; - [[UIApplication sharedApplication] sendEvent:eventUp]; - - // Dispatching the event doesn't actually update the first responder, so fake it - if ([touch.view isDescendantOfView:self] && [self canBecomeFirstResponder]) { - [self becomeFirstResponder]; - } - -} - -- (void)dragFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint; -{ - [self dragFromPoint:startPoint toPoint:endPoint steps:3]; -} - - -- (void)dragFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint steps:(NSUInteger)stepCount; -{ - KIFDisplacement displacement = CGPointMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y); - [self dragFromPoint:startPoint displacement:displacement steps:stepCount]; -} - -- (void)dragFromPoint:(CGPoint)startPoint displacement:(KIFDisplacement)displacement steps:(NSUInteger)stepCount; -{ - CGPoint endPoint = CGPointMake(startPoint.x + displacement.x, startPoint.y + displacement.y); - NSArray *path = [self pointsFromStartPoint:startPoint toPoint:endPoint steps:stepCount]; - [self dragPointsAlongPaths:@[path]]; -} - -- (void)dragAlongPathWithPoints:(CGPoint *)points count:(NSInteger)count; -{ - // convert point array into NSArray with NSValue - NSMutableArray *array = [NSMutableArray array]; - for (int i = 0; i < count; i++) - { - [array addObject:[NSValue valueWithCGPoint:points[i]]]; - } - [self dragPointsAlongPaths:@[[array copy]]]; -} - -- (void)dragPointsAlongPaths:(NSArray *)arrayOfPaths { - // must have at least one path, and each path must have the same number of points - if (arrayOfPaths.count == 0) - { - return; - } - - // all paths must have similar number of points - NSUInteger pointsInPath = [arrayOfPaths[0] count]; - for (NSArray *path in arrayOfPaths) - { - if (path.count != pointsInPath) - { - return; - } - } - - NSMutableArray *touches = [NSMutableArray array]; - - for (NSUInteger pointIndex = 0; pointIndex < pointsInPath; pointIndex++) { - // create initial touch event and send touch down event - if (pointIndex == 0) - { - for (NSArray *path in arrayOfPaths) - { - CGPoint point = [path[pointIndex] CGPointValue]; - UITouch *touch = [[UITouch alloc] initAtPoint:point inView:self]; - [touch setPhaseAndUpdateTimestamp:UITouchPhaseBegan]; - [touches addObject:touch]; - } - UIEvent *eventDown = [self eventWithTouches:[NSArray arrayWithArray:touches]]; - [[UIApplication sharedApplication] sendEvent:eventDown]; - } - else - { - UITouch *touch; - for (NSUInteger pathIndex = 0; pathIndex < arrayOfPaths.count; pathIndex++) - { - NSArray *path = arrayOfPaths[pathIndex]; - CGPoint point = [path[pointIndex] CGPointValue]; - touch = touches[pathIndex]; - [touch setLocationInWindow:[self.window convertPoint:point fromView:self]]; - [touch setPhaseAndUpdateTimestamp:UITouchPhaseMoved]; - } - UIEvent *event = [self eventWithTouches:[NSArray arrayWithArray:touches]]; - [[UIApplication sharedApplication] sendEvent:event]; - - CFRunLoopRunInMode(UIApplicationCurrentRunMode, DRAG_TOUCH_DELAY, false); - - // 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]; - } - } - } - - // Dispatching the event doesn't actually update the first responder, so fake it - if ([touches[0] view] == self && [self canBecomeFirstResponder]) { - [self becomeFirstResponder]; - } - - while (UIApplicationCurrentRunMode != kCFRunLoopDefaultMode) { - CFRunLoopRunInMode(UIApplicationCurrentRunMode, 0.1, false); - } -} - -- (void)twoFingerPanFromPoint:(CGPoint)startPoint toPoint:(CGPoint)toPoint steps:(NSUInteger)stepCount { - //estimate the first finger to be diagonally up and left from the center - CGPoint finger1Start = CGPointMake(startPoint.x - kTwoFingerConstantWidth, - startPoint.y - kTwoFingerConstantWidth); - CGPoint finger1End = CGPointMake(toPoint.x - kTwoFingerConstantWidth, - toPoint.y - kTwoFingerConstantWidth); - //estimate the second finger to be diagonally down and right from the center - CGPoint finger2Start = CGPointMake(startPoint.x + kTwoFingerConstantWidth, - startPoint.y + kTwoFingerConstantWidth); - CGPoint finger2End = CGPointMake(toPoint.x + kTwoFingerConstantWidth, - toPoint.y + kTwoFingerConstantWidth); - NSArray *finger1Path = [self pointsFromStartPoint:finger1Start toPoint:finger1End steps:stepCount]; - NSArray *finger2Path = [self pointsFromStartPoint:finger2Start toPoint:finger2End steps:stepCount]; - NSArray *paths = @[finger1Path, finger2Path]; - - [self dragPointsAlongPaths:paths]; -} - -- (void)pinchAtPoint:(CGPoint)centerPoint distance:(CGFloat)distance steps:(NSUInteger)stepCount { - //estimate the first finger to be on the left - CGPoint finger1Start = CGPointMake(centerPoint.x - kTwoFingerConstantWidth - distance, centerPoint.y); - CGPoint finger1End = CGPointMake(centerPoint.x - kTwoFingerConstantWidth, centerPoint.y); - //estimate the second finger to be on the right - CGPoint finger2Start = CGPointMake(centerPoint.x + kTwoFingerConstantWidth + distance, centerPoint.y); - CGPoint finger2End = CGPointMake(centerPoint.x + kTwoFingerConstantWidth, centerPoint.y); - NSArray *finger1Path = [self pointsFromStartPoint:finger1Start toPoint:finger1End steps:stepCount]; - NSArray *finger2Path = [self pointsFromStartPoint:finger2Start toPoint:finger2End steps:stepCount]; - NSArray *paths = @[finger1Path, finger2Path]; - - [self dragPointsAlongPaths:paths]; -} - -- (void)zoomAtPoint:(CGPoint)centerPoint distance:(CGFloat)distance steps:(NSUInteger)stepCount { - //estimate the first finger to be on the left - CGPoint finger1Start = CGPointMake(centerPoint.x - kTwoFingerConstantWidth, centerPoint.y); - CGPoint finger1End = CGPointMake(centerPoint.x - kTwoFingerConstantWidth - distance, centerPoint.y); - //estimate the second finger to be on the right - CGPoint finger2Start = CGPointMake(centerPoint.x + kTwoFingerConstantWidth, centerPoint.y); - CGPoint finger2End = CGPointMake(centerPoint.x + kTwoFingerConstantWidth + distance, centerPoint.y); - NSArray *finger1Path = [self pointsFromStartPoint:finger1Start toPoint:finger1End steps:stepCount]; - NSArray *finger2Path = [self pointsFromStartPoint:finger2Start toPoint:finger2End steps:stepCount]; - NSArray *paths = @[finger1Path, finger2Path]; - - [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); - NSMutableArray *points = [NSMutableArray array]; - - for (NSUInteger i = 0; i < stepCount; i++) { - CGFloat progress = ((CGFloat)i)/(stepCount - 1); - CGPoint point = CGPointMake(startPoint.x + (progress * displacement.x), - startPoint.y + (progress * displacement.y)); - [points addObject:[NSValue valueWithCGPoint:point]]; - } - return [NSArray arrayWithArray:points]; -} - -- (BOOL)isProbablyTappable -{ - // There are some issues with the tappability check in UIWebViews, so if the view is a UIWebView we will just skip the check. - return [NSStringFromClass([self class]) isEqualToString:@"UIWebBrowserView"] || self.isTappable; -} - -// Is this view currently on screen? -- (BOOL)isTappable; -{ - return ([self hasTapGestureRecognizer] || - [self isTappableInRect:self.bounds]); -} - -- (BOOL)hasTapGestureRecognizer -{ - __block BOOL hasTapGestureRecognizer = NO; - - [self.gestureRecognizers enumerateObjectsUsingBlock:^(id obj, - NSUInteger idx, - BOOL *stop) { - if ([obj isKindOfClass:[UITapGestureRecognizer class]]) { - hasTapGestureRecognizer = YES; - - if (stop != NULL) { - *stop = YES; - } - } - }]; - - return hasTapGestureRecognizer; -} - -- (BOOL)isTappableInRect:(CGRect)rect; -{ - CGPoint tappablePoint = [self tappablePointInRect:rect]; - - return !isnan(tappablePoint.x); -} - -- (BOOL)isTappableWithHitTestResultView:(UIView *)hitView; -{ - // Special case for UIControls, which may have subviews which don't respond to -hitTest:, - // but which are tappable. In this case the hit view will be the containing - // UIControl, and it will forward the tap to the appropriate subview. - // This applies with UISegmentedControl which contains UISegment views (a private UIView - // representing a single segment). - if ([hitView isKindOfClass:[UIControl class]] && [self isDescendantOfView:hitView]) { - return YES; - } - - // Button views in the nav bar (a private class derived from UINavigationItemView), do not return - // themselves in a -hitTest:. Instead they return the nav bar. - if ([hitView isKindOfClass:[UINavigationBar class]] && [self isNavigationItemView] && [self isDescendantOfView:hitView]) { - return YES; - } - - return [hitView isDescendantOfView:self]; -} - -- (CGPoint)tappablePointInRect:(CGRect)rect; -{ - // Start at the top and recurse down - CGRect frame = [self.window convertRect:rect fromView:self]; - - UIView *hitView = nil; - CGPoint tapPoint = CGPointZero; - - // Mid point - tapPoint = CGPointCenteredInRect(frame); - hitView = [self.window hitTest:tapPoint withEvent:nil]; - if ([self isTappableWithHitTestResultView:hitView]) { - return [self.window convertPoint:tapPoint toView:self]; - } - - // Top left - tapPoint = CGPointMake(frame.origin.x + 1.0f, frame.origin.y + 1.0f); - hitView = [self.window hitTest:tapPoint withEvent:nil]; - if ([self isTappableWithHitTestResultView:hitView]) { - return [self.window convertPoint:tapPoint toView:self]; - } - - // Top right - tapPoint = CGPointMake(frame.origin.x + frame.size.width - 1.0f, frame.origin.y + 1.0f); - hitView = [self.window hitTest:tapPoint withEvent:nil]; - if ([self isTappableWithHitTestResultView:hitView]) { - return [self.window convertPoint:tapPoint toView:self]; - } - - // Bottom left - tapPoint = CGPointMake(frame.origin.x + 1.0f, frame.origin.y + frame.size.height - 1.0f); - hitView = [self.window hitTest:tapPoint withEvent:nil]; - if ([self isTappableWithHitTestResultView:hitView]) { - return [self.window convertPoint:tapPoint toView:self]; - } - - // Bottom right - tapPoint = CGPointMake(frame.origin.x + frame.size.width - 1.0f, frame.origin.y + frame.size.height - 1.0f); - hitView = [self.window hitTest:tapPoint withEvent:nil]; - if ([self isTappableWithHitTestResultView:hitView]) { - return [self.window convertPoint:tapPoint toView:self]; - } - - return CGPointMake(NAN, NAN); -} - -- (UIEvent *)eventWithTouches:(NSArray *)touches -{ - // _touchesEvent is a private selector, interface is exposed in UIApplication(KIFAdditionsPrivate) - UIEvent *event = [[UIApplication sharedApplication] _touchesEvent]; - - [event _clearTouches]; - [event kif_setEventWithTouches:touches]; - - for (UITouch *aTouch in touches) { - [event _addTouch:aTouch forDelayedDelivery:NO]; - } - - return event; -} - -- (UIEvent *)eventWithTouch:(UITouch *)touch; -{ - NSArray *touches = touch ? @[touch] : nil; - return [self eventWithTouches:touches]; -} - -- (BOOL)isUserInteractionActuallyEnabled; -{ - BOOL isUserInteractionEnabled = self.userInteractionEnabled; - - // Navigation item views don't have user interaction enabled, but their parent nav bar does and will forward the event - if (!isUserInteractionEnabled && [self isNavigationItemView]) { - // If this view is inside a nav bar, and the nav bar is enabled, then consider it enabled - UIView *navBar = [self superview]; - while (navBar && ![navBar isKindOfClass:[UINavigationBar class]]) { - navBar = [navBar superview]; - } - if (navBar && navBar.userInteractionEnabled) { - isUserInteractionEnabled = YES; - } - } - - // UIActionsheet Buttons have UIButtonLabels with userInteractionEnabled=NO inside, - // grab the superview UINavigationButton instead. - if (!isUserInteractionEnabled && [self isKindOfClass:NSClassFromString(@"UIButtonLabel")]) { - UIView *button = [self superview]; - while (button && ![button isKindOfClass:NSClassFromString(@"UINavigationButton")]) { - button = [button superview]; - } - if (button && button.userInteractionEnabled) { - isUserInteractionEnabled = YES; - } - } - - return isUserInteractionEnabled; -} - -- (BOOL)isNavigationItemView; -{ - return [self isKindOfClass:NSClassFromString(@"UINavigationItemView")] || [self isKindOfClass:NSClassFromString(@"_UINavigationBarBackIndicatorView")]; -} - -- (UIWindow *)windowOrIdentityWindow -{ - if (CGAffineTransformIsIdentity(self.window.transform)) { - return self.window; - } - - for (UIWindow *window in [[UIApplication sharedApplication] windowsWithKeyWindow]) { - if (CGAffineTransformIsIdentity(window.transform)) { - return window; - } - } - - return nil; -} - -- (BOOL)isVisibleInViewHierarchy -{ - __block BOOL result = YES; - [self performBlockOnAscendentViews:^(UIView *view, BOOL *stop) { - if (view.isHidden) { - result = NO; - if (stop != NULL) { - *stop = YES; - } - } - }]; - return result; -} - -- (void)performBlockOnDescendentViews:(void (^)(UIView *view, BOOL *stop))block -{ - BOOL stop = NO; - [self performBlockOnDescendentViews:block stop:&stop]; -} - -- (void)performBlockOnDescendentViews:(void (^)(UIView *view, BOOL *stop))block stop:(BOOL *)stop -{ - block(self, stop); - if (*stop) { - return; - } - - for (UIView *view in self.subviews) { - [view performBlockOnDescendentViews:block stop:stop]; - if (*stop) { - return; - } - } -} - -- (void)performBlockOnAscendentViews:(void (^)(UIView *view, BOOL *stop))block -{ - BOOL stop = NO; - UIView *checkedView = self; - while(checkedView && stop == NO) { - block(checkedView, &stop); - checkedView = checkedView.superview; - } -} - -- (void)printViewHierarchy { - [self printViewHierarchyWithIndentation:0]; -} - -+(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)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); - } -} - - -- (void)printViewHierarchyWithIndentation:(int)indent { - NSString* name = NSStringFromClass([self class]); - NSString* label = self.accessibilityLabel; - NSString* identifier = self.accessibilityIdentifier; - for(int i = 0; i < indent; ++i) { - printf("|\t"); - } - printf("%s", name.UTF8String); - if(label != nil) { - printf(", label: %s", label.UTF8String); - } else if(identifier != nil) { - printf(", identifier: %s", identifier.UTF8String); - } - if(self.hidden) { - printf(" (invisible)"); - } - - if([self isKindOfClass:[UIImageView class]]) { - if(((UIImageView*)self).highlighted) { - printf(" (highlighted)"); - } else { - printf(" (not highlighted)"); - } - } - - if([self isKindOfClass:[UIControl class]]) { - 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)"); - } - printf("\n"); - - // - NSInteger numOfAccElements = self.accessibilityElementCount; - if(numOfAccElements != NSNotFound) { - for (NSInteger i = 0; i < numOfAccElements; ++i) { - for(int i = 0; i < indent+1; ++i) { - printf("|\t"); - } - UIAccessibilityElement *e = [(UIAccessibilityElement*)self accessibilityElementAtIndex:i]; - printf("UIAccessibilityElement, label: %s", 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"); - } - } - - for (UIView *subview in self.subviews) { - [subview printViewHierarchyWithIndentation:indent+1]; - } -} - -@end diff --git a/Example/Pods/KIF/Additions/UIWindow-KIFAdditions.h b/Example/Pods/KIF/Additions/UIWindow-KIFAdditions.h deleted file mode 100644 index 64c9b2c..0000000 --- a/Example/Pods/KIF/Additions/UIWindow-KIFAdditions.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// UIWindow-KIFAdditions.h -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - - -@interface UIWindow (KIFAdditions) - -- (UIResponder *)firstResponder; - -@end diff --git a/Example/Pods/KIF/Additions/UIWindow-KIFAdditions.m b/Example/Pods/KIF/Additions/UIWindow-KIFAdditions.m deleted file mode 100644 index 893b49e..0000000 --- a/Example/Pods/KIF/Additions/UIWindow-KIFAdditions.m +++ /dev/null @@ -1,15 +0,0 @@ -// -// UIWindow-KIFAdditions.m -// KIF -// -// Created by Eric Firestone on 5/20/11. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "UIWindow-KIFAdditions.h" - - -//@implementation UIWindow (KIFAdditions) -// -//@end diff --git a/Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.h b/Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.h deleted file mode 100644 index 64f966c..0000000 --- a/Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// XCTestCase-KIFAdditions.h -// KIF -// -// Created by Tony DiPasquale on 12/9/13. -// -// - -#import -#import "KIFTestActor.h" - -@interface XCTestCase (KIFAdditions) - -@end diff --git a/Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.m b/Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.m deleted file mode 100644 index 247dcbe..0000000 --- a/Example/Pods/KIF/Additions/XCTestCase-KIFAdditions.m +++ /dev/null @@ -1,87 +0,0 @@ -// -// XCTestCase-KIFAdditions.m -// KIF -// -// Created by Tony DiPasquale on 12/9/13. -// -// - -#import "XCTestCase-KIFAdditions.h" -#import "LoadableCategory.h" -#import - -MAKE_CATEGORIES_LOADABLE(TestCase_KIFAdditions) - -static inline void Swizzle(Class c, SEL orig, SEL new) -{ - Method origMethod = class_getInstanceMethod(c, orig); - Method newMethod = class_getInstanceMethod(c, new); - if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) - class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); - else - method_exchangeImplementations(origMethod, newMethod); -} - -@interface XCTestCase () -- (void)_recordUnexpectedFailureWithDescription:(id)arg1 exception:(id)arg2; -@end - -@implementation XCTestCase (KIFAdditions) - -- (void)failWithException:(NSException *)exception stopTest:(BOOL)stop -{ - self.continueAfterFailure = YES; - - [self recordFailureWithDescription:exception.description inFile:exception.userInfo[@"SenTestFilenameKey"] atLine:[exception.userInfo[@"SenTestLineNumberKey"] unsignedIntegerValue] expected:NO]; - - if (stop) { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - Swizzle([XCTestCase class], @selector(_recordUnexpectedFailureWithDescription:exception:), @selector(KIF_recordUnexpectedFailureWithDescription:exception:)); - }); - [exception raise]; - } -} - -- (void)failWithExceptions:(NSArray *)exceptions stopTest:(BOOL)stop -{ - NSException *lastException = exceptions.lastObject; - for (NSException *exception in exceptions) { - [self failWithException:exception stopTest:(exception == lastException ? stop : NO)]; - } -} - -- (void)KIF_recordUnexpectedFailureWithDescription:(id)arg1 exception:(NSException *)arg2 -{ - if (![[arg2 name] isEqualToString:@"KIFFailureException"]) { - [self KIF_recordUnexpectedFailureWithDescription:arg1 exception:arg2]; - } -} - -@end - -#ifdef __IPHONE_8_0 - -@interface XCTestSuite () -- (void)_recordUnexpectedFailureForTestRun:(id)arg1 description:(id)arg2 exception:(id)arg3; -@end - -@implementation XCTestSuite (KIFAdditions) - -+ (void)load -{ - Swizzle([XCTestSuite class], @selector(_recordUnexpectedFailureForTestRun:description:exception:), @selector(KIF_recordUnexpectedFailureForTestRun:description:exception:)); -} - -- (void)KIF_recordUnexpectedFailureForTestRun:(XCTestSuiteRun *)arg1 description:(id)arg2 exception:(NSException *)arg3 -{ - if (![[arg3 name] isEqualToString:@"KIFFailureException"]) { - [self KIF_recordUnexpectedFailureForTestRun:arg1 description:arg2 exception:arg3]; - } else { - [arg1 recordFailureWithDescription:[NSString stringWithFormat:@"Test suite stopped on fatal error: %@", arg3.description] inFile:arg3.userInfo[@"SenTestFilenameKey"] atLine:[arg3.userInfo[@"SenTestLineNumberKey"] unsignedIntegerValue] expected:NO]; - } -} - -@end - -#endif diff --git a/Example/Pods/KIF/Classes/KIF.h b/Example/Pods/KIF/Classes/KIF.h deleted file mode 100644 index 6f70628..0000000 --- a/Example/Pods/KIF/Classes/KIF.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// KIF.h -// KIF -// -// Created by Jim Puls on 12/21/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "KIFTestActor.h" -#import "KIFTestCase.h" -#import "KIFSystemTestActor.h" -#import "KIFUITestActor.h" -#import "KIFUITestActor-ConditionalTests.h" - -#ifndef KIF_SENTEST -#import "XCTestCase-KIFAdditions.h" -#else -#import "SenTestCase-KIFAdditions.h" -#endif diff --git a/Example/Pods/KIF/Classes/KIFSystemTestActor.h b/Example/Pods/KIF/Classes/KIFSystemTestActor.h deleted file mode 100644 index b5b5c20..0000000 --- a/Example/Pods/KIF/Classes/KIFSystemTestActor.h +++ /dev/null @@ -1,79 +0,0 @@ -// -// KIFTester+Generic.h -// KIF -// -// Created by Brian Nickel on 12/14/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "KIFTestActor.h" -#import - -#define system KIFActorWithClass(KIFSystemTestActor) - -@interface KIFSystemTestActor : KIFTestActor - -/*! - @abstract Waits for a specific NSNotification. - @discussion Useful when a test requires an asynchronous task to complete, especially when that task does not trigger a visible change in the view hierarchy. - @param name The name of the NSNotification. - @param object The object to which the step should listen. Nil value will listen to all objects. - @return The detected NSNotification. - */ -- (NSNotification *)waitForNotificationName:(NSString*)name object:(id)object; - -/*! - @abstract Waits for a specific NSNotification, emitted during or after execution of a block. - @discussion Useful when step execution causes a notification to be emitted, but executes too quickly for waitForNotificationName: to observe it. - An observer will be registered for the notification before the block is executed. - @param name The name of the NSNotification. - @param object The object to which the step should listen. Nil value will listen to all objects. - @param block The block of code to be executed. - @return The detected NSNotification. - */ -- (NSNotification *)waitForNotificationName:(NSString *)name object:(id)object whileExecutingBlock:(void(^)())block; - -/*! - @abstract Simulates a memory warning. - */ -- (void)simulateMemoryWarning; - -/*! - @abstract Simulates a device rotation to a specific orentation from its last set orientation. - @discussion The first time this method is called, it will be from the device's natural orientation to the orientation described. - @param orientation The desired orientation. - */ -- (void)simulateDeviceRotationToOrientation:(UIDeviceOrientation)orientation; - -/*! - @abstract Waits for the application to request a specific URL while executing a block. - @param URLString The absolute string representation 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)waitForApplicationToOpenURL:(NSString *)URLString whileExecutingBlock:(void(^)())block returning:(BOOL)returnValue; - -/*! - @abstract Waits for the application to request any URL while executing a block. - @param block The block of code to be executed. - @param returnValue The value to return from @c +[UIApplication openURL:]. - */ -- (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. - @param description A description to use when writing the file to disk. - */ -- (void)captureScreenshotWithDescription:(NSString *)description; - -@end diff --git a/Example/Pods/KIF/Classes/KIFSystemTestActor.m b/Example/Pods/KIF/Classes/KIFSystemTestActor.m deleted file mode 100644 index 53f1ae5..0000000 --- a/Example/Pods/KIF/Classes/KIFSystemTestActor.m +++ /dev/null @@ -1,116 +0,0 @@ -// -// KIFTester+Generic.m -// KIF -// -// Created by Brian Nickel on 12/14/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "KIFSystemTestActor.h" -#import -#import "UIApplication-KIFAdditions.h" -#import "NSError-KIFAdditions.h" - -@implementation KIFSystemTestActor - -- (NSNotification *)waitForNotificationName:(NSString*)name object:(id)object -{ - return [self waitForNotificationName:name object:object whileExecutingBlock:nil]; -} - -- (NSNotification *)waitForNotificationName:(NSString *)name object:(id)object whileExecutingBlock:(void(^)())block -{ - return [self waitForNotificationName:name object:object whileExecutingBlock:block complete:nil]; -} - -- (NSNotification *)waitForNotificationName:(NSString *)name object:(id)object whileExecutingBlock:(void(^)())block complete:(void(^)())complete -{ - __block NSNotification *detectedNotification = nil; - id observer = [[NSNotificationCenter defaultCenter] addObserverForName:name object:object queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { - detectedNotification = note; - }]; - - if (block) { - block(); - } - - [self runBlock:^KIFTestStepResult(NSError **error) { - KIFTestWaitCondition(detectedNotification, error, @"Waiting for notification \"%@\"", name); - return KIFTestStepResultSuccess; - } complete:^(KIFTestStepResult result, NSError *error) { - [[NSNotificationCenter defaultCenter] removeObserver:observer]; - - if (complete) { - complete(); - } - }]; - - return detectedNotification; -} - -- (void)simulateMemoryWarning -{ - [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification object:[UIApplication sharedApplication]]; -} - -- (void)simulateDeviceRotationToOrientation:(UIDeviceOrientation)orientation -{ - if ([[UIApplication sharedApplication] respondsToSelector:@selector(rotateIfNeeded:completion:)]) { - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - [[UIApplication sharedApplication] rotateIfNeeded:orientation completion:^{ - dispatch_semaphore_signal(semaphore); - }]; - while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) { - CFRunLoopRunInMode([[UIApplication sharedApplication] currentRunLoopMode] ?: kCFRunLoopDefaultMode, 0.1, false); - } - } else { - [[UIApplication sharedApplication] rotateIfNeeded:orientation]; - } -} - - -- (void)waitForApplicationToOpenAnyURLWhileExecutingBlock:(void (^)())block returning:(BOOL)returnValue -{ - [self waitForApplicationToOpenURL:nil whileExecutingBlock:block returning: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]; - NSNotification *notification = [self waitForNotificationName:UIApplicationDidMockOpenURLNotification object:[UIApplication sharedApplication] whileExecutingBlock:block complete:^{ - [UIApplication stopMockingOpenURL]; - }]; - - if (URLMatcherBlock) { - NSURL *actualURL = [notification.userInfo objectForKey:UIApplicationOpenedURLKey]; - URLMatcherBlock(actualURL); - } -} - -- (void)captureScreenshotWithDescription:(NSString *)description -{ - NSError *error; - if (![[UIApplication sharedApplication] writeScreenshotForLine:(NSUInteger)self.line inFile:self.file description:description error:&error]) { - [self failWithError:error stopTest:NO]; - } -} - -@end diff --git a/Example/Pods/KIF/Classes/KIFTestActor.h b/Example/Pods/KIF/Classes/KIFTestActor.h deleted file mode 100644 index 854c310..0000000 --- a/Example/Pods/KIF/Classes/KIFTestActor.h +++ /dev/null @@ -1,160 +0,0 @@ -// -// KIFTester.h -// KIF -// -// Created by Brian Nickel on 12/13/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import - -#ifdef DEPRECATED_MSG_ATTRIBUTE -#define KIF_DEPRECATED(m) DEPRECATED_MSG_ATTRIBUTE(m) -#else -#define KIF_DEPRECATED(m) -#endif - -#define KIFActorWithClass(clazz) [clazz actorInFile:[NSString stringWithUTF8String:__FILE__] atLine:__LINE__ delegate:self] - -/*! - @define KIFTestCondition - @abstract Tests a condition and returns a failure result if the condition isn't true. - @discussion This is a useful macro for quickly evaluating conditions in a test step. If the condition is false then the current test step will be aborted with a failure result. - @param condition The condition to test. - @param error The NSError object to put the error string into. May be nil, but should usually be the error parameter from the test step execution block. - @param ... A string describing what the failure was that occurred. This may be a format string with additional arguments. - */ -#define KIFTestCondition(condition, error, ...) ({ \ -if (!(condition)) { \ -if (error) { \ -*error = [NSError errorWithDomain:@"KIFTest" code:KIFTestStepResultFailure userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:__VA_ARGS__], NSLocalizedDescriptionKey, nil]]; \ -} \ -return KIFTestStepResultFailure; \ -} \ -}) - -/*! - @define KIFTestWaitCondition - @abstract Tests a condition and returns a wait result if the condition isn't true. - @discussion This is a useful macro for quickly evaluating conditions in a test step. If the condition is false then the current test step will be aborted with a wait result, indicating that it should be called again in the near future. - @param condition The condition to test. - @param error The NSError object to put the error string into. May be nil, but should usually be the error parameter from the test step execution block. - @param ... A string describing why the step needs to wait. This is important since this reason will be considered the cause of a timeout error if the step requires waiting for too long. This may be a format string with additional arguments. - */ -#define KIFTestWaitCondition(condition, error, ...) ({ \ -if (!(condition)) { \ -if (error) { \ -*error = [NSError errorWithDomain:@"KIFTest" code:KIFTestStepResultWait userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:__VA_ARGS__], NSLocalizedDescriptionKey, nil]]; \ -} \ -return KIFTestStepResultWait; \ -} \ -}) - - -/*! - @enum KIFTestStepResult - @abstract Result codes from a test step. - @constant KIFTestStepResultFailure The step failed and the test controller should move to the next scenario. - @constant KIFTestStepResultSuccess The step succeeded and the test controller should move to the next step in the current scenario. - @constant KIFTestStepResultWait The test isn't ready yet and should be tried again after a short delay. - */ -typedef NS_ENUM(NSUInteger, KIFTestStepResult) { - KIFTestStepResultFailure = 0, - KIFTestStepResultSuccess, - KIFTestStepResultWait, -}; - -/*! - @typedef KIFTestExecutionBlock - @param error An error to fill out in the case of a failure or wait condition. Filling out this error is mandatory in these cases to ensure that testing output is useful. - @result A test result code. Returning KIFTestStepResultWait will cause the block to be tried again on the next iteration. - */ -typedef KIFTestStepResult (^KIFTestExecutionBlock)(NSError **error); - -/*! - @typedef KIFTestCompletionBlock - @param result The result of the test, either KIFTestStepResultSuccess or KIFTestStepResultFailure. - @param error An error provided by the test or nil if result is equal to KIFTestStepResultSuccess. - */ -typedef void (^KIFTestCompletionBlock)(KIFTestStepResult result, NSError *error); - -@protocol KIFTestActorDelegate; - -@interface KIFTestActor : NSObject - -+ (instancetype)actorInFile:(NSString *)file atLine:(NSInteger)line delegate:(id)delegate; - -@property (strong, nonatomic, readonly) NSString *file; -@property (nonatomic, readonly) NSInteger line; -@property (weak, nonatomic, readonly) id delegate; -@property (nonatomic) NSTimeInterval executionBlockTimeout; -@property (nonatomic) NSTimeInterval animationWaitingTimeout; - -- (instancetype)usingTimeout:(NSTimeInterval)executionBlockTimeout; - -- (void)runBlock:(KIFTestExecutionBlock)executionBlock complete:(KIFTestCompletionBlock)completionBlock timeout:(NSTimeInterval)timeout; -- (void)runBlock:(KIFTestExecutionBlock)executionBlock complete:(KIFTestCompletionBlock)completionBlock; -- (void)runBlock:(KIFTestExecutionBlock)executionBlock timeout:(NSTimeInterval)timeout; -- (void)runBlock:(KIFTestExecutionBlock)executionBlock; - - -/*! - @discussion Attempts to run the test block similar to -runBlock:complete:timeout: but does not halt the test on completion, instead returning NO on failure and providing an error description to the optional error parameter. - */ -- (BOOL)tryRunningBlock:(KIFTestExecutionBlock)executionBlock complete:(KIFTestCompletionBlock)completionBlock timeout:(NSTimeInterval)timeout error:(out NSError **)error; - -/*! - @method defaultTimeout - @abstract The default amount of time to assign to execution blocks before assuming they failed. - @discussion To change the default value of the timeout property, call +setDefaultTimeout: with a different value. - */ -+ (NSTimeInterval)defaultTimeout; - -/*! - @method setDefaultTimeout: - @abstract Sets the default amount of time to assign to execution blocks before assuming they failed. - */ -+ (void)setDefaultTimeout:(NSTimeInterval)newDefaultTimeout; - -/*! - @method stepDelay - @abstract The amount of time that execution blocks use before trying again to met desired conditions. - @discussion To change the default value of the step delay property, call +setStepDelay: with a different value. - */ -+ (NSTimeInterval)stepDelay; - -/*! - @method setStepDelay: - @abstract Sets the amount of time that execution blocks use before trying again to met desired conditions. - */ -+ (void)setStepDelay:(NSTimeInterval)newStepDelay; - -/*! - @abstract Fails the test. - @discussion Mostly useful for test debugging or as a placeholder when building new tests. - */ -- (void)fail; - -- (void)failWithError:(NSError *)error stopTest:(BOOL)stopTest; - -/*! - @abstract Waits for a certain amount of time before returning. - @discussion In general when waiting for the app to get into a known state, it's better to use -waitForTappableViewWithAccessibilityLabel:, however this step may be useful in some situations as well. - @param timeInterval The number of seconds to wait before returning. - */ -- (void)waitForTimeInterval:(NSTimeInterval)timeInterval; - - - -@end - -@protocol KIFTestActorDelegate - -- (void)failWithException:(NSException *)exception stopTest:(BOOL)stop; -- (void)failWithExceptions:(NSArray *)exceptions stopTest:(BOOL)stop; - -@end - -@interface KIFTestActor (Delegate) -@end diff --git a/Example/Pods/KIF/Classes/KIFTestActor.m b/Example/Pods/KIF/Classes/KIFTestActor.m deleted file mode 100644 index 6e539c4..0000000 --- a/Example/Pods/KIF/Classes/KIFTestActor.m +++ /dev/null @@ -1,199 +0,0 @@ -// -// KIFTester.m -// KIF -// -// Created by Brian Nickel on 12/13/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#ifndef KIF_SENTEST -#import -#import "NSException-KIFAdditions.h" -#else -#import -#endif - -#import "KIFTestActor.h" -#import "NSError-KIFAdditions.h" -#import -#import -#import "UIApplication-KIFAdditions.h" -#import "UIView-KIFAdditions.h" - -@implementation KIFTestActor - -+ (void)load -{ - @autoreleasepool { - NSLog(@"KIFTester loaded"); - [KIFTestActor _enableAccessibility]; - [UIApplication swizzleRunLoop]; - } -} - -+ (void)_enableAccessibility; -{ - NSString *appSupportLocation = @"/System/Library/PrivateFrameworks/AppSupport.framework/AppSupport"; - - NSDictionary *environment = [[NSProcessInfo processInfo] environment]; - NSString *simulatorRoot = [environment objectForKey:@"IPHONE_SIMULATOR_ROOT"]; - if (simulatorRoot) { - appSupportLocation = [simulatorRoot stringByAppendingString:appSupportLocation]; - } - - void *appSupportLibrary = dlopen([appSupportLocation fileSystemRepresentation], RTLD_LAZY); - - CFStringRef (*copySharedResourcesPreferencesDomainForDomain)(CFStringRef domain) = dlsym(appSupportLibrary, "CPCopySharedResourcesPreferencesDomainForDomain"); - - if (copySharedResourcesPreferencesDomainForDomain) { - CFStringRef accessibilityDomain = copySharedResourcesPreferencesDomainForDomain(CFSTR("com.apple.Accessibility")); - - if (accessibilityDomain) { - CFPreferencesSetValue(CFSTR("ApplicationAccessibilityEnabled"), kCFBooleanTrue, accessibilityDomain, kCFPreferencesAnyUser, kCFPreferencesAnyHost); - CFRelease(accessibilityDomain); - } - } -} - -- (instancetype)initWithFile:(NSString *)file line:(NSInteger)line delegate:(id)delegate -{ - self = [super init]; - if (self) { - _file = file; - _line = line; - _delegate = delegate; - _executionBlockTimeout = [[self class] defaultTimeout]; - _animationWaitingTimeout = 0.5f; - } - return self; -} - -+ (instancetype)actorInFile:(NSString *)file atLine:(NSInteger)line delegate:(id)delegate -{ - return [[self alloc] initWithFile:file line:line delegate:delegate]; -} - -- (instancetype)usingTimeout:(NSTimeInterval)executionBlockTimeout -{ - self.executionBlockTimeout = executionBlockTimeout; - return self; -} - -- (BOOL)tryRunningBlock:(KIFTestExecutionBlock)executionBlock complete:(KIFTestCompletionBlock)completionBlock timeout:(NSTimeInterval)timeout error:(out NSError **)error -{ - NSDate *startDate = [NSDate date]; - KIFTestStepResult result; - NSError *internalError; - - while ((result = executionBlock(&internalError)) == KIFTestStepResultWait && -[startDate timeIntervalSinceNow] < timeout) { - CFRunLoopRunInMode([[UIApplication sharedApplication] currentRunLoopMode] ?: kCFRunLoopDefaultMode, KIFTestStepDelay, false); - } - - if (result == KIFTestStepResultWait) { - internalError = [NSError KIFErrorWithUnderlyingError:internalError format:@"The step timed out after %.2f seconds: %@", timeout, internalError.localizedDescription]; - result = KIFTestStepResultFailure; - } - - if (completionBlock) { - completionBlock(result, internalError); - } - - if (error) { - *error = internalError; - } - - return result != KIFTestStepResultFailure; -} - -- (void)runBlock:(KIFTestExecutionBlock)executionBlock complete:(KIFTestCompletionBlock)completionBlock timeout:(NSTimeInterval)timeout -{ - NSError *error = nil; - if (![self tryRunningBlock:executionBlock complete:completionBlock timeout:timeout error:&error]) { - [self failWithError:error stopTest:YES]; - } -} - -- (void)runBlock:(KIFTestExecutionBlock)executionBlock complete:(KIFTestCompletionBlock)completionBlock -{ - [self runBlock:executionBlock complete:completionBlock timeout:self.executionBlockTimeout]; -} - -- (void)runBlock:(KIFTestExecutionBlock)executionBlock timeout:(NSTimeInterval)timeout -{ - [self runBlock:executionBlock complete:nil timeout:timeout]; -} - -- (void)runBlock:(KIFTestExecutionBlock)executionBlock -{ - [self runBlock:executionBlock complete:nil]; -} - - -#pragma mark Class Methods - -static NSTimeInterval KIFTestStepDefaultTimeout = 10.0; -static NSTimeInterval KIFTestStepDelay = 0.1; - -+ (NSTimeInterval)defaultTimeout; -{ - return KIFTestStepDefaultTimeout; -} - -+ (void)setDefaultTimeout:(NSTimeInterval)newDefaultTimeout; -{ - KIFTestStepDefaultTimeout = newDefaultTimeout; -} - -+ (NSTimeInterval)stepDelay; -{ - return KIFTestStepDelay; -} - -+ (void)setStepDelay:(NSTimeInterval)newStepDelay; -{ - KIFTestStepDelay = newStepDelay; -} - -#pragma mark Generic tests - -- (void)fail -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - KIFTestCondition(NO, error, @"This test always fails"); - }]; -} - -- (void)failWithError:(NSError *)error stopTest:(BOOL)stopTest -{ - [self.delegate failWithException:[NSException failureInFile:self.file atLine:(int)self.line withDescription:error.localizedDescription] stopTest:stopTest]; -} - -- (void)waitForTimeInterval:(NSTimeInterval)timeInterval -{ - NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate]; - - [self runBlock:^KIFTestStepResult(NSError **error) { - KIFTestWaitCondition((([NSDate timeIntervalSinceReferenceDate] - startTime) >= timeInterval), error, @"Waiting for time interval to expire."); - return KIFTestStepResultSuccess; - } timeout:timeInterval + 1]; -} - -@end - -@implementation KIFTestActor (Delegate) - -- (void)failWithException:(NSException *)exception stopTest:(BOOL)stop -{ - [self failWithExceptions:@[exception] stopTest:stop]; -} - -- (void)failWithExceptions:(NSArray *)exceptions stopTest:(BOOL)stop -{ - NSException *firstException = [exceptions objectAtIndex:0]; - NSException *newException = [NSException failureInFile:self.file atLine:(int)self.line withDescription:@"Failure in child step: %@", firstException.description]; - - [self.delegate failWithExceptions:[exceptions arrayByAddingObject:newException] stopTest:stop]; -} - -@end diff --git a/Example/Pods/KIF/Classes/KIFTestCase.h b/Example/Pods/KIF/Classes/KIFTestCase.h deleted file mode 100644 index ad98eef..0000000 --- a/Example/Pods/KIF/Classes/KIFTestCase.h +++ /dev/null @@ -1,58 +0,0 @@ -// -// KIFTestCase.h -// KIF -// -// Created by Brian Nickel on 12/14/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -/*! - * @abstract @c KIFTestCase subclasses @c SenTestCase or XCTestCase to add setup and teardown steps that can be used to execute KIF test steps. - * @discussion This class provides four new methods: @c beforeAll and @c afterAll which run once before and after all tests and @c beforeEach and @c afterEach which run before and after every test. @c beforeEach and @c afterEach are guaranteed to run in the same instance as each test, but @c beforeAll and @c afterAll are not. As such, @c beforeEach can be used to set up instance variables while @c beforeAll can only be used to set up static variables. - */ -#ifndef KIF_SENTEST - -#import -#import "XCTestCase-KIFAdditions.h" -@interface KIFTestCase : XCTestCase - -#else - -#import -#import "SenTestCase-KIFAdditions.h" -@interface KIFTestCase : SenTestCase - -#endif - -/*! - * @abstract This method runs once before executing the first test in the class. - * @discussion This should be used for navigating to the starting point in the app where all tests will start from. Because this method is not guaranteed to run in the same instance as tests, it should not be used for setting up instance variables but can be used for setting up static variables. - */ -- (void)beforeAll; - -/*! - * @abstract This method runs before each test. - * @discussion This should be used for any common tasks required before each test. Because this method is guaranteed to run in the same instance as tests, it can be used for setting up instance variables. - */ -- (void)beforeEach; - -/*! - * @abstract This method runs after each test. - * @discussion This should be used for restoring the app to the state it was in before the test. This could include conditional logic to recover from failed tests. - */ -- (void)afterEach; - -/*! - * @abstract This method runs once after executing the last test in the class. - * @discussion This should be used for navigating back to the initial state of the app, where it was before @c beforeAll. This should also be used for tearing down any static methods created by @c beforeAll. - */ -- (void)afterAll; - -/*! - * @discussion When @c YES, rather than failing the test and advancing on the first failure, KIF will stop executing tests and begin spinning the run loop. This provides an opportunity for inspecting the state of the app when the failure occurred. - */ -@property (nonatomic, assign) BOOL stopTestsOnFirstBigFailure; - -@end - diff --git a/Example/Pods/KIF/Classes/KIFTestCase.m b/Example/Pods/KIF/Classes/KIFTestCase.m deleted file mode 100644 index 53a8acb..0000000 --- a/Example/Pods/KIF/Classes/KIFTestCase.m +++ /dev/null @@ -1,176 +0,0 @@ -// -// KIFTestCase.m -// KIF -// -// Created by Brian Nickel on 12/14/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "KIFTestCase.h" -#import -#import "UIApplication-KIFAdditions.h" -#import "KIFTestActor.h" - -#define SIG(class, selector) [class instanceMethodSignatureForSelector:selector] - - -@implementation KIFTestCase -{ - NSException *_stoppingException; -} - -NSComparisonResult selectorSort(NSInvocation *invocOne, NSInvocation *invocTwo, void *reverse); - -+ (id)defaultTestSuite -{ - if (self == [KIFTestCase class]) { - // Don't run KIFTestCase "tests" - return nil; - } - - return [super defaultTestSuite]; -} - -- (id)initWithInvocation:(NSInvocation *)anInvocation; -{ - self = [super initWithInvocation:anInvocation]; - if (!self) { - return nil; - } - -#ifndef KIF_SENTEST - self.continueAfterFailure = NO; -#else - [self raiseAfterFailure]; -#endif - return self; -} - -- (void)beforeEach { } -- (void)afterEach { } -- (void)beforeAll { } -- (void)afterAll { } - -#ifndef KIF_SENTEST - -NSComparisonResult selectorSort(NSInvocation *invocOne, NSInvocation *invocTwo, void *reverse) { - - NSString *selectorOne = NSStringFromSelector([invocOne selector]); - NSString *selectorTwo = NSStringFromSelector([invocTwo selector]); - return [selectorOne compare:selectorTwo options:NSCaseInsensitiveSearch]; -} - -+ (NSArray *)testInvocations -{ - NSArray *disorderedInvoc = [super testInvocations]; - NSArray *newArray = [disorderedInvoc sortedArrayUsingFunction:selectorSort context:NULL]; - return newArray; -} - -+ (void)setUp -{ - [self performSetupTearDownWithSelector:@selector(beforeAll)]; -} - -+ (void)tearDown -{ - [self performSetupTearDownWithSelector:@selector(afterAll)]; -} - -+ (void)performSetupTearDownWithSelector:(SEL)selector -{ - KIFTestCase *testCase = [self testCaseWithSelector:selector]; - 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]; - } -} - -#else - -+ (NSArray *)testInvocations; -{ - if (self == [KIFTestCase class]) { - return nil; - } - - NSMutableArray *testInvocations = [NSMutableArray arrayWithArray:[super testInvocations]]; - - if ([self instancesRespondToSelector:@selector(beforeAll)]) { - NSInvocation *beforeAll = [NSInvocation invocationWithMethodSignature:SIG(self, @selector(beforeAll))]; - beforeAll.selector = @selector(beforeAll); - [testInvocations insertObject:beforeAll atIndex:0]; - } - - if ([self instancesRespondToSelector:@selector(afterAll)]) { - NSInvocation *afterAll = [NSInvocation invocationWithMethodSignature:SIG(self, @selector(afterAll))]; - afterAll.selector = @selector(afterAll); - [testInvocations addObject:afterAll]; - } - - return testInvocations; -} - -#endif - -- (void)setUp; -{ - [super setUp]; - - if ([self isNotBeforeOrAfter]) { - [self beforeEach]; - } -} - -- (void)tearDown; -{ - if ([self isNotBeforeOrAfter]) { - [self afterEach]; - } - - [super tearDown]; -} - -- (BOOL)isNotBeforeOrAfter; -{ - SEL selector = self.invocation.selector; - return selector != @selector(beforeAll) && selector != @selector(afterAll); -} - -- (void)failWithException:(NSException *)exception stopTest:(BOOL)stop -{ - if (stop) { - [self writeScreenshotForException:exception]; - _stoppingException = exception; - } - - if (stop && self.stopTestsOnFirstBigFailure) { - NSLog(@"Fatal failure encountered: %@", exception.description); - NSLog(@"Stopping tests since stopTestsOnFirstBigFailure = YES"); - - KIFTestActor *waiter = [[KIFTestActor alloc] init]; - [waiter waitForTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow]]; - - return; - } else { - [super failWithException:exception stopTest:stop]; - } -} - -- (void)writeScreenshotForException:(NSException *)exception; -{ -#ifndef KIF_SENTEST - [[UIApplication sharedApplication] writeScreenshotForLine:[exception.userInfo[@"SenTestLineNumberKey"] unsignedIntegerValue] inFile:exception.userInfo[@"SenTestFilenameKey"] description:nil error:NULL]; -#else - [[UIApplication sharedApplication] writeScreenshotForLine:exception.lineNumber.unsignedIntegerValue inFile:exception.filename description:nil error:NULL]; -#endif -} - -@end diff --git a/Example/Pods/KIF/Classes/KIFTestStepValidation.h b/Example/Pods/KIF/Classes/KIFTestStepValidation.h deleted file mode 100644 index f300c16..0000000 --- a/Example/Pods/KIF/Classes/KIFTestStepValidation.h +++ /dev/null @@ -1,61 +0,0 @@ -// -// KIFTestStepValidation.h -// KIF -// -// Created by Brian Nickel on 7/27/13. -// -// - -#import -#import "KIFTestCase.h" - -#ifndef KIF_SENTEST - -#define __KIFFail XCTFail -#define __KIFAssertEqual XCTAssertEqual -#define __KIFAssertEqualObjects XCTAssertEqualObjects - -#else - -#define __KIFFail STFail -#define __KIFAssertEqual STAssertEquals -#define __KIFAssertEqualObjects STAssertEqualObjects - -#endif - -#define KIFExpectFailure(stmt) \ -{\ - _MockKIFTestActorDelegate *mockDelegate = [_MockKIFTestActorDelegate mockDelegate];\ - {\ - _MockKIFTestActorDelegate *self = mockDelegate;\ - @try { stmt; }\ - @catch (NSException *exception) { }\ - }\ - if (!mockDelegate.failed) {\ - __KIFFail(@"%s should have failed.", #stmt);\ - }\ -} - -#define KIFExpectFailureWithCount(stmt, cnt) \ -{\ - _MockKIFTestActorDelegate *mockDelegate = [_MockKIFTestActorDelegate mockDelegate];\ - {\ - _MockKIFTestActorDelegate *self = mockDelegate;\ - @try { stmt; }\ - @catch (NSException *exception) { }\ - }\ - if (!mockDelegate.failed) {\ - __KIFFail(@"%s should have failed.", #stmt);\ - }\ - __KIFAssertEqual((NSUInteger)cnt, mockDelegate.exceptions.count, @"Expected a different number of exceptions.");\ -} - - -@interface _MockKIFTestActorDelegate : NSObject -@property (nonatomic, assign) BOOL failed; -@property (nonatomic, strong) NSArray *exceptions; -@property (nonatomic, assign) BOOL stopped; - -+ (instancetype)mockDelegate; - -@end diff --git a/Example/Pods/KIF/Classes/KIFTestStepValidation.m b/Example/Pods/KIF/Classes/KIFTestStepValidation.m deleted file mode 100644 index 9828503..0000000 --- a/Example/Pods/KIF/Classes/KIFTestStepValidation.m +++ /dev/null @@ -1,34 +0,0 @@ -// -// KIFTestStepValidation.m -// KIF -// -// Created by Brian Nickel on 7/27/13. -// -// - -#import "KIFTestStepValidation.h" - -@implementation _MockKIFTestActorDelegate - -- (void)failWithException:(NSException *)exception stopTest:(BOOL)stop -{ - [self failWithExceptions:@[exception] stopTest:stop]; -} - -- (void)failWithExceptions:(NSArray *)exceptions stopTest:(BOOL)stop -{ - self.failed = YES; - self.exceptions = exceptions; - self.stopped = stop; - if (stop) { - [[exceptions objectAtIndex:0] raise]; - } -} - -+ (instancetype)mockDelegate -{ - return [[self alloc] init]; -} - - -@end diff --git a/Example/Pods/KIF/Classes/KIFTypist.h b/Example/Pods/KIF/Classes/KIFTypist.h deleted file mode 100644 index b3a0866..0000000 --- a/Example/Pods/KIF/Classes/KIFTypist.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// KIFTypist.h -// KIF -// -// Created by Pete Hodgson on 8/12/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - - -@interface KIFTypist : NSObject - -+ (void)registerForNotifications; -+ (BOOL)keyboardHidden; -+ (BOOL)enterCharacter:(NSString *)characterString; -+ (void)setKeystrokeDelay:(NSTimeInterval)delay; -+ (BOOL)hasHardwareKeyboard; -+ (BOOL)hasKeyInputResponder; - -@end diff --git a/Example/Pods/KIF/Classes/KIFTypist.m b/Example/Pods/KIF/Classes/KIFTypist.m deleted file mode 100644 index bb5dc57..0000000 --- a/Example/Pods/KIF/Classes/KIFTypist.m +++ /dev/null @@ -1,112 +0,0 @@ -// -// KIFTypist.m -// KIF -// -// Created by Pete Hodgson on 8/12/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "KIFTypist.h" -#import "UIApplication-KIFAdditions.h" -#import "UIView-KIFAdditions.h" -#import "CGGeometry-KIFAdditions.h" -#import "UIAccessibilityElement-KIFAdditions.h" - -@interface UIKeyboardImpl : NSObject -+ (UIKeyboardImpl *)sharedInstance; -- (void)addInputString:(NSString *)string; -- (void)deleteFromInput; -@property(getter=isInHardwareKeyboardMode) BOOL inHardwareKeyboardMode; -@property(retain) UIResponder * delegate; -@end - -static NSTimeInterval keystrokeDelay = 0.01f; - -@interface KIFTypist() -@property (nonatomic, assign) BOOL keyboardHidden; -@end - -@implementation KIFTypist - -+ (KIFTypist *)sharedTypist -{ - static dispatch_once_t once; - static KIFTypist *sharedObserver = nil; - dispatch_once(&once, ^{ - sharedObserver = [[self alloc] init]; - }); - return sharedObserver; -} - -+ (void)registerForNotifications { - [[self sharedTypist] registerForNotifications]; -} - -- (instancetype)init -{ - if ((self = [super init])) { - self.keyboardHidden = YES; - } - return self; -} - -- (void)registerForNotifications -{ - // 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 -{ - return [self sharedTypist].keyboardHidden; -} - -+ (BOOL)enterCharacter:(NSString *)characterString; -{ - if ([characterString isEqualToString:@"\b"]) { - [[UIKeyboardImpl sharedInstance] deleteFromInput]; - } else { - [[UIKeyboardImpl sharedInstance] addInputString:characterString]; - } - - CFRunLoopRunInMode(kCFRunLoopDefaultMode, keystrokeDelay, false); - return YES; -} - -+ (void)setKeystrokeDelay:(NSTimeInterval)delay -{ - keystrokeDelay = delay; -} - -+ (BOOL)hasHardwareKeyboard -{ - return [UIKeyboardImpl sharedInstance].inHardwareKeyboardMode; -} - -+ (BOOL)hasKeyInputResponder -{ - return [UIKeyboardImpl sharedInstance].delegate != nil; -} - - -@end diff --git a/Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.h b/Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.h deleted file mode 100644 index 10cdc33..0000000 --- a/Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.h +++ /dev/null @@ -1,68 +0,0 @@ -// -// KIFUITestActor-ConditionalTests.h -// KIF -// -// Created by Brian Nickel on 7/24/14. -// -// - -#import "KIF.h" - -@interface KIFUITestActor (ConditionalTests) - -/*! - @abstract Checks if an accessibility element is visible on screen. - @discussion The view or accessibility element with the given label is searched in the view hierarchy. If the element isn't found, then NO is returned. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - @param label The accessibility label of the element to wait for. - - If the view you want to check for is tappable, use the -tryFindingTappableViewWithAccessibilityLabel: methods instead as they provide a more strict test. - - */ -- (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label error:(out NSError **)error; - -/*! - @abstract Checks if an accessibility element is visible on screen. - @discussion The view or accessibility element with the given label is searched in the view hierarchy. If the element isn't found, then NO is returned. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - @param label The accessibility label of the element to wait for. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - -/*! - @abstract Checks if an accessibility element is visible on screen. - @discussion The view or accessibility element with the given label is searched in the view hierarchy. If the element isn't found, then NO is returned. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - -/*! - @abstract Checks if an accessibility element is visible on screen. - @discussion The view or accessibility element with the given label is searched in the view hierarchy. If the element isn't found, then NO is returned. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - @param label The accessibility label of the element to wait for. - */ -- (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label error:(out NSError **)error; - -/*! - @abstract Checks if an accessibility element is visible on screen. - @discussion The view or accessibility element with the given label is searched in the view hierarchy. If the element isn't found, then NO is returned. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - @param label The accessibility label of the element to wait for. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - -/*! - @abstract Checks if an accessibility element is visible on screen. - @discussion The view or accessibility element with the given label is searched in the view hierarchy. If the element isn't found, then NO is returned. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error; - -- (BOOL)tryFindingAccessibilityElement:(out UIAccessibilityElement **)element view:(out UIView **)view withIdentifier:(NSString *)identifier tappable:(BOOL)mustBeTappable error:(out NSError **)error; - -- (BOOL)tryFindingAccessibilityElement:(out UIAccessibilityElement **)element view:(out UIView **)view withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable error:(out NSError **)error; - -@end diff --git a/Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.m b/Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.m deleted file mode 100644 index d6226f0..0000000 --- a/Example/Pods/KIF/Classes/KIFUITestActor-ConditionalTests.m +++ /dev/null @@ -1,73 +0,0 @@ -// -// KIFUITestActor-ConditionalTests.m -// KIF -// -// Created by Brian Nickel on 7/24/14. -// -// - -#import "KIFUITestActor-ConditionalTests.h" -#import "UIAccessibilityElement-KIFAdditions.h" -#import "NSError-KIFAdditions.h" - -@implementation KIFUITestActor (ConditionalTests) - -- (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label error:(out NSError **)error -{ - return [self tryFindingViewWithAccessibilityLabel:label value:nil traits:UIAccessibilityTraitNone tappable:NO error:error]; -} - -- (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits error:(out NSError **)error -{ - return [self tryFindingViewWithAccessibilityLabel:label value:nil traits:traits tappable:NO error:error]; -} - -- (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error -{ - return [self tryFindingViewWithAccessibilityLabel:label value:value traits:traits tappable:NO error:error]; -} - -- (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label error:(out NSError **)error -{ - return [self tryFindingViewWithAccessibilityLabel:label value:nil traits:UIAccessibilityTraitNone tappable:YES error:error]; -} - -- (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits error:(out NSError **)error -{ - return [self tryFindingViewWithAccessibilityLabel:label value:nil traits:traits tappable:YES error:error]; -} - -- (BOOL)tryFindingTappableViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits error:(out NSError **)error -{ - return [self tryFindingViewWithAccessibilityLabel:label value:value traits:traits tappable:YES error:error]; -} - -- (BOOL)tryFindingViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable error:(out NSError **)error -{ - return [self tryFindingAccessibilityElement:NULL view:NULL withLabel:label value:value traits:traits tappable:mustBeTappable error:error]; -} - -- (BOOL)tryFindingAccessibilityElement:(out UIAccessibilityElement **)element view:(out UIView **)view withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable error:(out NSError **)error -{ - return [self tryRunningBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { - return [UIAccessibilityElement accessibilityElement:element view:view withLabel:label value:value traits:traits tappable:mustBeTappable error:error] ? KIFTestStepResultSuccess : KIFTestStepResultWait; - } complete:nil timeout:1.0 error:error]; -} - -- (BOOL)tryFindingAccessibilityElement:(out UIAccessibilityElement **)element view:(out UIView **)view withIdentifier:(NSString *)identifier tappable:(BOOL)mustBeTappable error:(out NSError **)error -{ - if (![UIAccessibilityElement instancesRespondToSelector:@selector(accessibilityIdentifier)]) { - [self failWithError:[NSError KIFErrorWithFormat:@"Running test on platform that does not support accessibilityIdentifier"] stopTest:YES]; - } - - return [self tryFindingAccessibilityElement:element view:view withElementMatchingPredicate:[NSPredicate predicateWithFormat:@"accessibilityIdentifier = %@", identifier] tappable:mustBeTappable error:error]; -} - -- (BOOL)tryFindingAccessibilityElement:(out UIAccessibilityElement **)element view:(out UIView **)view withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable error:(out NSError **)error -{ - return [self tryRunningBlock:^KIFTestStepResult(NSError *__autoreleasing *error) { - return [UIAccessibilityElement accessibilityElement:element view:view withElementMatchingPredicate:predicate tappable:mustBeTappable error:error] ? KIFTestStepResultSuccess : KIFTestStepResultWait; - } complete:nil timeout:1.0 error:error]; -} - -@end diff --git a/Example/Pods/KIF/Classes/KIFUITestActor.h b/Example/Pods/KIF/Classes/KIFUITestActor.h deleted file mode 100644 index 710b321..0000000 --- a/Example/Pods/KIF/Classes/KIFUITestActor.h +++ /dev/null @@ -1,518 +0,0 @@ -// -// KIFTester+UI.h -// KIF -// -// Created by Brian Nickel on 12/14/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "KIFTestActor.h" -#import -#import "UIView-KIFAdditions.h" - -#define tester KIFActorWithClass(KIFUITestActor) - -/*! - @enum KIFSwipeDirection - @abstract Directions in which to swipe. - @constant KIFSwipeDirectionRight Swipe to the right. - @constant KIFSwipeDirectionLeft Swipe to the left. - @constant KIFSwipeDirectionUp Swipe up. - @constant KIFSwipeDirectionDown Swipe down. - */ -typedef NS_ENUM(NSUInteger, KIFSwipeDirection) { - KIFSwipeDirectionRight, - KIFSwipeDirectionLeft, - KIFSwipeDirectionUp, - KIFSwipeDirectionDown -}; - -/*! - @enum KIFPickerType - @abstract Picker type to select values from. - @constant KIFUIPickerView UIPickerView type - @constant KIFUIDatePicker UIDatePicker type - */ -typedef NS_ENUM(NSUInteger, KIFPickerType) { - KIFUIPickerView, - KIFUIDatePicker -}; - -#define kKIFMajorSwipeDisplacement 200 -#define kKIFMinorSwipeDisplacement 5 - -static inline KIFDisplacement KIFDisplacementForSwipingInDirection(KIFSwipeDirection direction) -{ - switch (direction) - { - // As discovered on the Frank mailing lists, it won't register as a - // swipe if you move purely horizontally or vertically, so need a - // slight orthogonal offset too. - case KIFSwipeDirectionRight: - return CGPointMake(kKIFMajorSwipeDisplacement, kKIFMinorSwipeDisplacement); - case KIFSwipeDirectionLeft: - return CGPointMake(-kKIFMajorSwipeDisplacement, kKIFMinorSwipeDisplacement); - case KIFSwipeDirectionUp: - return CGPointMake(kKIFMinorSwipeDisplacement, -kKIFMajorSwipeDisplacement); - case KIFSwipeDirectionDown: - return CGPointMake(kKIFMinorSwipeDisplacement, kKIFMajorSwipeDisplacement); - } -} - -@interface KIFUITestActor : KIFTestActor - -/*! - @abstract Waits until a view or accessibility element is present. - @discussion The view or accessibility element with the given label is found in the view hierarchy. If the element isn't found, then the step will attempt to wait until it is. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - - If the view you want to wait for is tappable, use the -waitForTappableViewWithAccessibilityLabel: methods instead as they provide a more strict test. - @param label The accessibility label of the element to wait for. - */ -- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label; - -/*! - @abstract Waits until a view or accessibility element is present. - @discussion The view or accessibility element with the given label is found in the view hierarchy. If the element isn't found, then the step will attempt to wait until it is. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - - If the view you want to wait for is tappable, use the -waitForTappableViewWithAccessibilityLabel: methods instead as they provide a more strict test. - @param label The accessibility label of the element to wait for. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; - - -/*! - @abstract Waits until a view or accessibility element is present. - @discussion The view or accessibility element with the given label is found in the view hierarchy. If the element isn't found, then the step will attempt to wait until it is. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are ignored. - - If the view you want to wait for is tappable, use the -waitForTappableViewWithAccessibilityLabel: methods instead as they provide a more strict test. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - @result A configured test step. - */ -- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits; - -/*! - @abstract Waits until a view or accessibility element is no longer present. - @discussion The view or accessibility element with the given label is found in the view hierarchy. If the element is found, then the step will attempt to wait until it isn't. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are considered absent. - @param label The accessibility label of the element to wait for. - */ -- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label; - -/*! - @abstract Waits until a view or accessibility element is no longer present. - @discussion The view or accessibility element with the given label is found in the view hierarchy. If the element is found, then the step will attempt to wait until it isn't. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are considered absent. - @param label The accessibility label of the element to wait for. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; - -/*! - @abstract Waits until a view or accessibility element is no longer present. - @discussion The view or accessibility element with the given label is found in the view hierarchy. If the element is found, then the step will attempt to wait until it isn't. Note that the view does not necessarily have to be visible on the screen, and may be behind another view or offscreen. Views with their hidden property set to YES are considered absent. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits; - -/*! - @abstract Waits until a view or accessibility element is present and available for tapping. - @discussion The view or accessibility element with the given label is found in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Whether or not a view is tappable is based on -[UIView hitTest:]. - @param label The accessibility label of the element to wait for. - */ -- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label; - -/*! - @abstract Waits until a view or accessibility element is present and available for tapping. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Whether or not a view is tappable is based on -[UIView hitTest:]. - @param label The accessibility label of the element to wait for. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; - -/*! - @abstract Waits until a view or accessibility element is present and available for tapping. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Whether or not a view is tappable is based on -[UIView hitTest:]. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits; - - -/*! - @abstract Waits for an accessibility element and its containing view based on a variety of criteria. - @discussion This method provides a more verbose API for achieving what is available in the waitForView/waitForTappableView family of methods, exposing both the found element and its containing view. The results can be used in other methods such as @c tapAccessibilityElement:inView: - @param element To be populated with the matching accessibility element when found. Can be NULL. - @param view To be populated with the matching view when found. Can be NULL. - @param label The accessibility label of the element to wait for. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - @param mustBeTappable If YES, only an element that can be tapped on will be returned. - */ -- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable; - -/*! - @abstract Waits for an accessibility element and its containing view based the accessibility identifier. - @discussion This method provides a more verbose API for achieving what is available in the waitForView/waitForTappableView family of methods, exposing both the found element and its containing view. The results can be used in other methods such as @c tapAccessibilityElement:inView: - @param element To be populated with the matching accessibility element when found. Can be NULL. - @param view To be populated with the matching view when found. Can be NULL. - @param identifier The accessibility identifier of the element to wait for. - @param mustBeTappable If YES, only an element that can be tapped on will be returned. - */ -- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withIdentifier:(NSString *)identifier tappable:(BOOL)mustBeTappable; - -/*! - @abstract Waits for an accessibility element and its containing view based on a predicate. - @discussion This method provides a more verbose API for achieving what is available in the waitForView/waitForTappableView family of methods, exposing both the found element and its containing view. The results can be used in other methods such as @c tapAccessibilityElement:inView: - - This method provides more flexability than @c waitForAccessibilityElement:view:withLabel:value:traits:tappable: but less precise error messages. This message will tell you why the method failed but not whether or not the element met some of the criteria. - @param element To be populated with the matching accessibility element when found. Can be NULL. - @param view To be populated with the matching view when found. Can be NULL. - @param predicate The predicate to match. - @param mustBeTappable If YES, only an element that can be tapped on will be returned. - */ -- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable; - -/*! - @abstract Tries to guess if there are any unfinished animations and waits for a certain amount of time to let them finish. - */ -- (void)waitForAnimationsToFinish; - -/*! - @abstract Tries to guess if there are any unfinished animations and waits for a certain amount of time to let them finish. - @param timeout The maximum duration the method waits to let the animations finish. - */ -- (void)waitForAnimationsToFinishWithTimeout:(NSTimeInterval)timeout; - -/*! - @abstract Taps a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, a tap event is simulated in the center of the view or element. - @param label The accessibility label of the element to tap. - */ -- (void)tapViewWithAccessibilityLabel:(NSString *)label; - -/*! - @abstract Taps a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, a tap event is simulated in the center of the view or element. - @param label The accessibility label of the element to tap. - @param traits The accessibility traits of the element to tap. Elements that do not include at least these traits are ignored. - */ -- (void)tapViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; - -/*! - @abstract Taps a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, a tap event is simulated in the center of the view or element. - - This variation allows finding a particular instance of an accessibility element. For example, a table view might have multiple elements with the accessibility label of "Employee", but only one that also has the accessibility value of "Bob". - @param label The accessibility label of the element to tap. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to tap. Elements that do not include at least these traits are ignored. - */ -- (void)tapViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits; - -/*! - @abstract Taps a particular view in the view heirarchy. - @discussion Unlike the -tapViewWithAccessibilityLabel: family of methods, this method allows you to tap 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 view The view containing the accessibility element. - */ -- (void)tapAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)view; - -/*! - @abstract Taps the screen at a particular point. - @discussion Taps the screen at a specific point. In general you should use the factory steps that tap a view based on its accessibility label, but there are situations where it's not possible to access a view using accessibility mechanisms. This step is more lenient than the steps that use the accessibility label, and does not wait for any particular view to appear, or validate that the tapped view is enabled or has interaction enabled. Because this step doesn't doesn't validate that a view is present before tapping it, it's good practice to precede this step where possible with a -waitForViewWithAccessibilityLabel: with the label for another view that should appear on the same screen. - - @param screenPoint The point in screen coordinates to tap. Screen points originate from the top left of the screen. - */ -- (void)tapScreenAtPoint:(CGPoint)screenPoint; - -/*! - @abstract Performs a long press on a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, touch events are simulated in the center of the view or element. - @param label The accessibility label of the element to tap. - @param duration The length of time to long press the element. - */ -- (void)longPressViewWithAccessibilityLabel:(NSString *)label duration:(NSTimeInterval)duration; - -/*! - @abstract Performs a long press on a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, touch events are simulated in the center of the view or element. - - This variation allows finding a particular instance of an accessibility element. For example, a table view might have multiple elements with the accessibility label of "Employee", but only one that also has the accessibility value of "Bob". - @param label The accessibility label of the element to tap. - @param value The accessibility value of the element to tap. - @param duration The length of time to long press the element. - */ -- (void)longPressViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value duration:(NSTimeInterval)duration; - -- (void)longPressAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)view duration:(NSTimeInterval)duration; - -/*! - @abstract Performs a long press on a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, touch events are simulated in the center of the view or element. - - This variation allows finding a particular instance of an accessibility element. For example, a table view might have multiple elements with the accessibility label of "Employee", but only one that also has the accessibility value of "Bob". - @param label The accessibility label of the element to tap. - @param value The accessibility value of the element to tap. - @param traits The accessibility traits of the element to tap. Elements that do not include at least these traits are ignored. - @param duration The length of time to long press the element. - */ -- (void)longPressViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits duration:(NSTimeInterval)duration; - - -/*! - @abstract Waits for the software keyboard to be visible. - @discussion If input is also possible from a hardare keyboard @c waitForKeyInputReady may be more appropriate. - */ -- (void)waitForSoftwareKeyboard; -- (void)waitForKeyboard KIF_DEPRECATED("Use waitForSoftwareKeyboard or waitForKeyInputReady."); - -/*! - @abstract If present, waits for the software keyboard to dismiss. - */ -- (void)waitForAbsenceOfSoftwareKeyboard; -- (void)waitForAbsenceOfKeyboard KIF_DEPRECATED("Use waitForAbscenseOfSoftwareKeyboard."); - -/*! - @abstract Waits for the keyboard to be ready for input. This tests whether or not a hardware or software keyboard is available and if the keyboard has a responder to send events to. - */ -- (void)waitForKeyInputReady; - -/*! - @abstract Enters text into a the current first responder. - @discussion Text is entered into the view by simulating taps on the appropriate keyboard keys if the keyboard is already displayed. Useful to enter text in UIWebViews or components with no accessibility labels. - @param text The text to enter. - */ -- (void)enterTextIntoCurrentFirstResponder:(NSString *)text; -- (void)enterTextIntoCurrentFirstResponder:(NSString *)text fallbackView:(UIView *)fallbackView; - -/*! - @abstract Enters text into a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, a tap event is simulated in the center of the view or element, then text is entered into the view by simulating taps on the appropriate keyboard keys. - @param text The text to enter. - @param label The accessibility label of the element to type into. - */ -- (void)enterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label; - -/*! - @abstract Enters text into a particular view in the view hierarchy. - @discussion The view or accessibility element with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present and tappable, a tap event is simulated in the center of the view or element, then text is entered into the view by simulating taps on the appropriate keyboard keys. - @param text The text to enter. - @param label The accessibility label of the element to type into. - @param traits The accessibility traits of the element to type into. Elements that do not include at least these traits are ignored. - @param expectedResult What the text value should be after entry, including any formatting done by the field. If this is nil, the "text" parameter will be used. - */ -- (void)enterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits expectedResult:(NSString *)expectedResult; - -- (void)clearTextFromFirstResponder; -- (void)clearTextFromViewWithAccessibilityLabel:(NSString *)label; -- (void)clearTextFromViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; -- (void)clearTextFromElement:(UIAccessibilityElement*)element inView:(UIView*)view; - -- (void)clearTextFromAndThenEnterTextIntoCurrentFirstResponder:(NSString *)text; -- (void)clearTextFromAndThenEnterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label; -- (void)clearTextFromAndThenEnterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits expectedResult:(NSString *)expectedResult; - -- (void)expectView:(UIView *)view toContainText:(NSString *)expectedResult; - -/*! - @abstract Selects an item from a currently visible picker view. - @discussion With a picker view already visible, this step will find an item with the given title, select that item, and tap the Done button. - @param title The title of the row to select. - */ -- (void)selectPickerViewRowWithTitle:(NSString *)title; - -/*! - @abstract Selects an item from a currently visible picker view in specified component. - @discussion With a picker view already visible, this step will find an item with the given title in given component, select that item, and tap the Done button. - @param title The title of the row to select. - @param component The component tester inteds to select the title in. - */ -- (void)selectPickerViewRowWithTitle:(NSString *)title inComponent:(NSInteger)component; - -/*! - @abstract Selects a value from a currently visible date picker view. - @discussion With a date picker view already visible, this step will select the different rotating weel values in order of how the array parameter is passed in. After it is done it will hide the date picker. It works with all 4 UIDatePickerMode* modes. The input parameter of type NSArray has to match in what order the date picker is displaying the values/columns. So if the locale is changing the input parameter has to be adjusted. Example: Mode: UIDatePickerModeDate, Locale: en_US, Input param: NSArray *date = @[@"June", @"17", @"1965"];. Example: Mode: UIDatePickerModeDate, Locale: de_DE, Input param: NSArray *date = @[@"17.", @"Juni", @"1965". - @param datePickerColumnValues Each element in the NSArray represents a rotating wheel in the date picker control. Elements from 0 - n are listed in the order of the rotating wheels, left to right. - */ -- (void) selectDatePickerValue:(NSArray*)datePickerColumnValues; - -/*! - @abstract Toggles a UISwitch into a specified position. - @discussion The UISwitch with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present, the step will return if it's already in the desired position. If the switch is tappable but not in the desired position, a tap event is simulated in the center of the view or element, toggling the switch into the desired position. - @param switchIsOn The desired position of the UISwitch. - @param label The accessibility label of the element to switch. - */ -- (void)setOn:(BOOL)switchIsOn forSwitchWithAccessibilityLabel:(NSString *)label; - -/*! - @abstract Slides a UISlider to a specified value. - @discussion The UISlider with the given label is searched for in the view hierarchy. If the element isn't found or isn't currently tappable, then the step will attempt to wait until it is. Once the view is present, the step will attempt to drag the slider to the new value. The step will fail if it finds a view with the given accessibility label that is not a UISlider or if value is outside of the possible values. Because this step simulates drag events, the value reached may not be the exact value requested and the app may ignore the touch events if the movement is less than the drag gesture recognizer's minimum distance. - @param value The desired value of the UISlider. - @param label The accessibility label of the element to drag. - */ -- (void)setValue:(float)value forSliderWithAccessibilityLabel:(NSString *)label; -- (void)setValue:(float)value forSlider:(UISlider *)slider; - -/*! - @abstract Dismisses a popover on screen. - @discussion With a popover up, tap at the top-left corner of the screen. - */ -- (void)dismissPopover; - -/*! - @abstract Select a certain photo from the built in photo picker. - @discussion This set of steps expects that the photo picker has been initiated and that the sheet is up. From there it will tap the "Choose Photo" button and select the desired photo. - @param albumName The name of the album to select the photo from. (1-indexed) - @param row The row number in the album for the desired photo. (1-indexed) - @param column The column number in the album for the desired photo. - */ -- (void)choosePhotoInAlbum:(NSString *)albumName atRow:(NSInteger)row column:(NSInteger)column; - -/*! - @abstract Taps the row at indexPath in a table view with the given label. - @discussion This step will get the view with the specified accessibility label and tap the row at indexPath. - - For cases where you may need to work from the end of a table view rather than the beginning, negative sections count back from the end of the table view (-1 is the last section) and negative rows count back from the end of the section (-1 is the last row for that section). - - @param tableViewLabel Accessibility label of the table view. - @param indexPath Index path of the row to tap. - */ -- (void)tapRowInTableViewWithAccessibilityLabel:(NSString*)tableViewLabel atIndexPath:(NSIndexPath *)indexPath KIF_DEPRECATED("Use tapRowAtIndexPath:inTableViewWithAccessibilityIdentifier:"); - -/*! - @abstract Taps the row at indexPath in a table view with the given identifier. - @discussion This step will get the view with the specified accessibility identifier and tap the row at indexPath. - - For cases where you may need to work from the end of a table view rather than the beginning, negative sections count back from the end of the table view (-1 is the last section) and negative rows count back from the end of the section (-1 is the last row for that section). - - @param indexPath Index path of the row to tap. - @param identifier Accessibility identifier of the table view. - */ -- (void)tapRowAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0); - -/*! - @abstract Taps the item at indexPath in a collection view with the given identifier. - @discussion This step will get the view with the specified accessibility identifier and tap the item at indexPath. - - For cases where you may need to work from the end of a collection view rather than the beginning, negative sections count back from the end of the collection view (-1 is the last section) and negative items count back from the end of the section (-1 is the last item for that section). - - @param indexPath Index path of the item to tap. - @param identifier Accessibility identifier of the collection view. - */ -- (void)tapItemAtIndexPath:(NSIndexPath *)indexPath inCollectionViewWithAccessibilityIdentifier:(NSString *)identifier; - -#if TARGET_IPHONE_SIMULATOR -/*! - @abstract If present, dismisses a system alert with the last button, usually 'Allow'. - @discussion Use this to dissmiss a location services authorization dialog or a photos access dialog by tapping the 'Allow' button. No action is taken if no alert is present. - */ -- (void)acknowledgeSystemAlert; -#endif - -/*! - @abstract Swipes a particular view in the view hierarchy in the given direction. - @discussion The view will get the view with the specified accessibility label and swipe the screen in the given direction from the view's center. - @param label The accessibility label of the view to swipe. - @param direction The direction in which to swipe. - */ -- (void)swipeViewWithAccessibilityLabel:(NSString *)label inDirection:(KIFSwipeDirection)direction; - -/*! - @abstract Swipes a particular view in the view hierarchy in the given direction. - @discussion The view will get the view with the specified accessibility label and swipe the screen in the given direction from the view's center. - @param label The accessibility label of the view to swipe. - @param value The accessibility value of the view to swipe. - @param direction The direction in which to swipe. - */ -- (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value inDirection:(KIFSwipeDirection)direction; - -/*! - @abstract Swipes a particular view in the view hierarchy in the given direction. - @discussion This step will get the view with the specified accessibility label and swipe the screen in the given direction from the view's center. - @param label The accessibility label of the view to swipe. - @param value The accessibility value of the view to swipe. - @param traits The accessibility traits of the view to swipe. Elements that do not include at least these traits are ignored. - @param direction The direction in which to swipe. - */ -- (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits 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. - @param label The accessibility label of the view to scroll. - @param horizontalFraction The horizontal displacement of the scroll action, as a fraction of the width of the view. - @param verticalFraction The vertical displacement of the scroll action, as a fraction of the height of the view. - */ -- (void)scrollViewWithAccessibilityLabel:(NSString *)label byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction KIF_DEPRECATED("Use scrollViewWithAccessibilityIdentifier:byFractionOfSizeHorizontal:vertical:"); - -/*! - @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 identifier and scroll it by the indicated fraction of its size, with the scroll centered on the center of the view. - @param identifier The accessibility identifier of the view to scroll. - @param horizontalFraction The horizontal displacement of the scroll action, as a fraction of the width of the view. - @param verticalFraction The vertical displacement of the scroll action, as a fraction of the height of the view. - */ -- (void)scrollViewWithAccessibilityIdentifier:(NSString *)identifier byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction NS_AVAILABLE_IOS(5_0); - -/*! - @abstract Waits until a view or accessibility element is the first responder. - @discussion The first responder is found by searching the view hierarchy of the application's - main window and its accessibility label is compared to the given value. If they match, the - step returns success else it will attempt to wait until they do. - @param label The accessibility label of the element to wait for. - */ -- (void)waitForFirstResponderWithAccessibilityLabel:(NSString *)label; - -/*! - @abstract Waits until a view or accessibility element is the first responder. - @discussion The first responder is found by searching the view hierarchy of the application's - main window and its accessibility label is compared to the given value. If they match, the - step returns success else it will attempt to wait until they do. - @param label The accessibility label of the element to wait for. - @param traits The accessibility traits of the element to wait for. Elements that do not include at least these traits are ignored. - */ -- (void)waitForFirstResponderWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits; - -- (void)tapStatusBar; - -/*! - @abstract Waits for the cell at indexPath in a table view with the given identifier. - @discussion This step will get the view with the specified accessibility identifier and then get the cell at the indexPath. - - For cases where you may need to work from the end of a table view rather than the beginning, negative sections count back from the end of the table view (-1 is the last section) and negative rows count back from the end of the section (-1 is the last row for that section). - - @param indexPath Index path of the cell. - @param identifier Accessibility identifier of the table view. - @result Table view cell at index path - */ -- (UITableViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier; - -/*! - @abstract Waits for the cell at indexPath in a collection view with the given identifier. - @discussion This step will get the view with the specified accessibility identifier and then get the cell at indexPath. - - For cases where you may need to work from the end of a collection view rather than the beginning, negative sections count back from the end of the collection view (-1 is the last section) and negative items count back from the end of the section (-1 is the last item for that section). - - @param indexPath Index path of the item to tap. - @param identifier Accessibility identifier of the collection view. - @result Collection view cell at index path - */ -- (UICollectionViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inCollectionViewWithAccessibilityIdentifier:(NSString *)identifier; - -/*! - @abstract Moves the row at sourceIndexPath to destinationIndexPath in a table view with the given identifier. - @discussion This step will get the view with the specified accessibility identifier and move the row at sourceIndexPath to destinationIndexPath. - - For cases where you may need to work from the end of a table view rather than the beginning, negative sections count back from the end of the table view (-1 is the last section) and negative rows count back from the end of the section (-1 is the last row for that section). - - @param sourceIndexPath Index path of the row to move. - @param destinationIndexPath Desired final index path of the row after moving. - @param identifier Accessibility identifier of the table view. - */ -- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier; -@end diff --git a/Example/Pods/KIF/Classes/KIFUITestActor.m b/Example/Pods/KIF/Classes/KIFUITestActor.m deleted file mode 100644 index 6daf048..0000000 --- a/Example/Pods/KIF/Classes/KIFUITestActor.m +++ /dev/null @@ -1,1015 +0,0 @@ -// -// KIFTester+UI.m -// KIF -// -// Created by Brian Nickel on 12/14/12. -// Licensed to Square, Inc. under one or more contributor license agreements. -// See the LICENSE file distributed with this work for the terms under -// which Square, Inc. licenses this file to you. - -#import "KIFUITestActor.h" -#import "UIApplication-KIFAdditions.h" -#import "UIWindow-KIFAdditions.h" -#import "UIAccessibilityElement-KIFAdditions.h" -#import "UIView-KIFAdditions.h" -#import "UITableView-KIFAdditions.h" -#import "CGGeometry-KIFAdditions.h" -#import "NSError-KIFAdditions.h" -#import "KIFTypist.h" -#import "UIAutomationHelper.h" - -@implementation KIFUITestActor - -+ (void)initialize -{ - if (self == [KIFUITestActor class]) { - [KIFTypist registerForNotifications]; - } -} - -- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label -{ - return [self waitForViewWithAccessibilityLabel:label value:nil traits:UIAccessibilityTraitNone tappable:NO]; -} - -- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits -{ - return [self waitForViewWithAccessibilityLabel:label value:nil traits:traits tappable:NO]; -} - -- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits -{ - return [self waitForViewWithAccessibilityLabel:label value:value traits:traits tappable:NO]; -} - -- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label -{ - return [self waitForViewWithAccessibilityLabel:label value:nil traits:UIAccessibilityTraitNone tappable:YES]; -} - -- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits -{ - return [self waitForViewWithAccessibilityLabel:label value:nil traits:traits tappable:YES]; -} - -- (UIView *)waitForTappableViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits -{ - return [self waitForViewWithAccessibilityLabel:label value:value traits:traits tappable:YES]; -} - -- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable -{ - UIView *view = nil; - @autoreleasepool { - [self waitForAccessibilityElement:NULL view:&view withLabel:label value:value traits:traits tappable:mustBeTappable]; - } - - return view; -} - -- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits tappable:(BOOL)mustBeTappable -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - return [UIAccessibilityElement accessibilityElement:element view:view withLabel:label value:value traits:traits tappable:mustBeTappable error:error] ? KIFTestStepResultSuccess : KIFTestStepResultWait; - }]; -} - -- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withIdentifier:(NSString *)identifier tappable:(BOOL)mustBeTappable -{ - if (![UIAccessibilityElement instancesRespondToSelector:@selector(accessibilityIdentifier)]) { - [self failWithError:[NSError KIFErrorWithFormat:@"Running test on platform that does not support accessibilityIdentifier"] stopTest:YES]; - } - - [self waitForAccessibilityElement:element view:view withElementMatchingPredicate:[NSPredicate predicateWithFormat:@"accessibilityIdentifier = %@", identifier] tappable:mustBeTappable]; -} - -- (void)waitForAccessibilityElement:(UIAccessibilityElement **)element view:(out UIView **)view withElementMatchingPredicate:(NSPredicate *)predicate tappable:(BOOL)mustBeTappable -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - return [UIAccessibilityElement accessibilityElement:element view:view withElementMatchingPredicate:predicate tappable:mustBeTappable error:error] ? KIFTestStepResultSuccess : KIFTestStepResultWait; - }]; -} - -- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label -{ - [self waitForAbsenceOfViewWithAccessibilityLabel:label traits:UIAccessibilityTraitNone]; -} - -- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits -{ - [self waitForAbsenceOfViewWithAccessibilityLabel:label value:nil traits:traits]; -} - -- (void)waitForAbsenceOfViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - // If the app is ignoring interaction events, then wait before doing our analysis - KIFTestWaitCondition(![[UIApplication sharedApplication] isIgnoringInteractionEvents], error, @"Application is ignoring interaction events."); - - // If the element can't be found, then we're done - UIAccessibilityElement *element = [[UIApplication sharedApplication] accessibilityElementWithLabel:label accessibilityValue:value traits:traits]; - if (!element) { - return KIFTestStepResultSuccess; - } - - UIView *view = [UIAccessibilityElement viewContainingAccessibilityElement:element]; - - // If we found an element, but it's not associated with a view, then something's wrong. Wait it out and try again. - KIFTestWaitCondition(view, error, @"Cannot find view containing accessibility element with the label \"%@\"", label); - - // Hidden views count as absent - KIFTestWaitCondition([view isHidden] || [view superview] == nil, error, @"Accessibility element with label \"%@\" is visible and not hidden.", label); - - return KIFTestStepResultSuccess; - }]; -} - -- (void)waitForAnimationsToFinish { - [self waitForAnimationsToFinishWithTimeout:self.animationWaitingTimeout]; -} - -- (void)waitForAnimationsToFinishWithTimeout:(NSTimeInterval)timeout { - static const CGFloat kStabilizationWait = 0.5f; - - NSTimeInterval maximumWaitingTimeInterval = timeout; - if (maximumWaitingTimeInterval <= kStabilizationWait) { - if(maximumWaitingTimeInterval >= 0) { - [self waitForTimeInterval:maximumWaitingTimeInterval]; - } - - return; - } - - // Wait for the view to stabilize and give them a chance to start animations before we wait for them. - [self waitForTimeInterval:kStabilizationWait]; - maximumWaitingTimeInterval -= kStabilizationWait; - - NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate]; - [self runBlock:^KIFTestStepResult(NSError **error) { - __block BOOL runningAnimationFound = false; - for (UIWindow *window in [UIApplication sharedApplication].windowsWithKeyWindow) { - [window performBlockOnDescendentViews:^(UIView *view, BOOL *stop) { - BOOL isViewVisible = [view isVisibleInViewHierarchy]; // do not wait for animatinos of views that aren't visible - BOOL hasAnimation = view.layer.animationKeys.count != 0 && ![view.layer.animationKeys isEqualToArray:@[@"_UIParallaxMotionEffect"]]; // explicitly exclude _UIParallaxMotionEffect as it is used in alertviews, and we don't want every alertview to be paused - BOOL hasUnfinishedSystemAnimation = [NSStringFromClass(view.class) isEqualToString:@"_UIParallaxDimmingView"]; // indicates that the view-hierarchy is in an in-between-state of an animation - if (isViewVisible && (hasAnimation || hasUnfinishedSystemAnimation)) { - runningAnimationFound = YES; - if (stop != NULL) { - *stop = YES; - } - return; - } - }]; - } - - return runningAnimationFound && ([NSDate timeIntervalSinceReferenceDate] - startTime) < maximumWaitingTimeInterval ? KIFTestStepResultWait : KIFTestStepResultSuccess; - } timeout:maximumWaitingTimeInterval + 1]; -} - -- (void)tapViewWithAccessibilityLabel:(NSString *)label -{ - [self tapViewWithAccessibilityLabel:label value:nil traits:UIAccessibilityTraitNone]; -} - -- (void)tapViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits -{ - [self tapViewWithAccessibilityLabel:label value:nil traits:traits]; -} - -- (void)tapViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits -{ - @autoreleasepool { - UIView *view = nil; - UIAccessibilityElement *element = nil; - [self waitForAccessibilityElement:&element view:&view withLabel:label value:value traits:traits tappable:YES]; - [self tapAccessibilityElement:element inView:view]; - } -} - -- (void)tapAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)view -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - - KIFTestWaitCondition(view.isUserInteractionActuallyEnabled, error, @"View is not enabled for interaction"); - - // If the accessibilityFrame is not set, fallback to the view frame. - CGRect elementFrame; - if (CGRectEqualToRect(CGRectZero, element.accessibilityFrame)) { - elementFrame.origin = CGPointZero; - elementFrame.size = view.frame.size; - } else { - elementFrame = [view.windowOrIdentityWindow convertRect:element.accessibilityFrame toView:view]; - } - CGPoint tappablePointInElement = [view tappablePointInRect:elementFrame]; - - // This is mostly redundant of the test in _accessibilityElementWithLabel: - KIFTestWaitCondition(!isnan(tappablePointInElement.x), error, @"View is not tappable"); - [view tapAtPoint:tappablePointInElement]; - - KIFTestCondition(![view canBecomeFirstResponder] || [view isDescendantOfFirstResponder], error, @"Failed to make the view into the first responder"); - - return KIFTestStepResultSuccess; - }]; - - [self waitForAnimationsToFinish]; -} - -- (void)tapScreenAtPoint:(CGPoint)screenPoint -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - - // Try all the windows until we get one back that actually has something in it at the given point - UIView *view = nil; - for (UIWindow *window in [[[UIApplication sharedApplication] windowsWithKeyWindow] reverseObjectEnumerator]) { - CGPoint windowPoint = [window convertPoint:screenPoint fromView:nil]; - view = [window hitTest:windowPoint withEvent:nil]; - - // If we hit the window itself, then skip it. - if (view != window && view != nil) { - break; - } - } - - KIFTestWaitCondition(view, error, @"No view was found at the point %@", NSStringFromCGPoint(screenPoint)); - - // This is mostly redundant of the test in _accessibilityElementWithLabel: - CGPoint viewPoint = [view convertPoint:screenPoint fromView:nil]; - [view tapAtPoint:viewPoint]; - - return KIFTestStepResultSuccess; - }]; -} - -- (void)longPressViewWithAccessibilityLabel:(NSString *)label duration:(NSTimeInterval)duration; -{ - [self longPressViewWithAccessibilityLabel:label value:nil traits:UIAccessibilityTraitNone duration:duration]; -} - -- (void)longPressViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value duration:(NSTimeInterval)duration; -{ - [self longPressViewWithAccessibilityLabel:label value:value traits:UIAccessibilityTraitNone duration:duration]; -} - -- (void)longPressViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value traits:(UIAccessibilityTraits)traits duration:(NSTimeInterval)duration; -{ - @autoreleasepool { - UIView *view = nil; - UIAccessibilityElement *element = nil; - [self waitForAccessibilityElement:&element view:&view withLabel:label value:value traits:traits tappable:YES]; - [self longPressAccessibilityElement:element inView:view duration:duration]; - } -} - -- (void)longPressAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)view duration:(NSTimeInterval)duration; -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - - KIFTestWaitCondition(view.isUserInteractionActuallyEnabled, error, @"View is not enabled for interaction"); - - CGRect elementFrame = [view.windowOrIdentityWindow convertRect:element.accessibilityFrame toView:view]; - CGPoint tappablePointInElement = [view tappablePointInRect:elementFrame]; - - // This is mostly redundant of the test in _accessibilityElementWithLabel: - KIFTestWaitCondition(!isnan(tappablePointInElement.x), error, @"View is not tappable"); - [view longPressAtPoint:tappablePointInElement duration:duration]; - - KIFTestCondition(![view canBecomeFirstResponder] || [view isDescendantOfFirstResponder], error, @"Failed to make the view into the first responder"); - - return KIFTestStepResultSuccess; - }]; - - // Wait for view to settle. - [self waitForTimeInterval:0.5]; -} - -- (void)waitForKeyboard -{ - [self waitForSoftwareKeyboard]; -} - -- (void)waitForSoftwareKeyboard -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - KIFTestWaitCondition(![KIFTypist keyboardHidden], error, @"Keyboard is not visible"); - - return KIFTestStepResultSuccess; - }]; -} - -- (void)waitForAbsenceOfKeyboard -{ - [self waitForAbsenceOfSoftwareKeyboard]; -} - -- (void)waitForAbsenceOfSoftwareKeyboard -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - KIFTestWaitCondition([KIFTypist keyboardHidden], error, @"Keyboard is visible"); - - return KIFTestStepResultSuccess; - }]; -} - -- (void)waitForKeyInputReady -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - KIFTestWaitCondition(![KIFTypist keyboardHidden] || [KIFTypist hasHardwareKeyboard], error, @"No software or hardware keyboard."); - KIFTestWaitCondition([KIFTypist hasKeyInputResponder], error, @"No responder for key inputs."); - - return KIFTestStepResultSuccess; - }]; -} - -- (void)enterTextIntoCurrentFirstResponder:(NSString *)text; -{ - [self waitForKeyInputReady]; - [self enterTextIntoCurrentFirstResponder:text fallbackView:nil]; -} - -- (void)enterTextIntoCurrentFirstResponder:(NSString *)text fallbackView:(UIView *)fallbackView; -{ - for (NSUInteger characterIndex = 0; characterIndex < [text length]; characterIndex++) { - NSString *characterString = [text substringWithRange:NSMakeRange(characterIndex, 1)]; - - if (![KIFTypist enterCharacter:characterString]) { - // Attempt to cheat if we couldn't find the character - if (!fallbackView) { - UIResponder *firstResponder = [[[UIApplication sharedApplication] keyWindow] firstResponder]; - - if ([firstResponder isKindOfClass:[UIView class]]) { - fallbackView = (UIView *)firstResponder; - } - } - - if ([fallbackView isKindOfClass:[UITextField class]] || [fallbackView isKindOfClass:[UITextView class]] || [fallbackView isKindOfClass:[UISearchBar class]]) { - NSLog(@"KIF: Unable to find keyboard key for %@. Inserting manually.", characterString); - [(UITextField *)fallbackView setText:[[(UITextField *)fallbackView text] stringByAppendingString:characterString]]; - } else { - [self failWithError:[NSError KIFErrorWithFormat:@"Failed to find key for character \"%@\"", characterString] stopTest:YES]; - } - } - } -} - -- (void)enterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label -{ - return [self enterText:text intoViewWithAccessibilityLabel:label traits:UIAccessibilityTraitNone expectedResult:nil]; -} - -- (void)enterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits expectedResult:(NSString *)expectedResult -{ - UIView *view = nil; - UIAccessibilityElement *element = nil; - - [self waitForAccessibilityElement:&element view:&view withLabel:label value:nil traits:traits tappable:YES]; - [self tapAccessibilityElement:element inView:view]; - [self waitForTimeInterval:0.25]; - [self enterTextIntoCurrentFirstResponder:text fallbackView:view]; - [self expectView:view toContainText:expectedResult ?: text]; -} - -- (void)expectView:(UIView *)view toContainText:(NSString *)expectedResult -{ - // We will perform some additional validation if the view is UITextField or UITextView. - if (![view respondsToSelector:@selector(text)]) { - return; - } - - UITextView *textView = (UITextView *)view; - - // Some slower machines take longer for typing to catch up, so wait for a bit before failing - [self runBlock:^KIFTestStepResult(NSError **error) { - // We trim \n and \r because they trigger the return key, so they won't show up in the final product on single-line inputs. - // Also trim \b (backspace) characters to allow for deletion. - NSMutableCharacterSet *charExclusionSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"\b"]; - [charExclusionSet formUnionWithCharacterSet:[NSCharacterSet newlineCharacterSet]]; - NSString *expected = [expectedResult stringByTrimmingCharactersInSet:charExclusionSet]; - NSString *actual = [textView.text stringByTrimmingCharactersInSet:charExclusionSet]; - - KIFTestWaitCondition([actual isEqualToString:expected], error, @"Failed to get text \"%@\" in field; instead, it was \"%@\"", expected, actual); - - return KIFTestStepResultSuccess; - } timeout:1.0]; -} - -- (void)clearTextFromFirstResponder -{ - UIView *firstResponder = (id)[[[UIApplication sharedApplication] keyWindow] firstResponder]; - if ([firstResponder isKindOfClass:[UIView class]]) { - [self clearTextFromElement:(UIAccessibilityElement *)firstResponder inView:firstResponder]; - } -} - -- (void)clearTextFromViewWithAccessibilityLabel:(NSString *)label -{ - [self clearTextFromViewWithAccessibilityLabel:label traits:UIAccessibilityTraitNone]; -} - -- (void)clearTextFromViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits -{ - UIView *view = nil; - UIAccessibilityElement *element = nil; - - [self waitForAccessibilityElement:&element view:&view withLabel:label value:nil traits:traits tappable:YES]; - [self clearTextFromElement:element inView:view]; -} - -- (void)clearTextFromElement:(UIAccessibilityElement*)element inView:(UIView*)view -{ - [self tapAccessibilityElement:element inView:view]; - - // Per issue #294, the tap occurs in the center of the text view. If the text is too long, this means not all text gets cleared. To address this for most cases, we can check if the selected view conforms to UITextInput and select the whole text range. - if ([view conformsToProtocol:@protocol(UITextInput)]) { - id textInput = (id )view; - [textInput setSelectedTextRange:[textInput textRangeFromPosition:textInput.beginningOfDocument toPosition:textInput.endOfDocument]]; - - [self waitForTimeInterval:0.1]; - [self enterTextIntoCurrentFirstResponder:@"\b" fallbackView:view]; - } else { - NSUInteger numberOfCharacters = [view respondsToSelector:@selector(text)] ? [(UITextField *)view text].length : element.accessibilityValue.length; - NSMutableString *text = [NSMutableString string]; - for (NSInteger i = 0; i < numberOfCharacters; i ++) { - [text appendString:@"\b"]; - } - [self enterTextIntoCurrentFirstResponder:text fallbackView:view]; - } - - [self expectView:view toContainText:@""]; -} - -- (void)clearTextFromAndThenEnterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label -{ - [self clearTextFromViewWithAccessibilityLabel:label]; - [self enterText:text intoViewWithAccessibilityLabel:label]; -} - -- (void)clearTextFromAndThenEnterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits expectedResult:(NSString *)expectedResult -{ - [self clearTextFromViewWithAccessibilityLabel:label traits:traits]; - [self enterText:text intoViewWithAccessibilityLabel:label traits:traits expectedResult:expectedResult]; -} - -- (void)clearTextFromAndThenEnterTextIntoCurrentFirstResponder:(NSString *)text -{ - [self clearTextFromFirstResponder]; - [self enterTextIntoCurrentFirstResponder:text]; -} - -- (void) selectDatePickerValue:(NSArray*)datePickerColumnValues { - [self selectPickerValue:datePickerColumnValues pickerType:KIFUIDatePicker]; -} - -- (void)selectPickerViewRowWithTitle:(NSString *)title -{ - NSArray *dataToSelect = @[title]; - [self selectPickerValue:dataToSelect pickerType:KIFUIPickerView]; -} - -- (void)selectPickerViewRowWithTitle:(NSString *)title inComponent:(NSInteger)component -{ - NSMutableArray *dataToSelect = [[NSMutableArray alloc] init]; - - // Assume it is datePicker and then test our hypothesis later! - UIPickerView *pickerView = [[[[UIApplication sharedApplication] datePickerWindow] subviewsWithClassNameOrSuperClassNamePrefix:@"UIPickerView"] lastObject]; - - // Check which type of UIPickerVIew is visible on current window. - KIFPickerType pickerType = 0; - if ([pickerView respondsToSelector:@selector(setDate:animated:)]) { - pickerType = KIFUIDatePicker; - } - else { - pickerType = KIFUIPickerView; - pickerView = [[[[UIApplication sharedApplication] pickerViewWindow] subviewsWithClassNameOrSuperClassNamePrefix:@"UIPickerView"] lastObject]; - } - - // Add title at component index and add empty strings for other. - // This support legacy function re-use. - for (int i = 0; i < pickerView.numberOfComponents; i++) { - if (component == i) { - [dataToSelect addObject:title]; - } - else { - NSInteger currentIndex = [pickerView selectedRowInComponent:i]; - NSString *rowTitle = nil; - if ([pickerView.delegate respondsToSelector:@selector(pickerView:titleForRow:forComponent:)]) { - rowTitle = [pickerView.delegate pickerView:pickerView titleForRow:currentIndex forComponent: i]; - } else if ([pickerView.delegate respondsToSelector:@selector(pickerView:viewForRow:forComponent:reusingView:)]) { - // This delegate inserts views directly, so try to figure out what the title is by looking for a label - UIView *rowView = [pickerView.delegate pickerView:pickerView viewForRow:currentIndex forComponent: i reusingView:nil]; - NSArray *labels = [rowView subviewsWithClassNameOrSuperClassNamePrefix:@"UILabel"]; - UILabel *label = (labels.count > 0 ? labels[0] : nil); - rowTitle = label.text; - } - - 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]; - } - } - } - - [self selectPickerValue:dataToSelect pickerType:pickerType]; -} - -- (void) selectPickerValue:(NSArray*)pickerColumnValues pickerType:(KIFPickerType)pickerType { - - [self runBlock:^KIFTestStepResult(NSError **error) { - NSInteger columnCount = [pickerColumnValues count]; - NSMutableArray* found_values = [NSMutableArray arrayWithCapacity:columnCount]; - for (NSInteger componentIndex = 0; componentIndex < columnCount; componentIndex++) { - [found_values addObject:[NSNumber numberWithBool:NO]]; - } - // Find the picker view - UIPickerView *pickerView = nil; - switch (pickerType) - { - case KIFUIDatePicker: - pickerView = [[[[UIApplication sharedApplication] datePickerWindow] subviewsWithClassNameOrSuperClassNamePrefix:@"UIPickerView"] lastObject]; - KIFTestCondition(pickerView, error, @"No picker view is present"); - break; - case KIFUIPickerView: - pickerView = [[[[UIApplication sharedApplication] pickerViewWindow] subviewsWithClassNameOrSuperClassNamePrefix:@"UIPickerView"] lastObject]; - } - - NSInteger componentCount = [pickerView.dataSource numberOfComponentsInPickerView:pickerView]; - KIFTestCondition(componentCount == columnCount, error, @"The UIDatePicker does not have the expected column count."); - - for (NSInteger componentIndex = 0; componentIndex < componentCount; componentIndex++) { - NSInteger rowCount = [pickerView.dataSource pickerView:pickerView numberOfRowsInComponent:componentIndex]; - for (NSInteger rowIndex = 0; rowIndex < rowCount; rowIndex++) { - NSString *rowTitle = nil; - if ([pickerView.delegate respondsToSelector:@selector(pickerView:titleForRow:forComponent:)]) { - rowTitle = [pickerView.delegate pickerView:pickerView titleForRow:rowIndex forComponent:componentIndex]; - } else if ([pickerView.delegate respondsToSelector:@selector(pickerView:viewForRow:forComponent:reusingView:)]) { - - UIView *rowView = [pickerView.delegate pickerView:pickerView viewForRow:rowIndex forComponent:componentIndex reusingView:nil]; - UILabel *label; - if ([rowView isKindOfClass:[UILabel class]] ) { - label = (id)rowView; - } else { - // This delegate inserts views directly, so try to figure out what the title is by looking for a label - NSArray *labels = [rowView subviewsWithClassNameOrSuperClassNamePrefix:@"UILabel"]; - label = (labels.count > 0 ? labels[0] : nil); - } - rowTitle = label.text; - } - - if (rowIndex==[pickerView selectedRowInComponent:componentIndex] && [rowTitle isEqual:pickerColumnValues[componentIndex]]){ - [found_values replaceObjectAtIndex:componentIndex withObject:@(YES)]; - break; - } - else if ([rowTitle isEqual:pickerColumnValues[componentIndex]]) { - [pickerView selectRow:rowIndex inComponent:componentIndex animated:false]; - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1, false); - - // Tap in the middle of the picker view to select the item - [pickerView tap]; - [self waitForTimeInterval:0.5]; - - // The combination of selectRow:inComponent:animated: and tap does not consistently result in - // pickerView:didSelectRow:inComponent: being called on the delegate. We need to do it explicitly. - if ([pickerView.delegate respondsToSelector:@selector(pickerView:didSelectRow:inComponent:)]) { - [pickerView.delegate pickerView:pickerView didSelectRow:rowIndex inComponent:componentIndex]; - } - - [found_values replaceObjectAtIndex:componentIndex withObject:@(YES)]; - break; - } - } - if (found_values[componentIndex] == [NSNumber numberWithBool:YES]) { - continue; - } - } - - // Support multiple column by adding flag to check if the value found in - // at-least one column - BOOL _foundInOneColumn = NO; - for (NSInteger componentIndex = 0; componentIndex < columnCount; componentIndex++) { - if (found_values[componentIndex] != [NSNumber numberWithBool:NO]) { - _foundInOneColumn = YES; - } - } - - if (!_foundInOneColumn) { - KIFTestCondition(NO, error, @"Failed to select from Picker."); - return KIFTestStepResultFailure; - } - - return KIFTestStepResultSuccess; - }]; - -} - -- (void)setOn:(BOOL)switchIsOn forSwitchWithAccessibilityLabel:(NSString *)label -{ - UIView *view = nil; - UIAccessibilityElement *element = nil; - - [self waitForAccessibilityElement:&element view:&view withLabel:label value:nil traits:UIAccessibilityTraitButton tappable:YES]; - - if (![view isKindOfClass:[UISwitch class]]) { - [self failWithError:[NSError KIFErrorWithFormat:@"View with accessibility label \"%@\" is a %@, not a UISwitch", label, NSStringFromClass([view class])] stopTest:YES]; - } - - UISwitch *switchView = (UISwitch *)view; - - // No need to switch it if it's already in the correct position - if (switchView.isOn == switchIsOn) { - return; - } - - [self tapAccessibilityElement:element inView:view]; - - // If we succeeded, stop the test. - if (switchView.isOn == switchIsOn) { - return; - } - - NSLog(@"Faking turning switch %@ with accessibility label %@", switchIsOn ? @"ON" : @"OFF", label); - [switchView setOn:switchIsOn animated:YES]; - [switchView sendActionsForControlEvents:UIControlEventValueChanged]; - [self waitForTimeInterval:0.5]; - - // We gave it our best shot. Fail the test. - if (switchView.isOn != switchIsOn) { - [self failWithError:[NSError KIFErrorWithFormat:@"Failed to toggle switch to \"%@\"; instead, it was \"%@\"", switchIsOn ? @"ON" : @"OFF", switchView.on ? @"ON" : @"OFF"] stopTest:YES]; - } -} - - - -- (void)setValue:(float)value forSliderWithAccessibilityLabel:(NSString *)label -{ - UISlider *slider = nil; - UIAccessibilityElement *element = nil; - [self waitForAccessibilityElement:&element view:&slider withLabel:label value:nil traits:UIAccessibilityTraitNone tappable:YES]; - - if (![slider isKindOfClass:[UISlider class]]) { - [self failWithError:[NSError KIFErrorWithFormat:@"View with accessibility label \"%@\" is a %@, not a UISlider", label, NSStringFromClass([slider class])] stopTest:YES]; - } - [self setValue:value forSlider:slider]; -} - -- (void)setValue:(float)value forSlider:(UISlider *)slider -{ - if (value < slider.minimumValue) { - [self failWithError:[NSError KIFErrorWithFormat:@"Cannot slide past minimum value of %f", slider.minimumValue] stopTest:YES]; - } - - if (value > slider.maximumValue) { - [self failWithError:[NSError KIFErrorWithFormat:@"Cannot slide past maximum value of %f", slider.maximumValue] stopTest:YES]; - } - - CGRect trackRect = [slider trackRectForBounds:slider.bounds]; - CGPoint currentPosition = CGPointCenteredInRect([slider thumbRectForBounds:slider.bounds trackRect:trackRect value:slider.value]); - CGPoint finalPosition = CGPointCenteredInRect([slider thumbRectForBounds:slider.bounds trackRect:trackRect value:value]); - - if (value == slider.minimumValue) { - finalPosition.x = 0; - } else if (value == slider.maximumValue) { - finalPosition.x = slider.bounds.size.width; - } - - [slider dragFromPoint:currentPosition toPoint:finalPosition steps:10]; -} - -- (void)dismissPopover -{ - const NSTimeInterval tapDelay = 0.05; - UIWindow *window = [[UIApplication sharedApplication] dimmingViewWindow]; - if (!window) { - [self failWithError:[NSError KIFErrorWithFormat:@"Failed to find any dimming views in the application"] stopTest:YES]; - } - UIView *dimmingView = [[window subviewsWithClassNamePrefix:@"UIDimmingView"] lastObject]; - [dimmingView tapAtPoint:CGPointMake(50.0f, 50.0f)]; - CFRunLoopRunInMode(kCFRunLoopDefaultMode, tapDelay, false); -} - -- (void)choosePhotoInAlbum:(NSString *)albumName atRow:(NSInteger)row column:(NSInteger)column -{ - // This is basically the same as the step to tap with an accessibility label except that the accessibility labels for the albums have the number of photos appended to the end, such as "My Photos (3)." This means that we have to do a prefix match rather than an exact match. - [self runBlock:^KIFTestStepResult(NSError **error) { - - NSString *labelPrefix = [NSString stringWithFormat:@"%@", albumName]; - UIAccessibilityElement *element = [[UIApplication sharedApplication] accessibilityElementMatchingBlock:^(UIAccessibilityElement *element) { - return [element.accessibilityLabel hasPrefix:labelPrefix]; - }]; - - KIFTestWaitCondition(element, error, @"Failed to find photo album with name %@", albumName); - - UIView *view = [UIAccessibilityElement viewContainingAccessibilityElement:element]; - KIFTestWaitCondition(view, error, @"Failed to find view for photo album with name %@", albumName); - - if (![view isUserInteractionActuallyEnabled]) { - if (error) { - *error = [NSError KIFErrorWithFormat:@"Album picker is not enabled for interaction"]; - } - return KIFTestStepResultWait; - } - - CGRect elementFrame = [view.windowOrIdentityWindow convertRect:element.accessibilityFrame toView:view]; - CGPoint tappablePointInElement = [view tappablePointInRect:elementFrame]; - - [view tapAtPoint:tappablePointInElement]; - - return KIFTestStepResultSuccess; - }]; - - // Wait for media picker view controller to be pushed. - [self waitForTimeInterval:1]; - - // Tap the desired photo in the grid - // TODO: This currently only works for the first page of photos. It should scroll appropriately at some point. - const CGFloat headerHeight = 64.0; - const CGSize thumbnailSize = CGSizeMake(75.0, 75.0); - const CGFloat thumbnailMargin = 5.0; - CGPoint thumbnailCenter; - thumbnailCenter.x = thumbnailMargin + (MAX(0, column - 1) * (thumbnailSize.width + thumbnailMargin)) + thumbnailSize.width / 2.0; - thumbnailCenter.y = headerHeight + thumbnailMargin + (MAX(0, row - 1) * (thumbnailSize.height + thumbnailMargin)) + thumbnailSize.height / 2.0; - [self tapScreenAtPoint:thumbnailCenter]; -} - -- (void)tapRowAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier -{ - UITableView *tableView; - [self waitForAccessibilityElement:NULL view:&tableView withIdentifier:identifier tappable:NO]; - [self tapRowAtIndexPath:indexPath inTableView:tableView]; -} - -- (void)tapRowInTableViewWithAccessibilityLabel:(NSString*)tableViewLabel atIndexPath:(NSIndexPath *)indexPath -{ - UITableView *tableView = (UITableView *)[self waitForViewWithAccessibilityLabel:tableViewLabel]; - [self tapRowAtIndexPath:indexPath inTableView:tableView]; -} - -- (void)tapRowAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView -{ - UITableViewCell *cell = [self waitForCellAtIndexPath:indexPath inTableView:tableView]; - CGRect cellFrame = [cell.contentView convertRect:cell.contentView.frame toView:tableView]; - [tableView tapAtPoint:CGPointCenteredInRect(cellFrame)]; - - [self waitForAnimationsToFinish]; -} - -- (void)tapItemAtIndexPath:(NSIndexPath *)indexPath inCollectionViewWithAccessibilityIdentifier:(NSString *)identifier -{ - UICollectionView *collectionView; - [self waitForAccessibilityElement:NULL view:&collectionView withIdentifier:identifier tappable:NO]; - [self tapItemAtIndexPath:indexPath inCollectionView:collectionView]; -} - -- (void)acknowledgeSystemAlert { - [UIAutomationHelper acknowledgeSystemAlert]; -} - -- (void)tapItemAtIndexPath:(NSIndexPath *)indexPath inCollectionView:(UICollectionView *)collectionView -{ - UICollectionViewCell *cell; - cell = [self waitForCellAtIndexPath:indexPath inCollectionView:collectionView]; - - CGRect cellFrame = [cell.contentView convertRect:cell.contentView.frame toView:collectionView]; - [collectionView tapAtPoint:CGPointCenteredInRect(cellFrame)]; - - [self waitForAnimationsToFinish]; -} - -- (void)swipeViewWithAccessibilityLabel:(NSString *)label inDirection:(KIFSwipeDirection)direction -{ - [self swipeViewWithAccessibilityLabel:label value:nil traits:UIAccessibilityTraitNone inDirection:direction]; -} - -- (void)swipeViewWithAccessibilityLabel:(NSString *)label value:(NSString *)value inDirection:(KIFSwipeDirection)direction -{ - [self swipeViewWithAccessibilityLabel:label value:value traits:UIAccessibilityTraitNone inDirection:direction]; -} - -- (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]; - - // 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]; -} - -- (void)scrollViewWithAccessibilityLabel:(NSString *)label byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction -{ - UIView *viewToScroll; - UIAccessibilityElement *element; - [self waitForAccessibilityElement:&element view:&viewToScroll withLabel:label value:nil traits:UIAccessibilityTraitNone tappable:NO]; - [self scrollAccessibilityElement:element inView:viewToScroll byFractionOfSizeHorizontal:horizontalFraction vertical:verticalFraction]; -} - -- (void)scrollViewWithAccessibilityIdentifier:(NSString *)identifier byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction -{ - UIView *viewToScroll; - UIAccessibilityElement *element; - [self waitForAccessibilityElement:&element view:&viewToScroll withIdentifier:identifier tappable:NO]; - [self scrollAccessibilityElement:element inView:viewToScroll byFractionOfSizeHorizontal:horizontalFraction vertical:verticalFraction]; -} - -- (void)scrollAccessibilityElement:(UIAccessibilityElement *)element inView:(UIView *)viewToScroll byFractionOfSizeHorizontal:(CGFloat)horizontalFraction vertical:(CGFloat)verticalFraction -{ - const NSUInteger kNumberOfPointsInScrollPath = 5; - - // Within this method, all geometry is done in the coordinate system of the view to scroll. - - CGRect elementFrame = [viewToScroll.windowOrIdentityWindow convertRect:element.accessibilityFrame toView:viewToScroll]; - - KIFDisplacement scrollDisplacement = CGPointMake(elementFrame.size.width * horizontalFraction, elementFrame.size.height * verticalFraction); - - CGPoint scrollStart = CGPointCenteredInRect(elementFrame); - scrollStart.x -= scrollDisplacement.x / 2; - scrollStart.y -= scrollDisplacement.y / 2; - - [viewToScroll dragFromPoint:scrollStart displacement:scrollDisplacement steps:kNumberOfPointsInScrollPath]; -} - -- (void)waitForFirstResponderWithAccessibilityLabel:(NSString *)label -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - UIResponder *firstResponder = [[[UIApplication sharedApplication] keyWindow] firstResponder]; - if ([firstResponder isKindOfClass:NSClassFromString(@"UISearchBarTextField")]) { - do { - firstResponder = [(UIView *)firstResponder superview]; - } while (firstResponder && ![firstResponder isKindOfClass:[UISearchBar class]]); - } - KIFTestWaitCondition([[firstResponder accessibilityLabel] isEqualToString:label], error, @"Expected accessibility label for first responder to be '%@', got '%@'", label, [firstResponder accessibilityLabel]); - - return KIFTestStepResultSuccess; - }]; -} - -- (void)waitForFirstResponderWithAccessibilityLabel:(NSString *)label traits:(UIAccessibilityTraits)traits -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - UIResponder *firstResponder = [[[UIApplication sharedApplication] keyWindow] firstResponder]; - - NSString *foundLabel = firstResponder.accessibilityLabel; - - // foundLabel == label checks for the case where both are nil. - KIFTestWaitCondition(foundLabel == label || [foundLabel isEqualToString:label], error, @"Expected accessibility label for first responder to be '%@', got '%@'", label, foundLabel); - KIFTestWaitCondition(firstResponder.accessibilityTraits & traits, error, @"Found first responder with accessibility label, but not traits."); - - return KIFTestStepResultSuccess; - }]; -} - -- (UITableViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier -{ - UITableView *tableView; - [self waitForAccessibilityElement:NULL view:&tableView withIdentifier:identifier tappable:NO]; - return [self waitForCellAtIndexPath:indexPath inTableView:tableView]; -} - -- (UITableViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView -{ - if (![tableView isKindOfClass:[UITableView class]]) { - [self failWithError:[NSError KIFErrorWithFormat:@"View is not a table view"] stopTest:YES]; - } - - // If section < 0, search from the end of the table. - if (indexPath.section < 0) { - indexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:tableView.numberOfSections + indexPath.section]; - } - - // If row < 0, search from the end of the section. - if (indexPath.row < 0) { - indexPath = [NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:indexPath.section] + indexPath.row inSection:indexPath.section]; - } - - [self runBlock:^KIFTestStepResult(NSError **error) { - - KIFTestWaitCondition(indexPath.section < tableView.numberOfSections, error, @"Section %ld is not found in table view", (long)indexPath.section); - - KIFTestWaitCondition(indexPath.row < [tableView numberOfRowsInSection:indexPath.section], error, @"Row %ld is not found in section %ld of table view", (long)indexPath.row, (long)indexPath.section); - - return KIFTestStepResultSuccess; - }]; - - __block UITableViewCell *cell = nil; - __block CGFloat lastYOffset = CGFLOAT_MAX; - [self runBlock:^KIFTestStepResult(NSError **error) { - [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; - cell = [tableView cellForRowAtIndexPath:indexPath]; - KIFTestWaitCondition(!!cell, error, @"Table view cell at index path %@ not found", indexPath); - - if (lastYOffset != tableView.contentOffset.y) { - lastYOffset = tableView.contentOffset.y; - KIFTestWaitCondition(NO, error, @"Didn't finish scrolling to cell."); - } - - return KIFTestStepResultSuccess; - }]; - - [self waitForTimeInterval:0.1]; // Let things settle. - - - return cell; -} - -- (UICollectionViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inCollectionViewWithAccessibilityIdentifier:(NSString *)identifier -{ - UICollectionView *collectionView; - [self waitForAccessibilityElement:NULL view:&collectionView withIdentifier:identifier tappable:NO]; - return [self waitForCellAtIndexPath:indexPath inCollectionView:collectionView]; -} - -- (UICollectionViewCell *)waitForCellAtIndexPath:(NSIndexPath *)indexPath inCollectionView:(UICollectionView *)collectionView -{ - if (![collectionView isKindOfClass:[UICollectionView class]]) { - [self failWithError:[NSError KIFErrorWithFormat:@"View is not a collection view"] stopTest:YES]; - } - - NSInteger section = indexPath.section; - NSInteger item = indexPath.item; - - // If section < 0, search from the end of the table. - if (section < 0) { - section += collectionView.numberOfSections; - } - - // If item < 0, search from the end of the section. - if (item < 0) { - item += [collectionView numberOfItemsInSection:section]; - } - - indexPath = [NSIndexPath indexPathForItem:item inSection:section]; - - [self runBlock:^KIFTestStepResult(NSError **error) { - - KIFTestWaitCondition(indexPath.section < collectionView.numberOfSections, error, @"Section %ld is not found in collection view", (long)indexPath.section); - - KIFTestWaitCondition(indexPath.row < [collectionView numberOfItemsInSection:indexPath.section], error, @"Item %ld is not found in section %ld of collection view", (long)indexPath.row, (long)indexPath.section); - - return KIFTestStepResultSuccess; - }]; - - [collectionView scrollToItemAtIndexPath:indexPath - atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally | UICollectionViewScrollPositionCenteredVertically - animated:YES]; - - [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]; - } - - return cell; -} - -- (void)tapStatusBar -{ - [self runBlock:^KIFTestStepResult(NSError **error) { - KIFTestWaitCondition(![UIApplication sharedApplication].statusBarHidden, error, @"Expected status bar to be visible."); - return KIFTestStepResultSuccess; - }]; - - UIWindow *statusBarWindow = [[UIApplication sharedApplication] statusBarWindow]; - NSArray *statusBars = [statusBarWindow subviewsWithClassNameOrSuperClassNamePrefix:@"UIStatusBar"]; - - if (statusBars.count == 0) { - [self failWithError:[NSError KIFErrorWithFormat: @"Could not find the status bar"] stopTest:YES]; - } - - [self tapAccessibilityElement:statusBars[0] inView:statusBars[0]]; -} - -- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath inTableViewWithAccessibilityIdentifier:(NSString *)identifier -{ - UITableView *tableView; - [self waitForAccessibilityElement:NULL view:&tableView withIdentifier:identifier tappable:NO]; - - UITableViewCell *cell = [self waitForCellAtIndexPath:sourceIndexPath inTableView:tableView]; - - NSError *error = nil; - if (![tableView dragCell:cell toIndexPath:destinationIndexPath error:&error]) { - [self failWithError:error stopTest:YES]; - } -} - -@end - diff --git a/Example/Pods/KIF/Classes/UIAutomationHelper.h b/Example/Pods/KIF/Classes/UIAutomationHelper.h deleted file mode 100644 index 78fe4de..0000000 --- a/Example/Pods/KIF/Classes/UIAutomationHelper.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// UIAutomationHelper.h -// KIF -// -// Created by Joe Masilotti on 12/1/14. -// -// - -#import - -@class KIFTestActor; - -@interface UIAutomationHelper : NSObject - -+ (void)acknowledgeSystemAlert; - -@end diff --git a/Example/Pods/KIF/Classes/UIAutomationHelper.m b/Example/Pods/KIF/Classes/UIAutomationHelper.m deleted file mode 100644 index e400712..0000000 --- a/Example/Pods/KIF/Classes/UIAutomationHelper.m +++ /dev/null @@ -1,84 +0,0 @@ -// -// UIAutomationHelper.m -// KIF -// -// Created by Joe Masilotti on 12/1/14. -// -// - -#import "UIAutomationHelper.h" -#include - -@interface UIAElement : NSObject -- (void)tap; -@end - -@interface UIAAlert : UIAElement -- (NSArray *)buttons; -@end - -@interface UIAApplication : UIAElement -- (UIAAlert *)alert; -@end - -@interface UIATarget : UIAElement -+ (UIATarget *)localTarget; -- (UIAApplication *)frontMostApp; -@end - -@interface UIAElementNil : UIAElement - -@end - -@implementation UIAutomationHelper - -+ (UIAutomationHelper *)sharedHelper -{ - static dispatch_once_t once; - static UIAutomationHelper *sharedHelper = nil; - dispatch_once(&once, ^{ - sharedHelper = [[self alloc] init]; - [sharedHelper linkAutomationFramework]; - }); - return sharedHelper; -} - -+ (void)acknowledgeSystemAlert { - [[self sharedHelper] acknowledgeSystemAlert]; -} - -- (void)acknowledgeSystemAlert { - UIAApplication *application = [[self target] frontMostApp]; - UIAAlert *alert = application.alert; - - if (![alert isKindOfClass:[self nilElementClass]]) { - [[alert.buttons lastObject] tap]; - while (![application.alert isKindOfClass:[self nilElementClass]]) { } - } -} - -#pragma mark - Private - -- (void)linkAutomationFramework { - dlopen([@"/Developer/Library/PrivateFrameworks/UIAutomation.framework/UIAutomation" fileSystemRepresentation], RTLD_LOCAL); - - // Keep trying until the accessibility server starts up (it takes a little while on iOS 7) - UIATarget *target = nil; - while (!target) { - @try { - target = [self target]; - } - @catch (NSException *exception) { } - @finally { } - } -} - -- (UIATarget *)target { - return [NSClassFromString(@"UIATarget") localTarget]; -} - -- (Class)nilElementClass { - return NSClassFromString(@"UIAElementNil"); -} - -@end diff --git a/Example/Pods/KIF/LICENSE b/Example/Pods/KIF/LICENSE deleted file mode 100644 index 3eaf7fa..0000000 --- a/Example/Pods/KIF/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -KIF -Copyright 2011 Square, Inc. -A full list of contributors is available at https://github.com/square/KIF/contributors - - 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. \ No newline at end of file diff --git a/Example/Pods/KIF/README.md b/Example/Pods/KIF/README.md deleted file mode 100644 index c6f5ae0..0000000 --- a/Example/Pods/KIF/README.md +++ /dev/null @@ -1,312 +0,0 @@ -[![Build Status](https://travis-ci.org/kif-framework/KIF.svg?branch=master)](https://travis-ci.org/kif-framework/KIF) - -KIF iOS Integration Testing Framework -===================================== - -KIF, which stands for Keep It Functional, is an iOS integration test framework. It allows for easy automation of iOS apps by leveraging the accessibility attributes that the OS makes available for those with visual disabilities. - -KIF builds and performs the tests using a standard `XCTest` testing target. Testing is conducted synchronously in the main thread (running the run loop to force the passage of time) allowing for more complex logic and composition. This also allows KIF to take advantage of the Xcode 5 Test Navigator, command line build tools, and Bot test reports. [Find out more about Xcode 5 features.](https://developer.apple.com/technologies/tools/whats-new.html) - -**KIF uses undocumented Apple APIs.** This is true of most iOS testing frameworks, and is safe for testing purposes, but it's important that KIF does not make it into production code, as it will get your app submission denied by Apple. Follow the instructions below to ensure that KIF is configured correctly for your project. - -**Note:** KIF 2.0 is not API compatible with KIF 1.0 and uses a different test execution mechanism. KIF 1.0 can be found in the [Releases](https://github.com/kif-framework/KIF/releases/) section or on [CocoaPods](http://cocoapods.org). - -Features --------- - -#### Minimizes Indirection -All of the tests for KIF are written in Objective C. This allows for maximum integration with your code while minimizing the number of layers you have to build. - -#### Easy Configuration -KIF integrates directly into your Xcode project, so there's no need to run an additional web server or install any additional packages. - -#### Wide OS coverage -KIF's test suite has been run against iOS 5.1 and above (including iOS 8), though lower versions will likely work. - -#### Test Like a User -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. - -See KIF in Action ------------------ - -KIF uses techniques described below to validate its internal functionality. You can see a test suite that exercises its entire functionality by simply building and testing the KIF scheme with ⌘U. Look at the tests in the "KIF Tests" group for ideas on how to build your own tests. - -Installation (with CocoaPods) ------------------------------ - -[CocoaPods](http://cocoapods.org) are the easiest way to get set up with KIF. - -The first thing you will want to do is set up a test target you will be using for KIF. You may already have one named *MyApplication*_Tests if you selected to automatically create unit tests. If you did, you can keep using it if you aren't using it for unit tests. Otherwise, follow these directions to create a new one. - -Select your project in Xcode and click on "Add Target" in the bottom left corner of the editor. Select iOS -> Other -> Cocoa Touch Unit Testing Bundle. Give it a product name like "Acceptance Tests", "UI Tests", or something that indicates the intent of your testing process. You can select "Use Automatic Reference Counting" even if the remainder of your app doesn't, just to make your life easier. - -The testing target will add a header and implementation file, likely "Acceptance_Tests.m/h" to match your target name. Delete those. - -Once your test target set up, add the following to your Podfile file. Use your target's name as appropriate. - -```Ruby -target 'Acceptance Tests', :exclusive => true do - pod 'KIF', '~> 3.0', :configurations => ['Debug'] -end -``` - -The `:exclusive => true` option will prevent Cocoapods from including dependencies from your main target in your test target causing double-linking issues when you test link against the app. - -After running `pod install` complete the tasks in [**Final Test Target Configurations**](#final-test-target-configurations) below for the final details on getting your tests to run. - -Note: if you are using KIF with OCUnit, you need to use the OCUnit version of KIF as follows: - -```Ruby -target 'Acceptance Tests', :exclusive => true do - pod 'KIF/OCUnit', '~> 3.0' -end -``` - -Installation (from GitHub) --------------------------- - -To install KIF, you'll need to link the libKIF static library directly into your application. Download the source from the [kif-framework/KIF](https://github.com/kif-framework/KIF/) and follow the instructions below. The screenshots are from Xcode 6 on Yosemite, but the instructions should be the same for Xcode 5 or later on any OS version. - -We'll be using a simple project as an example, and you can find it in `Documentation/Examples/Testable Swift` in this repository. - -![Simple App](https://github.com/kif-framework/KIF/raw/master/Documentation/Images/Simple App.png) - - -### Add KIF to your project files -The first step is to add the KIF project into the ./Frameworks/KIF subdirectory of your existing app. If your project uses Git for version control, you can use submodules to make updating in the future easier: - -``` -cd /path/to/MyApplicationSource -mkdir Frameworks -git submodule add https://github.com/kif-framework/KIF.git Frameworks/KIF -``` - -If you're not using Git, simply download the source and copy it into the `./Frameworks/KIF` directory. - -### Add KIF to Your Workspace -Let your project know about KIF by adding the KIF project into a workspace along with your main project. Find the `KIF.xcodeproj` file in Finder and drag it into the Project Navigator (⌘1). - -![Added KIF to the project](https://github.com/kif-framework/KIF/raw/master/Documentation/Images/Added KIF to Project.png) - - -### Create a Testing Target -You'll need to create a test target for your app. You may already have one named *MyApplication*Tests if you selected to automatically create unit tests when you created the project. If you did, you can keep using it if you aren't using it for unit tests. Otherwise, follow these directions to create a new one. - -Select your project in Xcode and click on "Add Target" in the bottom left corner of the editor. Select iOS -> Other -> Cocoa Touch Testing Bundle. Give it a product name like "Acceptance Tests", "UI Tests", or something that indicates the intent of your testing process. - -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 and IOKit.framework. - -![Add libKIF library screen shot](https://github.com/kif-framework/KIF/raw/master/Documentation/Images/Add Library.png) - -![Add libKIF library screen shot](https://github.com/kif-framework/KIF/raw/master/Documentation/Images/Add Library Sheet.png) - -KIF takes advantage of Objective C's ability to add categories on an object, but this isn't enabled for static libraries by default. To enable this, add the `-ObjC` flag to the "Other Linker Flags" build setting on your test bundle target as shown below. - -![Add category linker flags screen shot](https://github.com/kif-framework/KIF/raw/master/Documentation/Images/Add Category Linker Flags.png) - -Read **Final Test Target Configurations** below for the final details on getting your tests to run. - -Final Test Target Configurations --------------------------------- - -You need your tests to run hosted in your application. **Xcode does this for you by default** when creating a new testing bundle target, but if you're migrating an older bundle, follow the steps below. - -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". - -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". - -## Example test cases -With your project configured to use KIF, it's time to start writing tests. There are two main classes used in KIF testing: the test case (`KIFTestCase`, subclass of `XCTestCase`) and the UI test actor (`KIFUITestActor`). The XCTest test runner loads the test case classes and executes their test. Inside these tests, the tester performs the UI operations which generally imitate a user interaction. Three of the most common tester actions are "tap this view," "enter text into this view," and "wait for this view." These steps are included as factory methods on `KIFUITestActor` in the base KIF implementation. - -KIF relies on the built-in accessibility of iOS to perform its test steps. As such, it's important that your app is fully accessible. This is also a great way to ensure that your app is usable by the sight impaired. Making your application accessible is usually as easy as giving your views reasonable labels. More details are available in [Apple's Documentation](http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/iPhoneAccessibility/Making_Application_Accessible/Making_Application_Accessible.html#//apple_ref/doc/uid/TP40008785-CH102-SW5). - -The first step is to create a test class to test some functionality. In our case, we will create a login test (`LoginTests`). Create a new class that inherits from KIFTestCase. You may have to update the import to point to ``. The test method name provides a unique identifier. Your `KIFTestCase` subclass should look something like this: - -*LoginTestCase.h* - -```objective-c -#import - -@interface LoginTests : KIFTestCase -@end -``` - -*LoginTestCase.m* - -```objective-c -#import "LoginTests.h" -#import "KIFUITestActor+EXAdditions.h" - -@implementation LoginTests - -- (void)beforeEach -{ - [tester navigateToLoginPage]; -} - -- (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"]; - - // Verify that the login succeeded - [tester waitForTappableViewWithAccessibilityLabel:@"Welcome"]; -} - -@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* - -```objective-c -#import - -@interface KIFUITestActor (EXAdditions) - -- (void)navigateToLoginPage; -- (void)returnToLoggedOutHomeScreen; - -@end -``` - -*KIFUITestActor+EXAdditions.m* - -```objective-c -#import "KIFUITestActor+EXAdditions.h" - -@implementation KIFUITestActor (EXAdditions) - -- (void)navigateToLoginPage -{ - [self tapViewWithAccessibilityLabel:@"Login/Sign Up"]; - [self tapViewWithAccessibilityLabel:@"Skip this ad"]; -} - -- (void)returnToLoggedOutHomeScreen -{ - [self tapViewWithAccessibilityLabel:@"Logout"]; - [self tapViewWithAccessibilityLabel:@"Logout"]; // Dismiss alert. -} - -@end -``` - -Everything should now be configured. When you run the integration tests using the test button, ⌘U, or the Xcode 5 Test Navigator (⌘5). - -Use with other testing frameworks ---------------------------------- - -`KIFTestCase` is not necessary for running KIF tests. Tests can run directly in `XCTestCase` or any subclass. The basic requirement is that when you call `tester` or `system`, `self` must be an instance of `XCTestCase`. - -For example, the following [Specta](https://github.com/specta/specta) test works without any changes to KIF or Specta: - -```objective-c -#import -#import - -SpecBegin(App) - -describe(@"Tab controller", ^{ - - it(@"should show second view when I tap on the second tab", ^{ - [tester tapViewWithAccessibilityLabel:@"Second" traits:UIAccessibilityTraitButton]; - [tester waitForViewWithAccessibilityLabel:@"Second View"]; - }); - -}); - -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. - - - (void)failWithException:(NSException *)exception stopTest:(BOOL)stop; - - (void)failWithExceptions:(NSArray *)exceptions stopTest:(BOOL)stop; - -In the first case, the test runner should log the exception and halt the test execution if `stop` is `YES`. In the second, the runner should log all the exceptions and halt the test execution if `stop` is `YES`. The exceptions take advantage of KIF's extensions to `NSException` that include the `lineNumber` and `filename` in the exception's `userData` to record the error's origin. - -## Use with Swift - -Since it's easy to combine Swift and Objective-C code in a single project, KIF is fully capable of testing apps written in both Objective-C and Swift. - -If you want to write your test cases in Swift, you'll need to keep two things in mind. - -1. Your test bundle's bridging header will need to `#import `, since KIF is a static library and not a header. -2. The `tester` and `system` keywords are C preprocessor macros which aren't available in Swift. You can easily write a small extension to `XCTestCase` or any other class to access them: - -```swift -extension XCTestCase { - func tester(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFUITestActor { - return KIFUITestActor(inFile: file, atLine: line, delegate: self) - } - - func system(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFSystemTestActor { - return KIFSystemTestActor(inFile: file, atLine: line, delegate: self) - } -} - -extension KIFTestActor { - func tester(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFUITestActor { - return KIFUITestActor(inFile: file, atLine: line, delegate: self) - } - - func system(_ file : String = __FILE__, _ line : Int = __LINE__) -> KIFSystemTestActor { - return KIFSystemTestActor(inFile: file, atLine: line, delegate: self) - } -} -``` - - -Troubleshooting ---------------- - -### Simulator launches but app doesn't appear, steps time out after 10 seconds - -This issue occurs when XCTest does not have a valid test host. Reread the instructions above with regards to the "Bundle Loader" and "Test Host" settings. You may have missed something. - -### Step fails because a view cannot be found - -If KIF is failing to find a view, the most likely cause is that the view doesn't have its accessibility label set. If the view is defined in a xib, then the label can be set using the inspector. If it's created programmatically, simply set the accessibilityLabel attribute to the desired label. - -If the label is definitely set correctly, take a closer look at the error given by KIF. This error should tell you more specifically why the view was not accessible. If you are using `-waitForTappableViewWithAccessibilityLabel:`, then make sure the view is actually tappable. For items such as labels which cannot become the first responder, you may need to use `-waitForViewWithAccessibilityLabel:` instead. - -### Unrecognized selector when first trying to run - -If the first time you try to run KIF you get the following error: - - 2011-06-13 13:54:53.295 Testable (Integration Tests)[12385:207] -[NSFileManager createUserDirectory:]: unrecognized selector sent to instance 0x4e02830 - 2011-06-13 13:54:53.298 Testable (Integration Tests)[12385:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSFileManager createUserDirectory:]: unrecognized selector sent to instance 0x4e02830' - -or if you get another "unrecognized selector" error inside the KIF code, make sure that you've properly set the -ObjC flag as described above. Without this flag your app can't access the category methods that are necessary for KIF to work properly. - -Continuous Integration ----------------------- - -A continuous integration (CI) process is highly recommended and is extremely useful in ensuring that your application stays functional. The easiest way to do this will be with Xcode 5, either using Bots, or Jenkins or another tool that uses xcodebuild. For tools using xcodebuild, review the manpage for instructions on using test destinations. - -Contributing ------------- - -We're glad you're interested in KIF, and we'd love to see where you take it. - -Any contributors to the master KIF repository must sign the [Individual Contributor License Agreement (CLA)](https://spreadsheets.google.com/spreadsheet/viewform?formkey=dDViT2xzUHAwRkI3X3k5Z0lQM091OGc6MQ&ndplr=1). It's a short form that covers our bases and makes sure you're eligible to contribute. - -When you have a change you'd like to see in the master repository, [send a pull request](https://github.com/kif-framework/KIF/pulls). Before we merge your request, we'll make sure you're in the list of people who have signed a CLA. - -Thanks, and happy testing! diff --git a/Example/Pods/Local Podspecs/JazzHands.podspec.json b/Example/Pods/Local Podspecs/JazzHands.podspec.json index d3d5e81..b6d3744 100644 --- a/Example/Pods/Local Podspecs/JazzHands.podspec.json +++ b/Example/Pods/Local Podspecs/JazzHands.podspec.json @@ -1,6 +1,6 @@ { "name": "JazzHands", - "version": "0.2.1", + "version": "2.0.0", "summary": "Simple keyframe animations for scrolling intros.", "homepage": "https://github.com/IFTTT/JazzHands", "authors": { @@ -11,10 +11,10 @@ }, "source": { "git": "https://github.com/IFTTT/JazzHands.git", - "tag": "0.2.1" + "tag": "2.0.0" }, "platforms": { - "ios": "5.0" + "ios": "7.0" }, "requires_arc": true, "license": { diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index a8f22a5..26205df 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,22 +1,20 @@ PODS: - - FBSnapshotTestCase (1.6) - - JazzHands (0.2.1) - - KIF (3.2.1): - - KIF/XCTest (= 3.2.1) - - KIF/XCTest (3.2.1) + - Expecta (1.0.0) + - JazzHands (2.0.0) + - Specta (1.0.2) DEPENDENCIES: - - FBSnapshotTestCase + - Expecta - JazzHands (from `../JazzHands.podspec`) - - KIF + - Specta EXTERNAL SOURCES: JazzHands: :path: ../JazzHands.podspec SPEC CHECKSUMS: - FBSnapshotTestCase: 9d5fe43b29ae3a0ed8fc829477971b281038f748 - JazzHands: d2343c3f2f9d70598d0cad8f521ce3893842a44a - KIF: ef1691e54e1d969c3b4fd0b5b56a3d7ddf37f216 + Expecta: 32604574add2c46a36f8d2f716b6c5736eb75024 + JazzHands: 00002e9b1284e7fc1ac6555012e81b8942477242 + Specta: 9cec98310dca411f7c7ffd6943552b501622abfe COCOAPODS: 0.37.2 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 53f853a..8e938c9 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,1035 +7,1335 @@ objects = { /* Begin PBXBuildFile section */ - 0291013306F073A76E5A7471 /* IFTTTEasingFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = C1B1B67A79413AD1E07925E8 /* IFTTTEasingFunction.h */; }; - 02D402615CD385CF0D7B3D3C /* KIFTypist.m in Sources */ = {isa = PBXBuildFile; fileRef = 071A08A2564C4F14A890A402 /* KIFTypist.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 03AE0A206FAF50E6BBC434BC /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC1B23BD8D61F24277A842D8 /* XCTest.framework */; }; - 04FC66A79E74D12A1561DCA0 /* IFTTTAnimatedScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 85CEAE78062CD7509D84CB86 /* IFTTTAnimatedScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 051DF1FA2E691566E21164C8 /* IFTTTTextColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 16A2F693C98C6E0F994B99BF /* IFTTTTextColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 0BA755C4B8FC81C21137AB78 /* IFTTTScaleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 48923395B02318400C9A97F2 /* IFTTTScaleAnimation.h */; }; - 0BFFFFAA7220C8D7F74C715B /* Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 72660D21C63255FB53EED136 /* Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m */; }; - 0C13041F47BB81E4EDA967B8 /* UIApplication-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = F9688CC70B27E3D3D92EC8E0 /* UIApplication-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 1517BBA3CB5AABFAC770A108 /* CGGeometry-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = F1684BC9E83BDB69098058C0 /* CGGeometry-KIFAdditions.h */; }; - 15F3C05FAAF177D640EE5D3C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B90CEA7E0A74BDC1CEB6A8F /* CoreGraphics.framework */; }; - 15FBB470CD31C73D8F136760 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1490ADE661D8B8F1E1EB2225 /* UIKit.framework */; }; - 18198F922B86554B833846B3 /* IFTTTCornerRadiusAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1300C1FC3284AD2D23833154 /* IFTTTCornerRadiusAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 1DB6B6C0476CAE3F42DF636B /* IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = EEAD12BEF19EDE749A5C66A3 /* IFTTTJazzHands.h */; }; - 1FF6892EC8565A6472D7BBB2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */; }; - 22CF0A8ACB04B0E5694AB2B5 /* NSError-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E1319A038AAB0933C0BF850A /* NSError-KIFAdditions.h */; }; - 243CB53653364BA2BAFDCB57 /* KIF.h in Headers */ = {isa = PBXBuildFile; fileRef = D4D975905FF759A215E4B7F6 /* KIF.h */; }; - 24ACBE85B6D07C0DDFC1B9DE /* IFTTTCornerRadiusAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6847135A20FFE1AD5524D7D0 /* IFTTTCornerRadiusAnimation.h */; }; - 269948B822224ACB8E382455 /* CGGeometry-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CAFF5A2662BF9A21D8799F27 /* CGGeometry-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 27CBAE27627409ECAC3EBF4F /* IFTTTConstraintsAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = FBE7509D66A773BD53478D27 /* IFTTTConstraintsAnimation.h */; }; - 29C4D7912BD227E406DE2E12 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B90CEA7E0A74BDC1CEB6A8F /* CoreGraphics.framework */; }; - 2B34EBAC49912D9BD52C248C /* KIFTestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = 928938C0715A8451256115FE /* KIFTestActor.h */; }; - 2BBC5877C7B4D90D48687418 /* NSException-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 184C09699F1DBE4EDD8E0B44 /* NSException-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 2F1DFA1A6C8DDD6BBCC57F30 /* XCTestCase-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6039E18C8EAAD4039323B10D /* XCTestCase-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 312E971E59992BD1B32BF033 /* IFTTTTransform3DAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AED21C6A67508B00B912D2D /* IFTTTTransform3DAnimation.h */; }; - 32D11B012AEF418C095671F6 /* KIFTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 043AC8359396697F9390CF08 /* KIFTestCase.h */; }; - 32DC11D9464F992B89DC7EE0 /* IFTTTAnimationKeyFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 21F65937361658EC44335F92 /* IFTTTAnimationKeyFrame.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 36FA00C71F741607603FD69B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B114F8BC115DBB2E2B80A5CA /* QuartzCore.framework */; }; - 3A238DDE24239A052A050E64 /* IFTTTColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = DA4F5570E36F3CC8EE72E028 /* IFTTTColorAnimation.h */; }; - 3BB17F8BF922DA0A2047F9AA /* UIAccessibilityElement-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 194690D0C44A07261C2140BF /* UIAccessibilityElement-KIFAdditions.h */; }; - 40C992B0259B47142211F704 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */; }; - 40C9F01C2703D0DBA4DAA1B7 /* IFTTTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD4826CE81E8A9A5B3FCB7E /* IFTTTAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 413D09D1332A4F859B302001 /* UIAutomationHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A7CC9C53BC9E8DDF1D6F469 /* UIAutomationHelper.h */; }; - 41CCCDEDF52E9B446BB5956A /* IFTTTTextColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 338E02428339143290E57031 /* IFTTTTextColorAnimation.h */; }; - 42E413183C0384CB1CFAF79A /* IFTTTTransform3DAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B245A8C63B9024CD7FB3C /* IFTTTTransform3DAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 442E58984ADDE6C05219DC4D /* IFTTTColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1566D6FB421D545BE39A6651 /* IFTTTColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 444F138D2AE5CBA885686900 /* IFTTTTransform3DAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AED21C6A67508B00B912D2D /* IFTTTTransform3DAnimation.h */; }; - 461DF07F7385E07C688F0F06 /* KIFUITestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = 64872AB43E95ED154D9C7567 /* KIFUITestActor.h */; }; - 49D8C46A3E79BE10FB6DAF91 /* Pods-JazzHandsTests-KIF-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B48DA303C0F737D295810557 /* Pods-JazzHandsTests-KIF-dummy.m */; }; - 4A9219E88209B8C06943F3D6 /* IFTTTEasingFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = F9DC64CF46841D674D78921E /* IFTTTEasingFunction.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 4BC2936B3B60E32CFD7AF59E /* NSFileManager-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 45A01F72296E1891E6CFFF5B /* NSFileManager-KIFAdditions.h */; }; - 4C38F964B21C608577027621 /* IFTTTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C055AA3D333823BDB173B33 /* IFTTTAnimation.h */; }; - 4D724CA6AB49FE9BA441ACDF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B114F8BC115DBB2E2B80A5CA /* QuartzCore.framework */; }; - 51A9CE11C781DC23930F7ECB /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = 201907DE231A2B673DE68D76 /* UIImage+Diff.h */; }; - 5253EF230D3F76BE85DC5C47 /* UIApplication-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 85035BA70AF2DA3581F5316C /* UIApplication-KIFAdditions.h */; }; - 5776EA3E2BB6B4A0743E3B98 /* IFTTTAnimationKeyFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 753EE94CACAEF5B575AF892E /* IFTTTAnimationKeyFrame.h */; }; - 5B2B2105FD2F02C693F80E11 /* KIFTypist.h in Headers */ = {isa = PBXBuildFile; fileRef = E7BA8A335C37F43E6F7BA644 /* KIFTypist.h */; }; - 5BFE4E1AD739F27F7C16EFBD /* IFTTTCornerRadiusAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1300C1FC3284AD2D23833154 /* IFTTTCornerRadiusAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 5C6404B3E11EF116D6AEC858 /* UITouch-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FB8C462077D25A302F11ED2 /* UITouch-KIFAdditions.h */; }; - 5CDEAF70044534B95635F02F /* UIEvent+KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B1BA9E0A82BB8D0C228A3E74 /* UIEvent+KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 5E69FC0358D8196906566A81 /* IFTTTAlphaAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C9883750C104249C45CD924C /* IFTTTAlphaAnimation.h */; }; - 5FFCF969087083CB6ECACB33 /* IFTTTAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F216A32D6D191C3234DCE413 /* IFTTTAnimator.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 615F454EADDE0379B9C49882 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B2467017731B6A57A702235 /* IOKit.framework */; }; - 623E0C2497AA7CB09FCC84EF /* KIFSystemTestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1784419FC8351B725C24E28C /* KIFSystemTestActor.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 6551CD0CF349DCB361031D60 /* IFTTTAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = AD7E7EEE462AC2D83B56B75D /* IFTTTAnimator.h */; }; - 6B631C30073A48BC91378B77 /* UIWindow-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A3A7F20410D9D7EE75D5A450 /* UIWindow-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 6C9B6548738059E9E8B76520 /* Pods-JazzHandsDemo-JazzHands-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC1D27E4895BB488EB1D0B1C /* Pods-JazzHandsDemo-JazzHands-dummy.m */; }; - 6CD629A4EF46375202447AE9 /* IFTTTAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = F216A32D6D191C3234DCE413 /* IFTTTAnimator.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 6E67F854EA3B2CE1E13FC20F /* IFTTTAngleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 915BB9CF037C8266840A9F50 /* IFTTTAngleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 72ED2E12A7CB2BF41E8306C9 /* IFTTTScaleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BDA79FB2BE4B818B3A18615 /* IFTTTScaleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 75BB3AB37DB127F992EE9A8D /* IFTTTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD4826CE81E8A9A5B3FCB7E /* IFTTTAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 7942FE5C4CD4C3ABC9D9EA76 /* IFTTTAlphaAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = EE15649BB8576B4E098929BF /* IFTTTAlphaAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 7950B372A8FA955960957C7B /* IFTTTTextColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 16A2F693C98C6E0F994B99BF /* IFTTTTextColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 796823C3B7AF12E6365E5CF7 /* IFTTTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C055AA3D333823BDB173B33 /* IFTTTAnimation.h */; }; - 799144A5001255D3C8C24ECE /* IFTTTScaleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BDA79FB2BE4B818B3A18615 /* IFTTTScaleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 7E1187BF7EA5D491E96FF6F2 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC1B23BD8D61F24277A842D8 /* XCTest.framework */; }; - 7E7AFEBA9151CB58198F1BF0 /* UIAccessibilityElement-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A5BACC1C01FA2DF37DA63BE /* UIAccessibilityElement-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 7EF215EF13E586C5A595FB6D /* IFTTTAlphaAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = EE15649BB8576B4E098929BF /* IFTTTAlphaAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 7F8DCFF3C5D95E77254F0BA3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */; }; - 80CF13ECC0463AB79EBFF01E /* Pods-JazzHandsDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 07FBE6B50342202CB3432530 /* Pods-JazzHandsDemo-dummy.m */; }; - 8253E9B466683B7716DA5816 /* IFTTTAnimationFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 652D2110802E63186F337E1F /* IFTTTAnimationFrame.h */; }; - 8409F00E7CF492BD0F81606A /* IFTTTEasingFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = F9DC64CF46841D674D78921E /* IFTTTEasingFunction.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 8496A70D670BC99CA4359E91 /* KIFSystemTestActor.h in Headers */ = {isa = PBXBuildFile; fileRef = ACB93FAACE32F589FEB4C8B6 /* KIFSystemTestActor.h */; }; - 8535193232199F9DDCF9841C /* NSBundle-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A1DD39D32151067AB8B05EAC /* NSBundle-KIFAdditions.h */; }; - 89EFA5DA7348136212ED6A86 /* XCTestCase-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = AA3900E39A50980B7CBE690D /* XCTestCase-KIFAdditions.h */; }; - 8C4058D9AD7F375A39D01903 /* IFTTTAnimatedScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 44E93E7EC9E94ADFAE8DC0FD /* IFTTTAnimatedScrollViewController.h */; }; - 8CADB8B156739D7F81651BF8 /* IFTTTAlphaAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C9883750C104249C45CD924C /* IFTTTAlphaAnimation.h */; }; - 8DBEA273D5324FB796C4029B /* IFTTTFrameAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E9C1FB250BD00113DF32AF3 /* IFTTTFrameAnimation.h */; }; - 8E91E4A0FE814D9EFA80BB5C /* NSBundle-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E140AB3FA8CBB0ED8B44EB9D /* NSBundle-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 8EA399EF5EFAE639F20A0F50 /* KIFTestStepValidation.m in Sources */ = {isa = PBXBuildFile; fileRef = DC2CF30AFCC24C1AA3A02027 /* KIFTestStepValidation.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - 8F05A9B732FA2754DE583299 /* IFTTTHideAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = E7AF4D250C9B583C91B5A2BA /* IFTTTHideAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 90A9EA58B13ABCDE700A3644 /* Pods-JazzHandsTests-JazzHands-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 319905129F4A1CCA67639C25 /* Pods-JazzHandsTests-JazzHands-dummy.m */; }; - 9238DF8CA2D39815D9DE5B47 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */; }; - 924FE4BA54DEFB1AE4F049D2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1490ADE661D8B8F1E1EB2225 /* UIKit.framework */; }; - 92718771E2EF31AACD9DFCFF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */; }; - 92AA56D9B07B1461F83A450F /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = D399B1C4A80CC581C1B8F9F3 /* UIImage+Compare.h */; }; - 92F66209607375EBB274D0AB /* IFTTTAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = AD7E7EEE462AC2D83B56B75D /* IFTTTAnimator.h */; }; - 963DB8A2D997283C26A6B37E /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = AC8FD1BBFD1C04925A7E62F2 /* UIImage+Compare.m */; }; - 96E26EC1D77AB6929D03AB80 /* KIFTestStepValidation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E27611507A8B509CEA982F3 /* KIFTestStepValidation.h */; }; - 96E3E6314C5DA37DC7F66560 /* IFTTTAngleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 915BB9CF037C8266840A9F50 /* IFTTTAngleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - 99457362116DC9CE5DF6C3EA /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 49977C43D74361D6B0B720E6 /* FBSnapshotTestCase.h */; }; - 9BCE4D1999FEC6F39CB69558 /* IFTTTAnimationKeyFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 753EE94CACAEF5B575AF892E /* IFTTTAnimationKeyFrame.h */; }; - 9D6DBF4A80E028B5EEB4B72B /* IFTTTAnimatedScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 44E93E7EC9E94ADFAE8DC0FD /* IFTTTAnimatedScrollViewController.h */; }; - A38C8C1145F00D487A444B07 /* KIFUITestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0B1A3F4E1F889FD1C0922E /* KIFUITestActor.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - A511FC610E597F66F5DB1BBA /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = AA99F99956D3489FD8629F49 /* UIImage+Diff.m */; }; - A57147E81A049E07CA776E89 /* IFTTTConstraintsAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 080D25604009B8109FF817BE /* IFTTTConstraintsAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - A6172238B6CF5AE56303F03C /* IFTTTFrameAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = B35B46A0F8CB9ABA014BC8BE /* IFTTTFrameAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - A7D8C5BF909C0B9413081325 /* NSError-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E627E94BE15DF7A1E716CDA2 /* NSError-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - A980BC74174051659FC64004 /* UIAutomationHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E14E3068348FC0892C0F2E5A /* UIAutomationHelper.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - A9A8E3A98219E9290D706174 /* IFTTTScaleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 48923395B02318400C9A97F2 /* IFTTTScaleAnimation.h */; }; - A9E603A55113C8B6D5BF2286 /* IFTTTColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1566D6FB421D545BE39A6651 /* IFTTTColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - AA6C8FBEF3860B72B296A2EC /* UIEvent+KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E96B13C6F6E68FF06851EB6 /* UIEvent+KIFAdditions.h */; }; - AB13DD9570E0FB147E64BFA4 /* KIFUITestActor-ConditionalTests.h in Headers */ = {isa = PBXBuildFile; fileRef = 47BBA80C2F8AC21489CF9C00 /* KIFUITestActor-ConditionalTests.h */; }; - AC08DB4FD18C526177F8B386 /* NSFileManager-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = D281B398041DEDFA26A55A4E /* NSFileManager-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - AC8476E6E1798A7F4B27BB54 /* IFTTTHideAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E29E9543A91C67EF6B91598 /* IFTTTHideAnimation.h */; }; - AF81474AC042BDBC56F79311 /* IFTTTEasingFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = C1B1B67A79413AD1E07925E8 /* IFTTTEasingFunction.h */; }; - AFB85B35B8FBC80D9395B274 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = BDC9DA665454BAC6A64EA5B0 /* FBSnapshotTestController.m */; }; - B0D8810D9AC25DBACE3491C1 /* IFTTTAngleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = DD36FF3EF53F78FD102396E0 /* IFTTTAngleAnimation.h */; }; - B12F554424A35904C7E17FD3 /* IFTTTAnimatedScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 85CEAE78062CD7509D84CB86 /* IFTTTAnimatedScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - B177566D1F998C6830876DC6 /* LoadableCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F94E50700C4F8449AC20695 /* LoadableCategory.h */; }; - B57FB884CFBF790CFA131F11 /* UITableView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D9A3040D3BF6F24E947F76B /* UITableView-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - B5B9749D0F12933D24A46D37 /* Pods-JazzHandsTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AFFFE09B24B269BAF37EABFD /* Pods-JazzHandsTests-dummy.m */; }; - B89B9DEDDBD98C8B661355F0 /* IFTTTCornerRadiusAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6847135A20FFE1AD5524D7D0 /* IFTTTCornerRadiusAnimation.h */; }; - BD4600E30B98AFBAB5E7A9F6 /* IFTTTHideAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = E7AF4D250C9B583C91B5A2BA /* IFTTTHideAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - BF01925966674FA553339B93 /* IFTTTTextColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 338E02428339143290E57031 /* IFTTTTextColorAnimation.h */; }; - C064A44316C3CE6E1AE50C89 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */; }; - C1A01CE380A5FF977619C574 /* UIView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A6F77393A57C18EA64DB988 /* UIView-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - C6471B381997F0FAAF10CFAB /* IFTTTAngleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = DD36FF3EF53F78FD102396E0 /* IFTTTAngleAnimation.h */; }; - C73C2D2CC78AF308BC269C16 /* UITouch-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E18973E008A4BC00480F420 /* UITouch-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - CB9459C51672DB088EF1FF31 /* UIScrollView-KIFAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C00B9C3B187857A9FEC7651 /* UIScrollView-KIFAdditions.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - CBBDB111ADF0543D3C712CCD /* IFTTTColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = DA4F5570E36F3CC8EE72E028 /* IFTTTColorAnimation.h */; }; - CC111984F501EAA9000E610B /* IFTTTFrameAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = B35B46A0F8CB9ABA014BC8BE /* IFTTTFrameAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - CED9659C42A21114C896B573 /* IFTTTTransform3DAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B1B245A8C63B9024CD7FB3C /* IFTTTTransform3DAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - CF195537561F255B2FE4A0D1 /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C2340D47F5E1A05D840BB2 /* FBSnapshotTestController.h */; }; - CF7011D34C1923AA7483504D /* IFTTTAnimationKeyFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 21F65937361658EC44335F92 /* IFTTTAnimationKeyFrame.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - CF7F6FE63F063160A172C837 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B90CEA7E0A74BDC1CEB6A8F /* CoreGraphics.framework */; }; - D166C1E584988A0C0883073A /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = CA5C4FBE406FE0FD844319D6 /* FBSnapshotTestCase.m */; }; - D1C68BDE8C65D28829D61C87 /* IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = EEAD12BEF19EDE749A5C66A3 /* IFTTTJazzHands.h */; }; - DEAD7854B86F6F4F901B3BBD /* UIView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C23A2C6E2264EC23D177443 /* UIView-KIFAdditions.h */; }; - DF9D7CBEBEF75F8F48C7359E /* IFTTTHideAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E29E9543A91C67EF6B91598 /* IFTTTHideAnimation.h */; }; - E00D303F6C94ED556BB93AE5 /* IFTTTAnimationFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 652D2110802E63186F337E1F /* IFTTTAnimationFrame.h */; }; - E40B8DBBD1A5404D79902650 /* IFTTTAnimationFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = D0734BBED1195B3158A5EB6A /* IFTTTAnimationFrame.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - EB906263B580005DBDB9B291 /* KIFTestActor.m in Sources */ = {isa = PBXBuildFile; fileRef = 511DC5D73AA68415AEB86083 /* KIFTestActor.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - EC2E187B9885097DE11D3CDD /* UIScrollView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = C293B64197275F3D9DF826C5 /* UIScrollView-KIFAdditions.h */; }; - ED378EA08278DBDDB2DE2CA5 /* NSException-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = FF117F1F9AC8F6ED92B638A1 /* NSException-KIFAdditions.h */; }; - EF2C006E6FFA279794C2757F /* UITableView-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E65C2B4A83C466DB92066E35 /* UITableView-KIFAdditions.h */; }; - F03031805EDFBA04E71DEB0F /* KIFUITestActor-ConditionalTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DB3418F5FE5AEEC2E48686C /* KIFUITestActor-ConditionalTests.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - F1A89AE7489BF279B32B9013 /* IFTTTAnimationFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = D0734BBED1195B3158A5EB6A /* IFTTTAnimationFrame.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - F1C851F70A3652DAE9158741 /* IFTTTConstraintsAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 080D25604009B8109FF817BE /* IFTTTConstraintsAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules -DOS_OBJECT_USE_OBJC=0"; }; }; - F25A12A9C09A9CF6A2FC7BCE /* KIFTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 73660A05BBBC26AB985D77C6 /* KIFTestCase.m */; settings = {COMPILER_FLAGS = "-DKIF_XCTEST -DOS_OBJECT_USE_OBJC=0"; }; }; - F626A866373151CB57A2A1C2 /* IFTTTConstraintsAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = FBE7509D66A773BD53478D27 /* IFTTTConstraintsAnimation.h */; }; - F74461CBEE12D10970B2BC93 /* IFTTTFrameAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E9C1FB250BD00113DF32AF3 /* IFTTTFrameAnimation.h */; }; - F74D71BDDAB53DE16386A11F /* UIWindow-KIFAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 491129F86B49E41FCD576CA3 /* UIWindow-KIFAdditions.h */; }; + 04583811D006FD0FFB194B0D /* IFTTTAnimatedPagingScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D080568FEB9EEFEDE67B1FEB /* IFTTTAnimatedPagingScrollViewController.h */; }; + 055B35520727F841BD63BA67 /* EXPMatchers+beInstanceOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 6070DD1E16D354E51A90BBE5 /* EXPMatchers+beInstanceOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 06924C5FE261AF1445596F47 /* EXPUnsupportedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 06DF8DACD4EB525AF0994799 /* EXPUnsupportedObject.h */; }; + 06935AF487615862A161A1ED /* EXPBlockDefinedMatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = C82FBC3B44F4BAD55EA83375 /* EXPBlockDefinedMatcher.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 088CF428927B789FE53D19C0 /* IFTTTLabelAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FB33694C2D99FA54FE7FB56 /* IFTTTLabelAnimation.h */; }; + 0D24FCA2247410B36D044414 /* IFTTTAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F1FB3B2BB701BF95064CE4E /* IFTTTAnimator.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 0E7661CC985DBA6E46D4D31B /* EXPMatchers+beCloseTo.m in Sources */ = {isa = PBXBuildFile; fileRef = A93A850FEA7D0E8CC3ACA0A4 /* EXPMatchers+beCloseTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 0EB6FF3442B2C4DEE47CDC05 /* UIView+IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ED1E5279DA220B6B619CB3E /* UIView+IFTTTJazzHands.h */; }; + 1120F4418BA8421F6AA49663 /* EXPMatchers+beLessThan.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C01ACAA3213C292B568179 /* EXPMatchers+beLessThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 12E1F4CF069C4DC309BE5567 /* EXPMatchers+haveCountOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 298786748608B5848E826326 /* EXPMatchers+haveCountOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 14A9221ACE37F6A5839FCE67 /* EXPMatchers+beTruthy.h in Headers */ = {isa = PBXBuildFile; fileRef = 2679FCF05ACF4B71C76B0E9D /* EXPMatchers+beTruthy.h */; }; + 164E1262D4B3664A3FB9F92F /* IFTTTConstraintMultiplierAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 002B3F0C1D3CD604CF06E479 /* IFTTTConstraintMultiplierAnimation.h */; }; + 17A3CDF0CB9B5454AE47C360 /* EXPMatchers+respondTo.m in Sources */ = {isa = PBXBuildFile; fileRef = B3D3F58A54F4F1E06417442B /* EXPMatchers+respondTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 18E68F9C2AD6DDC76DB1DB2E /* SPTExampleGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 00782EF2619A5B6F441F4BDC /* SPTExampleGroup.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 196B89DDEAC4D309784B2F36 /* Specta.h in Headers */ = {isa = PBXBuildFile; fileRef = B723FE99B0F1D3BF959D9A3C /* Specta.h */; }; + 1B8D9C36543A98509C3F3197 /* EXPMatchers+conformTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 50E0B8F3E256BAAD0E4E497B /* EXPMatchers+conformTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 1C0B2B201FAB9BF2AF9A0B57 /* IFTTTLabelAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7962EC97E740A52F7ACA2044 /* IFTTTLabelAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 2050B7D009FE6BA169105C97 /* IFTTTShapeLayerAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F4A2DB3FD89E5FE2B4D5278 /* IFTTTShapeLayerAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 20BC1155D0B4A5168E39121B /* SPTCallSite.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B79C571F17C761639AC7E08 /* SPTCallSite.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 232AB5EA8EF425C279D4A852 /* IFTTTScaleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C78853DCFB0D13B5269AA48D /* IFTTTScaleAnimation.h */; }; + 249FD819370090BBAA4CBF28 /* SPTExampleGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = A13035E609D54AFB3C76DD1B /* SPTExampleGroup.h */; }; + 24EFC11F97E6F3FCA3AFC3D2 /* IFTTTAnimatedScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 189F102FDADF37A3C0886332 /* IFTTTAnimatedScrollViewController.h */; }; + 258CF926CAE1D2F6A2889203 /* IFTTTScrollViewPageConstraintAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = D89E35A8EBC952A2AA8FEF03 /* IFTTTScrollViewPageConstraintAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 25C8C11695388F270495945C /* IFTTTStrokeEndAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3FB2353AD48A3DF3288FC6B /* IFTTTStrokeEndAnimation.h */; }; + 272629762C38A41F0B7666EF /* IFTTTTransform3DAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 50AF64A686F4155BD6C8878E /* IFTTTTransform3DAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 27784D0ECFD575A2C205C574 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC794D494F1CEFAD4F5EB849 /* QuartzCore.framework */; }; + 27A84187E85CF922A2B0832B /* IFTTTFrameAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 86C778FBAF3569F881329DC3 /* IFTTTFrameAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 2850743C631819B78CBF485D /* IFTTTAnimatedScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F21ABAF0CA4BF1BD7E53FF6C /* IFTTTAnimatedScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 295093E7D8CE1AB43BC4318B /* IFTTTFillColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BFF4DE3C75DE7EBB3B7DE4F /* IFTTTFillColorAnimation.h */; }; + 2A4749CA716B8D0A778EBC6B /* IFTTTRotationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = FA2CAA3C43B61C68D8DF29E9 /* IFTTTRotationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 2B36ACA9898B67CCF635A7E9 /* IFTTTTransform3DAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B196D682CD3033507868B17 /* IFTTTTransform3DAnimation.h */; }; + 2B588DD7108A41E74E30A301 /* SPTCallSite.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B338FDC538D2FA4A0BBEEF7 /* SPTCallSite.h */; }; + 2E8C349116769C4B5CEC1BE2 /* IFTTTStrokeEndAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 40326F9B29A545752472E2EA /* IFTTTStrokeEndAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 2EECDC616C08489665E30D28 /* EXPMatchers+beFalsy.h in Headers */ = {isa = PBXBuildFile; fileRef = DC41964BD15F91A162BE4D98 /* EXPMatchers+beFalsy.h */; }; + 2F84BDAA06B084A915E69386 /* EXPMatchers+beTruthy.m in Sources */ = {isa = PBXBuildFile; fileRef = 682AB2648C5DE591BBED15C5 /* EXPMatchers+beTruthy.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 30BCC0259BCDA9DB05141657 /* IFTTTEasingFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = AA224E51A2963A34CD39A8B2 /* IFTTTEasingFunction.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 31015E2D64A86DC63CBAB200 /* EXPMatchers+postNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = B48E4B6E8DBA72D76A051805 /* EXPMatchers+postNotification.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 31D1FA17EB86B2A7764F003E /* SPTTestSuite.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CA3BEF356504E9E249AC501 /* SPTTestSuite.h */; }; + 326156701011B8178DAA34D5 /* IFTTTEasingFunction.m in Sources */ = {isa = PBXBuildFile; fileRef = AA224E51A2963A34CD39A8B2 /* IFTTTEasingFunction.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 32FBE19B0B3A6E062A01D2EB /* IFTTTViewAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AE62A256E02B4DAF70DB7BC /* IFTTTViewAnimation.h */; }; + 332EF569972089DF39E06835 /* Pods-JazzHandsTests-Expecta-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 16843D73F03FCF88745D4F06 /* Pods-JazzHandsTests-Expecta-dummy.m */; }; + 3360FBA6C6DAA26E1C15532D /* EXPMatchers+beNil.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BB365C86C7CB937B35952F6 /* EXPMatchers+beNil.h */; }; + 362891AB97379A7C2B9B942D /* IFTTTConstraintMultiplierAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 39443B74259B804EC826F6A7 /* IFTTTConstraintMultiplierAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 371725B603A305B8FC1DBB38 /* SPTGlobalBeforeAfterEach.h in Headers */ = {isa = PBXBuildFile; fileRef = 198385680DB8962AB44D0F34 /* SPTGlobalBeforeAfterEach.h */; }; + 38010F1785A4335F4D612496 /* EXPMatcherHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C3E1DDF9F25A50514126870 /* EXPMatcherHelpers.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 399CB0C543D7AFFBE45D1E29 /* IFTTTAnimatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 58B07CE6E985CD85BAF28A4C /* IFTTTAnimatable.h */; }; + 39BBAC06230A5D2A0E7CF62E /* IFTTTCornerRadiusAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B4BC6B019092783446C185E /* IFTTTCornerRadiusAnimation.h */; }; + 3E9582346A040FD3EFEAABC9 /* EXPMatchers+contain.h in Headers */ = {isa = PBXBuildFile; fileRef = 881169508AEE642729CFD2F6 /* EXPMatchers+contain.h */; }; + 3EB6B177AD3AC79168B3496C /* IFTTTTranslationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5316E8D39354AC4F858E123A /* IFTTTTranslationAnimation.h */; }; + 3F1C1DDFB0172B0500BE4B5C /* IFTTTStrokeEndAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3FB2353AD48A3DF3288FC6B /* IFTTTStrokeEndAnimation.h */; }; + 3F8E42DDDB2917F9F9D8D387 /* EXPMatchers+raiseWithReason.m in Sources */ = {isa = PBXBuildFile; fileRef = B346F92160B3F2944E510A6A /* EXPMatchers+raiseWithReason.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 409682A9E7C96EB93F02C85B /* UIView+IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ED1E5279DA220B6B619CB3E /* UIView+IFTTTJazzHands.h */; }; + 41F11176CBE9F4D2B14BD9AB /* IFTTTConstraintConstantAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = E605A59EB565BC24B8B2FA32 /* IFTTTConstraintConstantAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 42D5DC5C69EA647FF768E21B /* SPTExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 92FB2FE75E866F191BD2BA57 /* SPTExample.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 43D4ED5159AC280BDACB2566 /* IFTTTStrokeStartAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC7AD019563FB8FEDD8B06A /* IFTTTStrokeStartAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 44F2594CE5C4309632489E71 /* SPTExcludeGlobalBeforeAfterEach.h in Headers */ = {isa = PBXBuildFile; fileRef = 047140F40CA374B06271AF10 /* SPTExcludeGlobalBeforeAfterEach.h */; }; + 456CC6C07CD8D158135AA3F9 /* IFTTTTranslationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5316E8D39354AC4F858E123A /* IFTTTTranslationAnimation.h */; }; + 47D9FB3F47966287ACC4FD3B /* EXPMatchers+beKindOf.m in Sources */ = {isa = PBXBuildFile; fileRef = C1E3E7180708AF5D08DFD70B /* EXPMatchers+beKindOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 48136667E837A5583FFD7DB6 /* IFTTTShapeLayerAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F4A2DB3FD89E5FE2B4D5278 /* IFTTTShapeLayerAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 487A4139CF60FF871A15DB11 /* EXPMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E759C076FF2DB0AE9EE71396 /* EXPMatcher.h */; }; + 4C69C5E145031E414274F3CB /* Pods-JazzHandsTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD3F92F4335B3E08540B6138 /* Pods-JazzHandsTests-dummy.m */; }; + 4E74D5E76749346882213B2C /* EXPMatchers+beIdenticalTo.h in Headers */ = {isa = PBXBuildFile; fileRef = F5C0125A9388D4A0053B0828 /* EXPMatchers+beIdenticalTo.h */; }; + 4EA21EDF74A889588B259EF4 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ACF87B2A9B3693B7B157FAE /* IFTTTScrollViewPageConstraintAnimation.h */; }; + 4F0A5CA80ACC68AF50339710 /* EXPMatcherHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 2616AE13C74D7FBEA5E8408B /* EXPMatcherHelpers.h */; }; + 4F6AEE39E73D35844C5FA586 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D66411B58B31BFB1ACEFC15C /* Foundation.framework */; }; + 50CB3BBFC0A45DBD59243579 /* UIView+IFTTTJazzHands.m in Sources */ = {isa = PBXBuildFile; fileRef = 617C2814D9982B227FF974D3 /* UIView+IFTTTJazzHands.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 514DEF41A3E73B3DFE4F3404 /* IFTTTCornerRadiusAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8648D504A9F151202BC02326 /* IFTTTCornerRadiusAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 522E83ED8DDF5FEEFF3CDFDF /* IFTTTAlphaAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 46058DBAECF9273509E2984A /* IFTTTAlphaAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 522F2BC68D7164D9B93579A6 /* EXPMatchers+beNil.m in Sources */ = {isa = PBXBuildFile; fileRef = E29FB58ADFEB9664CF020693 /* EXPMatchers+beNil.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 52E4540E1E3EC3FBBFAB43FE /* SPTSharedExampleGroups.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F49D4E545DC90CFBE1481DF /* SPTSharedExampleGroups.h */; }; + 536C1FF5529A6FD0E4857E95 /* EXPMatchers+equal.h in Headers */ = {isa = PBXBuildFile; fileRef = C7E41D3C4AE5DF9B187F936B /* EXPMatchers+equal.h */; }; + 5393E8721100915F390FF4ED /* IFTTTColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F450459912740182731099 /* IFTTTColorAnimation.h */; }; + 542066710442E478FB62E164 /* ExpectaObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 43C80395C21A7CC033E50AF1 /* ExpectaObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 56218B58DBFFCAB1F9EE6F0B /* EXPMatchers+beSupersetOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 780401C415ED9587D09D659E /* EXPMatchers+beSupersetOf.h */; }; + 56FAE01B8097D11F6D36C6CC /* IFTTTViewAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AE62A256E02B4DAF70DB7BC /* IFTTTViewAnimation.h */; }; + 57768C526413E5DB8E191EB3 /* EXPMatchers.h in Headers */ = {isa = PBXBuildFile; fileRef = F99EBDCAE07360CF68EA682D /* EXPMatchers.h */; }; + 57A0F6CCD2DD469EFDE195A5 /* Pods-JazzHandsTests-Specta-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 43B44E496437786C5B1E962C /* Pods-JazzHandsTests-Specta-dummy.m */; }; + 57E1F9D9287CD6278828C8B8 /* EXPMatchers+postNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 14324273647B2D03DDE54FFF /* EXPMatchers+postNotification.h */; }; + 583EE1C1F94DB05D580BD5F4 /* ExpectaObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 0697F10FDF4361FAC6FCD666 /* ExpectaObject.h */; }; + 5A7114B7BE48EF78673C5C0F /* IFTTTHideAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BD6FC1C838F4EA59535EC7B /* IFTTTHideAnimation.h */; }; + 5C00F1D6309BC469E2304D82 /* IFTTTAnimatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 58B07CE6E985CD85BAF28A4C /* IFTTTAnimatable.h */; }; + 5ED6352EB7087DDCE1A35032 /* IFTTTCornerRadiusAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B4BC6B019092783446C185E /* IFTTTCornerRadiusAnimation.h */; }; + 60F1F1608B1C424F31E37F77 /* IFTTTAlphaAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 46058DBAECF9273509E2984A /* IFTTTAlphaAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 61A1AD5262222BA3FD297130 /* SpectaDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 47027D439C3E5ADB7AEFD95A /* SpectaDSL.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 61A9DFFB0DF32CADFD06A300 /* EXPDoubleTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = DC2F96F297D4AAA6C237FD59 /* EXPDoubleTuple.h */; }; + 61C8523C2CDB8F80E3CBD733 /* IFTTTFillColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BFF4DE3C75DE7EBB3B7DE4F /* IFTTTFillColorAnimation.h */; }; + 63322CB8C9EE35422EBD6CD2 /* EXPMatchers+beLessThanOrEqualTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4828DFC6426035975361C0BD /* EXPMatchers+beLessThanOrEqualTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 63A62FE4A6B54E5D43C612B8 /* EXPMatchers+beCloseTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E4E5A13C629E555AE29A201 /* EXPMatchers+beCloseTo.h */; }; + 655CCFCA5EDB23D8C40FDE09 /* IFTTTEasingFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB2A7859D701D920BE8B591 /* IFTTTEasingFunction.h */; }; + 66204D2B768B28DF556A6123 /* IFTTTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E7AF9B9766985BAD6BE2421 /* IFTTTAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 668D971570D9A92CEA27E6B1 /* IFTTTStrokeStartAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC7AD019563FB8FEDD8B06A /* IFTTTStrokeStartAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 66AE2CF9F249E9D4D3AAEFF0 /* IFTTTFrameAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 86C778FBAF3569F881329DC3 /* IFTTTFrameAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 679E00C36DEE9857B5A10505 /* IFTTTAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E7AF9B9766985BAD6BE2421 /* IFTTTAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 6844CE55704BA4382A02F64F /* NSValue+Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F5089FDAD849CFEBF4976D5 /* NSValue+Expecta.h */; }; + 688417F091474F9FDFC191E9 /* IFTTTShapeLayerAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = AD3CEFB39115B48873FF3E99 /* IFTTTShapeLayerAnimation.h */; }; + 68B06A9A753F03390BC76B4F /* SpectaDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = C068DC956F7E93648FFC4C74 /* SpectaDSL.h */; }; + 69234E5708951D7F832AE407 /* IFTTTAnimatedScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 189F102FDADF37A3C0886332 /* IFTTTAnimatedScrollViewController.h */; }; + 6B55F7B6AB7CF1F8F0BD1B5D /* IFTTTRotationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 16E7197913DA65A2A2ED5F63 /* IFTTTRotationAnimation.h */; }; + 6D52A8BF9C1DCC9103C0556A /* EXPMatchers+contain.m in Sources */ = {isa = PBXBuildFile; fileRef = D276663C50D7522A8147E7EA /* EXPMatchers+contain.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 6E49C87D91FA9526E9E7B0DD /* IFTTTConstraintMultiplierAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 39443B74259B804EC826F6A7 /* IFTTTConstraintMultiplierAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 6E68A84004C7063ED28FEDCE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D66411B58B31BFB1ACEFC15C /* Foundation.framework */; }; + 6FEEB2F009C9C844B7D15EC0 /* IFTTTFrameAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A84BCAFD4DCE5B63BB893B9 /* IFTTTFrameAnimation.h */; }; + 700CAACAF73340577C167D5C /* SPTSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D66990FB5081BD3D897B74E /* SPTSpec.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 7217A83EFB38B174A9D6162A /* IFTTTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 451C44D78ED8B8365AC5BEC9 /* IFTTTAnimation.h */; }; + 7267E8ECA27C3EF3D72CF59C /* IFTTTRotationAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 16E7197913DA65A2A2ED5F63 /* IFTTTRotationAnimation.h */; }; + 729DCD5A3479BE3A082BA215 /* IFTTTTextColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 63F87023FDD6D465E5447D36 /* IFTTTTextColorAnimation.h */; }; + 736A13F5C0DA85EA3A01E0B5 /* SPTSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CF2DBA56BE8A1E325A0C7CA /* SPTSpec.h */; }; + 739C9888B032F3D82FA48605 /* ExpectaSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = E63780BA0E7CE6068D280BCA /* ExpectaSupport.h */; }; + 7528018662E93C45D9EC25DD /* EXPMatchers+beSubclassOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 5663E5D142CCA72AAE0446B2 /* EXPMatchers+beSubclassOf.h */; }; + 76054A442B353094885E9A5D /* IFTTTScrollViewPageConstraintAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ACF87B2A9B3693B7B157FAE /* IFTTTScrollViewPageConstraintAnimation.h */; }; + 76593C9CE984319FAEE27EED /* IFTTTAnimatedPagingScrollViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D080568FEB9EEFEDE67B1FEB /* IFTTTAnimatedPagingScrollViewController.h */; }; + 775274E0E93D201F8BF9DE29 /* IFTTTTransform3DAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B196D682CD3033507868B17 /* IFTTTTransform3DAnimation.h */; }; + 792D6A3CC70DF7E654F82F54 /* SPTExample.h in Headers */ = {isa = PBXBuildFile; fileRef = 00648A5FD04F7B2C6522763B /* SPTExample.h */; }; + 7B232659746A9D6899E1B8BC /* ExpectaSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 93E5DF31C16F9E313700A54F /* ExpectaSupport.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 7B34DDD8C74FC221EA3BD64F /* IFTTTShapeLayerAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = AD3CEFB39115B48873FF3E99 /* IFTTTShapeLayerAnimation.h */; }; + 7B501C8A32DA6C5A98C7DC21 /* IFTTTFillColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F8DFCA3B8691BA59EEAA9648 /* IFTTTFillColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 7B55872BFB06FD7A286ABF2A /* IFTTTHideAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BD6FC1C838F4EA59535EC7B /* IFTTTHideAnimation.h */; }; + 7B709370AB3310803419F81C /* EXPMatchers+beginWith.m in Sources */ = {isa = PBXBuildFile; fileRef = 117B3449C0E1795F2A575F84 /* EXPMatchers+beginWith.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 7D01BD51B92F762E9E000B66 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC794D494F1CEFAD4F5EB849 /* QuartzCore.framework */; }; + 7F4EC6D7AE9F04E07D208A3F /* EXPDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 41B5F95FBF8A15EA70444508 /* EXPDefines.h */; }; + 80497C7F46EE1E9A16473B00 /* IFTTTAnimatedPagingScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22945D9961216B78017FBC0C /* IFTTTAnimatedPagingScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 817AC30E3EB02DA3EFD422BE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D66411B58B31BFB1ACEFC15C /* Foundation.framework */; }; + 81A07B81B785529B6FD10C7A /* IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = 69EF441B3A7387684C69C57C /* IFTTTJazzHands.h */; }; + 8263376E51F6297D7BF0BB82 /* SpectaUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BEA82AF02164C5A6D191C89 /* SpectaUtility.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 826BDD53D7D4A0F7D074FFFC /* EXPMatchers+match.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B68A532C78D629F3B36982B /* EXPMatchers+match.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 82B952846B970C2398AFD310 /* IFTTTLabelAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7962EC97E740A52F7ACA2044 /* IFTTTLabelAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 86322A363FCD04C2615569D3 /* IFTTTScrollViewPageConstraintAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = D89E35A8EBC952A2AA8FEF03 /* IFTTTScrollViewPageConstraintAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 875420BF7FA2B026279AEC92 /* IFTTTColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = A78E0FC22514B43DFE608827 /* IFTTTColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 87E98DB88610BEDA1BA92A71 /* IFTTTRotationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = FA2CAA3C43B61C68D8DF29E9 /* IFTTTRotationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 887A75F898C63C4AA1DE9C79 /* IFTTTViewAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 070C7B1D690A3EF19BC88EF3 /* IFTTTViewAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 88D45F18D18AD4F7468CF931 /* EXPExpect.m in Sources */ = {isa = PBXBuildFile; fileRef = 13041B06B57AFD51E4CC0099 /* EXPExpect.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 8A3EBA4E7534E36CF6B36D84 /* EXPMatchers+raise.h in Headers */ = {isa = PBXBuildFile; fileRef = 76C7BBE3CB31ABD62B6120C8 /* EXPMatchers+raise.h */; }; + 8C95AD898D9AF389E8456D62 /* IFTTTFilmstrip.m in Sources */ = {isa = PBXBuildFile; fileRef = D6B500A598A22EA5D9B7D626 /* IFTTTFilmstrip.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 8DABB0DEC27CCB358C373BD6 /* EXPExpect.h in Headers */ = {isa = PBXBuildFile; fileRef = 14B6DC7E40BEF488FDA0B61A /* EXPExpect.h */; }; + 8E11F31EED96015F2D997109 /* IFTTTFilmstrip.h in Headers */ = {isa = PBXBuildFile; fileRef = C79624E726B5887222BEE96D /* IFTTTFilmstrip.h */; }; + 90B4CF2FDF6EFBC58A3AA499 /* EXPMatchers+beGreaterThanOrEqualTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CADAAFDF79E39AEB413CCD4 /* EXPMatchers+beGreaterThanOrEqualTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 928574B365534078BD65ACC7 /* IFTTTHideAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = FC8D6323659AFA81B01FB6C9 /* IFTTTHideAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + 931DF34122D2DEA948E54825 /* EXPMatchers+beGreaterThanOrEqualTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BF1DF87834D99B87565166F /* EXPMatchers+beGreaterThanOrEqualTo.h */; }; + 9328F9FAF6B494D2A32D2581 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C028B496A8F728A4C7AEA39F /* CoreGraphics.framework */; }; + 94466FB672E80265D6E24078 /* EXPMatchers+respondTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DBEFB67C1195EFBF8FF435 /* EXPMatchers+respondTo.h */; }; + 9478F95119D6A249151D7D34 /* EXPMatchers+beLessThanOrEqualTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 99C0613F3CD3E5E49936E796 /* EXPMatchers+beLessThanOrEqualTo.h */; }; + 949689F07D1A69A8062E495F /* EXPDoubleTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DE2773EB8A2CB31F469B34E /* EXPDoubleTuple.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 95404AE22E356E330782BEE9 /* EXPBlockDefinedMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 38ED88D20A047E0D4B24B054 /* EXPBlockDefinedMatcher.h */; }; + 972198011E22B3518C5C17F8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D66411B58B31BFB1ACEFC15C /* Foundation.framework */; }; + 97F7FAD23C9BF54DB9A6AD8F /* EXPMatchers+beInstanceOf.h in Headers */ = {isa = PBXBuildFile; fileRef = A8443E65E9763B2611AB86DD /* EXPMatchers+beInstanceOf.h */; }; + 9866A8AB778CEE9F50B309DF /* EXPMatchers+beGreaterThan.m in Sources */ = {isa = PBXBuildFile; fileRef = EB4FD886BFC4B69964400F69 /* EXPMatchers+beGreaterThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 9BB5E63A9EEFC44614BA06B0 /* IFTTTEasingFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB2A7859D701D920BE8B591 /* IFTTTEasingFunction.h */; }; + 9DB0FA98A15A4C377D643336 /* EXPMatchers+beInTheRangeOf.m in Sources */ = {isa = PBXBuildFile; fileRef = BEAA07F2D4D3B498A377383B /* EXPMatchers+beInTheRangeOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + A013F52A86C97AD6C444B8EC /* EXPMatchers+endWith.h in Headers */ = {isa = PBXBuildFile; fileRef = 787AB22095C208AE2B08F4BD /* EXPMatchers+endWith.h */; }; + A1D46FB5D28496A7E167DB69 /* EXPMatchers+endWith.m in Sources */ = {isa = PBXBuildFile; fileRef = 280C36CD5D509C370E16A95C /* EXPMatchers+endWith.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + A287DCAB0E6B97DE3A218A50 /* Pods-JazzHandsDemo-JazzHands-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 973C32FD26864247497B7236 /* Pods-JazzHandsDemo-JazzHands-dummy.m */; }; + A48728E264B31FEBF17BB7E0 /* SPTCompiledExample.h in Headers */ = {isa = PBXBuildFile; fileRef = 352184A1C5CD3DBEAAD9D37F /* SPTCompiledExample.h */; }; + A54281473F1FD774E8144454 /* EXPMatchers+beSupersetOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F2C52A698F80DB1481BA0C6 /* EXPMatchers+beSupersetOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + A75251EE2EA3EB48CD982751 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AF590CB5403C7DE8BBDDD92 /* UIKit.framework */; }; + A814A155BF991270BF10F11C /* IFTTTStrokeStartAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 44A0431AFDB1AD67060A6B8A /* IFTTTStrokeStartAnimation.h */; }; + AB26427E2E93ABDBB1DF5926 /* EXPMatchers+beLessThan.h in Headers */ = {isa = PBXBuildFile; fileRef = 28CA780AEF79FB4C0A68427F /* EXPMatchers+beLessThan.h */; }; + ABB87890E86543F255B8F546 /* IFTTTViewAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 070C7B1D690A3EF19BC88EF3 /* IFTTTViewAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + ABD40E6EFB644AC4ABCA685F /* IFTTTFilmstrip.m in Sources */ = {isa = PBXBuildFile; fileRef = D6B500A598A22EA5D9B7D626 /* IFTTTFilmstrip.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + AC0AEB8C81E1064292170709 /* IFTTTLabelAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FB33694C2D99FA54FE7FB56 /* IFTTTLabelAnimation.h */; }; + AE0EC022EF3517FFAEBAD9CB /* EXPMatchers+beSubclassOf.m in Sources */ = {isa = PBXBuildFile; fileRef = 45E53758B49865190C63BDA6 /* EXPMatchers+beSubclassOf.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + AE445B39658CC19C6EA9493E /* IFTTTColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = A78E0FC22514B43DFE608827 /* IFTTTColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + AFA5AB0FC5DD0AA1C1723A1F /* EXPMatchers+match.h in Headers */ = {isa = PBXBuildFile; fileRef = A0BB2BA14BE1FB29B4B2C752 /* EXPMatchers+match.h */; }; + B0940113C0D8D458CB808A32 /* NSValue+Expecta.m in Sources */ = {isa = PBXBuildFile; fileRef = 0887561851B299D5F4AA7F96 /* NSValue+Expecta.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + B270E452D8FD24B16FCF201A /* IFTTTAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32665C816421C6BD84BF079D /* IFTTTAnimator.h */; }; + B30A69A986FEF10F9217F3BC /* IFTTTConstraintConstantAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2557BB302523E5908ADE8698 /* IFTTTConstraintConstantAnimation.h */; }; + B3DDE119C2CFFA9BEB8ECED9 /* IFTTTAlphaAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 459F273807851C27BACEA41C /* IFTTTAlphaAnimation.h */; }; + B43809FB316EBBFD3968430C /* EXPMatchers+raise.m in Sources */ = {isa = PBXBuildFile; fileRef = 17FB11E5C5893920E688A8CB /* EXPMatchers+raise.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + B47FC87F0426A037E08B9999 /* IFTTTTextColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8784F8C1C06ACF53C472CF54 /* IFTTTTextColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + B494A81123DBFF39435BAAA3 /* IFTTTFilmstrip.h in Headers */ = {isa = PBXBuildFile; fileRef = C79624E726B5887222BEE96D /* IFTTTFilmstrip.h */; }; + B518B55BAEE89AA7407FFE59 /* SPTSharedExampleGroups.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F2587FBDCBEB011B30CF0B /* SPTSharedExampleGroups.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + B520753AB8D35D80F07F9659 /* EXPMatchers+conformTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 84665A516B97123AD4E45D6F /* EXPMatchers+conformTo.h */; }; + B56788485D5992F0001F0EE3 /* SpectaUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = B4BE827C13C6FD930490949E /* SpectaUtility.h */; }; + B6F77AF7E059A00E24B1E914 /* IFTTTFillColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F8DFCA3B8691BA59EEAA9648 /* IFTTTFillColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + B8AA158DB3603764E5D2CBD8 /* EXPMatchers+beIdenticalTo.m in Sources */ = {isa = PBXBuildFile; fileRef = EE5E4BCA953931B7FFC7B4C7 /* EXPMatchers+beIdenticalTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + B8E98FFC1059CFA47DAC156F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C028B496A8F728A4C7AEA39F /* CoreGraphics.framework */; }; + B97B704CFF372C3C30CF910F /* NSObject+Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = F392CC5E821C2BCE0F17D579 /* NSObject+Expecta.h */; }; + B9C41F18238D6108DE06DEDC /* IFTTTScaleAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C78853DCFB0D13B5269AA48D /* IFTTTScaleAnimation.h */; }; + BAD5A987FA8E5842A1D1CBD9 /* UIView+IFTTTJazzHands.m in Sources */ = {isa = PBXBuildFile; fileRef = 617C2814D9982B227FF974D3 /* UIView+IFTTTJazzHands.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + BB333C75F6B41E75F13F4A72 /* IFTTTInterpolatable.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B714C24FA4738E28E77B878 /* IFTTTInterpolatable.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + BBAC5A8E58F82B276C50F71A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 684C3276564FB1E21BB07EA5 /* XCTest.framework */; }; + BC7F1B89652998205B65AE3F /* IFTTTFrameAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A84BCAFD4DCE5B63BB893B9 /* IFTTTFrameAnimation.h */; }; + BDDC66A8AF23316E1A217892 /* IFTTTColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3F450459912740182731099 /* IFTTTColorAnimation.h */; }; + BE0B799C1F50348EAD27E78C /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 684C3276564FB1E21BB07EA5 /* XCTest.framework */; }; + BE4AA27F718B85413F1F12F4 /* Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = A5C32F67D947A0F208F37FFA /* Expecta.h */; }; + C2E608488E4EE8D18AAE61A5 /* IFTTTAnimatedPagingScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22945D9961216B78017FBC0C /* IFTTTAnimatedPagingScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + C6ABFF1C8ED45E1F31F020A4 /* IFTTTInterpolatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C280155A5FA68882E1457C3 /* IFTTTInterpolatable.h */; }; + C7EFF90602E209951BCC1CBD /* XCTest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = FB871F670A5C4E828BA5F0FE /* XCTest+Private.h */; }; + C8D2F20764028B2C7D0DF6BF /* IFTTTCornerRadiusAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8648D504A9F151202BC02326 /* IFTTTCornerRadiusAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + CA7DE9CD9A0EF906AD5F3E8A /* EXPMatchers+beginWith.h in Headers */ = {isa = PBXBuildFile; fileRef = 1871020DD03AA5ED5EF0FD4C /* EXPMatchers+beginWith.h */; }; + CD89824A41AE568A007A132E /* IFTTTAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 451C44D78ED8B8365AC5BEC9 /* IFTTTAnimation.h */; }; + CDD225866866A84F070E41FC /* XCTestCase+Specta.m in Sources */ = {isa = PBXBuildFile; fileRef = 53BF2B2D9C146BD56D3B322D /* XCTestCase+Specta.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + CF2BFCD1A62FB4BBD2E86B0C /* IFTTTStrokeEndAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 40326F9B29A545752472E2EA /* IFTTTStrokeEndAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + CFF2223ABCAD0389B5A00C83 /* Pods-JazzHandsDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F1B8D1A5453D3DF1C84D3921 /* Pods-JazzHandsDemo-dummy.m */; }; + D15DA8F26F85BEF534109DAC /* EXPMatchers+haveCountOf.h in Headers */ = {isa = PBXBuildFile; fileRef = E5A8936FDC099C9F6F358059 /* EXPMatchers+haveCountOf.h */; }; + D230F2ABAD55AF4AD98425FB /* IFTTTTransform3DAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 50AF64A686F4155BD6C8878E /* IFTTTTransform3DAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + D2A9936B44092EF6AC08ABF8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D66411B58B31BFB1ACEFC15C /* Foundation.framework */; }; + D3EC86461B066789F20890EB /* IFTTTTextColorAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8784F8C1C06ACF53C472CF54 /* IFTTTTextColorAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + D512C736933357BE4BE4116C /* EXPMatchers+beGreaterThan.h in Headers */ = {isa = PBXBuildFile; fileRef = 36DA46923DDD8D7BD0CBB7CD /* EXPMatchers+beGreaterThan.h */; }; + D721F1DA841546ABEAA342B9 /* IFTTTInterpolatable.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C280155A5FA68882E1457C3 /* IFTTTInterpolatable.h */; }; + D733EAC136334F6606A4C5BC /* IFTTTTranslationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = EFC775CDEB23A70B6884CB02 /* IFTTTTranslationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + D74D02F94B80F3199A0C53A0 /* IFTTTConstraintMultiplierAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 002B3F0C1D3CD604CF06E479 /* IFTTTConstraintMultiplierAnimation.h */; }; + D7A6C7A56AD752403E9B84C8 /* IFTTTConstraintConstantAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2557BB302523E5908ADE8698 /* IFTTTConstraintConstantAnimation.h */; }; + D83CD6126F46695C42095B01 /* IFTTTInterpolatable.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B714C24FA4738E28E77B878 /* IFTTTInterpolatable.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + D8B9CA8A6B7C757BBFAC964B /* EXPMatchers+beKindOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 7922E489E49C309EBEC62699 /* EXPMatchers+beKindOf.h */; }; + D8F79FFAAE4FDD20DAA99F54 /* IFTTTAlphaAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 459F273807851C27BACEA41C /* IFTTTAlphaAnimation.h */; }; + DBEDAF2568E8E3F39712FCF6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AF590CB5403C7DE8BBDDD92 /* UIKit.framework */; }; + DCB12FD30C56C1A89137DE73 /* EXPMatchers+equal.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A19F83233A6448FBB900987 /* EXPMatchers+equal.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + DDA96229186DFA613431CFA8 /* SpectaTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 89F3C37F0E067C82613CC37A /* SpectaTypes.h */; }; + DF3DD45851189791CD4342A8 /* EXPUnsupportedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 014621B70DB490593F4E520A /* EXPUnsupportedObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + E027383E37A270D98111AB0D /* IFTTTConstraintConstantAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = E605A59EB565BC24B8B2FA32 /* IFTTTConstraintConstantAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + E302E7BE62EC9EA5EC672B41 /* IFTTTHideAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = FC8D6323659AFA81B01FB6C9 /* IFTTTHideAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + E4378CC93258A1A29B61181D /* EXPMatchers+beInTheRangeOf.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A124E601D2DF1F992F924FB /* EXPMatchers+beInTheRangeOf.h */; }; + E48F935A796C4E811FE62D97 /* IFTTTAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F1FB3B2BB701BF95064CE4E /* IFTTTAnimator.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + E877ECF912A510E3B08F452B /* EXPFloatTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF3D5CCEF8F4F3832509964 /* EXPFloatTuple.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + E8AE771AB3C90A947DC74EA3 /* IFTTTAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32665C816421C6BD84BF079D /* IFTTTAnimator.h */; }; + E9CC266A9EBE7B9DC7CDF350 /* IFTTTScaleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F7ABB9B572EF8A1553622BF8 /* IFTTTScaleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + EB801661D176E2AE6ED6D2E9 /* XCTestCase+Specta.h in Headers */ = {isa = PBXBuildFile; fileRef = 731751E70BE7FCCF04898EA6 /* XCTestCase+Specta.h */; }; + EC8173FB83791991F07D7778 /* IFTTTStrokeStartAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 44A0431AFDB1AD67060A6B8A /* IFTTTStrokeStartAnimation.h */; }; + ECADB369378E9A7F0012532E /* SPTTestSuite.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EB787D8662B9EB201FC4A6A /* SPTTestSuite.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F05A48AE11A93222A122F904 /* IFTTTScaleAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = F7ABB9B572EF8A1553622BF8 /* IFTTTScaleAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + F0AFA5E94FDC82B6E1FF51DF /* SPTCompiledExample.m in Sources */ = {isa = PBXBuildFile; fileRef = 64BC5B9F2416623BFCAE698D /* SPTCompiledExample.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + F6195612D5F4E364ED3CA8F0 /* EXPMatchers+beFalsy.m in Sources */ = {isa = PBXBuildFile; fileRef = A6886187101941F3BAED7C1E /* EXPMatchers+beFalsy.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + F6423A42324C1AECB57E873C /* Pods-JazzHandsTests-JazzHands-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BAA5614F8FE38FD411809D28 /* Pods-JazzHandsTests-JazzHands-dummy.m */; }; + F76B4E54DE80AC7B4069E8E7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D66411B58B31BFB1ACEFC15C /* Foundation.framework */; }; + F9754F92F0F36FC7D2DA370F /* EXPFloatTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A38DBFD01F91A61A5C3E3FC /* EXPFloatTuple.h */; }; + FA7E12E8F805C23A5B96BF03 /* IFTTTAnimatedScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F21ABAF0CA4BF1BD7E53FF6C /* IFTTTAnimatedScrollViewController.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; + FBF31EF5CC8817F632B8BAD6 /* EXPMatchers+raiseWithReason.h in Headers */ = {isa = PBXBuildFile; fileRef = 26E81B27039EBACD0A2D1658 /* EXPMatchers+raiseWithReason.h */; }; + FD55ACF1C724D81DB0954A8C /* IFTTTJazzHands.h in Headers */ = {isa = PBXBuildFile; fileRef = 69EF441B3A7387684C69C57C /* IFTTTJazzHands.h */; }; + FFDAFE99810307413B56A9FB /* IFTTTTextColorAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 63F87023FDD6D465E5447D36 /* IFTTTTextColorAnimation.h */; }; + FFFB0D1B2F2B7AD6682C1759 /* IFTTTTranslationAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = EFC775CDEB23A70B6884CB02 /* IFTTTTranslationAnimation.m */; settings = {COMPILER_FLAGS = "-fmodules"; }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 229F36EB43ECEEF895279B37 /* PBXContainerItemProxy */ = { + 1A8230D3C75D93443600B19B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D3EE56C18F6AC2DBE3869796 /* Project object */; + containerPortal = 178EC51E7A0545B59B0CD2AD /* Project object */; proxyType = 1; - remoteGlobalIDString = F203775F0D6710D3BC5B78C3; - remoteInfo = "Pods-JazzHandsTests-JazzHands"; + remoteGlobalIDString = DC8E70DB547EE788D70D683D; + remoteInfo = "Pods-JazzHandsTests-Expecta"; }; - 5367F2F47328AC326C05A4A6 /* PBXContainerItemProxy */ = { + 266CA7EF52E29354A745F60C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D3EE56C18F6AC2DBE3869796 /* Project object */; + containerPortal = 178EC51E7A0545B59B0CD2AD /* Project object */; proxyType = 1; - remoteGlobalIDString = 990A61EA846F717335941AB5; - remoteInfo = "Pods-JazzHandsDemo-JazzHands"; + remoteGlobalIDString = 1F7B3AE52AD450FE0ADD77E4; + remoteInfo = "Pods-JazzHandsTests-JazzHands"; }; - AE4411D0AB85BF4167337A9F /* PBXContainerItemProxy */ = { + 4C6A7AC72055761AE1F9FE33 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D3EE56C18F6AC2DBE3869796 /* Project object */; + containerPortal = 178EC51E7A0545B59B0CD2AD /* Project object */; proxyType = 1; - remoteGlobalIDString = 629E749F6B357F5B71AAB91C; - remoteInfo = "Pods-JazzHandsTests-KIF"; + remoteGlobalIDString = FE7FE84998FD9900ABE7AC0F; + remoteInfo = "Pods-JazzHandsDemo-JazzHands"; }; - BF0D6BBC226E4D6D52FACAB4 /* PBXContainerItemProxy */ = { + 7CBB1E2D824BCF8C98F3EADB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = D3EE56C18F6AC2DBE3869796 /* Project object */; + containerPortal = 178EC51E7A0545B59B0CD2AD /* Project object */; proxyType = 1; - remoteGlobalIDString = DF2C2A1C804A04E33B10DCC5; - remoteInfo = "Pods-JazzHandsTests-FBSnapshotTestCase"; + remoteGlobalIDString = 474046DDD5023AF51208E1E8; + remoteInfo = "Pods-JazzHandsTests-Specta"; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 043AC8359396697F9390CF08 /* KIFTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KIFTestCase.h; path = Classes/KIFTestCase.h; sourceTree = ""; }; - 0623EB00CE30F1B76CE2994D /* Pods-JazzHandsTests-JazzHands-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Pods-JazzHandsTests-JazzHands-prefix.pch"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; sourceTree = ""; }; - 071A08A2564C4F14A890A402 /* KIFTypist.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KIFTypist.m; path = Classes/KIFTypist.m; sourceTree = ""; }; - 07FBE6B50342202CB3432530 /* Pods-JazzHandsDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsDemo-dummy.m"; sourceTree = ""; }; - 080D25604009B8109FF817BE /* IFTTTConstraintsAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTConstraintsAnimation.m; sourceTree = ""; }; - 0E96B13C6F6E68FF06851EB6 /* UIEvent+KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIEvent+KIFAdditions.h"; path = "Additions/UIEvent+KIFAdditions.h"; sourceTree = ""; }; - 0FE763717EEAB5E0E52D6B84 /* libPods-JazzHandsDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1300C1FC3284AD2D23833154 /* IFTTTCornerRadiusAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTCornerRadiusAnimation.m; sourceTree = ""; }; - 1490ADE661D8B8F1E1EB2225 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 1566D6FB421D545BE39A6651 /* IFTTTColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTColorAnimation.m; sourceTree = ""; }; - 16A2F693C98C6E0F994B99BF /* IFTTTTextColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTextColorAnimation.m; sourceTree = ""; }; - 1784419FC8351B725C24E28C /* KIFSystemTestActor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KIFSystemTestActor.m; path = Classes/KIFSystemTestActor.m; sourceTree = ""; }; - 184C09699F1DBE4EDD8E0B44 /* NSException-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSException-KIFAdditions.m"; path = "Additions/NSException-KIFAdditions.m"; sourceTree = ""; }; - 194690D0C44A07261C2140BF /* UIAccessibilityElement-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAccessibilityElement-KIFAdditions.h"; path = "Additions/UIAccessibilityElement-KIFAdditions.h"; sourceTree = ""; }; - 1B1B245A8C63B9024CD7FB3C /* IFTTTTransform3DAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTransform3DAnimation.m; sourceTree = ""; }; - 1CFCA498D21687E27B0525EF /* Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig"; sourceTree = ""; }; - 1DB3418F5FE5AEEC2E48686C /* KIFUITestActor-ConditionalTests.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "KIFUITestActor-ConditionalTests.m"; path = "Classes/KIFUITestActor-ConditionalTests.m"; sourceTree = ""; }; - 1FC562E36822A0D444F35654 /* Pods-JazzHandsTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsTests-resources.sh"; sourceTree = ""; }; - 201907DE231A2B673DE68D76 /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/UIImage+Diff.h"; sourceTree = ""; }; - 216F519D98B5FA7FEC9ECC4E /* Pods-JazzHandsTests-JazzHands.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JazzHandsTests-JazzHands.xcconfig"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands.xcconfig"; sourceTree = ""; }; - 21F65937361658EC44335F92 /* IFTTTAnimationKeyFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimationKeyFrame.m; sourceTree = ""; }; - 2D9A3040D3BF6F24E947F76B /* UITableView-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView-KIFAdditions.m"; path = "Additions/UITableView-KIFAdditions.m"; sourceTree = ""; }; - 2E18973E008A4BC00480F420 /* UITouch-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITouch-KIFAdditions.m"; path = "Additions/UITouch-KIFAdditions.m"; sourceTree = ""; }; - 319905129F4A1CCA67639C25 /* Pods-JazzHandsTests-JazzHands-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Pods-JazzHandsTests-JazzHands-dummy.m"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-dummy.m"; sourceTree = ""; }; - 338E02428339143290E57031 /* IFTTTTextColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTextColorAnimation.h; sourceTree = ""; }; - 3750B1BD85A6394D599F972E /* Pods-JazzHandsDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsDemo-acknowledgements.plist"; sourceTree = ""; }; - 398C7ADEBCE3753FF6AEEE05 /* Pods-JazzHandsDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsDemo-resources.sh"; sourceTree = ""; }; - 3C055AA3D333823BDB173B33 /* IFTTTAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimation.h; sourceTree = ""; }; - 3E27611507A8B509CEA982F3 /* KIFTestStepValidation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KIFTestStepValidation.h; path = Classes/KIFTestStepValidation.h; sourceTree = ""; }; - 42E75919FAF7203428A0E887 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo-JazzHands-Private.xcconfig"; sourceTree = ""; }; - 44E93E7EC9E94ADFAE8DC0FD /* IFTTTAnimatedScrollViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatedScrollViewController.h; sourceTree = ""; }; - 45A01F72296E1891E6CFFF5B /* NSFileManager-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileManager-KIFAdditions.h"; path = "Additions/NSFileManager-KIFAdditions.h"; sourceTree = ""; }; - 47BBA80C2F8AC21489CF9C00 /* KIFUITestActor-ConditionalTests.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "KIFUITestActor-ConditionalTests.h"; path = "Classes/KIFUITestActor-ConditionalTests.h"; sourceTree = ""; }; - 4847536E809420D86FCA4EFA /* libPods-JazzHandsTests-JazzHands.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-JazzHands.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 48923395B02318400C9A97F2 /* IFTTTScaleAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTScaleAnimation.h; sourceTree = ""; }; - 491129F86B49E41FCD576CA3 /* UIWindow-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWindow-KIFAdditions.h"; path = "Additions/UIWindow-KIFAdditions.h"; sourceTree = ""; }; - 49977C43D74361D6B0B720E6 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; - 49DA91330977A0749C5DCFB4 /* Pods-JazzHandsTests-KIF-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-KIF-Private.xcconfig"; sourceTree = ""; }; - 4A5BACC1C01FA2DF37DA63BE /* UIAccessibilityElement-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAccessibilityElement-KIFAdditions.m"; path = "Additions/UIAccessibilityElement-KIFAdditions.m"; sourceTree = ""; }; - 4A6F77393A57C18EA64DB988 /* UIView-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView-KIFAdditions.m"; path = "Additions/UIView-KIFAdditions.m"; sourceTree = ""; }; - 4C00B9C3B187857A9FEC7651 /* UIScrollView-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView-KIFAdditions.m"; path = "Additions/UIScrollView-KIFAdditions.m"; sourceTree = ""; }; - 511DC5D73AA68415AEB86083 /* KIFTestActor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KIFTestActor.m; path = Classes/KIFTestActor.m; sourceTree = ""; }; - 55840AA05AD57DC6FB062ED2 /* Pods-JazzHandsDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsDemo-acknowledgements.markdown"; sourceTree = ""; }; - 56743DE181DD32ABFD735AA0 /* Pods-JazzHandsTests-KIF.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-KIF.xcconfig"; sourceTree = ""; }; - 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 5B2467017731B6A57A702235 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; }; - 5D41A46448B3B2716DBE60FE /* Pods-JazzHandsDemo-JazzHands-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsDemo-JazzHands-prefix.pch"; sourceTree = ""; }; - 5F94E50700C4F8449AC20695 /* LoadableCategory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LoadableCategory.h; path = Additions/LoadableCategory.h; sourceTree = ""; }; - 6039E18C8EAAD4039323B10D /* XCTestCase-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestCase-KIFAdditions.m"; path = "Additions/XCTestCase-KIFAdditions.m"; sourceTree = ""; }; - 64872AB43E95ED154D9C7567 /* KIFUITestActor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KIFUITestActor.h; path = Classes/KIFUITestActor.h; sourceTree = ""; }; - 652D2110802E63186F337E1F /* IFTTTAnimationFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimationFrame.h; sourceTree = ""; }; - 6530F0A74583360D8B4EBEED /* libPods-JazzHandsTests-FBSnapshotTestCase.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-FBSnapshotTestCase.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6847135A20FFE1AD5524D7D0 /* IFTTTCornerRadiusAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTCornerRadiusAnimation.h; sourceTree = ""; }; - 6E29E9543A91C67EF6B91598 /* IFTTTHideAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTHideAnimation.h; sourceTree = ""; }; - 6E9C1FB250BD00113DF32AF3 /* IFTTTFrameAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFrameAnimation.h; sourceTree = ""; }; - 72660D21C63255FB53EED136 /* Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; - 73660A05BBBC26AB985D77C6 /* KIFTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KIFTestCase.m; path = Classes/KIFTestCase.m; sourceTree = ""; }; - 753EE94CACAEF5B575AF892E /* IFTTTAnimationKeyFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimationKeyFrame.h; sourceTree = ""; }; - 77290F40DC545A3E0F975FBB /* Pods-JazzHandsTests-KIF-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-KIF-prefix.pch"; sourceTree = ""; }; - 7B90CEA7E0A74BDC1CEB6A8F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 7FB8C462077D25A302F11ED2 /* UITouch-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITouch-KIFAdditions.h"; path = "Additions/UITouch-KIFAdditions.h"; sourceTree = ""; }; - 7FD4826CE81E8A9A5B3FCB7E /* IFTTTAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimation.m; sourceTree = ""; }; - 831DBE806D52F1E0543B3BAA /* Pods-JazzHandsTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsTests-acknowledgements.plist"; sourceTree = ""; }; - 85035BA70AF2DA3581F5316C /* UIApplication-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication-KIFAdditions.h"; path = "Additions/UIApplication-KIFAdditions.h"; sourceTree = ""; }; - 85CEAE78062CD7509D84CB86 /* IFTTTAnimatedScrollViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimatedScrollViewController.m; sourceTree = ""; }; - 8AED21C6A67508B00B912D2D /* IFTTTTransform3DAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTransform3DAnimation.h; sourceTree = ""; }; - 8BDA79FB2BE4B818B3A18615 /* IFTTTScaleAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTScaleAnimation.m; sourceTree = ""; }; - 8DCDBADF054DB67D87BDD8DE /* Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig"; sourceTree = ""; }; - 915BB9CF037C8266840A9F50 /* IFTTTAngleAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAngleAnimation.m; sourceTree = ""; }; - 928938C0715A8451256115FE /* KIFTestActor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KIFTestActor.h; path = Classes/KIFTestActor.h; sourceTree = ""; }; - 9A7CC9C53BC9E8DDF1D6F469 /* UIAutomationHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UIAutomationHelper.h; path = Classes/UIAutomationHelper.h; sourceTree = ""; }; - 9B0B1A3F4E1F889FD1C0922E /* KIFUITestActor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KIFUITestActor.m; path = Classes/KIFUITestActor.m; sourceTree = ""; }; - 9C23A2C6E2264EC23D177443 /* UIView-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView-KIFAdditions.h"; path = "Additions/UIView-KIFAdditions.h"; sourceTree = ""; }; - 9CF4C69F0DA2C84B7649961F /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JazzHandsTests-JazzHands-Private.xcconfig"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig"; sourceTree = ""; }; - A1DD39D32151067AB8B05EAC /* NSBundle-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle-KIFAdditions.h"; path = "Additions/NSBundle-KIFAdditions.h"; sourceTree = ""; }; - A3A7F20410D9D7EE75D5A450 /* UIWindow-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWindow-KIFAdditions.m"; path = "Additions/UIWindow-KIFAdditions.m"; sourceTree = ""; }; - A5E7B9060EF44E96E76DD0EE /* Pods-JazzHandsDemo-JazzHands.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo-JazzHands.xcconfig"; sourceTree = ""; }; - A793E88685BFE79F7DE9877B /* Pods-JazzHandsDemo-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsDemo-environment.h"; sourceTree = ""; }; - A9C2340D47F5E1A05D840BB2 /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; - AA3900E39A50980B7CBE690D /* XCTestCase-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "XCTestCase-KIFAdditions.h"; path = "Additions/XCTestCase-KIFAdditions.h"; sourceTree = ""; }; - AA99F99956D3489FD8629F49 /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/UIImage+Diff.m"; sourceTree = ""; }; - AC8FD1BBFD1C04925A7E62F2 /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/UIImage+Compare.m"; sourceTree = ""; }; - ACB93FAACE32F589FEB4C8B6 /* KIFSystemTestActor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KIFSystemTestActor.h; path = Classes/KIFSystemTestActor.h; sourceTree = ""; }; - AD7E7EEE462AC2D83B56B75D /* IFTTTAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimator.h; sourceTree = ""; }; - AFFFE09B24B269BAF37EABFD /* Pods-JazzHandsTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-dummy.m"; sourceTree = ""; }; - B114F8BC115DBB2E2B80A5CA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - B1BA9E0A82BB8D0C228A3E74 /* UIEvent+KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIEvent+KIFAdditions.m"; path = "Additions/UIEvent+KIFAdditions.m"; sourceTree = ""; }; - B35B46A0F8CB9ABA014BC8BE /* IFTTTFrameAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFrameAnimation.m; sourceTree = ""; }; - B38520B88C1E3764516A2944 /* Pods-JazzHandsTests-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-environment.h"; sourceTree = ""; }; - B48DA303C0F737D295810557 /* Pods-JazzHandsTests-KIF-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-KIF-dummy.m"; sourceTree = ""; }; - BC1B23BD8D61F24277A842D8 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - BC1D27E4895BB488EB1D0B1C /* Pods-JazzHandsDemo-JazzHands-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsDemo-JazzHands-dummy.m"; sourceTree = ""; }; - BDC9DA665454BAC6A64EA5B0 /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; - C1B1B67A79413AD1E07925E8 /* IFTTTEasingFunction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTEasingFunction.h; sourceTree = ""; }; - C293B64197275F3D9DF826C5 /* UIScrollView-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView-KIFAdditions.h"; path = "Additions/UIScrollView-KIFAdditions.h"; sourceTree = ""; }; - C94499F9702BCF1A9D554F23 /* libPods-JazzHandsTests-KIF.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-KIF.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - C9883750C104249C45CD924C /* IFTTTAlphaAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAlphaAnimation.h; sourceTree = ""; }; - CA5C4FBE406FE0FD844319D6 /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; - CAFF5A2662BF9A21D8799F27 /* CGGeometry-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CGGeometry-KIFAdditions.m"; path = "Additions/CGGeometry-KIFAdditions.m"; sourceTree = ""; }; - CB0F85BEA9A17C1CD68E3497 /* Pods-JazzHandsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.debug.xcconfig"; sourceTree = ""; }; - D0102FD813E71318A0015B30 /* Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; - D0734BBED1195B3158A5EB6A /* IFTTTAnimationFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimationFrame.m; sourceTree = ""; }; - D12C347D42DC4F7372E0AD4A /* Pods-JazzHandsTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsTests-acknowledgements.markdown"; sourceTree = ""; }; - D281B398041DEDFA26A55A4E /* NSFileManager-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileManager-KIFAdditions.m"; path = "Additions/NSFileManager-KIFAdditions.m"; sourceTree = ""; }; - D399B1C4A80CC581C1B8F9F3 /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/UIImage+Compare.h"; sourceTree = ""; }; - D4D975905FF759A215E4B7F6 /* KIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KIF.h; path = Classes/KIF.h; sourceTree = ""; }; - DA4F5570E36F3CC8EE72E028 /* IFTTTColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTColorAnimation.h; sourceTree = ""; }; - DC2CF30AFCC24C1AA3A02027 /* KIFTestStepValidation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = KIFTestStepValidation.m; path = Classes/KIFTestStepValidation.m; sourceTree = ""; }; - DD36FF3EF53F78FD102396E0 /* IFTTTAngleAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAngleAnimation.h; sourceTree = ""; }; - E1319A038AAB0933C0BF850A /* NSError-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSError-KIFAdditions.h"; path = "Additions/NSError-KIFAdditions.h"; sourceTree = ""; }; - E140AB3FA8CBB0ED8B44EB9D /* NSBundle-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle-KIFAdditions.m"; path = "Additions/NSBundle-KIFAdditions.m"; sourceTree = ""; }; - E14E3068348FC0892C0F2E5A /* UIAutomationHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = UIAutomationHelper.m; path = Classes/UIAutomationHelper.m; sourceTree = ""; }; - E5EAE8B949D325AF39A9DC48 /* libPods-JazzHandsTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - E627E94BE15DF7A1E716CDA2 /* NSError-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSError-KIFAdditions.m"; path = "Additions/NSError-KIFAdditions.m"; sourceTree = ""; }; - E65C2B4A83C466DB92066E35 /* UITableView-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView-KIFAdditions.h"; path = "Additions/UITableView-KIFAdditions.h"; sourceTree = ""; }; - E67734D3CDFE3F18D9041897 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - E7AF4D250C9B583C91B5A2BA /* IFTTTHideAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTHideAnimation.m; sourceTree = ""; }; - E7BA8A335C37F43E6F7BA644 /* KIFTypist.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KIFTypist.h; path = Classes/KIFTypist.h; sourceTree = ""; }; - E9956D55F6D69A575DB83B5E /* Pods-JazzHandsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.release.xcconfig"; sourceTree = ""; }; - EE15649BB8576B4E098929BF /* IFTTTAlphaAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAlphaAnimation.m; sourceTree = ""; }; - EEAD12BEF19EDE749A5C66A3 /* IFTTTJazzHands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTJazzHands.h; sourceTree = ""; }; - F1684BC9E83BDB69098058C0 /* CGGeometry-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CGGeometry-KIFAdditions.h"; path = "Additions/CGGeometry-KIFAdditions.h"; sourceTree = ""; }; - F1C2DD8B9B4063E104753350 /* libPods-JazzHandsDemo-JazzHands.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsDemo-JazzHands.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - F216A32D6D191C3234DCE413 /* IFTTTAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimator.m; sourceTree = ""; }; - F54F430B0F999BD29F575D03 /* Pods-JazzHandsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.release.xcconfig"; sourceTree = ""; }; - F9688CC70B27E3D3D92EC8E0 /* UIApplication-KIFAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication-KIFAdditions.m"; path = "Additions/UIApplication-KIFAdditions.m"; sourceTree = ""; }; - F9DC64CF46841D674D78921E /* IFTTTEasingFunction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTEasingFunction.m; sourceTree = ""; }; - FBE7509D66A773BD53478D27 /* IFTTTConstraintsAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTConstraintsAnimation.h; sourceTree = ""; }; - FD49D18BED380EDD94744B04 /* Pods-JazzHandsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.debug.xcconfig"; sourceTree = ""; }; - FF117F1F9AC8F6ED92B638A1 /* NSException-KIFAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSException-KIFAdditions.h"; path = "Additions/NSException-KIFAdditions.h"; sourceTree = ""; }; + 002B3F0C1D3CD604CF06E479 /* IFTTTConstraintMultiplierAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTConstraintMultiplierAnimation.h; sourceTree = ""; }; + 00648A5FD04F7B2C6522763B /* SPTExample.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExample.h; path = Specta/Specta/SPTExample.h; sourceTree = ""; }; + 00782EF2619A5B6F441F4BDC /* SPTExampleGroup.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTExampleGroup.m; path = Specta/Specta/SPTExampleGroup.m; sourceTree = ""; }; + 014621B70DB490593F4E520A /* EXPUnsupportedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPUnsupportedObject.m; path = Expecta/EXPUnsupportedObject.m; sourceTree = ""; }; + 02CD155D711CF74BE325D301 /* libPods-JazzHandsDemo-JazzHands.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsDemo-JazzHands.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 047140F40CA374B06271AF10 /* SPTExcludeGlobalBeforeAfterEach.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExcludeGlobalBeforeAfterEach.h; path = Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h; sourceTree = ""; }; + 0697F10FDF4361FAC6FCD666 /* ExpectaObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ExpectaObject.h; path = Expecta/ExpectaObject.h; sourceTree = ""; }; + 06DF8DACD4EB525AF0994799 /* EXPUnsupportedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPUnsupportedObject.h; path = Expecta/EXPUnsupportedObject.h; sourceTree = ""; }; + 070C7B1D690A3EF19BC88EF3 /* IFTTTViewAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTViewAnimation.m; sourceTree = ""; }; + 0887561851B299D5F4AA7F96 /* NSValue+Expecta.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSValue+Expecta.m"; path = "Expecta/NSValue+Expecta.m"; sourceTree = ""; }; + 08E6719DAA4746C321CFDA07 /* Pods-JazzHandsTests-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-environment.h"; sourceTree = ""; }; + 0A19F83233A6448FBB900987 /* EXPMatchers+equal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+equal.m"; path = "Expecta/Matchers/EXPMatchers+equal.m"; sourceTree = ""; }; + 0F4A2DB3FD89E5FE2B4D5278 /* IFTTTShapeLayerAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTShapeLayerAnimation.m; sourceTree = ""; }; + 117B3449C0E1795F2A575F84 /* EXPMatchers+beginWith.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beginWith.m"; path = "Expecta/Matchers/EXPMatchers+beginWith.m"; sourceTree = ""; }; + 13041B06B57AFD51E4CC0099 /* EXPExpect.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPExpect.m; path = Expecta/EXPExpect.m; sourceTree = ""; }; + 14324273647B2D03DDE54FFF /* EXPMatchers+postNotification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+postNotification.h"; path = "Expecta/Matchers/EXPMatchers+postNotification.h"; sourceTree = ""; }; + 14A80AB118A0EE2B2947711B /* Pods-JazzHandsDemo-JazzHands.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo-JazzHands.xcconfig"; sourceTree = ""; }; + 14B6DC7E40BEF488FDA0B61A /* EXPExpect.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPExpect.h; path = Expecta/EXPExpect.h; sourceTree = ""; }; + 1656EA22E4969961BC3B5B0C /* Pods-JazzHandsDemo-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsDemo-environment.h"; sourceTree = ""; }; + 16843D73F03FCF88745D4F06 /* Pods-JazzHandsTests-Expecta-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-Expecta-dummy.m"; sourceTree = ""; }; + 16E7197913DA65A2A2ED5F63 /* IFTTTRotationAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTRotationAnimation.h; sourceTree = ""; }; + 17FB11E5C5893920E688A8CB /* EXPMatchers+raise.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+raise.m"; path = "Expecta/Matchers/EXPMatchers+raise.m"; sourceTree = ""; }; + 1871020DD03AA5ED5EF0FD4C /* EXPMatchers+beginWith.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beginWith.h"; path = "Expecta/Matchers/EXPMatchers+beginWith.h"; sourceTree = ""; }; + 189F102FDADF37A3C0886332 /* IFTTTAnimatedScrollViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatedScrollViewController.h; sourceTree = ""; }; + 198385680DB8962AB44D0F34 /* SPTGlobalBeforeAfterEach.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTGlobalBeforeAfterEach.h; path = Specta/Specta/SPTGlobalBeforeAfterEach.h; sourceTree = ""; }; + 1A1DF926FD8C2951B34A5597 /* Pods-JazzHandsDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsDemo-resources.sh"; sourceTree = ""; }; + 1B714C24FA4738E28E77B878 /* IFTTTInterpolatable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTInterpolatable.m; sourceTree = ""; }; + 1D66990FB5081BD3D897B74E /* SPTSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTSpec.m; path = Specta/Specta/SPTSpec.m; sourceTree = ""; }; + 1D909E7FBF5A4029D49C5652 /* Pods-JazzHandsTests-Specta-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-Specta-prefix.pch"; sourceTree = ""; }; + 1E1C0EF61FBBE9F82792590A /* libPods-JazzHandsDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 22945D9961216B78017FBC0C /* IFTTTAnimatedPagingScrollViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimatedPagingScrollViewController.m; sourceTree = ""; }; + 2557BB302523E5908ADE8698 /* IFTTTConstraintConstantAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTConstraintConstantAnimation.h; sourceTree = ""; }; + 2616AE13C74D7FBEA5E8408B /* EXPMatcherHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatcherHelpers.h; path = Expecta/Matchers/EXPMatcherHelpers.h; sourceTree = ""; }; + 2679FCF05ACF4B71C76B0E9D /* EXPMatchers+beTruthy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beTruthy.h"; path = "Expecta/Matchers/EXPMatchers+beTruthy.h"; sourceTree = ""; }; + 26E81B27039EBACD0A2D1658 /* EXPMatchers+raiseWithReason.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+raiseWithReason.h"; path = "Expecta/Matchers/EXPMatchers+raiseWithReason.h"; sourceTree = ""; }; + 280C36CD5D509C370E16A95C /* EXPMatchers+endWith.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+endWith.m"; path = "Expecta/Matchers/EXPMatchers+endWith.m"; sourceTree = ""; }; + 28CA780AEF79FB4C0A68427F /* EXPMatchers+beLessThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beLessThan.h"; path = "Expecta/Matchers/EXPMatchers+beLessThan.h"; sourceTree = ""; }; + 298786748608B5848E826326 /* EXPMatchers+haveCountOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+haveCountOf.m"; path = "Expecta/Matchers/EXPMatchers+haveCountOf.m"; sourceTree = ""; }; + 2A6E2D7F2E0424579F2606E9 /* Pods-JazzHandsTests-JazzHands.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JazzHandsTests-JazzHands.xcconfig"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands.xcconfig"; sourceTree = ""; }; + 2BD6FC1C838F4EA59535EC7B /* IFTTTHideAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTHideAnimation.h; sourceTree = ""; }; + 2FB33694C2D99FA54FE7FB56 /* IFTTTLabelAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTLabelAnimation.h; sourceTree = ""; }; + 32665C816421C6BD84BF079D /* IFTTTAnimator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimator.h; sourceTree = ""; }; + 352184A1C5CD3DBEAAD9D37F /* SPTCompiledExample.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTCompiledExample.h; path = Specta/Specta/SPTCompiledExample.h; sourceTree = ""; }; + 36DA46923DDD8D7BD0CBB7CD /* EXPMatchers+beGreaterThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThan.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThan.h"; sourceTree = ""; }; + 37C4380E7E20452228F7E38D /* Pods-JazzHandsTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsTests-acknowledgements.plist"; sourceTree = ""; }; + 38ED88D20A047E0D4B24B054 /* EXPBlockDefinedMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPBlockDefinedMatcher.h; path = Expecta/EXPBlockDefinedMatcher.h; sourceTree = ""; }; + 39443B74259B804EC826F6A7 /* IFTTTConstraintMultiplierAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTConstraintMultiplierAnimation.m; sourceTree = ""; }; + 3B338FDC538D2FA4A0BBEEF7 /* SPTCallSite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTCallSite.h; path = Specta/Specta/SPTCallSite.h; sourceTree = ""; }; + 3C280155A5FA68882E1457C3 /* IFTTTInterpolatable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTInterpolatable.h; sourceTree = ""; }; + 3DCE159FE5C1B43DFC2CAF16 /* Pods-JazzHandsTests-Expecta-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsTests-Expecta-prefix.pch"; sourceTree = ""; }; + 3E4E5A13C629E555AE29A201 /* EXPMatchers+beCloseTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beCloseTo.h"; path = "Expecta/Matchers/EXPMatchers+beCloseTo.h"; sourceTree = ""; }; + 3E7AF9B9766985BAD6BE2421 /* IFTTTAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimation.m; sourceTree = ""; }; + 3F5089FDAD849CFEBF4976D5 /* NSValue+Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSValue+Expecta.h"; path = "Expecta/NSValue+Expecta.h"; sourceTree = ""; }; + 40191242206A6771F3A73399 /* Pods-JazzHandsDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsDemo-acknowledgements.markdown"; sourceTree = ""; }; + 40326F9B29A545752472E2EA /* IFTTTStrokeEndAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTStrokeEndAnimation.m; sourceTree = ""; }; + 41B5F95FBF8A15EA70444508 /* EXPDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDefines.h; path = Expecta/EXPDefines.h; sourceTree = ""; }; + 43B44E496437786C5B1E962C /* Pods-JazzHandsTests-Specta-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-Specta-dummy.m"; sourceTree = ""; }; + 43C80395C21A7CC033E50AF1 /* ExpectaObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ExpectaObject.m; path = Expecta/ExpectaObject.m; sourceTree = ""; }; + 44778620D0A4684796F1A953 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Expecta-Private.xcconfig"; sourceTree = ""; }; + 44A0431AFDB1AD67060A6B8A /* IFTTTStrokeStartAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTStrokeStartAnimation.h; sourceTree = ""; }; + 451C44D78ED8B8365AC5BEC9 /* IFTTTAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimation.h; sourceTree = ""; }; + 459F273807851C27BACEA41C /* IFTTTAlphaAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAlphaAnimation.h; sourceTree = ""; }; + 45E53758B49865190C63BDA6 /* EXPMatchers+beSubclassOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beSubclassOf.m"; path = "Expecta/Matchers/EXPMatchers+beSubclassOf.m"; sourceTree = ""; }; + 46058DBAECF9273509E2984A /* IFTTTAlphaAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAlphaAnimation.m; sourceTree = ""; }; + 47027D439C3E5ADB7AEFD95A /* SpectaDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SpectaDSL.m; path = Specta/Specta/SpectaDSL.m; sourceTree = ""; }; + 4819D30CEA5129B149D6A23F /* Pods-JazzHandsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.release.xcconfig"; sourceTree = ""; }; + 4828DFC6426035975361C0BD /* EXPMatchers+beLessThanOrEqualTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beLessThanOrEqualTo.m"; path = "Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m"; sourceTree = ""; }; + 4A124E601D2DF1F992F924FB /* EXPMatchers+beInTheRangeOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beInTheRangeOf.h"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.h"; sourceTree = ""; }; + 4C5C16C3144999F0091CF7F0 /* Pods-JazzHandsTests-Specta-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Specta-Private.xcconfig"; sourceTree = ""; }; + 4CF2DBA56BE8A1E325A0C7CA /* SPTSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTSpec.h; path = Specta/Specta/SPTSpec.h; sourceTree = ""; }; + 4F49D4E545DC90CFBE1481DF /* SPTSharedExampleGroups.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTSharedExampleGroups.h; path = Specta/Specta/SPTSharedExampleGroups.h; sourceTree = ""; }; + 50AF64A686F4155BD6C8878E /* IFTTTTransform3DAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTransform3DAnimation.m; sourceTree = ""; }; + 50E0B8F3E256BAAD0E4E497B /* EXPMatchers+conformTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+conformTo.m"; path = "Expecta/Matchers/EXPMatchers+conformTo.m"; sourceTree = ""; }; + 5316E8D39354AC4F858E123A /* IFTTTTranslationAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTranslationAnimation.h; sourceTree = ""; }; + 53BF2B2D9C146BD56D3B322D /* XCTestCase+Specta.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestCase+Specta.m"; path = "Specta/Specta/XCTestCase+Specta.m"; sourceTree = ""; }; + 54DBEFB67C1195EFBF8FF435 /* EXPMatchers+respondTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+respondTo.h"; path = "Expecta/Matchers/EXPMatchers+respondTo.h"; sourceTree = ""; }; + 5663E5D142CCA72AAE0446B2 /* EXPMatchers+beSubclassOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beSubclassOf.h"; path = "Expecta/Matchers/EXPMatchers+beSubclassOf.h"; sourceTree = ""; }; + 58B07CE6E985CD85BAF28A4C /* IFTTTAnimatable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatable.h; sourceTree = ""; }; + 5AF590CB5403C7DE8BBDDD92 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 5EB787D8662B9EB201FC4A6A /* SPTTestSuite.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTTestSuite.m; path = Specta/Specta/SPTTestSuite.m; sourceTree = ""; }; + 5ED1E5279DA220B6B619CB3E /* UIView+IFTTTJazzHands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIView+IFTTTJazzHands.h"; sourceTree = ""; }; + 5FD2A64DAA1C81948F968D6E /* Pods-JazzHandsDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.debug.xcconfig"; sourceTree = ""; }; + 6070DD1E16D354E51A90BBE5 /* EXPMatchers+beInstanceOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInstanceOf.m"; path = "Expecta/Matchers/EXPMatchers+beInstanceOf.m"; sourceTree = ""; }; + 60882D6AD680D2C57B8EAFF6 /* Pods-JazzHandsDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo.release.xcconfig"; sourceTree = ""; }; + 617C2814D9982B227FF974D3 /* UIView+IFTTTJazzHands.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIView+IFTTTJazzHands.m"; sourceTree = ""; }; + 63F87023FDD6D465E5447D36 /* IFTTTTextColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTextColorAnimation.h; sourceTree = ""; }; + 64BC5B9F2416623BFCAE698D /* SPTCompiledExample.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTCompiledExample.m; path = Specta/Specta/SPTCompiledExample.m; sourceTree = ""; }; + 6777804BC0388D39ACE6689E /* libPods-JazzHandsTests-Expecta.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-Expecta.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 682AB2648C5DE591BBED15C5 /* EXPMatchers+beTruthy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beTruthy.m"; path = "Expecta/Matchers/EXPMatchers+beTruthy.m"; sourceTree = ""; }; + 684C3276564FB1E21BB07EA5 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 69EF441B3A7387684C69C57C /* IFTTTJazzHands.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTJazzHands.h; sourceTree = ""; }; + 6A38DBFD01F91A61A5C3E3FC /* EXPFloatTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPFloatTuple.h; path = Expecta/EXPFloatTuple.h; sourceTree = ""; }; + 6B4BC6B019092783446C185E /* IFTTTCornerRadiusAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTCornerRadiusAnimation.h; sourceTree = ""; }; + 6BB365C86C7CB937B35952F6 /* EXPMatchers+beNil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beNil.h"; path = "Expecta/Matchers/EXPMatchers+beNil.h"; sourceTree = ""; }; + 6DE2773EB8A2CB31F469B34E /* EXPDoubleTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPDoubleTuple.m; path = Expecta/EXPDoubleTuple.m; sourceTree = ""; }; + 6F1FB3B2BB701BF95064CE4E /* IFTTTAnimator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimator.m; sourceTree = ""; }; + 731751E70BE7FCCF04898EA6 /* XCTestCase+Specta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "XCTestCase+Specta.h"; path = "Specta/Specta/XCTestCase+Specta.h"; sourceTree = ""; }; + 759FE9073BAD7FADFAA24FDB /* Pods-JazzHandsTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JazzHandsTests-resources.sh"; sourceTree = ""; }; + 76C01ACAA3213C292B568179 /* EXPMatchers+beLessThan.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beLessThan.m"; path = "Expecta/Matchers/EXPMatchers+beLessThan.m"; sourceTree = ""; }; + 76C7BBE3CB31ABD62B6120C8 /* EXPMatchers+raise.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+raise.h"; path = "Expecta/Matchers/EXPMatchers+raise.h"; sourceTree = ""; }; + 780401C415ED9587D09D659E /* EXPMatchers+beSupersetOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beSupersetOf.h"; path = "Expecta/Matchers/EXPMatchers+beSupersetOf.h"; sourceTree = ""; }; + 787AB22095C208AE2B08F4BD /* EXPMatchers+endWith.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+endWith.h"; path = "Expecta/Matchers/EXPMatchers+endWith.h"; sourceTree = ""; }; + 7922E489E49C309EBEC62699 /* EXPMatchers+beKindOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beKindOf.h"; path = "Expecta/Matchers/EXPMatchers+beKindOf.h"; sourceTree = ""; }; + 7962EC97E740A52F7ACA2044 /* IFTTTLabelAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTLabelAnimation.m; sourceTree = ""; }; + 79630B7461BAFF7D351A2F7D /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JazzHandsTests-JazzHands-Private.xcconfig"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig"; sourceTree = ""; }; + 7ACF87B2A9B3693B7B157FAE /* IFTTTScrollViewPageConstraintAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTScrollViewPageConstraintAnimation.h; sourceTree = ""; }; + 7B68A532C78D629F3B36982B /* EXPMatchers+match.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+match.m"; path = "Expecta/Matchers/EXPMatchers+match.m"; sourceTree = ""; }; + 7BEA82AF02164C5A6D191C89 /* SpectaUtility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SpectaUtility.m; path = Specta/Specta/SpectaUtility.m; sourceTree = ""; }; + 7BFF4DE3C75DE7EBB3B7DE4F /* IFTTTFillColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFillColorAnimation.h; sourceTree = ""; }; + 7F2C52A698F80DB1481BA0C6 /* EXPMatchers+beSupersetOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beSupersetOf.m"; path = "Expecta/Matchers/EXPMatchers+beSupersetOf.m"; sourceTree = ""; }; + 84665A516B97123AD4E45D6F /* EXPMatchers+conformTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+conformTo.h"; path = "Expecta/Matchers/EXPMatchers+conformTo.h"; sourceTree = ""; }; + 8648D504A9F151202BC02326 /* IFTTTCornerRadiusAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTCornerRadiusAnimation.m; sourceTree = ""; }; + 86C778FBAF3569F881329DC3 /* IFTTTFrameAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFrameAnimation.m; sourceTree = ""; }; + 8784F8C1C06ACF53C472CF54 /* IFTTTTextColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTextColorAnimation.m; sourceTree = ""; }; + 881169508AEE642729CFD2F6 /* EXPMatchers+contain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+contain.h"; path = "Expecta/Matchers/EXPMatchers+contain.h"; sourceTree = ""; }; + 88F2587FBDCBEB011B30CF0B /* SPTSharedExampleGroups.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTSharedExampleGroups.m; path = Specta/Specta/SPTSharedExampleGroups.m; sourceTree = ""; }; + 89F3C37F0E067C82613CC37A /* SpectaTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaTypes.h; path = Specta/Specta/SpectaTypes.h; sourceTree = ""; }; + 8A84BCAFD4DCE5B63BB893B9 /* IFTTTFrameAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFrameAnimation.h; sourceTree = ""; }; + 8AE62A256E02B4DAF70DB7BC /* IFTTTViewAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTViewAnimation.h; sourceTree = ""; }; + 8CA3BEF356504E9E249AC501 /* SPTTestSuite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTTestSuite.h; path = Specta/Specta/SPTTestSuite.h; sourceTree = ""; }; + 8DCE8261A2DAE3BF5C48FB96 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 91090D565DF6780E0A22BC9C /* Pods-JazzHandsTests-JazzHands-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Pods-JazzHandsTests-JazzHands-prefix.pch"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; sourceTree = ""; }; + 92FB2FE75E866F191BD2BA57 /* SPTExample.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTExample.m; path = Specta/Specta/SPTExample.m; sourceTree = ""; }; + 93E5DF31C16F9E313700A54F /* ExpectaSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ExpectaSupport.m; path = Expecta/ExpectaSupport.m; sourceTree = ""; }; + 96CFC496BB2080C86009C9DB /* libPods-JazzHandsTests-Specta.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-Specta.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 96FA7E3CAEC7F71ACE723DFB /* Pods-JazzHandsTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JazzHandsTests-acknowledgements.markdown"; sourceTree = ""; }; + 973C32FD26864247497B7236 /* Pods-JazzHandsDemo-JazzHands-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsDemo-JazzHands-dummy.m"; sourceTree = ""; }; + 99C0613F3CD3E5E49936E796 /* EXPMatchers+beLessThanOrEqualTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beLessThanOrEqualTo.h"; path = "Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h"; sourceTree = ""; }; + 9B196D682CD3033507868B17 /* IFTTTTransform3DAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTTransform3DAnimation.h; sourceTree = ""; }; + 9B79C571F17C761639AC7E08 /* SPTCallSite.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTCallSite.m; path = Specta/Specta/SPTCallSite.m; sourceTree = ""; }; + 9BF1DF87834D99B87565166F /* EXPMatchers+beGreaterThanOrEqualTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThanOrEqualTo.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h"; sourceTree = ""; }; + 9C3E1DDF9F25A50514126870 /* EXPMatcherHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPMatcherHelpers.m; path = Expecta/Matchers/EXPMatcherHelpers.m; sourceTree = ""; }; + 9CADAAFDF79E39AEB413CCD4 /* EXPMatchers+beGreaterThanOrEqualTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beGreaterThanOrEqualTo.m"; path = "Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m"; sourceTree = ""; }; + 9CF3D5CCEF8F4F3832509964 /* EXPFloatTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPFloatTuple.m; path = Expecta/EXPFloatTuple.m; sourceTree = ""; }; + A0BB2BA14BE1FB29B4B2C752 /* EXPMatchers+match.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+match.h"; path = "Expecta/Matchers/EXPMatchers+match.h"; sourceTree = ""; }; + A13035E609D54AFB3C76DD1B /* SPTExampleGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExampleGroup.h; path = Specta/Specta/SPTExampleGroup.h; sourceTree = ""; }; + A5C32F67D947A0F208F37FFA /* Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Expecta.h; path = Expecta/Expecta.h; sourceTree = ""; }; + A6886187101941F3BAED7C1E /* EXPMatchers+beFalsy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beFalsy.m"; path = "Expecta/Matchers/EXPMatchers+beFalsy.m"; sourceTree = ""; }; + A7018257716276765EEB9B58 /* libPods-JazzHandsTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + A78E0FC22514B43DFE608827 /* IFTTTColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTColorAnimation.m; sourceTree = ""; }; + A8443E65E9763B2611AB86DD /* EXPMatchers+beInstanceOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beInstanceOf.h"; path = "Expecta/Matchers/EXPMatchers+beInstanceOf.h"; sourceTree = ""; }; + A93A850FEA7D0E8CC3ACA0A4 /* EXPMatchers+beCloseTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beCloseTo.m"; path = "Expecta/Matchers/EXPMatchers+beCloseTo.m"; sourceTree = ""; }; + AA224E51A2963A34CD39A8B2 /* IFTTTEasingFunction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTEasingFunction.m; sourceTree = ""; }; + AD3CEFB39115B48873FF3E99 /* IFTTTShapeLayerAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTShapeLayerAnimation.h; sourceTree = ""; }; + AE8C1D15D7610F47CC08A179 /* Pods-JazzHandsDemo-JazzHands-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JazzHandsDemo-JazzHands-prefix.pch"; sourceTree = ""; }; + B346F92160B3F2944E510A6A /* EXPMatchers+raiseWithReason.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+raiseWithReason.m"; path = "Expecta/Matchers/EXPMatchers+raiseWithReason.m"; sourceTree = ""; }; + B36A523A2C7A359B40B5BAD8 /* libPods-JazzHandsTests-JazzHands.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JazzHandsTests-JazzHands.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + B3D3F58A54F4F1E06417442B /* EXPMatchers+respondTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+respondTo.m"; path = "Expecta/Matchers/EXPMatchers+respondTo.m"; sourceTree = ""; }; + B48E4B6E8DBA72D76A051805 /* EXPMatchers+postNotification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+postNotification.m"; path = "Expecta/Matchers/EXPMatchers+postNotification.m"; sourceTree = ""; }; + B4BE827C13C6FD930490949E /* SpectaUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaUtility.h; path = Specta/Specta/SpectaUtility.h; sourceTree = ""; }; + B723FE99B0F1D3BF959D9A3C /* Specta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Specta.h; path = Specta/Specta/Specta.h; sourceTree = ""; }; + BAA5614F8FE38FD411809D28 /* Pods-JazzHandsTests-JazzHands-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Pods-JazzHandsTests-JazzHands-dummy.m"; path = "../Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-dummy.m"; sourceTree = ""; }; + BBC7AD019563FB8FEDD8B06A /* IFTTTStrokeStartAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTStrokeStartAnimation.m; sourceTree = ""; }; + BEAA07F2D4D3B498A377383B /* EXPMatchers+beInTheRangeOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInTheRangeOf.m"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.m"; sourceTree = ""; }; + C028B496A8F728A4C7AEA39F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + C068DC956F7E93648FFC4C74 /* SpectaDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaDSL.h; path = Specta/Specta/SpectaDSL.h; sourceTree = ""; }; + C1E3E7180708AF5D08DFD70B /* EXPMatchers+beKindOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beKindOf.m"; path = "Expecta/Matchers/EXPMatchers+beKindOf.m"; sourceTree = ""; }; + C3F450459912740182731099 /* IFTTTColorAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTColorAnimation.h; sourceTree = ""; }; + C3FB2353AD48A3DF3288FC6B /* IFTTTStrokeEndAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTStrokeEndAnimation.h; sourceTree = ""; }; + C78853DCFB0D13B5269AA48D /* IFTTTScaleAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTScaleAnimation.h; sourceTree = ""; }; + C79624E726B5887222BEE96D /* IFTTTFilmstrip.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTFilmstrip.h; sourceTree = ""; }; + C7E41D3C4AE5DF9B187F936B /* EXPMatchers+equal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+equal.h"; path = "Expecta/Matchers/EXPMatchers+equal.h"; sourceTree = ""; }; + C82FBC3B44F4BAD55EA83375 /* EXPBlockDefinedMatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPBlockDefinedMatcher.m; path = Expecta/EXPBlockDefinedMatcher.m; sourceTree = ""; }; + D080568FEB9EEFEDE67B1FEB /* IFTTTAnimatedPagingScrollViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTAnimatedPagingScrollViewController.h; sourceTree = ""; }; + D1FCD977D16806F62F89FB33 /* Pods-JazzHandsTests-Specta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Specta.xcconfig"; sourceTree = ""; }; + D276663C50D7522A8147E7EA /* EXPMatchers+contain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+contain.m"; path = "Expecta/Matchers/EXPMatchers+contain.m"; sourceTree = ""; }; + D66411B58B31BFB1ACEFC15C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + D6B500A598A22EA5D9B7D626 /* IFTTTFilmstrip.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFilmstrip.m; sourceTree = ""; }; + D89E35A8EBC952A2AA8FEF03 /* IFTTTScrollViewPageConstraintAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTScrollViewPageConstraintAnimation.m; sourceTree = ""; }; + DBB2A7859D701D920BE8B591 /* IFTTTEasingFunction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = IFTTTEasingFunction.h; sourceTree = ""; }; + DC2F96F297D4AAA6C237FD59 /* EXPDoubleTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDoubleTuple.h; path = Expecta/EXPDoubleTuple.h; sourceTree = ""; }; + DC41964BD15F91A162BE4D98 /* EXPMatchers+beFalsy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beFalsy.h"; path = "Expecta/Matchers/EXPMatchers+beFalsy.h"; sourceTree = ""; }; + DC794D494F1CEFAD4F5EB849 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + E29FB58ADFEB9664CF020693 /* EXPMatchers+beNil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beNil.m"; path = "Expecta/Matchers/EXPMatchers+beNil.m"; sourceTree = ""; }; + E38F35C26AB7D5154A5953F4 /* Pods-JazzHandsDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JazzHandsDemo-acknowledgements.plist"; sourceTree = ""; }; + E5A8936FDC099C9F6F358059 /* EXPMatchers+haveCountOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+haveCountOf.h"; path = "Expecta/Matchers/EXPMatchers+haveCountOf.h"; sourceTree = ""; }; + E605A59EB565BC24B8B2FA32 /* IFTTTConstraintConstantAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTConstraintConstantAnimation.m; sourceTree = ""; }; + E63780BA0E7CE6068D280BCA /* ExpectaSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ExpectaSupport.h; path = Expecta/ExpectaSupport.h; sourceTree = ""; }; + E759C076FF2DB0AE9EE71396 /* EXPMatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatcher.h; path = Expecta/EXPMatcher.h; sourceTree = ""; }; + EB4FD886BFC4B69964400F69 /* EXPMatchers+beGreaterThan.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beGreaterThan.m"; path = "Expecta/Matchers/EXPMatchers+beGreaterThan.m"; sourceTree = ""; }; + EC0BC404FA398C41FAF29A61 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsDemo-JazzHands-Private.xcconfig"; sourceTree = ""; }; + EE5E4BCA953931B7FFC7B4C7 /* EXPMatchers+beIdenticalTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beIdenticalTo.m"; path = "Expecta/Matchers/EXPMatchers+beIdenticalTo.m"; sourceTree = ""; }; + EFC775CDEB23A70B6884CB02 /* IFTTTTranslationAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTTranslationAnimation.m; sourceTree = ""; }; + F1B8D1A5453D3DF1C84D3921 /* Pods-JazzHandsDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsDemo-dummy.m"; sourceTree = ""; }; + F21ABAF0CA4BF1BD7E53FF6C /* IFTTTAnimatedScrollViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTAnimatedScrollViewController.m; sourceTree = ""; }; + F392CC5E821C2BCE0F17D579 /* NSObject+Expecta.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+Expecta.h"; path = "Expecta/NSObject+Expecta.h"; sourceTree = ""; }; + F5C0125A9388D4A0053B0828 /* EXPMatchers+beIdenticalTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beIdenticalTo.h"; path = "Expecta/Matchers/EXPMatchers+beIdenticalTo.h"; sourceTree = ""; }; + F76CA17F62548EEF8DE345D7 /* Pods-JazzHandsTests-Expecta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests-Expecta.xcconfig"; sourceTree = ""; }; + F7ABB9B572EF8A1553622BF8 /* IFTTTScaleAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTScaleAnimation.m; sourceTree = ""; }; + F8DFCA3B8691BA59EEAA9648 /* IFTTTFillColorAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTFillColorAnimation.m; sourceTree = ""; }; + F99EBDCAE07360CF68EA682D /* EXPMatchers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatchers.h; path = Expecta/Matchers/EXPMatchers.h; sourceTree = ""; }; + FA2CAA3C43B61C68D8DF29E9 /* IFTTTRotationAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTRotationAnimation.m; sourceTree = ""; }; + FB871F670A5C4E828BA5F0FE /* XCTest+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "XCTest+Private.h"; path = "Specta/Specta/XCTest+Private.h"; sourceTree = ""; }; + FC710A2FC8801973C56015A6 /* Pods-JazzHandsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JazzHandsTests.debug.xcconfig"; sourceTree = ""; }; + FC8D6323659AFA81B01FB6C9 /* IFTTTHideAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = IFTTTHideAnimation.m; sourceTree = ""; }; + FD3F92F4335B3E08540B6138 /* Pods-JazzHandsTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JazzHandsTests-dummy.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 1B95DCEA0E0E6898ED58D2FC /* Frameworks */ = { + 28FE928A5C2EEF4708DE667F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9238DF8CA2D39815D9DE5B47 /* Foundation.framework in Frameworks */, + D2A9936B44092EF6AC08ABF8 /* Foundation.framework in Frameworks */, + BE0B799C1F50348EAD27E78C /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 452230011335A5719BC59E2C /* Frameworks */ = { + 33F0F384A0AD5A58BF262B25 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C064A44316C3CE6E1AE50C89 /* Foundation.framework in Frameworks */, - 03AE0A206FAF50E6BBC434BC /* XCTest.framework in Frameworks */, + 6E68A84004C7063ED28FEDCE /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5C8AE3AEAC5FF8116969CEEB /* Frameworks */ = { + 495CBB40E72591218E9B2614 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CF7F6FE63F063160A172C837 /* CoreGraphics.framework in Frameworks */, - 1FF6892EC8565A6472D7BBB2 /* Foundation.framework in Frameworks */, - 36FA00C71F741607603FD69B /* QuartzCore.framework in Frameworks */, - 15FBB470CD31C73D8F136760 /* UIKit.framework in Frameworks */, + B8E98FFC1059CFA47DAC156F /* CoreGraphics.framework in Frameworks */, + 817AC30E3EB02DA3EFD422BE /* Foundation.framework in Frameworks */, + 7D01BD51B92F762E9E000B66 /* QuartzCore.framework in Frameworks */, + A75251EE2EA3EB48CD982751 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6F51267A589877E7C41EBA03 /* Frameworks */ = { + 5888E17FE6AC23B3E6E0C6AB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 15F3C05FAAF177D640EE5D3C /* CoreGraphics.framework in Frameworks */, - 92718771E2EF31AACD9DFCFF /* Foundation.framework in Frameworks */, - 4D724CA6AB49FE9BA441ACDF /* QuartzCore.framework in Frameworks */, - 924FE4BA54DEFB1AE4F049D2 /* UIKit.framework in Frameworks */, + 972198011E22B3518C5C17F8 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 782D7E31CD99BBBDBFCFEAB5 /* Frameworks */ = { + 79896D5B26C2E4E7E6903300 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 29C4D7912BD227E406DE2E12 /* CoreGraphics.framework in Frameworks */, - 7F8DCFF3C5D95E77254F0BA3 /* Foundation.framework in Frameworks */, - 615F454EADDE0379B9C49882 /* IOKit.framework in Frameworks */, - 7E1187BF7EA5D491E96FF6F2 /* XCTest.framework in Frameworks */, + 4F6AEE39E73D35844C5FA586 /* Foundation.framework in Frameworks */, + BBAC5A8E58F82B276C50F71A /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FEFBB66E80E08ECCE5630C7E /* Frameworks */ = { + 856B99D89E74C202D1B71530 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 40C992B0259B47142211F704 /* Foundation.framework in Frameworks */, + 9328F9FAF6B494D2A32D2581 /* CoreGraphics.framework in Frameworks */, + F76B4E54DE80AC7B4069E8E7 /* Foundation.framework in Frameworks */, + 27784D0ECFD575A2C205C574 /* QuartzCore.framework in Frameworks */, + DBEDAF2568E8E3F39712FCF6 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 04EF622C2C461BB3386B01DF /* Pods-JazzHandsDemo */ = { - isa = PBXGroup; - children = ( - 55840AA05AD57DC6FB062ED2 /* Pods-JazzHandsDemo-acknowledgements.markdown */, - 3750B1BD85A6394D599F972E /* Pods-JazzHandsDemo-acknowledgements.plist */, - 07FBE6B50342202CB3432530 /* Pods-JazzHandsDemo-dummy.m */, - A793E88685BFE79F7DE9877B /* Pods-JazzHandsDemo-environment.h */, - 398C7ADEBCE3753FF6AEEE05 /* Pods-JazzHandsDemo-resources.sh */, - CB0F85BEA9A17C1CD68E3497 /* Pods-JazzHandsDemo.debug.xcconfig */, - E9956D55F6D69A575DB83B5E /* Pods-JazzHandsDemo.release.xcconfig */, - ); - name = "Pods-JazzHandsDemo"; - path = "Target Support Files/Pods-JazzHandsDemo"; - sourceTree = ""; - }; - 20F12CD3A44C5DC39DCCE9C3 /* FBSnapshotTestCase */ = { + 00C3FBEA96F41AE7CFE824E1 /* iOS */ = { isa = PBXGroup; children = ( - 49977C43D74361D6B0B720E6 /* FBSnapshotTestCase.h */, - CA5C4FBE406FE0FD844319D6 /* FBSnapshotTestCase.m */, - A9C2340D47F5E1A05D840BB2 /* FBSnapshotTestController.h */, - BDC9DA665454BAC6A64EA5B0 /* FBSnapshotTestController.m */, - D399B1C4A80CC581C1B8F9F3 /* UIImage+Compare.h */, - AC8FD1BBFD1C04925A7E62F2 /* UIImage+Compare.m */, - 201907DE231A2B673DE68D76 /* UIImage+Diff.h */, - AA99F99956D3489FD8629F49 /* UIImage+Diff.m */, - 301380AFC87535FF35B7913F /* Support Files */, + C028B496A8F728A4C7AEA39F /* CoreGraphics.framework */, + D66411B58B31BFB1ACEFC15C /* Foundation.framework */, + DC794D494F1CEFAD4F5EB849 /* QuartzCore.framework */, + 5AF590CB5403C7DE8BBDDD92 /* UIKit.framework */, + 684C3276564FB1E21BB07EA5 /* XCTest.framework */, ); - path = FBSnapshotTestCase; + name = iOS; sourceTree = ""; }; - 2ED3E558E31346B6180970AC /* Pods-JazzHandsTests */ = { + 0BBD42FD52117740E74282AB /* Pods-JazzHandsTests */ = { isa = PBXGroup; children = ( - D12C347D42DC4F7372E0AD4A /* Pods-JazzHandsTests-acknowledgements.markdown */, - 831DBE806D52F1E0543B3BAA /* Pods-JazzHandsTests-acknowledgements.plist */, - AFFFE09B24B269BAF37EABFD /* Pods-JazzHandsTests-dummy.m */, - B38520B88C1E3764516A2944 /* Pods-JazzHandsTests-environment.h */, - 1FC562E36822A0D444F35654 /* Pods-JazzHandsTests-resources.sh */, - FD49D18BED380EDD94744B04 /* Pods-JazzHandsTests.debug.xcconfig */, - F54F430B0F999BD29F575D03 /* Pods-JazzHandsTests.release.xcconfig */, + 96FA7E3CAEC7F71ACE723DFB /* Pods-JazzHandsTests-acknowledgements.markdown */, + 37C4380E7E20452228F7E38D /* Pods-JazzHandsTests-acknowledgements.plist */, + FD3F92F4335B3E08540B6138 /* Pods-JazzHandsTests-dummy.m */, + 08E6719DAA4746C321CFDA07 /* Pods-JazzHandsTests-environment.h */, + 759FE9073BAD7FADFAA24FDB /* Pods-JazzHandsTests-resources.sh */, + FC710A2FC8801973C56015A6 /* Pods-JazzHandsTests.debug.xcconfig */, + 4819D30CEA5129B149D6A23F /* Pods-JazzHandsTests.release.xcconfig */, ); name = "Pods-JazzHandsTests"; path = "Target Support Files/Pods-JazzHandsTests"; sourceTree = ""; }; - 301380AFC87535FF35B7913F /* Support Files */ = { + 167D2AC5CCE33AA0355BBA23 /* Expecta */ = { isa = PBXGroup; children = ( - 1CFCA498D21687E27B0525EF /* Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig */, - 8DCDBADF054DB67D87BDD8DE /* Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig */, - 72660D21C63255FB53EED136 /* Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m */, - D0102FD813E71318A0015B30 /* Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch */, + 38ED88D20A047E0D4B24B054 /* EXPBlockDefinedMatcher.h */, + C82FBC3B44F4BAD55EA83375 /* EXPBlockDefinedMatcher.m */, + 41B5F95FBF8A15EA70444508 /* EXPDefines.h */, + DC2F96F297D4AAA6C237FD59 /* EXPDoubleTuple.h */, + 6DE2773EB8A2CB31F469B34E /* EXPDoubleTuple.m */, + 14B6DC7E40BEF488FDA0B61A /* EXPExpect.h */, + 13041B06B57AFD51E4CC0099 /* EXPExpect.m */, + 6A38DBFD01F91A61A5C3E3FC /* EXPFloatTuple.h */, + 9CF3D5CCEF8F4F3832509964 /* EXPFloatTuple.m */, + E759C076FF2DB0AE9EE71396 /* EXPMatcher.h */, + 2616AE13C74D7FBEA5E8408B /* EXPMatcherHelpers.h */, + 9C3E1DDF9F25A50514126870 /* EXPMatcherHelpers.m */, + F99EBDCAE07360CF68EA682D /* EXPMatchers.h */, + 3E4E5A13C629E555AE29A201 /* EXPMatchers+beCloseTo.h */, + A93A850FEA7D0E8CC3ACA0A4 /* EXPMatchers+beCloseTo.m */, + DC41964BD15F91A162BE4D98 /* EXPMatchers+beFalsy.h */, + A6886187101941F3BAED7C1E /* EXPMatchers+beFalsy.m */, + 36DA46923DDD8D7BD0CBB7CD /* EXPMatchers+beGreaterThan.h */, + EB4FD886BFC4B69964400F69 /* EXPMatchers+beGreaterThan.m */, + 9BF1DF87834D99B87565166F /* EXPMatchers+beGreaterThanOrEqualTo.h */, + 9CADAAFDF79E39AEB413CCD4 /* EXPMatchers+beGreaterThanOrEqualTo.m */, + F5C0125A9388D4A0053B0828 /* EXPMatchers+beIdenticalTo.h */, + EE5E4BCA953931B7FFC7B4C7 /* EXPMatchers+beIdenticalTo.m */, + 4A124E601D2DF1F992F924FB /* EXPMatchers+beInTheRangeOf.h */, + BEAA07F2D4D3B498A377383B /* EXPMatchers+beInTheRangeOf.m */, + A8443E65E9763B2611AB86DD /* EXPMatchers+beInstanceOf.h */, + 6070DD1E16D354E51A90BBE5 /* EXPMatchers+beInstanceOf.m */, + 7922E489E49C309EBEC62699 /* EXPMatchers+beKindOf.h */, + C1E3E7180708AF5D08DFD70B /* EXPMatchers+beKindOf.m */, + 28CA780AEF79FB4C0A68427F /* EXPMatchers+beLessThan.h */, + 76C01ACAA3213C292B568179 /* EXPMatchers+beLessThan.m */, + 99C0613F3CD3E5E49936E796 /* EXPMatchers+beLessThanOrEqualTo.h */, + 4828DFC6426035975361C0BD /* EXPMatchers+beLessThanOrEqualTo.m */, + 6BB365C86C7CB937B35952F6 /* EXPMatchers+beNil.h */, + E29FB58ADFEB9664CF020693 /* EXPMatchers+beNil.m */, + 5663E5D142CCA72AAE0446B2 /* EXPMatchers+beSubclassOf.h */, + 45E53758B49865190C63BDA6 /* EXPMatchers+beSubclassOf.m */, + 780401C415ED9587D09D659E /* EXPMatchers+beSupersetOf.h */, + 7F2C52A698F80DB1481BA0C6 /* EXPMatchers+beSupersetOf.m */, + 2679FCF05ACF4B71C76B0E9D /* EXPMatchers+beTruthy.h */, + 682AB2648C5DE591BBED15C5 /* EXPMatchers+beTruthy.m */, + 1871020DD03AA5ED5EF0FD4C /* EXPMatchers+beginWith.h */, + 117B3449C0E1795F2A575F84 /* EXPMatchers+beginWith.m */, + 84665A516B97123AD4E45D6F /* EXPMatchers+conformTo.h */, + 50E0B8F3E256BAAD0E4E497B /* EXPMatchers+conformTo.m */, + 881169508AEE642729CFD2F6 /* EXPMatchers+contain.h */, + D276663C50D7522A8147E7EA /* EXPMatchers+contain.m */, + 787AB22095C208AE2B08F4BD /* EXPMatchers+endWith.h */, + 280C36CD5D509C370E16A95C /* EXPMatchers+endWith.m */, + C7E41D3C4AE5DF9B187F936B /* EXPMatchers+equal.h */, + 0A19F83233A6448FBB900987 /* EXPMatchers+equal.m */, + E5A8936FDC099C9F6F358059 /* EXPMatchers+haveCountOf.h */, + 298786748608B5848E826326 /* EXPMatchers+haveCountOf.m */, + A0BB2BA14BE1FB29B4B2C752 /* EXPMatchers+match.h */, + 7B68A532C78D629F3B36982B /* EXPMatchers+match.m */, + 14324273647B2D03DDE54FFF /* EXPMatchers+postNotification.h */, + B48E4B6E8DBA72D76A051805 /* EXPMatchers+postNotification.m */, + 76C7BBE3CB31ABD62B6120C8 /* EXPMatchers+raise.h */, + 17FB11E5C5893920E688A8CB /* EXPMatchers+raise.m */, + 26E81B27039EBACD0A2D1658 /* EXPMatchers+raiseWithReason.h */, + B346F92160B3F2944E510A6A /* EXPMatchers+raiseWithReason.m */, + 54DBEFB67C1195EFBF8FF435 /* EXPMatchers+respondTo.h */, + B3D3F58A54F4F1E06417442B /* EXPMatchers+respondTo.m */, + 06DF8DACD4EB525AF0994799 /* EXPUnsupportedObject.h */, + 014621B70DB490593F4E520A /* EXPUnsupportedObject.m */, + A5C32F67D947A0F208F37FFA /* Expecta.h */, + 0697F10FDF4361FAC6FCD666 /* ExpectaObject.h */, + 43C80395C21A7CC033E50AF1 /* ExpectaObject.m */, + E63780BA0E7CE6068D280BCA /* ExpectaSupport.h */, + 93E5DF31C16F9E313700A54F /* ExpectaSupport.m */, + F392CC5E821C2BCE0F17D579 /* NSObject+Expecta.h */, + 3F5089FDAD849CFEBF4976D5 /* NSValue+Expecta.h */, + 0887561851B299D5F4AA7F96 /* NSValue+Expecta.m */, + D1A5EDB763304E6B046EB579 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase"; + path = Expecta; sourceTree = ""; }; - 54063F7F43B98DDF25E6D5BC /* Pods */ = { + 1C40F568E64DFBE8BAD7483E /* Support Files */ = { isa = PBXGroup; children = ( - 20F12CD3A44C5DC39DCCE9C3 /* FBSnapshotTestCase */, - 8EB3D0D58C9AB3EC57D9FFFD /* KIF */, + D1FCD977D16806F62F89FB33 /* Pods-JazzHandsTests-Specta.xcconfig */, + 4C5C16C3144999F0091CF7F0 /* Pods-JazzHandsTests-Specta-Private.xcconfig */, + 43B44E496437786C5B1E962C /* Pods-JazzHandsTests-Specta-dummy.m */, + 1D909E7FBF5A4029D49C5652 /* Pods-JazzHandsTests-Specta-prefix.pch */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/Pods-JazzHandsTests-Specta"; sourceTree = ""; }; - 5F3FB29A15E39344DBE4C84C /* Support Files */ = { + 275E00DECAB0F42A20B4B904 /* Pods */ = { isa = PBXGroup; children = ( - A5E7B9060EF44E96E76DD0EE /* Pods-JazzHandsDemo-JazzHands.xcconfig */, - 42E75919FAF7203428A0E887 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */, - BC1D27E4895BB488EB1D0B1C /* Pods-JazzHandsDemo-JazzHands-dummy.m */, - 5D41A46448B3B2716DBE60FE /* Pods-JazzHandsDemo-JazzHands-prefix.pch */, - 216F519D98B5FA7FEC9ECC4E /* Pods-JazzHandsTests-JazzHands.xcconfig */, - 9CF4C69F0DA2C84B7649961F /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */, - 319905129F4A1CCA67639C25 /* Pods-JazzHandsTests-JazzHands-dummy.m */, - 0623EB00CE30F1B76CE2994D /* Pods-JazzHandsTests-JazzHands-prefix.pch */, + 167D2AC5CCE33AA0355BBA23 /* Expecta */, + B563EDD71302767E4BDB732B /* Specta */, ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands"; + name = Pods; sourceTree = ""; }; - 646BCE5BD0FC14093561D9D4 /* JazzHands */ = { + 648FF1AD96B747BBE868A118 /* JazzHands */ = { isa = PBXGroup; children = ( - C9883750C104249C45CD924C /* IFTTTAlphaAnimation.h */, - EE15649BB8576B4E098929BF /* IFTTTAlphaAnimation.m */, - DD36FF3EF53F78FD102396E0 /* IFTTTAngleAnimation.h */, - 915BB9CF037C8266840A9F50 /* IFTTTAngleAnimation.m */, - 44E93E7EC9E94ADFAE8DC0FD /* IFTTTAnimatedScrollViewController.h */, - 85CEAE78062CD7509D84CB86 /* IFTTTAnimatedScrollViewController.m */, - 3C055AA3D333823BDB173B33 /* IFTTTAnimation.h */, - 7FD4826CE81E8A9A5B3FCB7E /* IFTTTAnimation.m */, - 652D2110802E63186F337E1F /* IFTTTAnimationFrame.h */, - D0734BBED1195B3158A5EB6A /* IFTTTAnimationFrame.m */, - 753EE94CACAEF5B575AF892E /* IFTTTAnimationKeyFrame.h */, - 21F65937361658EC44335F92 /* IFTTTAnimationKeyFrame.m */, - AD7E7EEE462AC2D83B56B75D /* IFTTTAnimator.h */, - F216A32D6D191C3234DCE413 /* IFTTTAnimator.m */, - DA4F5570E36F3CC8EE72E028 /* IFTTTColorAnimation.h */, - 1566D6FB421D545BE39A6651 /* IFTTTColorAnimation.m */, - FBE7509D66A773BD53478D27 /* IFTTTConstraintsAnimation.h */, - 080D25604009B8109FF817BE /* IFTTTConstraintsAnimation.m */, - 6847135A20FFE1AD5524D7D0 /* IFTTTCornerRadiusAnimation.h */, - 1300C1FC3284AD2D23833154 /* IFTTTCornerRadiusAnimation.m */, - C1B1B67A79413AD1E07925E8 /* IFTTTEasingFunction.h */, - F9DC64CF46841D674D78921E /* IFTTTEasingFunction.m */, - 6E9C1FB250BD00113DF32AF3 /* IFTTTFrameAnimation.h */, - B35B46A0F8CB9ABA014BC8BE /* IFTTTFrameAnimation.m */, - 6E29E9543A91C67EF6B91598 /* IFTTTHideAnimation.h */, - E7AF4D250C9B583C91B5A2BA /* IFTTTHideAnimation.m */, - EEAD12BEF19EDE749A5C66A3 /* IFTTTJazzHands.h */, - 48923395B02318400C9A97F2 /* IFTTTScaleAnimation.h */, - 8BDA79FB2BE4B818B3A18615 /* IFTTTScaleAnimation.m */, - 338E02428339143290E57031 /* IFTTTTextColorAnimation.h */, - 16A2F693C98C6E0F994B99BF /* IFTTTTextColorAnimation.m */, - 8AED21C6A67508B00B912D2D /* IFTTTTransform3DAnimation.h */, - 1B1B245A8C63B9024CD7FB3C /* IFTTTTransform3DAnimation.m */, + 459F273807851C27BACEA41C /* IFTTTAlphaAnimation.h */, + 46058DBAECF9273509E2984A /* IFTTTAlphaAnimation.m */, + 58B07CE6E985CD85BAF28A4C /* IFTTTAnimatable.h */, + D080568FEB9EEFEDE67B1FEB /* IFTTTAnimatedPagingScrollViewController.h */, + 22945D9961216B78017FBC0C /* IFTTTAnimatedPagingScrollViewController.m */, + 189F102FDADF37A3C0886332 /* IFTTTAnimatedScrollViewController.h */, + F21ABAF0CA4BF1BD7E53FF6C /* IFTTTAnimatedScrollViewController.m */, + 451C44D78ED8B8365AC5BEC9 /* IFTTTAnimation.h */, + 3E7AF9B9766985BAD6BE2421 /* IFTTTAnimation.m */, + 32665C816421C6BD84BF079D /* IFTTTAnimator.h */, + 6F1FB3B2BB701BF95064CE4E /* IFTTTAnimator.m */, + C3F450459912740182731099 /* IFTTTColorAnimation.h */, + A78E0FC22514B43DFE608827 /* IFTTTColorAnimation.m */, + 2557BB302523E5908ADE8698 /* IFTTTConstraintConstantAnimation.h */, + E605A59EB565BC24B8B2FA32 /* IFTTTConstraintConstantAnimation.m */, + 002B3F0C1D3CD604CF06E479 /* IFTTTConstraintMultiplierAnimation.h */, + 39443B74259B804EC826F6A7 /* IFTTTConstraintMultiplierAnimation.m */, + 6B4BC6B019092783446C185E /* IFTTTCornerRadiusAnimation.h */, + 8648D504A9F151202BC02326 /* IFTTTCornerRadiusAnimation.m */, + DBB2A7859D701D920BE8B591 /* IFTTTEasingFunction.h */, + AA224E51A2963A34CD39A8B2 /* IFTTTEasingFunction.m */, + 7BFF4DE3C75DE7EBB3B7DE4F /* IFTTTFillColorAnimation.h */, + F8DFCA3B8691BA59EEAA9648 /* IFTTTFillColorAnimation.m */, + C79624E726B5887222BEE96D /* IFTTTFilmstrip.h */, + D6B500A598A22EA5D9B7D626 /* IFTTTFilmstrip.m */, + 8A84BCAFD4DCE5B63BB893B9 /* IFTTTFrameAnimation.h */, + 86C778FBAF3569F881329DC3 /* IFTTTFrameAnimation.m */, + 2BD6FC1C838F4EA59535EC7B /* IFTTTHideAnimation.h */, + FC8D6323659AFA81B01FB6C9 /* IFTTTHideAnimation.m */, + 3C280155A5FA68882E1457C3 /* IFTTTInterpolatable.h */, + 1B714C24FA4738E28E77B878 /* IFTTTInterpolatable.m */, + 69EF441B3A7387684C69C57C /* IFTTTJazzHands.h */, + 2FB33694C2D99FA54FE7FB56 /* IFTTTLabelAnimation.h */, + 7962EC97E740A52F7ACA2044 /* IFTTTLabelAnimation.m */, + 16E7197913DA65A2A2ED5F63 /* IFTTTRotationAnimation.h */, + FA2CAA3C43B61C68D8DF29E9 /* IFTTTRotationAnimation.m */, + C78853DCFB0D13B5269AA48D /* IFTTTScaleAnimation.h */, + F7ABB9B572EF8A1553622BF8 /* IFTTTScaleAnimation.m */, + 7ACF87B2A9B3693B7B157FAE /* IFTTTScrollViewPageConstraintAnimation.h */, + D89E35A8EBC952A2AA8FEF03 /* IFTTTScrollViewPageConstraintAnimation.m */, + AD3CEFB39115B48873FF3E99 /* IFTTTShapeLayerAnimation.h */, + 0F4A2DB3FD89E5FE2B4D5278 /* IFTTTShapeLayerAnimation.m */, + C3FB2353AD48A3DF3288FC6B /* IFTTTStrokeEndAnimation.h */, + 40326F9B29A545752472E2EA /* IFTTTStrokeEndAnimation.m */, + 44A0431AFDB1AD67060A6B8A /* IFTTTStrokeStartAnimation.h */, + BBC7AD019563FB8FEDD8B06A /* IFTTTStrokeStartAnimation.m */, + 63F87023FDD6D465E5447D36 /* IFTTTTextColorAnimation.h */, + 8784F8C1C06ACF53C472CF54 /* IFTTTTextColorAnimation.m */, + 9B196D682CD3033507868B17 /* IFTTTTransform3DAnimation.h */, + 50AF64A686F4155BD6C8878E /* IFTTTTransform3DAnimation.m */, + 5316E8D39354AC4F858E123A /* IFTTTTranslationAnimation.h */, + EFC775CDEB23A70B6884CB02 /* IFTTTTranslationAnimation.m */, + 8AE62A256E02B4DAF70DB7BC /* IFTTTViewAnimation.h */, + 070C7B1D690A3EF19BC88EF3 /* IFTTTViewAnimation.m */, + 5ED1E5279DA220B6B619CB3E /* UIView+IFTTTJazzHands.h */, + 617C2814D9982B227FF974D3 /* UIView+IFTTTJazzHands.m */, ); path = JazzHands; sourceTree = ""; }; - 69946D940E563CD14D60C6A4 /* Support Files */ = { + 717DB3E8A8456BC8B1F76AC4 /* Support Files */ = { isa = PBXGroup; children = ( - 56743DE181DD32ABFD735AA0 /* Pods-JazzHandsTests-KIF.xcconfig */, - 49DA91330977A0749C5DCFB4 /* Pods-JazzHandsTests-KIF-Private.xcconfig */, - B48DA303C0F737D295810557 /* Pods-JazzHandsTests-KIF-dummy.m */, - 77290F40DC545A3E0F975FBB /* Pods-JazzHandsTests-KIF-prefix.pch */, + 14A80AB118A0EE2B2947711B /* Pods-JazzHandsDemo-JazzHands.xcconfig */, + EC0BC404FA398C41FAF29A61 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */, + 973C32FD26864247497B7236 /* Pods-JazzHandsDemo-JazzHands-dummy.m */, + AE8C1D15D7610F47CC08A179 /* Pods-JazzHandsDemo-JazzHands-prefix.pch */, + 2A6E2D7F2E0424579F2606E9 /* Pods-JazzHandsTests-JazzHands.xcconfig */, + 79630B7461BAFF7D351A2F7D /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */, + BAA5614F8FE38FD411809D28 /* Pods-JazzHandsTests-JazzHands-dummy.m */, + 91090D565DF6780E0A22BC9C /* Pods-JazzHandsTests-JazzHands-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/Pods-JazzHandsTests-KIF"; + path = "Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands"; sourceTree = ""; }; - 71A6F150F4D2CB1732E341D7 /* iOS */ = { + 7D64C95AB5CB37740A4C247E /* Targets Support Files */ = { isa = PBXGroup; children = ( - 7B90CEA7E0A74BDC1CEB6A8F /* CoreGraphics.framework */, - 586BBAE15F08B3EF5E3AA422 /* Foundation.framework */, - 5B2467017731B6A57A702235 /* IOKit.framework */, - B114F8BC115DBB2E2B80A5CA /* QuartzCore.framework */, - 1490ADE661D8B8F1E1EB2225 /* UIKit.framework */, - BC1B23BD8D61F24277A842D8 /* XCTest.framework */, + 832FFDF8089570EC4B9EA6E7 /* Pods-JazzHandsDemo */, + 0BBD42FD52117740E74282AB /* Pods-JazzHandsTests */, ); - name = iOS; + name = "Targets Support Files"; sourceTree = ""; }; - 79C2237190BEE81186B08029 /* XCTest */ = { + 832FFDF8089570EC4B9EA6E7 /* Pods-JazzHandsDemo */ = { isa = PBXGroup; children = ( - F1684BC9E83BDB69098058C0 /* CGGeometry-KIFAdditions.h */, - CAFF5A2662BF9A21D8799F27 /* CGGeometry-KIFAdditions.m */, - D4D975905FF759A215E4B7F6 /* KIF.h */, - ACB93FAACE32F589FEB4C8B6 /* KIFSystemTestActor.h */, - 1784419FC8351B725C24E28C /* KIFSystemTestActor.m */, - 928938C0715A8451256115FE /* KIFTestActor.h */, - 511DC5D73AA68415AEB86083 /* KIFTestActor.m */, - 043AC8359396697F9390CF08 /* KIFTestCase.h */, - 73660A05BBBC26AB985D77C6 /* KIFTestCase.m */, - 3E27611507A8B509CEA982F3 /* KIFTestStepValidation.h */, - DC2CF30AFCC24C1AA3A02027 /* KIFTestStepValidation.m */, - E7BA8A335C37F43E6F7BA644 /* KIFTypist.h */, - 071A08A2564C4F14A890A402 /* KIFTypist.m */, - 64872AB43E95ED154D9C7567 /* KIFUITestActor.h */, - 9B0B1A3F4E1F889FD1C0922E /* KIFUITestActor.m */, - 47BBA80C2F8AC21489CF9C00 /* KIFUITestActor-ConditionalTests.h */, - 1DB3418F5FE5AEEC2E48686C /* KIFUITestActor-ConditionalTests.m */, - 5F94E50700C4F8449AC20695 /* LoadableCategory.h */, - A1DD39D32151067AB8B05EAC /* NSBundle-KIFAdditions.h */, - E140AB3FA8CBB0ED8B44EB9D /* NSBundle-KIFAdditions.m */, - E1319A038AAB0933C0BF850A /* NSError-KIFAdditions.h */, - E627E94BE15DF7A1E716CDA2 /* NSError-KIFAdditions.m */, - FF117F1F9AC8F6ED92B638A1 /* NSException-KIFAdditions.h */, - 184C09699F1DBE4EDD8E0B44 /* NSException-KIFAdditions.m */, - 45A01F72296E1891E6CFFF5B /* NSFileManager-KIFAdditions.h */, - D281B398041DEDFA26A55A4E /* NSFileManager-KIFAdditions.m */, - 194690D0C44A07261C2140BF /* UIAccessibilityElement-KIFAdditions.h */, - 4A5BACC1C01FA2DF37DA63BE /* UIAccessibilityElement-KIFAdditions.m */, - 85035BA70AF2DA3581F5316C /* UIApplication-KIFAdditions.h */, - F9688CC70B27E3D3D92EC8E0 /* UIApplication-KIFAdditions.m */, - 9A7CC9C53BC9E8DDF1D6F469 /* UIAutomationHelper.h */, - E14E3068348FC0892C0F2E5A /* UIAutomationHelper.m */, - 0E96B13C6F6E68FF06851EB6 /* UIEvent+KIFAdditions.h */, - B1BA9E0A82BB8D0C228A3E74 /* UIEvent+KIFAdditions.m */, - C293B64197275F3D9DF826C5 /* UIScrollView-KIFAdditions.h */, - 4C00B9C3B187857A9FEC7651 /* UIScrollView-KIFAdditions.m */, - E65C2B4A83C466DB92066E35 /* UITableView-KIFAdditions.h */, - 2D9A3040D3BF6F24E947F76B /* UITableView-KIFAdditions.m */, - 7FB8C462077D25A302F11ED2 /* UITouch-KIFAdditions.h */, - 2E18973E008A4BC00480F420 /* UITouch-KIFAdditions.m */, - 9C23A2C6E2264EC23D177443 /* UIView-KIFAdditions.h */, - 4A6F77393A57C18EA64DB988 /* UIView-KIFAdditions.m */, - 491129F86B49E41FCD576CA3 /* UIWindow-KIFAdditions.h */, - A3A7F20410D9D7EE75D5A450 /* UIWindow-KIFAdditions.m */, - AA3900E39A50980B7CBE690D /* XCTestCase-KIFAdditions.h */, - 6039E18C8EAAD4039323B10D /* XCTestCase-KIFAdditions.m */, + 40191242206A6771F3A73399 /* Pods-JazzHandsDemo-acknowledgements.markdown */, + E38F35C26AB7D5154A5953F4 /* Pods-JazzHandsDemo-acknowledgements.plist */, + F1B8D1A5453D3DF1C84D3921 /* Pods-JazzHandsDemo-dummy.m */, + 1656EA22E4969961BC3B5B0C /* Pods-JazzHandsDemo-environment.h */, + 1A1DF926FD8C2951B34A5597 /* Pods-JazzHandsDemo-resources.sh */, + 5FD2A64DAA1C81948F968D6E /* Pods-JazzHandsDemo.debug.xcconfig */, + 60882D6AD680D2C57B8EAFF6 /* Pods-JazzHandsDemo.release.xcconfig */, ); - name = XCTest; + name = "Pods-JazzHandsDemo"; + path = "Target Support Files/Pods-JazzHandsDemo"; sourceTree = ""; }; - 80A4FA50A84FF16330E23366 /* Products */ = { + 9F2B930B494335C5C3F1D42B /* Development Pods */ = { isa = PBXGroup; children = ( - 0FE763717EEAB5E0E52D6B84 /* libPods-JazzHandsDemo.a */, - F1C2DD8B9B4063E104753350 /* libPods-JazzHandsDemo-JazzHands.a */, - E5EAE8B949D325AF39A9DC48 /* libPods-JazzHandsTests.a */, - 6530F0A74583360D8B4EBEED /* libPods-JazzHandsTests-FBSnapshotTestCase.a */, - 4847536E809420D86FCA4EFA /* libPods-JazzHandsTests-JazzHands.a */, - C94499F9702BCF1A9D554F23 /* libPods-JazzHandsTests-KIF.a */, + DA2CB438AF2DFEA11F0780BD /* JazzHands */, ); - name = Products; + name = "Development Pods"; sourceTree = ""; }; - 8EB3D0D58C9AB3EC57D9FFFD /* KIF */ = { + A9A9A7D58859EFCEFC943907 /* Frameworks */ = { isa = PBXGroup; children = ( - 69946D940E563CD14D60C6A4 /* Support Files */, - 79C2237190BEE81186B08029 /* XCTest */, + 00C3FBEA96F41AE7CFE824E1 /* iOS */, ); - path = KIF; + name = Frameworks; sourceTree = ""; }; - A657EA7CC74D732155E5B588 /* JazzHands */ = { + AF874F5F26544B4F2C13EA0E /* Products */ = { isa = PBXGroup; children = ( - 646BCE5BD0FC14093561D9D4 /* JazzHands */, - 5F3FB29A15E39344DBE4C84C /* Support Files */, + 1E1C0EF61FBBE9F82792590A /* libPods-JazzHandsDemo.a */, + 02CD155D711CF74BE325D301 /* libPods-JazzHandsDemo-JazzHands.a */, + A7018257716276765EEB9B58 /* libPods-JazzHandsTests.a */, + 6777804BC0388D39ACE6689E /* libPods-JazzHandsTests-Expecta.a */, + B36A523A2C7A359B40B5BAD8 /* libPods-JazzHandsTests-JazzHands.a */, + 96CFC496BB2080C86009C9DB /* libPods-JazzHandsTests-Specta.a */, ); - name = JazzHands; - path = ../..; + name = Products; sourceTree = ""; }; - A9FC2880F4D0FE1B4C382BDF /* Development Pods */ = { + B563EDD71302767E4BDB732B /* Specta */ = { isa = PBXGroup; children = ( - A657EA7CC74D732155E5B588 /* JazzHands */, + 3B338FDC538D2FA4A0BBEEF7 /* SPTCallSite.h */, + 9B79C571F17C761639AC7E08 /* SPTCallSite.m */, + 352184A1C5CD3DBEAAD9D37F /* SPTCompiledExample.h */, + 64BC5B9F2416623BFCAE698D /* SPTCompiledExample.m */, + 00648A5FD04F7B2C6522763B /* SPTExample.h */, + 92FB2FE75E866F191BD2BA57 /* SPTExample.m */, + A13035E609D54AFB3C76DD1B /* SPTExampleGroup.h */, + 00782EF2619A5B6F441F4BDC /* SPTExampleGroup.m */, + 047140F40CA374B06271AF10 /* SPTExcludeGlobalBeforeAfterEach.h */, + 198385680DB8962AB44D0F34 /* SPTGlobalBeforeAfterEach.h */, + 4F49D4E545DC90CFBE1481DF /* SPTSharedExampleGroups.h */, + 88F2587FBDCBEB011B30CF0B /* SPTSharedExampleGroups.m */, + 4CF2DBA56BE8A1E325A0C7CA /* SPTSpec.h */, + 1D66990FB5081BD3D897B74E /* SPTSpec.m */, + 8CA3BEF356504E9E249AC501 /* SPTTestSuite.h */, + 5EB787D8662B9EB201FC4A6A /* SPTTestSuite.m */, + B723FE99B0F1D3BF959D9A3C /* Specta.h */, + C068DC956F7E93648FFC4C74 /* SpectaDSL.h */, + 47027D439C3E5ADB7AEFD95A /* SpectaDSL.m */, + 89F3C37F0E067C82613CC37A /* SpectaTypes.h */, + B4BE827C13C6FD930490949E /* SpectaUtility.h */, + 7BEA82AF02164C5A6D191C89 /* SpectaUtility.m */, + FB871F670A5C4E828BA5F0FE /* XCTest+Private.h */, + 731751E70BE7FCCF04898EA6 /* XCTestCase+Specta.h */, + 53BF2B2D9C146BD56D3B322D /* XCTestCase+Specta.m */, + 1C40F568E64DFBE8BAD7483E /* Support Files */, ); - name = "Development Pods"; + path = Specta; sourceTree = ""; }; - C888CD93A4F5936C3EB2FEC7 = { + CFA5EDA2CE2BEBB2E0526E86 = { isa = PBXGroup; children = ( - E67734D3CDFE3F18D9041897 /* Podfile */, - A9FC2880F4D0FE1B4C382BDF /* Development Pods */, - D9A03CF730E88BFB73EA25C8 /* Frameworks */, - 54063F7F43B98DDF25E6D5BC /* Pods */, - 80A4FA50A84FF16330E23366 /* Products */, - EF72E40F82DF0477AC82BDF5 /* Targets Support Files */, + 8DCE8261A2DAE3BF5C48FB96 /* Podfile */, + 9F2B930B494335C5C3F1D42B /* Development Pods */, + A9A9A7D58859EFCEFC943907 /* Frameworks */, + 275E00DECAB0F42A20B4B904 /* Pods */, + AF874F5F26544B4F2C13EA0E /* Products */, + 7D64C95AB5CB37740A4C247E /* Targets Support Files */, ); sourceTree = ""; }; - D9A03CF730E88BFB73EA25C8 /* Frameworks */ = { + D1A5EDB763304E6B046EB579 /* Support Files */ = { isa = PBXGroup; children = ( - 71A6F150F4D2CB1732E341D7 /* iOS */, + F76CA17F62548EEF8DE345D7 /* Pods-JazzHandsTests-Expecta.xcconfig */, + 44778620D0A4684796F1A953 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */, + 16843D73F03FCF88745D4F06 /* Pods-JazzHandsTests-Expecta-dummy.m */, + 3DCE159FE5C1B43DFC2CAF16 /* Pods-JazzHandsTests-Expecta-prefix.pch */, ); - name = Frameworks; + name = "Support Files"; + path = "../Target Support Files/Pods-JazzHandsTests-Expecta"; sourceTree = ""; }; - EF72E40F82DF0477AC82BDF5 /* Targets Support Files */ = { + DA2CB438AF2DFEA11F0780BD /* JazzHands */ = { isa = PBXGroup; children = ( - 04EF622C2C461BB3386B01DF /* Pods-JazzHandsDemo */, - 2ED3E558E31346B6180970AC /* Pods-JazzHandsTests */, + 648FF1AD96B747BBE868A118 /* JazzHands */, + 717DB3E8A8456BC8B1F76AC4 /* Support Files */, ); - name = "Targets Support Files"; + name = JazzHands; + path = ../..; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 1E095E8BF61C8F6E8D87257C /* Headers */ = { + 104757F81A16E38D474E13F5 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5E69FC0358D8196906566A81 /* IFTTTAlphaAnimation.h in Headers */, - C6471B381997F0FAAF10CFAB /* IFTTTAngleAnimation.h in Headers */, - 9D6DBF4A80E028B5EEB4B72B /* IFTTTAnimatedScrollViewController.h in Headers */, - 796823C3B7AF12E6365E5CF7 /* IFTTTAnimation.h in Headers */, - 8253E9B466683B7716DA5816 /* IFTTTAnimationFrame.h in Headers */, - 9BCE4D1999FEC6F39CB69558 /* IFTTTAnimationKeyFrame.h in Headers */, - 92F66209607375EBB274D0AB /* IFTTTAnimator.h in Headers */, - CBBDB111ADF0543D3C712CCD /* IFTTTColorAnimation.h in Headers */, - 27CBAE27627409ECAC3EBF4F /* IFTTTConstraintsAnimation.h in Headers */, - 24ACBE85B6D07C0DDFC1B9DE /* IFTTTCornerRadiusAnimation.h in Headers */, - 0291013306F073A76E5A7471 /* IFTTTEasingFunction.h in Headers */, - F74461CBEE12D10970B2BC93 /* IFTTTFrameAnimation.h in Headers */, - AC8476E6E1798A7F4B27BB54 /* IFTTTHideAnimation.h in Headers */, - 1DB6B6C0476CAE3F42DF636B /* IFTTTJazzHands.h in Headers */, - A9A8E3A98219E9290D706174 /* IFTTTScaleAnimation.h in Headers */, - BF01925966674FA553339B93 /* IFTTTTextColorAnimation.h in Headers */, - 312E971E59992BD1B32BF033 /* IFTTTTransform3DAnimation.h in Headers */, + D8F79FFAAE4FDD20DAA99F54 /* IFTTTAlphaAnimation.h in Headers */, + 399CB0C543D7AFFBE45D1E29 /* IFTTTAnimatable.h in Headers */, + 04583811D006FD0FFB194B0D /* IFTTTAnimatedPagingScrollViewController.h in Headers */, + 24EFC11F97E6F3FCA3AFC3D2 /* IFTTTAnimatedScrollViewController.h in Headers */, + CD89824A41AE568A007A132E /* IFTTTAnimation.h in Headers */, + B270E452D8FD24B16FCF201A /* IFTTTAnimator.h in Headers */, + 5393E8721100915F390FF4ED /* IFTTTColorAnimation.h in Headers */, + D7A6C7A56AD752403E9B84C8 /* IFTTTConstraintConstantAnimation.h in Headers */, + D74D02F94B80F3199A0C53A0 /* IFTTTConstraintMultiplierAnimation.h in Headers */, + 5ED6352EB7087DDCE1A35032 /* IFTTTCornerRadiusAnimation.h in Headers */, + 655CCFCA5EDB23D8C40FDE09 /* IFTTTEasingFunction.h in Headers */, + 61C8523C2CDB8F80E3CBD733 /* IFTTTFillColorAnimation.h in Headers */, + B494A81123DBFF39435BAAA3 /* IFTTTFilmstrip.h in Headers */, + BC7F1B89652998205B65AE3F /* IFTTTFrameAnimation.h in Headers */, + 5A7114B7BE48EF78673C5C0F /* IFTTTHideAnimation.h in Headers */, + D721F1DA841546ABEAA342B9 /* IFTTTInterpolatable.h in Headers */, + FD55ACF1C724D81DB0954A8C /* IFTTTJazzHands.h in Headers */, + 088CF428927B789FE53D19C0 /* IFTTTLabelAnimation.h in Headers */, + 6B55F7B6AB7CF1F8F0BD1B5D /* IFTTTRotationAnimation.h in Headers */, + B9C41F18238D6108DE06DEDC /* IFTTTScaleAnimation.h in Headers */, + 4EA21EDF74A889588B259EF4 /* IFTTTScrollViewPageConstraintAnimation.h in Headers */, + 688417F091474F9FDFC191E9 /* IFTTTShapeLayerAnimation.h in Headers */, + 3F1C1DDFB0172B0500BE4B5C /* IFTTTStrokeEndAnimation.h in Headers */, + A814A155BF991270BF10F11C /* IFTTTStrokeStartAnimation.h in Headers */, + FFDAFE99810307413B56A9FB /* IFTTTTextColorAnimation.h in Headers */, + 775274E0E93D201F8BF9DE29 /* IFTTTTransform3DAnimation.h in Headers */, + 3EB6B177AD3AC79168B3496C /* IFTTTTranslationAnimation.h in Headers */, + 56FAE01B8097D11F6D36C6CC /* IFTTTViewAnimation.h in Headers */, + 409682A9E7C96EB93F02C85B /* UIView+IFTTTJazzHands.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A0410A24C8EF6FF2E079D34B /* Headers */ = { + 3D2F5449CEBCB561F6C36DD8 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1517BBA3CB5AABFAC770A108 /* CGGeometry-KIFAdditions.h in Headers */, - 243CB53653364BA2BAFDCB57 /* KIF.h in Headers */, - 8496A70D670BC99CA4359E91 /* KIFSystemTestActor.h in Headers */, - 2B34EBAC49912D9BD52C248C /* KIFTestActor.h in Headers */, - 32D11B012AEF418C095671F6 /* KIFTestCase.h in Headers */, - 96E26EC1D77AB6929D03AB80 /* KIFTestStepValidation.h in Headers */, - 5B2B2105FD2F02C693F80E11 /* KIFTypist.h in Headers */, - AB13DD9570E0FB147E64BFA4 /* KIFUITestActor-ConditionalTests.h in Headers */, - 461DF07F7385E07C688F0F06 /* KIFUITestActor.h in Headers */, - B177566D1F998C6830876DC6 /* LoadableCategory.h in Headers */, - 8535193232199F9DDCF9841C /* NSBundle-KIFAdditions.h in Headers */, - 22CF0A8ACB04B0E5694AB2B5 /* NSError-KIFAdditions.h in Headers */, - ED378EA08278DBDDB2DE2CA5 /* NSException-KIFAdditions.h in Headers */, - 4BC2936B3B60E32CFD7AF59E /* NSFileManager-KIFAdditions.h in Headers */, - 3BB17F8BF922DA0A2047F9AA /* UIAccessibilityElement-KIFAdditions.h in Headers */, - 5253EF230D3F76BE85DC5C47 /* UIApplication-KIFAdditions.h in Headers */, - 413D09D1332A4F859B302001 /* UIAutomationHelper.h in Headers */, - AA6C8FBEF3860B72B296A2EC /* UIEvent+KIFAdditions.h in Headers */, - EC2E187B9885097DE11D3CDD /* UIScrollView-KIFAdditions.h in Headers */, - EF2C006E6FFA279794C2757F /* UITableView-KIFAdditions.h in Headers */, - 5C6404B3E11EF116D6AEC858 /* UITouch-KIFAdditions.h in Headers */, - DEAD7854B86F6F4F901B3BBD /* UIView-KIFAdditions.h in Headers */, - F74D71BDDAB53DE16386A11F /* UIWindow-KIFAdditions.h in Headers */, - 89EFA5DA7348136212ED6A86 /* XCTestCase-KIFAdditions.h in Headers */, + B3DDE119C2CFFA9BEB8ECED9 /* IFTTTAlphaAnimation.h in Headers */, + 5C00F1D6309BC469E2304D82 /* IFTTTAnimatable.h in Headers */, + 76593C9CE984319FAEE27EED /* IFTTTAnimatedPagingScrollViewController.h in Headers */, + 69234E5708951D7F832AE407 /* IFTTTAnimatedScrollViewController.h in Headers */, + 7217A83EFB38B174A9D6162A /* IFTTTAnimation.h in Headers */, + E8AE771AB3C90A947DC74EA3 /* IFTTTAnimator.h in Headers */, + BDDC66A8AF23316E1A217892 /* IFTTTColorAnimation.h in Headers */, + B30A69A986FEF10F9217F3BC /* IFTTTConstraintConstantAnimation.h in Headers */, + 164E1262D4B3664A3FB9F92F /* IFTTTConstraintMultiplierAnimation.h in Headers */, + 39BBAC06230A5D2A0E7CF62E /* IFTTTCornerRadiusAnimation.h in Headers */, + 9BB5E63A9EEFC44614BA06B0 /* IFTTTEasingFunction.h in Headers */, + 295093E7D8CE1AB43BC4318B /* IFTTTFillColorAnimation.h in Headers */, + 8E11F31EED96015F2D997109 /* IFTTTFilmstrip.h in Headers */, + 6FEEB2F009C9C844B7D15EC0 /* IFTTTFrameAnimation.h in Headers */, + 7B55872BFB06FD7A286ABF2A /* IFTTTHideAnimation.h in Headers */, + C6ABFF1C8ED45E1F31F020A4 /* IFTTTInterpolatable.h in Headers */, + 81A07B81B785529B6FD10C7A /* IFTTTJazzHands.h in Headers */, + AC0AEB8C81E1064292170709 /* IFTTTLabelAnimation.h in Headers */, + 7267E8ECA27C3EF3D72CF59C /* IFTTTRotationAnimation.h in Headers */, + 232AB5EA8EF425C279D4A852 /* IFTTTScaleAnimation.h in Headers */, + 76054A442B353094885E9A5D /* IFTTTScrollViewPageConstraintAnimation.h in Headers */, + 7B34DDD8C74FC221EA3BD64F /* IFTTTShapeLayerAnimation.h in Headers */, + 25C8C11695388F270495945C /* IFTTTStrokeEndAnimation.h in Headers */, + EC8173FB83791991F07D7778 /* IFTTTStrokeStartAnimation.h in Headers */, + 729DCD5A3479BE3A082BA215 /* IFTTTTextColorAnimation.h in Headers */, + 2B36ACA9898B67CCF635A7E9 /* IFTTTTransform3DAnimation.h in Headers */, + 456CC6C07CD8D158135AA3F9 /* IFTTTTranslationAnimation.h in Headers */, + 32FBE19B0B3A6E062A01D2EB /* IFTTTViewAnimation.h in Headers */, + 0EB6FF3442B2C4DEE47CDC05 /* UIView+IFTTTJazzHands.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A9E82A1A5BD21003C4E6766A /* Headers */ = { + F1275577B08A09563D628455 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 99457362116DC9CE5DF6C3EA /* FBSnapshotTestCase.h in Headers */, - CF195537561F255B2FE4A0D1 /* FBSnapshotTestController.h in Headers */, - 92AA56D9B07B1461F83A450F /* UIImage+Compare.h in Headers */, - 51A9CE11C781DC23930F7ECB /* UIImage+Diff.h in Headers */, + 95404AE22E356E330782BEE9 /* EXPBlockDefinedMatcher.h in Headers */, + 7F4EC6D7AE9F04E07D208A3F /* EXPDefines.h in Headers */, + 61A9DFFB0DF32CADFD06A300 /* EXPDoubleTuple.h in Headers */, + 8DABB0DEC27CCB358C373BD6 /* EXPExpect.h in Headers */, + F9754F92F0F36FC7D2DA370F /* EXPFloatTuple.h in Headers */, + 487A4139CF60FF871A15DB11 /* EXPMatcher.h in Headers */, + 4F0A5CA80ACC68AF50339710 /* EXPMatcherHelpers.h in Headers */, + 63A62FE4A6B54E5D43C612B8 /* EXPMatchers+beCloseTo.h in Headers */, + 2EECDC616C08489665E30D28 /* EXPMatchers+beFalsy.h in Headers */, + D512C736933357BE4BE4116C /* EXPMatchers+beGreaterThan.h in Headers */, + 931DF34122D2DEA948E54825 /* EXPMatchers+beGreaterThanOrEqualTo.h in Headers */, + 4E74D5E76749346882213B2C /* EXPMatchers+beIdenticalTo.h in Headers */, + E4378CC93258A1A29B61181D /* EXPMatchers+beInTheRangeOf.h in Headers */, + 97F7FAD23C9BF54DB9A6AD8F /* EXPMatchers+beInstanceOf.h in Headers */, + D8B9CA8A6B7C757BBFAC964B /* EXPMatchers+beKindOf.h in Headers */, + AB26427E2E93ABDBB1DF5926 /* EXPMatchers+beLessThan.h in Headers */, + 9478F95119D6A249151D7D34 /* EXPMatchers+beLessThanOrEqualTo.h in Headers */, + 3360FBA6C6DAA26E1C15532D /* EXPMatchers+beNil.h in Headers */, + 7528018662E93C45D9EC25DD /* EXPMatchers+beSubclassOf.h in Headers */, + 56218B58DBFFCAB1F9EE6F0B /* EXPMatchers+beSupersetOf.h in Headers */, + 14A9221ACE37F6A5839FCE67 /* EXPMatchers+beTruthy.h in Headers */, + CA7DE9CD9A0EF906AD5F3E8A /* EXPMatchers+beginWith.h in Headers */, + B520753AB8D35D80F07F9659 /* EXPMatchers+conformTo.h in Headers */, + 3E9582346A040FD3EFEAABC9 /* EXPMatchers+contain.h in Headers */, + A013F52A86C97AD6C444B8EC /* EXPMatchers+endWith.h in Headers */, + 536C1FF5529A6FD0E4857E95 /* EXPMatchers+equal.h in Headers */, + D15DA8F26F85BEF534109DAC /* EXPMatchers+haveCountOf.h in Headers */, + AFA5AB0FC5DD0AA1C1723A1F /* EXPMatchers+match.h in Headers */, + 57E1F9D9287CD6278828C8B8 /* EXPMatchers+postNotification.h in Headers */, + 8A3EBA4E7534E36CF6B36D84 /* EXPMatchers+raise.h in Headers */, + FBF31EF5CC8817F632B8BAD6 /* EXPMatchers+raiseWithReason.h in Headers */, + 94466FB672E80265D6E24078 /* EXPMatchers+respondTo.h in Headers */, + 57768C526413E5DB8E191EB3 /* EXPMatchers.h in Headers */, + 06924C5FE261AF1445596F47 /* EXPUnsupportedObject.h in Headers */, + BE4AA27F718B85413F1F12F4 /* Expecta.h in Headers */, + 583EE1C1F94DB05D580BD5F4 /* ExpectaObject.h in Headers */, + 739C9888B032F3D82FA48605 /* ExpectaSupport.h in Headers */, + B97B704CFF372C3C30CF910F /* NSObject+Expecta.h in Headers */, + 6844CE55704BA4382A02F64F /* NSValue+Expecta.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C5D0FEDF026FA88273E10330 /* Headers */ = { + F4D8441BE464048E5D1401BB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 8CADB8B156739D7F81651BF8 /* IFTTTAlphaAnimation.h in Headers */, - B0D8810D9AC25DBACE3491C1 /* IFTTTAngleAnimation.h in Headers */, - 8C4058D9AD7F375A39D01903 /* IFTTTAnimatedScrollViewController.h in Headers */, - 4C38F964B21C608577027621 /* IFTTTAnimation.h in Headers */, - E00D303F6C94ED556BB93AE5 /* IFTTTAnimationFrame.h in Headers */, - 5776EA3E2BB6B4A0743E3B98 /* IFTTTAnimationKeyFrame.h in Headers */, - 6551CD0CF349DCB361031D60 /* IFTTTAnimator.h in Headers */, - 3A238DDE24239A052A050E64 /* IFTTTColorAnimation.h in Headers */, - F626A866373151CB57A2A1C2 /* IFTTTConstraintsAnimation.h in Headers */, - B89B9DEDDBD98C8B661355F0 /* IFTTTCornerRadiusAnimation.h in Headers */, - AF81474AC042BDBC56F79311 /* IFTTTEasingFunction.h in Headers */, - 8DBEA273D5324FB796C4029B /* IFTTTFrameAnimation.h in Headers */, - DF9D7CBEBEF75F8F48C7359E /* IFTTTHideAnimation.h in Headers */, - D1C68BDE8C65D28829D61C87 /* IFTTTJazzHands.h in Headers */, - 0BA755C4B8FC81C21137AB78 /* IFTTTScaleAnimation.h in Headers */, - 41CCCDEDF52E9B446BB5956A /* IFTTTTextColorAnimation.h in Headers */, - 444F138D2AE5CBA885686900 /* IFTTTTransform3DAnimation.h in Headers */, + 2B588DD7108A41E74E30A301 /* SPTCallSite.h in Headers */, + A48728E264B31FEBF17BB7E0 /* SPTCompiledExample.h in Headers */, + 792D6A3CC70DF7E654F82F54 /* SPTExample.h in Headers */, + 249FD819370090BBAA4CBF28 /* SPTExampleGroup.h in Headers */, + 44F2594CE5C4309632489E71 /* SPTExcludeGlobalBeforeAfterEach.h in Headers */, + 371725B603A305B8FC1DBB38 /* SPTGlobalBeforeAfterEach.h in Headers */, + 52E4540E1E3EC3FBBFAB43FE /* SPTSharedExampleGroups.h in Headers */, + 736A13F5C0DA85EA3A01E0B5 /* SPTSpec.h in Headers */, + 31D1FA17EB86B2A7764F003E /* SPTTestSuite.h in Headers */, + 196B89DDEAC4D309784B2F36 /* Specta.h in Headers */, + 68B06A9A753F03390BC76B4F /* SpectaDSL.h in Headers */, + DDA96229186DFA613431CFA8 /* SpectaTypes.h in Headers */, + B56788485D5992F0001F0EE3 /* SpectaUtility.h in Headers */, + C7EFF90602E209951BCC1CBD /* XCTest+Private.h in Headers */, + EB801661D176E2AE6ED6D2E9 /* XCTestCase+Specta.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 56DA60F0FF47787ACF51D6AC /* Pods-JazzHandsTests */ = { + 1F7B3AE52AD450FE0ADD77E4 /* Pods-JazzHandsTests-JazzHands */ = { isa = PBXNativeTarget; - buildConfigurationList = 79F566BE6537341DF831EE68 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */; + buildConfigurationList = 263B5C3ED74E5CD514BAA8B5 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-JazzHands" */; buildPhases = ( - 9EFA481BB6091E3E38953345 /* Sources */, - FEFBB66E80E08ECCE5630C7E /* Frameworks */, + D6EB67DBB7BF12D4814BD9C2 /* Sources */, + 856B99D89E74C202D1B71530 /* Frameworks */, + 104757F81A16E38D474E13F5 /* Headers */, ); buildRules = ( ); dependencies = ( - D7153AA6C3B2A9FC43582508 /* PBXTargetDependency */, - 7EFA94BC79B52D04D6F51FB8 /* PBXTargetDependency */, - 9ED678E301EF367BF5073417 /* PBXTargetDependency */, ); - name = "Pods-JazzHandsTests"; - productName = "Pods-JazzHandsTests"; - productReference = E5EAE8B949D325AF39A9DC48 /* libPods-JazzHandsTests.a */; + name = "Pods-JazzHandsTests-JazzHands"; + productName = "Pods-JazzHandsTests-JazzHands"; + productReference = B36A523A2C7A359B40B5BAD8 /* libPods-JazzHandsTests-JazzHands.a */; productType = "com.apple.product-type.library.static"; }; - 629E749F6B357F5B71AAB91C /* Pods-JazzHandsTests-KIF */ = { + 2D5AC08F1F3DF3550B2C6AD9 /* Pods-JazzHandsTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 1233B1AB5E0528DA6550BBDC /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-KIF" */; + buildConfigurationList = 4B45977AE4B3BCD07A33FC54 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */; buildPhases = ( - 7219B04D2A698979AF8CAB60 /* Sources */, - 782D7E31CD99BBBDBFCFEAB5 /* Frameworks */, - A0410A24C8EF6FF2E079D34B /* Headers */, + 48E9612FAB4E57B991BDE843 /* Sources */, + 5888E17FE6AC23B3E6E0C6AB /* Frameworks */, ); buildRules = ( ); dependencies = ( + DF0157CF96C6F44DA8A71050 /* PBXTargetDependency */, + 9CC6E9EAFB1B49715BF085F6 /* PBXTargetDependency */, + 39DA8F0FDF49BF4DE5108B66 /* PBXTargetDependency */, ); - name = "Pods-JazzHandsTests-KIF"; - productName = "Pods-JazzHandsTests-KIF"; - productReference = C94499F9702BCF1A9D554F23 /* libPods-JazzHandsTests-KIF.a */; + name = "Pods-JazzHandsTests"; + productName = "Pods-JazzHandsTests"; + productReference = A7018257716276765EEB9B58 /* libPods-JazzHandsTests.a */; productType = "com.apple.product-type.library.static"; }; - 990A61EA846F717335941AB5 /* Pods-JazzHandsDemo-JazzHands */ = { + 474046DDD5023AF51208E1E8 /* Pods-JazzHandsTests-Specta */ = { isa = PBXNativeTarget; - buildConfigurationList = 1233516C8D7ED8823CCF0C7A /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo-JazzHands" */; + buildConfigurationList = EC6CBB492A279D7EE3BE3F2C /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Specta" */; buildPhases = ( - 3B3CF4CDAC89D8CF24E855DE /* Sources */, - 5C8AE3AEAC5FF8116969CEEB /* Frameworks */, - C5D0FEDF026FA88273E10330 /* Headers */, + 291ED0866FB88B4F57398D63 /* Sources */, + 28FE928A5C2EEF4708DE667F /* Frameworks */, + F4D8441BE464048E5D1401BB /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = "Pods-JazzHandsDemo-JazzHands"; - productName = "Pods-JazzHandsDemo-JazzHands"; - productReference = F1C2DD8B9B4063E104753350 /* libPods-JazzHandsDemo-JazzHands.a */; + name = "Pods-JazzHandsTests-Specta"; + productName = "Pods-JazzHandsTests-Specta"; + productReference = 96CFC496BB2080C86009C9DB /* libPods-JazzHandsTests-Specta.a */; productType = "com.apple.product-type.library.static"; }; - A0AEF0F12C065A30DE046310 /* Pods-JazzHandsDemo */ = { + 588A47CD6E45ECE185562513 /* Pods-JazzHandsDemo */ = { isa = PBXNativeTarget; - buildConfigurationList = 2B45A4AF849B364C7145E028 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */; + buildConfigurationList = AA5C00D87B9488DB218DDB9B /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */; buildPhases = ( - 89B4DFA155AEEA8297A36F68 /* Sources */, - 1B95DCEA0E0E6898ED58D2FC /* Frameworks */, + 7FF0016B6C281EF2C8315708 /* Sources */, + 33F0F384A0AD5A58BF262B25 /* Frameworks */, ); buildRules = ( ); dependencies = ( - 2E5FA4670FF52352B0029385 /* PBXTargetDependency */, + C6A679F7827EA441E8094160 /* PBXTargetDependency */, ); name = "Pods-JazzHandsDemo"; productName = "Pods-JazzHandsDemo"; - productReference = 0FE763717EEAB5E0E52D6B84 /* libPods-JazzHandsDemo.a */; + productReference = 1E1C0EF61FBBE9F82792590A /* libPods-JazzHandsDemo.a */; productType = "com.apple.product-type.library.static"; }; - DF2C2A1C804A04E33B10DCC5 /* Pods-JazzHandsTests-FBSnapshotTestCase */ = { + DC8E70DB547EE788D70D683D /* Pods-JazzHandsTests-Expecta */ = { isa = PBXNativeTarget; - buildConfigurationList = 1E8D2B824241A3BF183A33B3 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-FBSnapshotTestCase" */; + buildConfigurationList = 2ED3CFDF4AF2B433D24D1AE7 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Expecta" */; buildPhases = ( - 6E63F712C35B09537BE82ABD /* Sources */, - 452230011335A5719BC59E2C /* Frameworks */, - A9E82A1A5BD21003C4E6766A /* Headers */, + 258C48C2F09028FFF0453517 /* Sources */, + 79896D5B26C2E4E7E6903300 /* Frameworks */, + F1275577B08A09563D628455 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = "Pods-JazzHandsTests-FBSnapshotTestCase"; - productName = "Pods-JazzHandsTests-FBSnapshotTestCase"; - productReference = 6530F0A74583360D8B4EBEED /* libPods-JazzHandsTests-FBSnapshotTestCase.a */; + name = "Pods-JazzHandsTests-Expecta"; + productName = "Pods-JazzHandsTests-Expecta"; + productReference = 6777804BC0388D39ACE6689E /* libPods-JazzHandsTests-Expecta.a */; productType = "com.apple.product-type.library.static"; }; - F203775F0D6710D3BC5B78C3 /* Pods-JazzHandsTests-JazzHands */ = { + FE7FE84998FD9900ABE7AC0F /* Pods-JazzHandsDemo-JazzHands */ = { isa = PBXNativeTarget; - buildConfigurationList = 1425866E665D9CC70B1721C6 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-JazzHands" */; + buildConfigurationList = 3674F5A11ED44B9078E630A8 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo-JazzHands" */; buildPhases = ( - C4103D555AFC86FB2094DCBB /* Sources */, - 6F51267A589877E7C41EBA03 /* Frameworks */, - 1E095E8BF61C8F6E8D87257C /* Headers */, + 1A913E528BF1F4D8572D0153 /* Sources */, + 495CBB40E72591218E9B2614 /* Frameworks */, + 3D2F5449CEBCB561F6C36DD8 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = "Pods-JazzHandsTests-JazzHands"; - productName = "Pods-JazzHandsTests-JazzHands"; - productReference = 4847536E809420D86FCA4EFA /* libPods-JazzHandsTests-JazzHands.a */; + name = "Pods-JazzHandsDemo-JazzHands"; + productName = "Pods-JazzHandsDemo-JazzHands"; + productReference = 02CD155D711CF74BE325D301 /* libPods-JazzHandsDemo-JazzHands.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - D3EE56C18F6AC2DBE3869796 /* Project object */ = { + 178EC51E7A0545B59B0CD2AD /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0640; }; - buildConfigurationList = 2527815AADA91786E6B81B6C /* Build configuration list for PBXProject "Pods" */; + buildConfigurationList = 9816EA2DB15072877195DD3F /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); - mainGroup = C888CD93A4F5936C3EB2FEC7; - productRefGroup = 80A4FA50A84FF16330E23366 /* Products */; + mainGroup = CFA5EDA2CE2BEBB2E0526E86; + productRefGroup = AF874F5F26544B4F2C13EA0E /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - A0AEF0F12C065A30DE046310 /* Pods-JazzHandsDemo */, - 990A61EA846F717335941AB5 /* Pods-JazzHandsDemo-JazzHands */, - 56DA60F0FF47787ACF51D6AC /* Pods-JazzHandsTests */, - DF2C2A1C804A04E33B10DCC5 /* Pods-JazzHandsTests-FBSnapshotTestCase */, - F203775F0D6710D3BC5B78C3 /* Pods-JazzHandsTests-JazzHands */, - 629E749F6B357F5B71AAB91C /* Pods-JazzHandsTests-KIF */, + 588A47CD6E45ECE185562513 /* Pods-JazzHandsDemo */, + FE7FE84998FD9900ABE7AC0F /* Pods-JazzHandsDemo-JazzHands */, + 2D5AC08F1F3DF3550B2C6AD9 /* Pods-JazzHandsTests */, + DC8E70DB547EE788D70D683D /* Pods-JazzHandsTests-Expecta */, + 1F7B3AE52AD450FE0ADD77E4 /* Pods-JazzHandsTests-JazzHands */, + 474046DDD5023AF51208E1E8 /* Pods-JazzHandsTests-Specta */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 3B3CF4CDAC89D8CF24E855DE /* Sources */ = { + 1A913E528BF1F4D8572D0153 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7942FE5C4CD4C3ABC9D9EA76 /* IFTTTAlphaAnimation.m in Sources */, - 96E3E6314C5DA37DC7F66560 /* IFTTTAngleAnimation.m in Sources */, - 04FC66A79E74D12A1561DCA0 /* IFTTTAnimatedScrollViewController.m in Sources */, - 75BB3AB37DB127F992EE9A8D /* IFTTTAnimation.m in Sources */, - E40B8DBBD1A5404D79902650 /* IFTTTAnimationFrame.m in Sources */, - CF7011D34C1923AA7483504D /* IFTTTAnimationKeyFrame.m in Sources */, - 5FFCF969087083CB6ECACB33 /* IFTTTAnimator.m in Sources */, - A9E603A55113C8B6D5BF2286 /* IFTTTColorAnimation.m in Sources */, - F1C851F70A3652DAE9158741 /* IFTTTConstraintsAnimation.m in Sources */, - 18198F922B86554B833846B3 /* IFTTTCornerRadiusAnimation.m in Sources */, - 4A9219E88209B8C06943F3D6 /* IFTTTEasingFunction.m in Sources */, - A6172238B6CF5AE56303F03C /* IFTTTFrameAnimation.m in Sources */, - 8F05A9B732FA2754DE583299 /* IFTTTHideAnimation.m in Sources */, - 799144A5001255D3C8C24ECE /* IFTTTScaleAnimation.m in Sources */, - 051DF1FA2E691566E21164C8 /* IFTTTTextColorAnimation.m in Sources */, - CED9659C42A21114C896B573 /* IFTTTTransform3DAnimation.m in Sources */, - 6C9B6548738059E9E8B76520 /* Pods-JazzHandsDemo-JazzHands-dummy.m in Sources */, + 60F1F1608B1C424F31E37F77 /* IFTTTAlphaAnimation.m in Sources */, + 80497C7F46EE1E9A16473B00 /* IFTTTAnimatedPagingScrollViewController.m in Sources */, + FA7E12E8F805C23A5B96BF03 /* IFTTTAnimatedScrollViewController.m in Sources */, + 66204D2B768B28DF556A6123 /* IFTTTAnimation.m in Sources */, + 0D24FCA2247410B36D044414 /* IFTTTAnimator.m in Sources */, + AE445B39658CC19C6EA9493E /* IFTTTColorAnimation.m in Sources */, + 41F11176CBE9F4D2B14BD9AB /* IFTTTConstraintConstantAnimation.m in Sources */, + 362891AB97379A7C2B9B942D /* IFTTTConstraintMultiplierAnimation.m in Sources */, + C8D2F20764028B2C7D0DF6BF /* IFTTTCornerRadiusAnimation.m in Sources */, + 326156701011B8178DAA34D5 /* IFTTTEasingFunction.m in Sources */, + B6F77AF7E059A00E24B1E914 /* IFTTTFillColorAnimation.m in Sources */, + ABD40E6EFB644AC4ABCA685F /* IFTTTFilmstrip.m in Sources */, + 66AE2CF9F249E9D4D3AAEFF0 /* IFTTTFrameAnimation.m in Sources */, + 928574B365534078BD65ACC7 /* IFTTTHideAnimation.m in Sources */, + D83CD6126F46695C42095B01 /* IFTTTInterpolatable.m in Sources */, + 82B952846B970C2398AFD310 /* IFTTTLabelAnimation.m in Sources */, + 2A4749CA716B8D0A778EBC6B /* IFTTTRotationAnimation.m in Sources */, + F05A48AE11A93222A122F904 /* IFTTTScaleAnimation.m in Sources */, + 258CF926CAE1D2F6A2889203 /* IFTTTScrollViewPageConstraintAnimation.m in Sources */, + 48136667E837A5583FFD7DB6 /* IFTTTShapeLayerAnimation.m in Sources */, + 2E8C349116769C4B5CEC1BE2 /* IFTTTStrokeEndAnimation.m in Sources */, + 43D4ED5159AC280BDACB2566 /* IFTTTStrokeStartAnimation.m in Sources */, + D3EC86461B066789F20890EB /* IFTTTTextColorAnimation.m in Sources */, + D230F2ABAD55AF4AD98425FB /* IFTTTTransform3DAnimation.m in Sources */, + FFFB0D1B2F2B7AD6682C1759 /* IFTTTTranslationAnimation.m in Sources */, + 887A75F898C63C4AA1DE9C79 /* IFTTTViewAnimation.m in Sources */, + A287DCAB0E6B97DE3A218A50 /* Pods-JazzHandsDemo-JazzHands-dummy.m in Sources */, + BAD5A987FA8E5842A1D1CBD9 /* UIView+IFTTTJazzHands.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6E63F712C35B09537BE82ABD /* Sources */ = { + 258C48C2F09028FFF0453517 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D166C1E584988A0C0883073A /* FBSnapshotTestCase.m in Sources */, - AFB85B35B8FBC80D9395B274 /* FBSnapshotTestController.m in Sources */, - 0BFFFFAA7220C8D7F74C715B /* Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m in Sources */, - 963DB8A2D997283C26A6B37E /* UIImage+Compare.m in Sources */, - A511FC610E597F66F5DB1BBA /* UIImage+Diff.m in Sources */, + 06935AF487615862A161A1ED /* EXPBlockDefinedMatcher.m in Sources */, + 949689F07D1A69A8062E495F /* EXPDoubleTuple.m in Sources */, + 88D45F18D18AD4F7468CF931 /* EXPExpect.m in Sources */, + E877ECF912A510E3B08F452B /* EXPFloatTuple.m in Sources */, + 38010F1785A4335F4D612496 /* EXPMatcherHelpers.m in Sources */, + 0E7661CC985DBA6E46D4D31B /* EXPMatchers+beCloseTo.m in Sources */, + F6195612D5F4E364ED3CA8F0 /* EXPMatchers+beFalsy.m in Sources */, + 9866A8AB778CEE9F50B309DF /* EXPMatchers+beGreaterThan.m in Sources */, + 90B4CF2FDF6EFBC58A3AA499 /* EXPMatchers+beGreaterThanOrEqualTo.m in Sources */, + B8AA158DB3603764E5D2CBD8 /* EXPMatchers+beIdenticalTo.m in Sources */, + 9DB0FA98A15A4C377D643336 /* EXPMatchers+beInTheRangeOf.m in Sources */, + 055B35520727F841BD63BA67 /* EXPMatchers+beInstanceOf.m in Sources */, + 47D9FB3F47966287ACC4FD3B /* EXPMatchers+beKindOf.m in Sources */, + 1120F4418BA8421F6AA49663 /* EXPMatchers+beLessThan.m in Sources */, + 63322CB8C9EE35422EBD6CD2 /* EXPMatchers+beLessThanOrEqualTo.m in Sources */, + 522F2BC68D7164D9B93579A6 /* EXPMatchers+beNil.m in Sources */, + AE0EC022EF3517FFAEBAD9CB /* EXPMatchers+beSubclassOf.m in Sources */, + A54281473F1FD774E8144454 /* EXPMatchers+beSupersetOf.m in Sources */, + 2F84BDAA06B084A915E69386 /* EXPMatchers+beTruthy.m in Sources */, + 7B709370AB3310803419F81C /* EXPMatchers+beginWith.m in Sources */, + 1B8D9C36543A98509C3F3197 /* EXPMatchers+conformTo.m in Sources */, + 6D52A8BF9C1DCC9103C0556A /* EXPMatchers+contain.m in Sources */, + A1D46FB5D28496A7E167DB69 /* EXPMatchers+endWith.m in Sources */, + DCB12FD30C56C1A89137DE73 /* EXPMatchers+equal.m in Sources */, + 12E1F4CF069C4DC309BE5567 /* EXPMatchers+haveCountOf.m in Sources */, + 826BDD53D7D4A0F7D074FFFC /* EXPMatchers+match.m in Sources */, + 31015E2D64A86DC63CBAB200 /* EXPMatchers+postNotification.m in Sources */, + B43809FB316EBBFD3968430C /* EXPMatchers+raise.m in Sources */, + 3F8E42DDDB2917F9F9D8D387 /* EXPMatchers+raiseWithReason.m in Sources */, + 17A3CDF0CB9B5454AE47C360 /* EXPMatchers+respondTo.m in Sources */, + DF3DD45851189791CD4342A8 /* EXPUnsupportedObject.m in Sources */, + 542066710442E478FB62E164 /* ExpectaObject.m in Sources */, + 7B232659746A9D6899E1B8BC /* ExpectaSupport.m in Sources */, + B0940113C0D8D458CB808A32 /* NSValue+Expecta.m in Sources */, + 332EF569972089DF39E06835 /* Pods-JazzHandsTests-Expecta-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7219B04D2A698979AF8CAB60 /* Sources */ = { + 291ED0866FB88B4F57398D63 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 269948B822224ACB8E382455 /* CGGeometry-KIFAdditions.m in Sources */, - 623E0C2497AA7CB09FCC84EF /* KIFSystemTestActor.m in Sources */, - EB906263B580005DBDB9B291 /* KIFTestActor.m in Sources */, - F25A12A9C09A9CF6A2FC7BCE /* KIFTestCase.m in Sources */, - 8EA399EF5EFAE639F20A0F50 /* KIFTestStepValidation.m in Sources */, - 02D402615CD385CF0D7B3D3C /* KIFTypist.m in Sources */, - F03031805EDFBA04E71DEB0F /* KIFUITestActor-ConditionalTests.m in Sources */, - A38C8C1145F00D487A444B07 /* KIFUITestActor.m in Sources */, - 8E91E4A0FE814D9EFA80BB5C /* NSBundle-KIFAdditions.m in Sources */, - A7D8C5BF909C0B9413081325 /* NSError-KIFAdditions.m in Sources */, - 2BBC5877C7B4D90D48687418 /* NSException-KIFAdditions.m in Sources */, - AC08DB4FD18C526177F8B386 /* NSFileManager-KIFAdditions.m in Sources */, - 49D8C46A3E79BE10FB6DAF91 /* Pods-JazzHandsTests-KIF-dummy.m in Sources */, - 7E7AFEBA9151CB58198F1BF0 /* UIAccessibilityElement-KIFAdditions.m in Sources */, - 0C13041F47BB81E4EDA967B8 /* UIApplication-KIFAdditions.m in Sources */, - A980BC74174051659FC64004 /* UIAutomationHelper.m in Sources */, - 5CDEAF70044534B95635F02F /* UIEvent+KIFAdditions.m in Sources */, - CB9459C51672DB088EF1FF31 /* UIScrollView-KIFAdditions.m in Sources */, - B57FB884CFBF790CFA131F11 /* UITableView-KIFAdditions.m in Sources */, - C73C2D2CC78AF308BC269C16 /* UITouch-KIFAdditions.m in Sources */, - C1A01CE380A5FF977619C574 /* UIView-KIFAdditions.m in Sources */, - 6B631C30073A48BC91378B77 /* UIWindow-KIFAdditions.m in Sources */, - 2F1DFA1A6C8DDD6BBCC57F30 /* XCTestCase-KIFAdditions.m in Sources */, + 57A0F6CCD2DD469EFDE195A5 /* Pods-JazzHandsTests-Specta-dummy.m in Sources */, + 20BC1155D0B4A5168E39121B /* SPTCallSite.m in Sources */, + F0AFA5E94FDC82B6E1FF51DF /* SPTCompiledExample.m in Sources */, + 42D5DC5C69EA647FF768E21B /* SPTExample.m in Sources */, + 18E68F9C2AD6DDC76DB1DB2E /* SPTExampleGroup.m in Sources */, + B518B55BAEE89AA7407FFE59 /* SPTSharedExampleGroups.m in Sources */, + 700CAACAF73340577C167D5C /* SPTSpec.m in Sources */, + ECADB369378E9A7F0012532E /* SPTTestSuite.m in Sources */, + 61A1AD5262222BA3FD297130 /* SpectaDSL.m in Sources */, + 8263376E51F6297D7BF0BB82 /* SpectaUtility.m in Sources */, + CDD225866866A84F070E41FC /* XCTestCase+Specta.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 89B4DFA155AEEA8297A36F68 /* Sources */ = { + 48E9612FAB4E57B991BDE843 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 80CF13ECC0463AB79EBFF01E /* Pods-JazzHandsDemo-dummy.m in Sources */, + 4C69C5E145031E414274F3CB /* Pods-JazzHandsTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9EFA481BB6091E3E38953345 /* Sources */ = { + 7FF0016B6C281EF2C8315708 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B5B9749D0F12933D24A46D37 /* Pods-JazzHandsTests-dummy.m in Sources */, + CFF2223ABCAD0389B5A00C83 /* Pods-JazzHandsDemo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C4103D555AFC86FB2094DCBB /* Sources */ = { + D6EB67DBB7BF12D4814BD9C2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7EF215EF13E586C5A595FB6D /* IFTTTAlphaAnimation.m in Sources */, - 6E67F854EA3B2CE1E13FC20F /* IFTTTAngleAnimation.m in Sources */, - B12F554424A35904C7E17FD3 /* IFTTTAnimatedScrollViewController.m in Sources */, - 40C9F01C2703D0DBA4DAA1B7 /* IFTTTAnimation.m in Sources */, - F1A89AE7489BF279B32B9013 /* IFTTTAnimationFrame.m in Sources */, - 32DC11D9464F992B89DC7EE0 /* IFTTTAnimationKeyFrame.m in Sources */, - 6CD629A4EF46375202447AE9 /* IFTTTAnimator.m in Sources */, - 442E58984ADDE6C05219DC4D /* IFTTTColorAnimation.m in Sources */, - A57147E81A049E07CA776E89 /* IFTTTConstraintsAnimation.m in Sources */, - 5BFE4E1AD739F27F7C16EFBD /* IFTTTCornerRadiusAnimation.m in Sources */, - 8409F00E7CF492BD0F81606A /* IFTTTEasingFunction.m in Sources */, - CC111984F501EAA9000E610B /* IFTTTFrameAnimation.m in Sources */, - BD4600E30B98AFBAB5E7A9F6 /* IFTTTHideAnimation.m in Sources */, - 72ED2E12A7CB2BF41E8306C9 /* IFTTTScaleAnimation.m in Sources */, - 7950B372A8FA955960957C7B /* IFTTTTextColorAnimation.m in Sources */, - 42E413183C0384CB1CFAF79A /* IFTTTTransform3DAnimation.m in Sources */, - 90A9EA58B13ABCDE700A3644 /* Pods-JazzHandsTests-JazzHands-dummy.m in Sources */, + 522E83ED8DDF5FEEFF3CDFDF /* IFTTTAlphaAnimation.m in Sources */, + C2E608488E4EE8D18AAE61A5 /* IFTTTAnimatedPagingScrollViewController.m in Sources */, + 2850743C631819B78CBF485D /* IFTTTAnimatedScrollViewController.m in Sources */, + 679E00C36DEE9857B5A10505 /* IFTTTAnimation.m in Sources */, + E48F935A796C4E811FE62D97 /* IFTTTAnimator.m in Sources */, + 875420BF7FA2B026279AEC92 /* IFTTTColorAnimation.m in Sources */, + E027383E37A270D98111AB0D /* IFTTTConstraintConstantAnimation.m in Sources */, + 6E49C87D91FA9526E9E7B0DD /* IFTTTConstraintMultiplierAnimation.m in Sources */, + 514DEF41A3E73B3DFE4F3404 /* IFTTTCornerRadiusAnimation.m in Sources */, + 30BCC0259BCDA9DB05141657 /* IFTTTEasingFunction.m in Sources */, + 7B501C8A32DA6C5A98C7DC21 /* IFTTTFillColorAnimation.m in Sources */, + 8C95AD898D9AF389E8456D62 /* IFTTTFilmstrip.m in Sources */, + 27A84187E85CF922A2B0832B /* IFTTTFrameAnimation.m in Sources */, + E302E7BE62EC9EA5EC672B41 /* IFTTTHideAnimation.m in Sources */, + BB333C75F6B41E75F13F4A72 /* IFTTTInterpolatable.m in Sources */, + 1C0B2B201FAB9BF2AF9A0B57 /* IFTTTLabelAnimation.m in Sources */, + 87E98DB88610BEDA1BA92A71 /* IFTTTRotationAnimation.m in Sources */, + E9CC266A9EBE7B9DC7CDF350 /* IFTTTScaleAnimation.m in Sources */, + 86322A363FCD04C2615569D3 /* IFTTTScrollViewPageConstraintAnimation.m in Sources */, + 2050B7D009FE6BA169105C97 /* IFTTTShapeLayerAnimation.m in Sources */, + CF2BFCD1A62FB4BBD2E86B0C /* IFTTTStrokeEndAnimation.m in Sources */, + 668D971570D9A92CEA27E6B1 /* IFTTTStrokeStartAnimation.m in Sources */, + B47FC87F0426A037E08B9999 /* IFTTTTextColorAnimation.m in Sources */, + 272629762C38A41F0B7666EF /* IFTTTTransform3DAnimation.m in Sources */, + D733EAC136334F6606A4C5BC /* IFTTTTranslationAnimation.m in Sources */, + ABB87890E86543F255B8F546 /* IFTTTViewAnimation.m in Sources */, + F6423A42324C1AECB57E873C /* Pods-JazzHandsTests-JazzHands-dummy.m in Sources */, + 50CB3BBFC0A45DBD59243579 /* UIView+IFTTTJazzHands.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 2E5FA4670FF52352B0029385 /* PBXTargetDependency */ = { + 39DA8F0FDF49BF4DE5108B66 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-JazzHandsDemo-JazzHands"; - target = 990A61EA846F717335941AB5 /* Pods-JazzHandsDemo-JazzHands */; - targetProxy = 5367F2F47328AC326C05A4A6 /* PBXContainerItemProxy */; + name = "Pods-JazzHandsTests-Specta"; + target = 474046DDD5023AF51208E1E8 /* Pods-JazzHandsTests-Specta */; + targetProxy = 7CBB1E2D824BCF8C98F3EADB /* PBXContainerItemProxy */; }; - 7EFA94BC79B52D04D6F51FB8 /* PBXTargetDependency */ = { + 9CC6E9EAFB1B49715BF085F6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Pods-JazzHandsTests-JazzHands"; - target = F203775F0D6710D3BC5B78C3 /* Pods-JazzHandsTests-JazzHands */; - targetProxy = 229F36EB43ECEEF895279B37 /* PBXContainerItemProxy */; + target = 1F7B3AE52AD450FE0ADD77E4 /* Pods-JazzHandsTests-JazzHands */; + targetProxy = 266CA7EF52E29354A745F60C /* PBXContainerItemProxy */; }; - 9ED678E301EF367BF5073417 /* PBXTargetDependency */ = { + C6A679F7827EA441E8094160 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-JazzHandsTests-KIF"; - target = 629E749F6B357F5B71AAB91C /* Pods-JazzHandsTests-KIF */; - targetProxy = AE4411D0AB85BF4167337A9F /* PBXContainerItemProxy */; + name = "Pods-JazzHandsDemo-JazzHands"; + target = FE7FE84998FD9900ABE7AC0F /* Pods-JazzHandsDemo-JazzHands */; + targetProxy = 4C6A7AC72055761AE1F9FE33 /* PBXContainerItemProxy */; }; - D7153AA6C3B2A9FC43582508 /* PBXTargetDependency */ = { + DF0157CF96C6F44DA8A71050 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-JazzHandsTests-FBSnapshotTestCase"; - target = DF2C2A1C804A04E33B10DCC5 /* Pods-JazzHandsTests-FBSnapshotTestCase */; - targetProxy = BF0D6BBC226E4D6D52FACAB4 /* PBXContainerItemProxy */; + name = "Pods-JazzHandsTests-Expecta"; + target = DC8E70DB547EE788D70D683D /* Pods-JazzHandsTests-Expecta */; + targetProxy = 1A8230D3C75D93443600B19B /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 3FF332702569853567681621 /* Release */ = { + 0020E403F34B8917E6B3CCAB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F54F430B0F999BD29F575D03 /* Pods-JazzHandsTests.release.xcconfig */; + baseConfigurationReference = 44778620D0A4684796F1A953 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Release; }; - 5FF52393A91A043CE902488D /* Debug */ = { + 171162E2E95C9C500BD7D5CE /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 42E75919FAF7203428A0E887 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */; + baseConfigurationReference = 79630B7461BAFF7D351A2F7D /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; @@ -1046,61 +1346,95 @@ }; name = Debug; }; - 6B022CC1572D402E9FCDCE32 /* Debug */ = { + 1F95A80D9798A2C19F26C5B7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9CF4C69F0DA2C84B7649961F /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */; + baseConfigurationReference = 79630B7461BAFF7D351A2F7D /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 6D67EA96D37358DBDA5586DC /* Release */ = { + 3BC39EE7A96167F89D8BEFFC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8DCDBADF054DB67D87BDD8DE /* Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 6CAB5D9D09DBE4F3A9ABCE20 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EC0BC404FA398C41FAF29A61 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 7EB59EF3B6EEB812D2352919 /* Release */ = { + 75EB0A0742D7B9E7F90BB50F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E9956D55F6D69A575DB83B5E /* Pods-JazzHandsDemo.release.xcconfig */; + baseConfigurationReference = 4C5C16C3144999F0091CF7F0 /* Pods-JazzHandsTests-Specta-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Release; }; - 8468DAB37DE660A39BB7833F /* Debug */ = { + 8C9D23697A7776F68B9E8EDD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CB0F85BEA9A17C1CD68E3497 /* Pods-JazzHandsDemo.debug.xcconfig */; + baseConfigurationReference = 60882D6AD680D2C57B8EAFF6 /* Pods-JazzHandsDemo.release.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1108,43 +1442,25 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 9941087243F4DFB6C4C9671C /* Release */ = { + 9AD6A22BD66BA1FE2F09A75F /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4819D30CEA5129B149D6A23F /* Pods-JazzHandsTests.release.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; }; name = Release; }; - 9DD7D4D5B15A9779F4C529AC /* Debug */ = { + B35D652346A28BD8C0F385F6 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1183,57 +1499,41 @@ }; name = Debug; }; - A733E3A0CE04CAC7521D857D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 49DA91330977A0749C5DCFB4 /* Pods-JazzHandsTests-KIF-Private.xcconfig */; - buildSettings = { - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - }; - name = Release; - }; - A7480827D397415A78D716F7 /* Debug */ = { + BDFDEE826C7CD72F5BB6ED34 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8DCDBADF054DB67D87BDD8DE /* Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig */; + baseConfigurationReference = FC710A2FC8801973C56015A6 /* Pods-JazzHandsTests.debug.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Debug; }; - C788404C2100AF833CEA9CC1 /* Release */ = { + CB08389E1C9F6E1FE399E47F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9CF4C69F0DA2C84B7649961F /* Pods-JazzHandsTests-JazzHands-Private.xcconfig */; + baseConfigurationReference = 4C5C16C3144999F0091CF7F0 /* Pods-JazzHandsTests-Specta-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - D28777EDFC7211F59BD22F67 /* Release */ = { + CFAEFCF7C3530B1F37922F66 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 42E75919FAF7203428A0E887 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */; + baseConfigurationReference = EC0BC404FA398C41FAF29A61 /* Pods-JazzHandsDemo-JazzHands-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-prefix.pch"; @@ -1247,32 +1547,32 @@ }; name = Release; }; - DC4969608400A4D2E0611FBB /* Debug */ = { + DD31F89E7A60CD37B7F01077 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FD49D18BED380EDD94744B04 /* Pods-JazzHandsTests.debug.xcconfig */; + baseConfigurationReference = 44778620D0A4684796F1A953 /* Pods-JazzHandsTests-Expecta-Private.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Debug; }; - FAB03B824C96382D3561C23F /* Debug */ = { + DE772AA327789997CEB07508 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 49DA91330977A0749C5DCFB4 /* Pods-JazzHandsTests-KIF-Private.xcconfig */; + baseConfigurationReference = 5FD2A64DAA1C81948F968D6E /* Pods-JazzHandsDemo.debug.xcconfig */; buildSettings = { ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1282,70 +1582,70 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1233516C8D7ED8823CCF0C7A /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo-JazzHands" */ = { + 263B5C3ED74E5CD514BAA8B5 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-JazzHands" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5FF52393A91A043CE902488D /* Debug */, - D28777EDFC7211F59BD22F67 /* Release */, + 171162E2E95C9C500BD7D5CE /* Debug */, + 1F95A80D9798A2C19F26C5B7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1233B1AB5E0528DA6550BBDC /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-KIF" */ = { + 2ED3CFDF4AF2B433D24D1AE7 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Expecta" */ = { isa = XCConfigurationList; buildConfigurations = ( - FAB03B824C96382D3561C23F /* Debug */, - A733E3A0CE04CAC7521D857D /* Release */, + DD31F89E7A60CD37B7F01077 /* Debug */, + 0020E403F34B8917E6B3CCAB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1425866E665D9CC70B1721C6 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-JazzHands" */ = { + 3674F5A11ED44B9078E630A8 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo-JazzHands" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6B022CC1572D402E9FCDCE32 /* Debug */, - C788404C2100AF833CEA9CC1 /* Release */, + 6CAB5D9D09DBE4F3A9ABCE20 /* Debug */, + CFAEFCF7C3530B1F37922F66 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1E8D2B824241A3BF183A33B3 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-FBSnapshotTestCase" */ = { + 4B45977AE4B3BCD07A33FC54 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - A7480827D397415A78D716F7 /* Debug */, - 6D67EA96D37358DBDA5586DC /* Release */, + BDFDEE826C7CD72F5BB6ED34 /* Debug */, + 9AD6A22BD66BA1FE2F09A75F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2527815AADA91786E6B81B6C /* Build configuration list for PBXProject "Pods" */ = { + 9816EA2DB15072877195DD3F /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9DD7D4D5B15A9779F4C529AC /* Debug */, - 9941087243F4DFB6C4C9671C /* Release */, + B35D652346A28BD8C0F385F6 /* Debug */, + 3BC39EE7A96167F89D8BEFFC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2B45A4AF849B364C7145E028 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */ = { + AA5C00D87B9488DB218DDB9B /* Build configuration list for PBXNativeTarget "Pods-JazzHandsDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8468DAB37DE660A39BB7833F /* Debug */, - 7EB59EF3B6EEB812D2352919 /* Release */, + DE772AA327789997CEB07508 /* Debug */, + 8C9D23697A7776F68B9E8EDD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 79F566BE6537341DF831EE68 /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests" */ = { + EC6CBB492A279D7EE3BE3F2C /* Build configuration list for PBXNativeTarget "Pods-JazzHandsTests-Specta" */ = { isa = XCConfigurationList; buildConfigurations = ( - DC4969608400A4D2E0611FBB /* Debug */, - 3FF332702569853567681621 /* Release */, + CB08389E1C9F6E1FE399E47F /* Debug */, + 75EB0A0742D7B9E7F90BB50F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = D3EE56C18F6AC2DBE3869796 /* Project object */; + rootObject = 178EC51E7A0545B59B0CD2AD /* Project object */; } diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme index a5d0fa1..d6bca85 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsDemo-JazzHands.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme index fb41713..c19c59b 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-JazzHandsTests-JazzHands.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Example/Pods/Specta/LICENSE b/Example/Pods/Specta/LICENSE new file mode 100644 index 0000000..ca257c0 --- /dev/null +++ b/Example/Pods/Specta/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-2014 Specta Team. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission 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. + diff --git a/Example/Pods/Specta/README.md b/Example/Pods/Specta/README.md new file mode 100644 index 0000000..f453a2e --- /dev/null +++ b/Example/Pods/Specta/README.md @@ -0,0 +1,176 @@ +# Specta + +A light-weight TDD / BDD framework for Objective-C. + +### Status +[![Build Status](https://travis-ci.org/specta/specta.png)](https://travis-ci.org/specta/specta) +[![Coverage Status](https://coveralls.io/repos/specta/specta/badge.svg)](https://coveralls.io/r/specta/specta) + +## FEATURES + +* An Objective-C RSpec-like BDD DSL +* Quick and easy set up +* Built on top of XCTest +* Excellent Xcode integration + +## SCREENSHOT + +![Specta Screenshot](https://raw.githubusercontent.com/specta/specta/master/misc/specta_screenshot.jpg) + +## SETUP + +Use [CocoaPods](http://github.com/CocoaPods/CocoaPods), [Carthage](https://github.com/carthage/carthage) or [Set up manually](#setting-up-manually) + +### CocoaPods + +1. Add Specta to your project's `Podfile`: + + ```ruby + target :MyApp do + # your app dependencies + end + + target :MyAppTests do + pod 'Specta', '~> 0.5' + # pod 'Expecta', '~> 0.3' # expecta matchers + # pod 'OCMock', '~> 2.2' # OCMock + # pod 'OCHamcrest', '~> 3.0' # hamcrest matchers + # pod 'OCMockito', '~> 1.0' # OCMock + # pod 'LRMocky', '~> 0.9' # LRMocky + end + ``` + +2. Run `pod update` or `pod install` in your project directory. + +### Carthage + +1. Add Specta to your project's `Cartfile.private` + + ``` + github "specta/specta" ~> 0.5 + ``` + +2. Run `carthage update` in your project directory +3. Drag the appropriate `Specta.framework` for your platform (located in Carthage/Build/) into your application’s Xcode project, and add it to your test target(s). +4. If you are building for iOS, a new `Run Script Phase` must be added to copy the framework. The instructions can be found on [Carthage's getting started instructions](https://github.com/carthage/carthage#getting-started) + +### SETTING UP MANUALLY + +1. Clone from Github. +2. Run `rake` in project root to build. +3. Add a "Cocoa/Cocoa Touch Unit Testing Bundle" target if you don't already have one. +4. Copy and add all header files in `Products` folder to the Test target in your Xcode project. +5. For **OS X projects**, copy and add `Specta.framework` in `Products/osx` folder to the test target in your Xcode project. + For **iOS projects**, copy and add `Specta.framework` in `Products/ios` folder to the test target in your Xcode project. + You can alternatively use `libSpecta.a`, if you prefer to add it as a static library for your project. (iOS 7 and below require this) +6. Add `-ObjC` and `-all_load` to the "Other Linker Flags" build setting for the test target in your Xcode project. +7. If you encounter linking issues with `_llvm_*` symbols, ensure your target's "Generate Test Coverage Files" and "Instrument Program Flow" build settings are set to `Yes`. + +## EXAMPLE + +```objective-c +#import // #import "Specta.h" if you're using libSpecta.a + +SharedExamplesBegin(MySharedExamples) +// Global shared examples are shared across all spec files. + +sharedExamplesFor(@"foo", ^(NSDictionary *data) { + __block id bar = nil; + beforeEach(^{ + bar = data[@"bar"]; + }); + it(@"should not be nil", ^{ + XCTAssertNotNil(bar); + }); +}); + +SharedExamplesEnd + +SpecBegin(Thing) + +describe(@"Thing", ^{ + sharedExamplesFor(@"another shared behavior", ^(NSDictionary *data) { + // Locally defined shared examples can override global shared examples within its scope. + }); + + beforeAll(^{ + // This is run once and only once before all of the examples + // in this group and before any beforeEach blocks. + }); + + beforeEach(^{ + // This is run before each example. + }); + + it(@"should do stuff", ^{ + // This is an example block. Place your assertions here. + }); + + it(@"should do some stuff asynchronously", ^{ + waitUntil(^(DoneCallback done) { + // Async example blocks need to invoke done() callback. + done(); + }); + }); + + itShouldBehaveLike(@"a shared behavior", @{@"key" : @"obj"}); + + itShouldBehaveLike(@"another shared behavior", ^{ + // Use a block that returns a dictionary if you need the context to be evaluated lazily, + // e.g. to use an object prepared in a beforeEach block. + return @{@"key" : @"obj"}; + }); + + describe(@"Nested examples", ^{ + it(@"should do even more stuff", ^{ + // ... + }); + }); + + pending(@"pending example"); + + pending(@"another pending example", ^{ + // ... + }); + + afterEach(^{ + // This is run after each example. + }); + + afterAll(^{ + // This is run once and only once after all of the examples + // in this group and after any afterEach blocks. + }); +}); + +SpecEnd +``` + +* `beforeEach` and `afterEach` are also aliased as `before` and `after` respectively. +* `describe` is also aliased as `context`. +* `it` is also aliased as `example` and `specify`. +* `itShouldBehaveLike` is also aliased as `itBehavesLike`. +* Use `pending` or prepend `x` to `describe`, `context`, `example`, `it`, and `specify` to mark examples or groups as pending. +* Use `^(DoneCallback done)` as shown in the example above to make examples wait for completion. `done()` callback needs to be invoked to let Specta know that your test is complete. The default timeout is 10.0 seconds but this can be changed by calling the function `setAsyncSpecTimeout(NSTimeInterval timeout)`. +* `(before|after)(Each/All)` also accept `^(DoneCallback done)`s. +* Do `#define SPT_CEDAR_SYNTAX` before importing Specta if you prefer to write `SPEC_BEGIN` and `SPEC_END` instead of `SpecBegin` and `SpecEnd`. +* Prepend `f` to your `describe`, `context`, `example`, `it`, and `specify` to set focus on examples or groups. When specs are focused, all unfocused specs are skipped. +* To use original XCTest reporter, set an environment variable named `SPECTA_REPORTER_CLASS` to `SPTXCTestReporter` in your test scheme. +* Set an environment variable `SPECTA_NO_SHUFFLE` with value `1` to disable test shuffling. +* Set an environment variable `SPECTA_SEED` to specify the random seed for test shuffling. + +Standard XCTest matchers such as `XCTAssertEqualObjects` and `XCTAssertNil` work, but you probably want to add a nicer matcher framework - [Expecta](http://github.com/specta/expecta/) to your setup. Or if you really prefer, [OCHamcrest](https://github.com/jonreid/OCHamcrest) works fine too. Also, add a mocking framework: [OCMock](http://ocmock.org/). + +## RUNNING TESTS IN COMMAND LINE + +* Run `rake test` in the cloned folder. + +## CONTRIBUTION GUIDELINES + +* Please use only spaces and indent 2 spaces at a time. +* Please prefix instance variable names with a single underscore (`_`). +* Please prefix custom classes and functions defined in the global scope with `SPT`. + +## LICENSE + +Copyright (c) 2012-2015 [Specta Team](https://github.com/specta?tab=members). This software is licensed under the [MIT License](http://github.com/specta/specta/raw/master/LICENSE). diff --git a/Example/Pods/Specta/Specta/Specta/SPTCallSite.h b/Example/Pods/Specta/Specta/Specta/SPTCallSite.h new file mode 100644 index 0000000..adcd3b0 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTCallSite.h @@ -0,0 +1,12 @@ +#import + +@interface SPTCallSite : NSObject + +@property (nonatomic, copy, readonly) NSString *file; +@property (nonatomic, readonly) NSUInteger line; + ++ (instancetype)callSiteWithFile:(NSString *)file line:(NSUInteger)line; + +- (instancetype)initWithFile:(NSString *)file line:(NSUInteger)line; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTCallSite.m b/Example/Pods/Specta/Specta/Specta/SPTCallSite.m new file mode 100644 index 0000000..585cecd --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTCallSite.m @@ -0,0 +1,18 @@ +#import "SPTCallSite.h" + +@implementation SPTCallSite + ++ (instancetype)callSiteWithFile:(NSString *)file line:(NSUInteger)line { + return [[self alloc] initWithFile:file line:line]; +} + +- (instancetype)initWithFile:(NSString *)file line:(NSUInteger)line { + self = [super init]; + if (self) { + _file = file; + _line = line; + } + return self; +} + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTCompiledExample.h b/Example/Pods/Specta/Specta/Specta/SPTCompiledExample.h new file mode 100644 index 0000000..adb3aaa --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTCompiledExample.h @@ -0,0 +1,17 @@ +#import +#import "SpectaTypes.h" + +@interface SPTCompiledExample : NSObject + +@property (nonatomic, copy) NSString *name; +@property (nonatomic, copy) NSString *testCaseName; +@property (nonatomic, copy) SPTSpecBlock block; + +@property (nonatomic) BOOL pending; +@property (nonatomic, getter=isFocused) BOOL focused; + +@property (nonatomic) SEL testMethodSelector; + +- (id)initWithName:(NSString *)name testCaseName:(NSString *)testCaseName block:(SPTSpecBlock)block pending:(BOOL)pending focused:(BOOL)focused; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTCompiledExample.m b/Example/Pods/Specta/Specta/Specta/SPTCompiledExample.m new file mode 100644 index 0000000..e762165 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTCompiledExample.m @@ -0,0 +1,17 @@ +#import "SPTCompiledExample.h" + +@implementation SPTCompiledExample + +- (id)initWithName:(NSString *)name testCaseName:(NSString *)testCaseName block:(SPTSpecBlock)block pending:(BOOL)pending focused:(BOOL)focused { + self = [super init]; + if (self) { + self.name = name; + self.testCaseName = testCaseName; + self.block = block; + self.pending = pending; + self.focused = focused; + } + return self; +} + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTExample.h b/Example/Pods/Specta/Specta/Specta/SPTExample.h new file mode 100644 index 0000000..849aacb --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTExample.h @@ -0,0 +1,17 @@ +#import +#import "SpectaTypes.h" + +@class SPTCallSite; + +@interface SPTExample : NSObject + +@property (nonatomic, copy) NSString *name; +@property (nonatomic, retain) SPTCallSite *callSite; +@property (nonatomic, copy) SPTVoidBlock block; + +@property (nonatomic) BOOL pending; +@property (nonatomic, getter=isFocused) BOOL focused; + +- (id)initWithName:(NSString *)name callSite:(SPTCallSite *)callSite focused:(BOOL)focused block:(SPTVoidBlock)block; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTExample.m b/Example/Pods/Specta/Specta/Specta/SPTExample.m new file mode 100644 index 0000000..e5905a9 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTExample.m @@ -0,0 +1,17 @@ +#import "SPTExample.h" + +@implementation SPTExample + +- (id)initWithName:(NSString *)name callSite:(SPTCallSite *)callSite focused:(BOOL)focused block:(SPTVoidBlock)block { + self = [super init]; + if (self) { + self.name = name; + self.callSite = callSite; + self.block = block; + self.focused = focused; + self.pending = block == nil; + } + return self; +} + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTExampleGroup.h b/Example/Pods/Specta/Specta/Specta/SPTExampleGroup.h new file mode 100644 index 0000000..f3d0060 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTExampleGroup.h @@ -0,0 +1,36 @@ +#import +#import +#import "SpectaTypes.h" + +@class SPTExample; +@class SPTCallSite; + +@interface SPTExampleGroup : NSObject + +@property (nonatomic, copy) NSString *name; +@property (nonatomic, strong) SPTExampleGroup *root; +@property (nonatomic, strong) SPTExampleGroup *parent; +@property (nonatomic, strong) NSMutableArray *children; +@property (nonatomic, strong) NSMutableArray *beforeAllArray; +@property (nonatomic, strong) NSMutableArray *afterAllArray; +@property (nonatomic, strong) NSMutableArray *beforeEachArray; +@property (nonatomic, strong) NSMutableArray *afterEachArray; +@property (nonatomic, strong) NSMutableDictionary *sharedExamples; +@property (nonatomic) unsigned int exampleCount; +@property (nonatomic) unsigned int ranExampleCount; +@property (nonatomic) unsigned int pendingExampleCount; +@property (nonatomic, getter=isFocused) BOOL focused; + +- (id)initWithName:(NSString *)name parent:(SPTExampleGroup *)parent root:(SPTExampleGroup *)root; + +- (SPTExampleGroup *)addExampleGroupWithName:(NSString *)name focused:(BOOL)focused; +- (SPTExample *)addExampleWithName:(NSString *)name callSite:(SPTCallSite *)callSite focused:(BOOL)focused block:(SPTVoidBlock)block; + +- (void)addBeforeAllBlock:(SPTVoidBlock)block; +- (void)addAfterAllBlock:(SPTVoidBlock)block; +- (void)addBeforeEachBlock:(SPTVoidBlock)block; +- (void)addAfterEachBlock:(SPTVoidBlock)block; + +- (NSArray *)compileExamplesWithStack:(NSArray *)stack; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTExampleGroup.m b/Example/Pods/Specta/Specta/Specta/SPTExampleGroup.m new file mode 100644 index 0000000..cf51800 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTExampleGroup.m @@ -0,0 +1,335 @@ +#import "SPTExampleGroup.h" +#import "SPTExample.h" +#import "SPTCompiledExample.h" +#import "SPTSpec.h" +#import "SpectaUtility.h" +#import "XCTest+Private.h" +#import "SPTGlobalBeforeAfterEach.h" +#import +#import + +static NSArray *ClassesWithClassMethod(SEL classMethodSelector) { + NSMutableArray *classesWithClassMethod = [[NSMutableArray alloc] init]; + + int numberOfClasses = objc_getClassList(NULL, 0); + if (numberOfClasses > 0) { + Class *classes = (Class *)malloc(sizeof(Class) *numberOfClasses); + numberOfClasses = objc_getClassList(classes, numberOfClasses); + + for(int classIndex = 0; classIndex < numberOfClasses; classIndex++) { + Class aClass = classes[classIndex]; + + if (class_conformsToProtocol(aClass, @protocol(SPTGlobalBeforeAfterEach))) { + Method globalMethod = class_getClassMethod(aClass, classMethodSelector); + if (globalMethod) { + [classesWithClassMethod addObject:aClass]; + } + } + } + + free(classes); + } + + return classesWithClassMethod; +} + +static void runExampleBlock(void (^block)(), NSString *name) { + if (!SPTIsBlock(block)) { + return; + } + + ((SPTVoidBlock)block)(); +} + +typedef NS_ENUM(NSInteger, SPTExampleGroupOrder) { + SPTExampleGroupOrderOutermostFirst = 1, + SPTExampleGroupOrderInnermostFirst +}; + +@interface SPTExampleGroup () + +- (void)incrementExampleCount; +- (void)incrementPendingExampleCount; +- (void)resetRanExampleCountIfNeeded; +- (void)incrementRanExampleCount; +- (void)runBeforeHooks:(NSString *)compiledName; +- (void)runBeforeAllHooks:(NSString *)compiledName; +- (void)runBeforeEachHooks:(NSString *)compiledName; +- (void)runAfterHooks:(NSString *)compiledName; +- (void)runAfterEachHooks:(NSString *)compiledName; +- (void)runAfterAllHooks:(NSString *)compiledName; + +@end + +@implementation SPTExampleGroup + +- (id)init { + self = [super init]; + if (self) { + self.name = nil; + self.root = nil; + self.parent = nil; + self.children = [NSMutableArray array]; + self.beforeAllArray = [NSMutableArray array]; + self.afterAllArray = [NSMutableArray array]; + self.beforeEachArray = [NSMutableArray array]; + self.afterEachArray = [NSMutableArray array]; + self.sharedExamples = [NSMutableDictionary dictionary]; + self.exampleCount = 0; + self.pendingExampleCount = 0; + self.ranExampleCount = 0; + } + return self; +} + +- (id)initWithName:(NSString *)name parent:(SPTExampleGroup *)parent root:(SPTExampleGroup *)root { + self = [self init]; + if (self) { + self.name = name; + self.parent = parent; + self.root = root; + } + return self; +} + +- (SPTExampleGroup *)addExampleGroupWithName:(NSString *)name focused:(BOOL)focused { + SPTExampleGroup *group = [[SPTExampleGroup alloc] initWithName:name parent:self root:self.root]; + group.focused = focused; + [self.children addObject:group]; + return group; +} + +- (SPTExample *)addExampleWithName:(NSString *)name callSite:(SPTCallSite *)callSite focused:(BOOL)focused block:(SPTVoidBlock)block { + SPTExample *example; + @synchronized(self) { + example = [[SPTExample alloc] initWithName:name callSite:callSite focused:focused block:block]; + [self.children addObject:example]; + + [self incrementExampleCount]; + if (example.pending) { + [self incrementPendingExampleCount]; + } + } + return example; +} + +- (void)incrementExampleCount { + SPTExampleGroup *group = self; + while (group != nil) { + group.exampleCount ++; + group = group.parent; + } +} + +- (void)incrementPendingExampleCount { + SPTExampleGroup *group = self; + while (group != nil) { + group.pendingExampleCount ++; + group = group.parent; + } +} + +- (void)resetRanExampleCountIfNeeded { + SPTExampleGroup *group = self; + while (group != nil) { + if (group.ranExampleCount >= group.exampleCount) { + group.ranExampleCount = 0; + } + group = group.parent; + } +} + +- (void)incrementRanExampleCount { + SPTExampleGroup *group = self; + while (group != nil) { + group.ranExampleCount ++; + group = group.parent; + } +} + +- (void)addBeforeAllBlock:(SPTVoidBlock)block { + if (!block) return; + [self.beforeAllArray addObject:[block copy]]; +} + +- (void)addAfterAllBlock:(SPTVoidBlock)block { + if (!block) return; + [self.afterAllArray addObject:[block copy]]; +} + +- (void)addBeforeEachBlock:(SPTVoidBlock)block { + if (!block) return; + [self.beforeEachArray addObject:[block copy]]; +} + +- (void)addAfterEachBlock:(SPTVoidBlock)block { + if (!block) return; + [self.afterEachArray addObject:[block copy]]; +} + +- (void)runGlobalBeforeEachHooks:(NSString *)compiledName { + static NSArray *globalBeforeEachClasses; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + globalBeforeEachClasses = ClassesWithClassMethod(@selector(beforeEach)); + }); + + for (Class class in globalBeforeEachClasses) { + [class beforeEach]; + } +} + +- (void)runGlobalAfterEachHooks:(NSString *)compiledName { + static NSArray *globalAfterEachClasses; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + globalAfterEachClasses = ClassesWithClassMethod(@selector(afterEach)); + }); + + for (Class class in globalAfterEachClasses) { + [class afterEach]; + } +} + +// Builds an array of example groups that enclose the current group. +// When in innermost-first order, the most deeply nested example groups, +// beginning with self, are placed at the beginning of the array. +// When in outermost-first order, the opposite is true, and the last +// group in the array (self) is the most deeply nested. +- (NSArray *)exampleGroupStackInOrder:(SPTExampleGroupOrder)order { + NSMutableArray *groups = [NSMutableArray array]; + SPTExampleGroup *group = self; + while (group != nil) { + switch (order) { + case SPTExampleGroupOrderOutermostFirst: + [groups insertObject:group atIndex:0]; + break; + case SPTExampleGroupOrderInnermostFirst: + [groups addObject:group]; + break; + } + group = group.parent; + } + + return [groups copy]; +} + +- (void)runBeforeHooks:(NSString *)compiledName { + [self runBeforeAllHooks:compiledName]; + [self runBeforeEachHooks:compiledName]; +} + +- (void)runBeforeAllHooks:(NSString *)compiledName { + for(SPTExampleGroup *group in [self exampleGroupStackInOrder:SPTExampleGroupOrderOutermostFirst]) { + if (group.ranExampleCount == 0) { + for (id beforeAllBlock in group.beforeAllArray) { + runExampleBlock(beforeAllBlock, [NSString stringWithFormat:@"%@ - before all block", compiledName]); + } + } + } +} + +- (void)runBeforeEachHooks:(NSString *)compiledName { + [self runGlobalBeforeEachHooks:compiledName]; + for (SPTExampleGroup *group in [self exampleGroupStackInOrder:SPTExampleGroupOrderOutermostFirst]) { + for (id beforeEachBlock in group.beforeEachArray) { + runExampleBlock(beforeEachBlock, [NSString stringWithFormat:@"%@ - before each block", compiledName]); + } + } +} + +- (void)runAfterHooks:(NSString *)compiledName { + [self runAfterEachHooks:compiledName]; + [self runAfterAllHooks:compiledName]; +} + +- (void)runAfterEachHooks:(NSString *)compiledName { + for (SPTExampleGroup *group in [self exampleGroupStackInOrder:SPTExampleGroupOrderInnermostFirst]) { + for (id afterEachBlock in group.afterEachArray) { + runExampleBlock(afterEachBlock, [NSString stringWithFormat:@"%@ - after each block", compiledName]); + } + } + [self runGlobalAfterEachHooks:compiledName]; +} + +- (void)runAfterAllHooks:(NSString *)compiledName { + for (SPTExampleGroup *group in [self exampleGroupStackInOrder:SPTExampleGroupOrderInnermostFirst]) { + if (group.ranExampleCount == group.exampleCount) { + for (id afterAllBlock in group.afterAllArray) { + runExampleBlock(afterAllBlock, [NSString stringWithFormat:@"%@ - after all block", compiledName]); + } + } + } +} + +- (BOOL)isFocusedOrHasFocusedAncestor { + SPTExampleGroup *ancestor = self; + while (ancestor != nil) { + if (ancestor.focused) { + return YES; + } else { + ancestor = ancestor.parent; + } + } + + return NO; +} + +- (NSArray *)compileExamplesWithStack:(NSArray *)stack { + BOOL groupIsFocusedOrHasFocusedAncestor = [self isFocusedOrHasFocusedAncestor]; + + NSArray *compiled = @[]; + + for(id child in self.children) { + if ([child isKindOfClass:[SPTExampleGroup class]]) { + SPTExampleGroup *group = child; + NSArray *newStack = [stack arrayByAddingObject:group]; + compiled = [compiled arrayByAddingObjectsFromArray:[group compileExamplesWithStack:newStack]]; + + } else if ([child isKindOfClass:[SPTExample class]]) { + SPTExample *example = child; + NSArray *newStack = [stack arrayByAddingObject:example]; + + NSString *compiledName = [spt_map(newStack, ^id(id obj, NSUInteger idx) { + return [obj name]; + }) componentsJoinedByString:@" "]; + + NSString *testCaseName = [spt_map(newStack, ^id(id obj, NSUInteger idx) { + return spt_underscorize([obj name]); + }) componentsJoinedByString:@"__"]; + + // If example is pending, run only before- and after-all hooks. + // Otherwise, run the example and all before and after hooks. + SPTSpecBlock compiledBlock = example.pending ? ^(SPTSpec *spec){ + @synchronized(self.root) { + [self resetRanExampleCountIfNeeded]; + [self runBeforeAllHooks:compiledName]; + [self incrementRanExampleCount]; + [self runAfterAllHooks:compiledName]; + } + } : ^(SPTSpec *spec) { + @synchronized(self.root) { + [self resetRanExampleCountIfNeeded]; + [self runBeforeHooks:compiledName]; + } + @try { + runExampleBlock(example.block, compiledName); + } + @catch(NSException *e) { + [spec spt_handleException:e]; + } + @finally { + @synchronized(self.root) { + [self incrementRanExampleCount]; + [self runAfterHooks:compiledName]; + } + } + }; + SPTCompiledExample *compiledExample = [[SPTCompiledExample alloc] initWithName:compiledName testCaseName:testCaseName block:compiledBlock pending:example.pending focused:(groupIsFocusedOrHasFocusedAncestor || example.focused)]; + compiled = [compiled arrayByAddingObject:compiledExample]; + } + } + return compiled; +} + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h b/Example/Pods/Specta/Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h new file mode 100644 index 0000000..9581f0b --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2015 Specta Team. All rights reserved. + */ +#import + +// This protocol was used for blacklisting classes for global beforeEach and afterEach blocks. +// Now, instead, classes are whitelisted by implementing the SPTGlobalBeforeAfterEach protocol. +__deprecated_msg("Please whitelist classes instead with the SPTGlobalBeforeAfterEach protocol") +@protocol SPTExcludeGlobalBeforeAfterEach +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTGlobalBeforeAfterEach.h b/Example/Pods/Specta/Specta/Specta/SPTGlobalBeforeAfterEach.h new file mode 100644 index 0000000..490359d --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTGlobalBeforeAfterEach.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2015 Specta Team. All rights reserved. + */ +#import + +// This protocol is used for whitelisting classes for global beforeEach and afterEach blocks. +// If you want a class to participate in those just add this protocol to a category and it will be +// included. +@protocol SPTGlobalBeforeAfterEach + +@optional ++ (void)beforeEach; ++ (void)afterEach; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.h b/Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.h new file mode 100644 index 0000000..090acba --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.h @@ -0,0 +1,17 @@ +#import +#import +#import + +@class _XCTestCaseImplementation; + +@class SPTExampleGroup; + +@interface SPTSharedExampleGroups : XCTestCase + ++ (void)addSharedExampleGroupWithName:(NSString *)name block:(SPTDictionaryBlock)block exampleGroup:(SPTExampleGroup *)exampleGroup; ++ (SPTDictionaryBlock)sharedExampleGroupWithName:(NSString *)name exampleGroup:(SPTExampleGroup *)exampleGroup; + +- (void)sharedExampleGroups; + +@end + diff --git a/Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.m b/Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.m new file mode 100644 index 0000000..35b405c --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTSharedExampleGroups.m @@ -0,0 +1,74 @@ +#import "SPTSharedExampleGroups.h" +#import "SPTExampleGroup.h" +#import "SPTSpec.h" +#import "SpectaUtility.h" +#import + +NSMutableDictionary *globalSharedExampleGroups = nil; +BOOL initialized = NO; + +@implementation SPTSharedExampleGroups + ++ (void)initialize { + Class SPTSharedExampleGroupsClass = [SPTSharedExampleGroups class]; + if ([self class] == SPTSharedExampleGroupsClass) { + if (!initialized) { + initialized = YES; + globalSharedExampleGroups = [[NSMutableDictionary alloc] init]; + + Class *classes = NULL; + int numClasses = objc_getClassList(NULL, 0); + + if (numClasses > 0) { + classes = (Class *)malloc(sizeof(Class) * numClasses); + numClasses = objc_getClassList(classes, numClasses); + + Class klass, superClass; + for(uint i = 0; i < numClasses; i++) { + klass = classes[i]; + superClass = class_getSuperclass(klass); + if (superClass == SPTSharedExampleGroupsClass) { + [[[klass alloc] init] sharedExampleGroups]; + } + } + + free(classes); + } + } + } +} + ++ (void)addSharedExampleGroupWithName:(NSString *)name block:(SPTDictionaryBlock)block exampleGroup:(SPTExampleGroup *)exampleGroup { + (exampleGroup == nil ? globalSharedExampleGroups : exampleGroup.sharedExamples)[name] = [block copy]; +} + ++ (SPTDictionaryBlock)sharedExampleGroupWithName:(NSString *)name exampleGroup:(SPTExampleGroup *)exampleGroup { + SPTDictionaryBlock sharedExampleGroup = nil; + while (exampleGroup != nil) { + if ((sharedExampleGroup = exampleGroup.sharedExamples[name])) { + return sharedExampleGroup; + } + exampleGroup = exampleGroup.parent; + } + return globalSharedExampleGroups[name]; +} + +- (void)sharedExampleGroups {} + +- (void)spt_handleException:(NSException *)exception { + [SPTCurrentSpec spt_handleException:exception]; +} + +- (void)recordFailureWithDescription:(NSString *)description inFile:(NSString *)filename atLine:(NSUInteger)lineNumber expected:(BOOL)expected { + [SPTCurrentSpec recordFailureWithDescription:description inFile:filename atLine:lineNumber expected:expected]; +} + +- (void)_recordUnexpectedFailureWithDescription:(NSString *)description exception:(NSException *)exception { + [SPTCurrentSpec _recordUnexpectedFailureWithDescription:description exception:exception]; +} + +- (_XCTestCaseImplementation *)internalImplementation { + return [SPTCurrentSpec internalImplementation]; +} + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTSpec.h b/Example/Pods/Specta/Specta/Specta/SPTSpec.h new file mode 100644 index 0000000..ada4ea2 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTSpec.h @@ -0,0 +1,28 @@ +#import +#import + +@class + SPTTestSuite +, SPTCompiledExample +; + +@interface SPTSpec : XCTestCase + +@property (strong) XCTestCaseRun *spt_run; +@property (nonatomic) BOOL spt_pending; +@property (nonatomic) BOOL spt_skipped; + ++ (BOOL)spt_isDisabled; ++ (void)spt_setDisabled:(BOOL)disabled; ++ (BOOL)spt_focusedExamplesExist; ++ (SEL)spt_convertToTestMethod:(SPTCompiledExample *)example; ++ (SPTTestSuite *)spt_testSuite; ++ (void)spt_setCurrentTestSuite; ++ (void)spt_unsetCurrentTestSuite; ++ (void)spt_setCurrentTestSuiteFileName:(NSString *)fileName lineNumber:(NSUInteger)lineNumber; + +- (void)spec; +- (BOOL)spt_shouldRunExample:(SPTCompiledExample *)example; +- (void)spt_runExample:(SPTCompiledExample *)example; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTSpec.m b/Example/Pods/Specta/Specta/Specta/SPTSpec.m new file mode 100644 index 0000000..7671783 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTSpec.m @@ -0,0 +1,209 @@ +#import "SPTSpec.h" +#import "SPTTestSuite.h" +#import "SPTCompiledExample.h" +#import "SPTSharedExampleGroups.h" +#import "SpectaUtility.h" +#import +#import "XCTest+Private.h" + +@implementation SPTSpec + ++ (void)initialize { + [SPTSharedExampleGroups initialize]; + SPTTestSuite *testSuite = [[SPTTestSuite alloc] init]; + SPTSpec *spec = [[[self class] alloc] init]; + NSString *specName = NSStringFromClass([self class]); + objc_setAssociatedObject(self, "spt_testSuite", testSuite, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + [self spt_setCurrentTestSuite]; + @try { + [spec spec]; + } + @catch (NSException *exception) { + fprintf(stderr, "%s: An exception has occured outside of tests, aborting.\n\n%s (%s) \n", [specName UTF8String], [[exception name] UTF8String], [[exception reason] UTF8String]); + if ([exception respondsToSelector:@selector(callStackSymbols)]) { + NSArray *callStackSymbols = [exception callStackSymbols]; + if (callStackSymbols) { + NSString *callStack = [NSString stringWithFormat:@"\n Call Stack:\n %@\n", [callStackSymbols componentsJoinedByString:@"\n "]]; + fprintf(stderr, "%s", [callStack UTF8String]); + } + } + exit(1); + } + @finally { + [self spt_unsetCurrentTestSuite]; + } + [testSuite compile]; + [super initialize]; +} + ++ (SPTTestSuite *)spt_testSuite { + return objc_getAssociatedObject(self, "spt_testSuite"); +} + ++ (BOOL)spt_isDisabled { + return [self spt_testSuite].disabled; +} + ++ (void)spt_setDisabled:(BOOL)disabled { + [self spt_testSuite].disabled = disabled; +} + ++ (NSArray *)spt_allSpecClasses { + static NSArray *allSpecClasses = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + + NSMutableArray *specClasses = [[NSMutableArray alloc] init]; + + int numberOfClasses = objc_getClassList(NULL, 0); + if (numberOfClasses > 0) { + Class *classes = (Class *)malloc(sizeof(Class) * numberOfClasses); + numberOfClasses = objc_getClassList(classes, numberOfClasses); + + for (int classIndex = 0; classIndex < numberOfClasses; classIndex++) { + Class aClass = classes[classIndex]; + if (spt_isSpecClass(aClass)) { + [specClasses addObject:aClass]; + } + } + + free(classes); + } + + allSpecClasses = [specClasses copy]; + }); + + return allSpecClasses; +} + ++ (BOOL)spt_focusedExamplesExist { + for (Class specClass in [self spt_allSpecClasses]) { + SPTTestSuite *testSuite = [specClass spt_testSuite]; + if (testSuite.disabled == NO && [testSuite hasFocusedExamples]) { + return YES; + } + } + + return NO; +} + ++ (SEL)spt_convertToTestMethod:(SPTCompiledExample *)example { + @synchronized(example) { + if (!example.testMethodSelector) { + IMP imp = imp_implementationWithBlock(^(SPTSpec *self) { + [self spt_runExample:example]; + }); + + SEL sel; + unsigned int i = 0; + + do { + i++; + if (i == 1) { + sel = NSSelectorFromString([NSString stringWithFormat:@"test_%@", example.testCaseName]); + } else { + sel = NSSelectorFromString([NSString stringWithFormat:@"test_%@_%u", example.testCaseName, i]); + } + } while([self instancesRespondToSelector:sel]); + + class_addMethod(self, sel, imp, "@@:"); + example.testMethodSelector = sel; + } + } + + return example.testMethodSelector; +} + ++ (void)spt_setCurrentTestSuite { + SPTTestSuite *testSuite = [self spt_testSuite]; + [[NSThread currentThread] threadDictionary][spt_kCurrentTestSuiteKey] = testSuite; +} + ++ (void)spt_unsetCurrentTestSuite { + [[[NSThread currentThread] threadDictionary] removeObjectForKey:spt_kCurrentTestSuiteKey]; +} + ++ (void)spt_setCurrentTestSuiteFileName:(NSString *)fileName lineNumber:(NSUInteger)lineNumber { + SPTTestSuite *testSuite = [self spt_testSuite]; + testSuite.fileName = fileName; + testSuite.lineNumber = lineNumber; +} + +- (void)spec {} + +- (BOOL)spt_shouldRunExample:(SPTCompiledExample *)example { + return [[self class] spt_isDisabled] == NO && + (example.focused || [[self class] spt_focusedExamplesExist] == NO); +} + +- (void)spt_runExample:(SPTCompiledExample *)example { + [[NSThread currentThread] threadDictionary][spt_kCurrentSpecKey] = self; + + if ([self spt_shouldRunExample:example]) { + self.spt_pending = example.pending; + example.block(self); + } else if (!example.pending) { + self.spt_skipped = YES; + } + + [[[NSThread currentThread] threadDictionary] removeObjectForKey:spt_kCurrentSpecKey]; +} + +#pragma mark - XCTestCase overrides + ++ (NSArray *)testInvocations { + NSArray *compiledExamples = [self spt_testSuite].compiledExamples; + [NSMutableArray arrayWithCapacity:[compiledExamples count]]; + + NSMutableSet *addedSelectors = [NSMutableSet setWithCapacity:[compiledExamples count]]; + NSMutableArray *selectors = [NSMutableArray arrayWithCapacity:[compiledExamples count]]; + + // dynamically generate test methods with compiled examples + for (SPTCompiledExample *example in compiledExamples) { + SEL sel = [self spt_convertToTestMethod:example]; + NSString *selName = NSStringFromSelector(sel); + [selectors addObject: selName]; + [addedSelectors addObject: selName]; + } + + // look for any other test methods that may be present in class. + unsigned int n; + Method *imethods = class_copyMethodList(self, &n); + + for (NSUInteger i = 0; i < n; i++) { + struct objc_method_description *desc = method_getDescription(imethods[i]); + + char *types = desc->types; + SEL sel = desc->name; + NSString *selName = NSStringFromSelector(sel); + + if (strcmp(types, "@@:") == 0 && [selName hasPrefix:@"test"] && ![addedSelectors containsObject:selName]) { + [selectors addObject:NSStringFromSelector(sel)]; + } + } + + free(imethods); + + // create invocations from test method selectors + NSMutableArray *invocations = [NSMutableArray arrayWithCapacity:[selectors count]]; + for (NSString *selName in selectors) { + SEL sel = NSSelectorFromString(selName); + NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self instanceMethodSignatureForSelector:sel]]; + [inv setSelector:sel]; + [invocations addObject:inv]; + } + + return spt_shuffle(invocations); +} + +- (void)recordFailureWithDescription:(NSString *)description inFile:(NSString *)filename atLine:(NSUInteger)lineNumber expected:(BOOL)expected { + SPTSpec *currentSpec = SPTCurrentSpec; + [currentSpec.spt_run recordFailureWithDescription:description inFile:filename atLine:lineNumber expected:expected]; +} + +- (void)performTest:(XCTestRun *)run { + self.spt_run = (XCTestCaseRun *)run; + [super performTest:run]; +} + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTTestSuite.h b/Example/Pods/Specta/Specta/Specta/SPTTestSuite.h new file mode 100644 index 0000000..9bd9016 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTTestSuite.h @@ -0,0 +1,21 @@ +#import + +@class + SPTExample +, SPTExampleGroup +; + +@interface SPTTestSuite : NSObject + +@property (nonatomic, strong) SPTExampleGroup *rootGroup; +@property (nonatomic, strong) NSMutableArray *groupStack; +@property (nonatomic, strong) NSArray *compiledExamples; +@property (nonatomic, copy) NSString *fileName; +@property (nonatomic) NSUInteger lineNumber; +@property (nonatomic, getter = isDisabled) BOOL disabled; +@property (nonatomic) BOOL hasFocusedExamples; + +- (SPTExampleGroup *)currentGroup; +- (void)compile; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/SPTTestSuite.m b/Example/Pods/Specta/Specta/Specta/SPTTestSuite.m new file mode 100644 index 0000000..7053edd --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SPTTestSuite.m @@ -0,0 +1,31 @@ +#import "SPTTestSuite.h" +#import "SPTExampleGroup.h" +#import "SPTCompiledExample.h" + +@implementation SPTTestSuite + +- (id)init { + self = [super init]; + if (self) { + self.rootGroup = [[SPTExampleGroup alloc] init]; + self.rootGroup.root = self.rootGroup; + self.groupStack = [NSMutableArray arrayWithObject:self.rootGroup]; + } + return self; +} + +- (SPTExampleGroup *)currentGroup { + return [self.groupStack lastObject]; +} + +- (void)compile { + self.compiledExamples = [self.rootGroup compileExamplesWithStack:@[]]; + for (SPTCompiledExample *example in self.compiledExamples) { + if (example.focused) { + self.hasFocusedExamples = YES; + break; + } + } +} + +@end diff --git a/Example/Pods/Specta/Specta/Specta/Specta.h b/Example/Pods/Specta/Specta/Specta/Specta.h new file mode 100644 index 0000000..dda17f9 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/Specta.h @@ -0,0 +1,14 @@ +#import +#import + +//! Project version number for Specta. +FOUNDATION_EXPORT double SpectaVersionNumber; + +//! Project version string for Specta. +FOUNDATION_EXPORT const unsigned char SpectaVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import +#import +#import diff --git a/Example/Pods/Specta/Specta/Specta/SpectaDSL.h b/Example/Pods/Specta/Specta/Specta/SpectaDSL.h new file mode 100644 index 0000000..284d4f5 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SpectaDSL.h @@ -0,0 +1,90 @@ +#import + +#define SpecBegin(name) _SPTSpecBegin(name, __FILE__, __LINE__) +#define SpecEnd _SPTSpecEnd + +#define SharedExamplesBegin(name) _SPTSharedExampleGroupsBegin(name) +#define SharedExamplesEnd _SPTSharedExampleGroupsEnd +#define SharedExampleGroupsBegin(name) _SPTSharedExampleGroupsBegin(name) +#define SharedExampleGroupsEnd _SPTSharedExampleGroupsEnd + +typedef void (^DoneCallback)(void); + +OBJC_EXTERN void describe(NSString *name, void (^block)()); +OBJC_EXTERN void fdescribe(NSString *name, void (^block)()); + +OBJC_EXTERN void context(NSString *name, void (^block)()); +OBJC_EXTERN void fcontext(NSString *name, void (^block)()); + +OBJC_EXTERN void it(NSString *name, void (^block)()); +OBJC_EXTERN void fit(NSString *name, void (^block)()); + +OBJC_EXTERN void example(NSString *name, void (^block)()); +OBJC_EXTERN void fexample(NSString *name, void (^block)()); + +OBJC_EXTERN void specify(NSString *name, void (^block)()); +OBJC_EXTERN void fspecify(NSString *name, void (^block)()); + +#define pending(...) spt_pending_(__VA_ARGS__, nil) +#define xdescribe(...) spt_pending_(__VA_ARGS__, nil) +#define xcontext(...) spt_pending_(__VA_ARGS__, nil) +#define xexample(...) spt_pending_(__VA_ARGS__, nil) +#define xit(...) spt_pending_(__VA_ARGS__, nil) +#define xspecify(...) spt_pending_(__VA_ARGS__, nil) + +OBJC_EXTERN void beforeAll(void (^block)()); +OBJC_EXTERN void afterAll(void (^block)()); + +OBJC_EXTERN void beforeEach(void (^block)()); +OBJC_EXTERN void afterEach(void (^block)()); + +OBJC_EXTERN void before(void (^block)()); +OBJC_EXTERN void after(void (^block)()); + +OBJC_EXTERN void sharedExamplesFor(NSString *name, void (^block)(NSDictionary *data)); +OBJC_EXTERN void sharedExamples(NSString *name, void (^block)(NSDictionary *data)); + +#define itShouldBehaveLike(...) spt_itShouldBehaveLike_(@(__FILE__), __LINE__, __VA_ARGS__) +#define itBehavesLike(...) spt_itShouldBehaveLike_(@(__FILE__), __LINE__, __VA_ARGS__) + +OBJC_EXTERN void waitUntil(void (^block)(DoneCallback done)); +/** + * Runs the @c block and waits until the @c done block is called or the + * @c timeout has passed. + * + * @param timeout timeout for this @c block only; does not affect the global + * timeout, as @c setAsyncSpecTimeout() does. + * @param ^block runs test code + */ +OBJC_EXTERN void waitUntilTimeout(NSTimeInterval timeout, void (^block)(DoneCallback done)); + +OBJC_EXTERN void setAsyncSpecTimeout(NSTimeInterval timeout); + +// ---------------------------------------------------------------------------- + +#define _SPTSpecBegin(name, file, line) \ +@interface name##Spec : SPTSpec \ +@end \ +@implementation name##Spec \ +- (void)spec { \ + [[self class] spt_setCurrentTestSuiteFileName:(@(file)) lineNumber:(line)]; + +#define _SPTSpecEnd \ +} \ +@end + +#define _SPTSharedExampleGroupsBegin(name) \ +@interface name##SharedExampleGroups : SPTSharedExampleGroups \ +@end \ +@implementation name##SharedExampleGroups \ +- (void)sharedExampleGroups { + +#define _SPTSharedExampleGroupsEnd \ +} \ +@end + +OBJC_EXTERN void spt_it_(NSString *name, NSString *fileName, NSUInteger lineNumber, void (^block)()); +OBJC_EXTERN void spt_fit_(NSString *name, NSString *fileName, NSUInteger lineNumber, void (^block)()); +OBJC_EXTERN void spt_pending_(NSString *name, ...); +OBJC_EXTERN void spt_itShouldBehaveLike_(NSString *fileName, NSUInteger lineNumber, NSString *name, id dictionaryOrBlock); +OBJC_EXTERN void spt_itShouldBehaveLike_block(NSString *fileName, NSUInteger lineNumber, NSString *name, NSDictionary *(^block)()); diff --git a/Example/Pods/Specta/Specta/Specta/SpectaDSL.m b/Example/Pods/Specta/Specta/Specta/SpectaDSL.m new file mode 100644 index 0000000..10edcd5 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SpectaDSL.m @@ -0,0 +1,189 @@ +#import "SpectaDSL.h" +#import "SpectaTypes.h" +#import "SpectaUtility.h" +#import "SPTTestSuite.h" +#import "SPTExampleGroup.h" +#import "SPTSharedExampleGroups.h" +#import "SPTSpec.h" +#import "SPTCallSite.h" +#import + +static NSTimeInterval asyncSpecTimeout = 10.0; + +static void spt_defineItBlock(NSString *name, NSString *fileName, NSUInteger lineNumber, BOOL focused, void (^block)()) { + SPTReturnUnlessBlockOrNil(block); + SPTCallSite *site = nil; + if (lineNumber && fileName) { + site = [SPTCallSite callSiteWithFile:fileName line:lineNumber]; + } + [SPTCurrentGroup addExampleWithName:name callSite:site focused:focused block:block]; +} + +static void spt_defineDescribeBlock(NSString *name, BOOL focused, void (^block)()) { + if (block) { + [SPTGroupStack addObject:[SPTCurrentGroup addExampleGroupWithName:name focused:focused]]; + block(); + [SPTGroupStack removeLastObject]; + } else { + spt_defineItBlock(name, nil, 0, focused, nil); + } +} + +void spt_it_(NSString *name, NSString *fileName, NSUInteger lineNumber, void (^block)()) { + spt_defineItBlock(name, fileName, lineNumber, NO, block); +} + +void spt_fit_(NSString *name, NSString *fileName, NSUInteger lineNumber, void (^block)()) { + spt_defineItBlock(name, fileName, lineNumber, YES, block); +} + +void spt_pending_(NSString *name, ...) { + spt_defineItBlock(name, nil, 0, NO, nil); +} + +void spt_itShouldBehaveLike_(NSString *fileName, NSUInteger lineNumber, NSString *name, id dictionaryOrBlock) { + SPTDictionaryBlock block = [SPTSharedExampleGroups sharedExampleGroupWithName:name exampleGroup:SPTCurrentGroup]; + if (block) { + if (SPTIsBlock(dictionaryOrBlock)) { + id (^dataBlock)(void) = [dictionaryOrBlock copy]; + + describe(name, ^{ + __block NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] init]; + + beforeEach(^{ + NSDictionary *blockData = dataBlock(); + [dataDict removeAllObjects]; + [dataDict addEntriesFromDictionary:blockData]; + }); + + block(dataDict); + + afterAll(^{ + dataDict = nil; + }); + }); + } else { + NSDictionary *data = dictionaryOrBlock; + + describe(name, ^{ + block(data); + }); + } + } else { + SPTSpec *currentSpec = SPTCurrentSpec; + if (currentSpec) { + [currentSpec recordFailureWithDescription:@"itShouldBehaveLike should not be invoked inside an example block!" inFile:fileName atLine:lineNumber expected:NO]; + } else { + it(name, ^{ + [SPTCurrentSpec recordFailureWithDescription:[NSString stringWithFormat:@"Shared example group \"%@\" does not exist.", name] inFile:fileName atLine:lineNumber expected:NO]; + }); + } + } +} + +void spt_itShouldBehaveLike_block(NSString *fileName, NSUInteger lineNumber, NSString *name, NSDictionary *(^block)()) { + spt_itShouldBehaveLike_(fileName, lineNumber, name, (id)block); +} + +void describe(NSString *name, void (^block)()) { + spt_defineDescribeBlock(name, NO, block); +} + +void fdescribe(NSString *name, void (^block)()) { + spt_defineDescribeBlock(name, YES, block); +} + +void context(NSString *name, void (^block)()) { + describe(name, block); +} + +void fcontext(NSString *name, void (^block)()) { + fdescribe(name, block); +} + +void it(NSString *name, void (^block)()) { + spt_defineItBlock(name, nil, 0, NO, block); +} + +void fit(NSString *name, void (^block)()) { + spt_defineItBlock(name, nil, 0, YES, block); +} + +void example(NSString *name, void (^block)()) { + it(name, block); +} + +void fexample(NSString *name, void (^block)()) { + fit(name, block); +} + +void specify(NSString *name, void (^block)()) { + it(name, block); +} + +void fspecify(NSString *name, void (^block)()) { + fit(name, block); +} + +void beforeAll(void (^block)()) { + SPTReturnUnlessBlockOrNil(block); + [SPTCurrentGroup addBeforeAllBlock:block]; +} + +void afterAll(void (^block)()) { + SPTReturnUnlessBlockOrNil(block); + [SPTCurrentGroup addAfterAllBlock:block]; +} + +void beforeEach(void (^block)()) { + SPTReturnUnlessBlockOrNil(block); + [SPTCurrentGroup addBeforeEachBlock:block]; +} + +void afterEach(void (^block)()) { + SPTReturnUnlessBlockOrNil(block); + [SPTCurrentGroup addAfterEachBlock:block]; +} + +void before(void (^block)()) { + beforeEach(block); +} + +void after(void (^block)()) { + afterEach(block); +} + +void sharedExamplesFor(NSString *name, void (^block)(NSDictionary *data)) { + [SPTSharedExampleGroups addSharedExampleGroupWithName:name block:block exampleGroup:SPTCurrentGroup]; +} + +void sharedExamples(NSString *name, void (^block)(NSDictionary *data)) { + sharedExamplesFor(name, block); +} + +void waitUntil(void (^block)(DoneCallback done)) { + waitUntilTimeout(asyncSpecTimeout, block); +} + +void waitUntilTimeout(NSTimeInterval timeout, void (^block)(DoneCallback done)) { + __block uint32_t complete = 0; + dispatch_async(dispatch_get_main_queue(), ^{ + block(^{ + OSAtomicOr32Barrier(1, &complete); + }); + }); + NSDate *timeoutDate = [NSDate dateWithTimeIntervalSinceNow:timeout]; + while (!complete && [timeoutDate timeIntervalSinceNow] > 0) { + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; + } + if (!complete) { + NSString *message = [NSString stringWithFormat:@"failed to invoke done() callback before timeout (%f seconds)", timeout]; + SPTSpec *currentSpec = SPTCurrentSpec; + SPTTestSuite *testSuite = [[currentSpec class] spt_testSuite]; + [currentSpec recordFailureWithDescription:message inFile:testSuite.fileName atLine:testSuite.lineNumber expected:YES]; + } +} + +void setAsyncSpecTimeout(NSTimeInterval timeout) { + asyncSpecTimeout = timeout; +} diff --git a/Example/Pods/Specta/Specta/Specta/SpectaTypes.h b/Example/Pods/Specta/Specta/Specta/SpectaTypes.h new file mode 100644 index 0000000..f1f0ae3 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SpectaTypes.h @@ -0,0 +1,5 @@ +@class SPTSpec; + +typedef void (^SPTVoidBlock)(); +typedef void (^SPTSpecBlock)(SPTSpec *spec); +typedef void (^SPTDictionaryBlock)(NSDictionary *dictionary); diff --git a/Example/Pods/Specta/Specta/Specta/SpectaUtility.h b/Example/Pods/Specta/Specta/Specta/SpectaUtility.h new file mode 100644 index 0000000..a3a8f07 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SpectaUtility.h @@ -0,0 +1,18 @@ +#import + +extern NSString * const spt_kCurrentTestSuiteKey; +extern NSString * const spt_kCurrentSpecKey; + +#define SPTCurrentTestSuite [[NSThread mainThread] threadDictionary][spt_kCurrentTestSuiteKey] +#define SPTCurrentSpec [[NSThread mainThread] threadDictionary][spt_kCurrentSpecKey] +#define SPTCurrentGroup [SPTCurrentTestSuite currentGroup] +#define SPTGroupStack [SPTCurrentTestSuite groupStack] + +#define SPTReturnUnlessBlockOrNil(block) if ((block) && !SPTIsBlock((block))) return; +#define SPTIsBlock(obj) [(obj) isKindOfClass:NSClassFromString(@"NSBlock")] + +BOOL spt_isSpecClass(Class aClass); +NSString *spt_underscorize(NSString *string); +NSArray *spt_map(NSArray *array, id (^block)(id obj, NSUInteger idx)); +NSArray *spt_shuffle(NSArray *array); +unsigned int spt_seed(); diff --git a/Example/Pods/Specta/Specta/Specta/SpectaUtility.m b/Example/Pods/Specta/Specta/Specta/SpectaUtility.m new file mode 100644 index 0000000..9b2ee80 --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/SpectaUtility.m @@ -0,0 +1,79 @@ +#import "SpectaUtility.h" +#import "SPTSpec.h" +#import + +NSString * const spt_kCurrentTestSuiteKey = @"SPTCurrentTestSuite"; +NSString * const spt_kCurrentSpecKey = @"SPTCurrentSpec"; + +static unsigned int seed = 0; + +BOOL spt_isSpecClass(Class aClass) { + Class superclass = class_getSuperclass(aClass); + while (superclass != Nil) { + if (superclass == [SPTSpec class]) { + return YES; + } else { + superclass = class_getSuperclass(superclass); + } + } + return NO; +} + +NSString *spt_underscorize(NSString *string) { + static NSMutableCharacterSet *invalidCharSet; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + invalidCharSet = [[NSMutableCharacterSet alloc] init]; + [invalidCharSet formUnionWithCharacterSet:[NSCharacterSet controlCharacterSet]]; + [invalidCharSet formUnionWithCharacterSet:[NSCharacterSet illegalCharacterSet]]; + [invalidCharSet formUnionWithCharacterSet:[NSCharacterSet newlineCharacterSet]]; + [invalidCharSet formUnionWithCharacterSet:[NSCharacterSet nonBaseCharacterSet]]; + [invalidCharSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; + [invalidCharSet formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]]; + }); + NSString *stripped = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + stripped = [[stripped componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""]; + + NSArray *components = [stripped componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + stripped = [[components objectsAtIndexes:[components indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { + return ![obj isEqualToString:@""]; + }]] componentsJoinedByString:@"_"]; + return stripped; +} + +NSArray *spt_map(NSArray *array, id (^block)(id obj, NSUInteger idx)) { + NSMutableArray *mapped = [NSMutableArray arrayWithCapacity:[array count]]; + [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [mapped addObject:block(obj, idx)]; + }]; + return mapped; +} + +NSArray *spt_shuffle(NSArray *array) { + if (![[[[NSProcessInfo processInfo] environment] objectForKey:@"SPECTA_SHUFFLE"] isEqualToString:@"1"]) { + return array; + } + spt_seed(); + NSMutableArray *shuffled = [array mutableCopy]; + NSUInteger count = [shuffled count]; + for (NSUInteger i = 0; i < count; i++) { + NSUInteger r = random() % count; + [shuffled exchangeObjectAtIndex:i withObjectAtIndex:r]; + } + return shuffled; +} + +unsigned int spt_seed() { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSString *envSeed = [[[NSProcessInfo processInfo] environment] objectForKey:@"SPECTA_SEED"]; + if (envSeed) { + sscanf([envSeed UTF8String], "%u", &seed); + } else { + seed = arc4random(); + } + srandom(seed); + printf("Test Seed: %u\n", seed); + }); + return seed; +} diff --git a/Example/Pods/Specta/Specta/Specta/XCTest+Private.h b/Example/Pods/Specta/Specta/Specta/XCTest+Private.h new file mode 100644 index 0000000..0b83aeb --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/XCTest+Private.h @@ -0,0 +1,40 @@ +#import + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000 || __MAC_OS_X_VERSION_MAX_ALLOWED >= 101100 + +@interface XCTestObservationCenter (SPTTestSuspention) + +- (void)_suspendObservationForBlock:(void (^)(void))block; + +@end + +#else + +@interface XCTestObservationCenter : NSObject + ++ (id)sharedObservationCenter; +- (void)_suspendObservationForBlock:(void (^)(void))block; + +@end + +#endif + +@protocol XCTestObservation +@end + +@interface _XCTestDriverTestObserver : NSObject + +- (void)stopObserving; +- (void)startObserving; + +@end + +@interface _XCTestCaseImplementation : NSObject +@end + +@interface XCTestCase () + +- (_XCTestCaseImplementation *)internalImplementation; +- (void)_recordUnexpectedFailureWithDescription:(NSString *)description exception:(NSException *)exception; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.h b/Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.h new file mode 100644 index 0000000..9ca8f8a --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.h @@ -0,0 +1,7 @@ +#import + +@interface XCTestCase (Specta) + +- (void)spt_handleException:(NSException *)exception; + +@end diff --git a/Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.m b/Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.m new file mode 100644 index 0000000..4c503ee --- /dev/null +++ b/Example/Pods/Specta/Specta/Specta/XCTestCase+Specta.m @@ -0,0 +1,65 @@ +#import +#import "XCTestCase+Specta.h" +#import "SPTSpec.h" +#import "SPTExample.h" +#import "SPTSharedExampleGroups.h" +#import "SpectaUtility.h" +#import "XCTest+Private.h" + +@interface XCTestCase (xct_allSubclasses) + +- (NSArray *)allSubclasses; +- (void)_dequeueFailures; + +@end + +@implementation XCTestCase (Specta) + ++ (void)load { + Method allSubclasses = class_getClassMethod(self, @selector(allSubclasses)); + Method allSubclasses_swizzle = class_getClassMethod(self , @selector(spt_allSubclasses_swizzle)); + method_exchangeImplementations(allSubclasses, allSubclasses_swizzle); + + Method dequeueFailures = class_getInstanceMethod(self, @selector(_dequeueFailures)); + Method dequeueFailures_swizzle = class_getInstanceMethod(self, @selector(spt_dequeueFailures)); + method_exchangeImplementations(dequeueFailures, dequeueFailures_swizzle); +} + ++ (NSArray *)spt_allSubclasses_swizzle { + NSArray *subclasses = [self spt_allSubclasses_swizzle]; // call original + NSMutableArray *filtered = [NSMutableArray arrayWithCapacity:[subclasses count]]; + // exclude SPTSpec base class and all subclasses of SPTSharedExampleGroups + for (id subclass in subclasses) { + if (subclass != [SPTSpec class] && ![subclass isKindOfClass:[SPTSharedExampleGroups class]]) { + [filtered addObject:subclass]; + } + } + return spt_shuffle(filtered); +} + +- (void)spt_dequeueFailures { + void(^dequeueFailures)() = ^() { + [self spt_dequeueFailures]; + }; + + if ([NSThread isMainThread]) { + dequeueFailures(); + } else { + dispatch_sync(dispatch_get_main_queue(), dequeueFailures); + } +} + +- (void)spt_handleException:(NSException *)exception { + NSString *description = [exception reason]; + if ([exception userInfo]) { + id line = [exception userInfo][@"line"]; + id file = [exception userInfo][@"file"]; + if ([line isKindOfClass:[NSNumber class]] && [file isKindOfClass:[NSString class]]) { + [self recordFailureWithDescription:description inFile:file atLine:[line unsignedIntegerValue] expected:YES]; + return; + } + } + [self _recordUnexpectedFailureWithDescription:description exception:exception]; +} + +@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-Private.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-Private.xcconfig index ad8c988..09ae130 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-Private.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo-JazzHands/Pods-JazzHandsDemo-JazzHands-Private.xcconfig @@ -1,6 +1,6 @@ #include "Pods-JazzHandsDemo-JazzHands.xcconfig" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JazzHands" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JazzHands" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" OTHER_LDFLAGS = ${PODS_JAZZHANDSDEMO_JAZZHANDS_OTHER_LDFLAGS} -ObjC PODS_ROOT = ${SRCROOT} SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-environment.h b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-environment.h index 18a2b80..d0e4947 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-environment.h +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo-environment.h @@ -8,7 +8,7 @@ // JazzHands #define COCOAPODS_POD_AVAILABLE_JazzHands -#define COCOAPODS_VERSION_MAJOR_JazzHands 0 -#define COCOAPODS_VERSION_MINOR_JazzHands 2 -#define COCOAPODS_VERSION_PATCH_JazzHands 1 +#define COCOAPODS_VERSION_MAJOR_JazzHands 2 +#define COCOAPODS_VERSION_MINOR_JazzHands 0 +#define COCOAPODS_VERSION_PATCH_JazzHands 0 diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig index b01e63a..88216ea 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.debug.xcconfig @@ -1,6 +1,6 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/KIF" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsDemo-JazzHands" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig index b01e63a..88216ea 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsDemo/Pods-JazzHandsDemo.release.xcconfig @@ -1,6 +1,6 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/KIF" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsDemo-JazzHands" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-Private.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-Private.xcconfig new file mode 100644 index 0000000..4a1961b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-Private.xcconfig @@ -0,0 +1,7 @@ +#include "Pods-JazzHandsTests-Expecta.xcconfig" +FRAMEWORK_SEARCH_PATHS = ${PODS_JAZZHANDSTESTS_EXPECTA_FRAMEWORK_SEARCH_PATHS} +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Expecta" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_EXPECTA_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-dummy.m new file mode 100644 index 0000000..9e4819f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_JazzHandsTests_Expecta : NSObject +@end +@implementation PodsDummy_Pods_JazzHandsTests_Expecta +@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch similarity index 100% rename from Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-prefix.pch rename to Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta-prefix.pch diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta.xcconfig new file mode 100644 index 0000000..30e681d --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Expecta/Pods-JazzHandsTests-Expecta.xcconfig @@ -0,0 +1,2 @@ +PODS_JAZZHANDSTESTS_EXPECTA_FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" +PODS_JAZZHANDSTESTS_EXPECTA_OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig deleted file mode 100644 index 8c403ea..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-Private.xcconfig +++ /dev/null @@ -1,7 +0,0 @@ -#include "Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig" -FRAMEWORK_SEARCH_PATHS = ${PODS_JAZZHANDSTESTS_FBSNAPSHOTTESTCASE_FRAMEWORK_SEARCH_PATHS} -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" -OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_FBSNAPSHOTTESTCASE_OTHER_LDFLAGS} -ObjC -PODS_ROOT = ${SRCROOT} -SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m deleted file mode 100644 index a954130..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_JazzHandsTests_FBSnapshotTestCase : NSObject -@end -@implementation PodsDummy_Pods_JazzHandsTests_FBSnapshotTestCase -@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig deleted file mode 100644 index 4f50b65..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-FBSnapshotTestCase/Pods-JazzHandsTests-FBSnapshotTestCase.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -PODS_JAZZHANDSTESTS_FBSNAPSHOTTESTCASE_FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(PLATFORM_DIR)/Developer/Library/Frameworks" -PODS_JAZZHANDSTESTS_FBSNAPSHOTTESTCASE_OTHER_LDFLAGS = -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig index 2303867..a1d40b6 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-JazzHands/Pods-JazzHandsTests-JazzHands-Private.xcconfig @@ -1,6 +1,6 @@ #include "Pods-JazzHandsTests-JazzHands.xcconfig" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JazzHands" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JazzHands" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_JAZZHANDS_OTHER_LDFLAGS} -ObjC PODS_ROOT = ${SRCROOT} SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-Private.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-Private.xcconfig deleted file mode 100644 index e433c59..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-Private.xcconfig +++ /dev/null @@ -1,8 +0,0 @@ -#include "Pods-JazzHandsTests-KIF.xcconfig" -FRAMEWORK_SEARCH_PATHS = ${PODS_JAZZHANDSTESTS_KIF_FRAMEWORK_SEARCH_PATHS} -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/KIF" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" -OTHER_CFLAGS = ${PODS_JAZZHANDSTESTS_KIF_OTHER_CFLAGS} -OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_KIF_OTHER_LDFLAGS} -ObjC -PODS_ROOT = ${SRCROOT} -SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-dummy.m deleted file mode 100644 index f8ad038..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_JazzHandsTests_KIF : NSObject -@end -@implementation PodsDummy_Pods_JazzHandsTests_KIF -@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF.xcconfig deleted file mode 100644 index 7457750..0000000 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF.xcconfig +++ /dev/null @@ -1,3 +0,0 @@ -PODS_JAZZHANDSTESTS_KIF_FRAMEWORK_SEARCH_PATHS = $(PLATFORM_DIR)/Developer/Library/Frameworks $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(PLATFORM_DIR)/Developer/Library/Frameworks" -PODS_JAZZHANDSTESTS_KIF_OTHER_CFLAGS = -DKIF_XCTEST -PODS_JAZZHANDSTESTS_KIF_OTHER_LDFLAGS = -framework "CoreGraphics" -framework "IOKit" -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-Private.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-Private.xcconfig new file mode 100644 index 0000000..bfffd07 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-Private.xcconfig @@ -0,0 +1,7 @@ +#include "Pods-JazzHandsTests-Specta.xcconfig" +FRAMEWORK_SEARCH_PATHS = ${PODS_JAZZHANDSTESTS_SPECTA_FRAMEWORK_SEARCH_PATHS} +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Specta" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = ${PODS_JAZZHANDSTESTS_SPECTA_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-dummy.m b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-dummy.m new file mode 100644 index 0000000..69c8b1e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_JazzHandsTests_Specta : NSObject +@end +@implementation PodsDummy_Pods_JazzHandsTests_Specta +@end diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-prefix.pch b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch similarity index 70% rename from Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-prefix.pch rename to Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch index 98af222..62ca51c 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests-KIF/Pods-JazzHandsTests-KIF-prefix.pch +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta-prefix.pch @@ -3,4 +3,3 @@ #endif #import "Pods-JazzHandsTests-environment.h" -#import diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta.xcconfig new file mode 100644 index 0000000..64b4636 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests-Specta/Pods-JazzHandsTests-Specta.xcconfig @@ -0,0 +1,2 @@ +PODS_JAZZHANDSTESTS_SPECTA_FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" +PODS_JAZZHANDSTESTS_SPECTA_OTHER_LDFLAGS = -framework "Foundation" -framework "XCTest" \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown index 12f88e5..8761200 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.markdown @@ -1,37 +1,27 @@ # Acknowledgements This application makes use of the following third party libraries: -## FBSnapshotTestCase +## Expecta -BSD License +Copyright (c) 2011-2015 Specta Team - https://github.com/specta -For the FBSnapshotTestCase software +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Copyright (c) 2013, Facebook, Inc. -All rights reserved. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +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. ## JazzHands @@ -58,21 +48,27 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -## KIF +## Specta + +Copyright (c) 2012-2014 Specta Team. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -KIF -Copyright 2011 Square, Inc. -A full list of contributors is available at https://github.com/square/KIF/contributors +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - 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 +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. - 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. Generated by CocoaPods - http://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist index c1cc75a..4990699 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-acknowledgements.plist @@ -14,38 +14,28 @@ FooterText - BSD License + Copyright (c) 2011-2015 Specta Team - https://github.com/specta -For the FBSnapshotTestCase software +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Copyright (c) 2013, Facebook, Inc. -All rights reserved. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +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. Title - FBSnapshotTestCase + Expecta Type PSGroupSpecifier @@ -79,23 +69,29 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. FooterText - KIF -Copyright 2011 Square, Inc. -A full list of contributors is available at https://github.com/square/KIF/contributors + Copyright (c) 2012-2014 Specta Team. - 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 +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - 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. +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. + + Title - KIF + Specta Type PSGroupSpecifier diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-environment.h b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-environment.h index 82299a8..9c362e5 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-environment.h +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests-environment.h @@ -6,27 +6,21 @@ // project. -// FBSnapshotTestCase -#define COCOAPODS_POD_AVAILABLE_FBSnapshotTestCase -#define COCOAPODS_VERSION_MAJOR_FBSnapshotTestCase 1 -#define COCOAPODS_VERSION_MINOR_FBSnapshotTestCase 6 -#define COCOAPODS_VERSION_PATCH_FBSnapshotTestCase 0 +// Expecta +#define COCOAPODS_POD_AVAILABLE_Expecta +#define COCOAPODS_VERSION_MAJOR_Expecta 1 +#define COCOAPODS_VERSION_MINOR_Expecta 0 +#define COCOAPODS_VERSION_PATCH_Expecta 0 // JazzHands #define COCOAPODS_POD_AVAILABLE_JazzHands -#define COCOAPODS_VERSION_MAJOR_JazzHands 0 -#define COCOAPODS_VERSION_MINOR_JazzHands 2 -#define COCOAPODS_VERSION_PATCH_JazzHands 1 +#define COCOAPODS_VERSION_MAJOR_JazzHands 2 +#define COCOAPODS_VERSION_MINOR_JazzHands 0 +#define COCOAPODS_VERSION_PATCH_JazzHands 0 -// KIF -#define COCOAPODS_POD_AVAILABLE_KIF -#define COCOAPODS_VERSION_MAJOR_KIF 3 -#define COCOAPODS_VERSION_MINOR_KIF 2 -#define COCOAPODS_VERSION_PATCH_KIF 1 - -// KIF/XCTest -#define COCOAPODS_POD_AVAILABLE_KIF_XCTest -#define COCOAPODS_VERSION_MAJOR_KIF_XCTest 3 -#define COCOAPODS_VERSION_MINOR_KIF_XCTest 2 -#define COCOAPODS_VERSION_PATCH_KIF_XCTest 1 +// Specta +#define COCOAPODS_POD_AVAILABLE_Specta +#define COCOAPODS_VERSION_MAJOR_Specta 1 +#define COCOAPODS_VERSION_MINOR_Specta 0 +#define COCOAPODS_VERSION_PATCH_Specta 2 diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig index 8bf6784..2d8d55f 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.debug.xcconfig @@ -1,7 +1,7 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(PLATFORM_DIR)/Developer/Library/Frameworks" $(PLATFORM_DIR)/Developer/Library/Frameworks $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(PLATFORM_DIR)/Developer/Library/Frameworks" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/KIF" -DKIF_XCTEST -OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsTests-FBSnapshotTestCase" -l"Pods-JazzHandsTests-JazzHands" -l"Pods-JazzHandsTests-KIF" -framework "CoreGraphics" -framework "Foundation" -framework "IOKit" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsTests-Expecta" -l"Pods-JazzHandsTests-JazzHands" -l"Pods-JazzHandsTests-Specta" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig index 8bf6784..2d8d55f 100644 --- a/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-JazzHandsTests/Pods-JazzHandsTests.release.xcconfig @@ -1,7 +1,7 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(PLATFORM_DIR)/Developer/Library/Frameworks" $(PLATFORM_DIR)/Developer/Library/Frameworks $(inherited) "$(SDKROOT)/Developer/Library/Frameworks" "$(PLATFORM_DIR)/Developer/Library/Frameworks" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" $(inherited) $(DEVELOPER_FRAMEWORKS_DIR) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks" "$(SDKROOT)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/KIF" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/FBSnapshotTestCase" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/KIF" -DKIF_XCTEST -OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsTests-FBSnapshotTestCase" -l"Pods-JazzHandsTests-JazzHands" -l"Pods-JazzHandsTests-KIF" -framework "CoreGraphics" -framework "Foundation" -framework "IOKit" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Expecta" "${PODS_ROOT}/Headers/Public/JazzHands" "${PODS_ROOT}/Headers/Public/Specta" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Expecta" -isystem "${PODS_ROOT}/Headers/Public/JazzHands" -isystem "${PODS_ROOT}/Headers/Public/Specta" +OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-JazzHandsTests-Expecta" -l"Pods-JazzHandsTests-JazzHands" -l"Pods-JazzHandsTests-Specta" -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/JazzHands.podspec b/JazzHands.podspec index bb7c1b9..07e3a61 100644 --- a/JazzHands.podspec +++ b/JazzHands.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'JazzHands' - s.version = '0.2.1' + s.version = '2.0.0' s.summary = 'Simple keyframe animations for scrolling intros.' s.homepage = 'https://github.com/IFTTT/JazzHands' s.author = { @@ -10,7 +10,7 @@ Pod::Spec.new do |s| 'Laura Skelton' => 'laura@ifttt.com' } s.source = { :git => 'https://github.com/IFTTT/JazzHands.git', :tag => s.version.to_s } - s.platform = :ios, '5.0' + s.platform = :ios, '7.0' s.requires_arc = true s.license = { :type => 'MIT', diff --git a/JazzHands/IFTTTAlphaAnimation.h b/JazzHands/IFTTTAlphaAnimation.h index 3641571..c26f6c4 100644 --- a/JazzHands/IFTTTAlphaAnimation.h +++ b/JazzHands/IFTTTAlphaAnimation.h @@ -6,8 +6,11 @@ // Copyright (c) 2013 IFTTT Inc. All rights reserved. // -#import "IFTTTAnimation.h" +#import "IFTTTViewAnimation.h" -@interface IFTTTAlphaAnimation : IFTTTAnimation +@interface IFTTTAlphaAnimation : IFTTTViewAnimation + +- (void)addKeyframeForTime:(CGFloat)time alpha:(CGFloat)alpha; +- (void)addKeyframeForTime:(CGFloat)time alpha:(CGFloat)alpha withEasingFunction:(IFTTTEasingFunction)easingFunction; @end diff --git a/JazzHands/IFTTTAlphaAnimation.m b/JazzHands/IFTTTAlphaAnimation.m index 7f6e8d7..5387f12 100644 --- a/JazzHands/IFTTTAlphaAnimation.m +++ b/JazzHands/IFTTTAlphaAnimation.m @@ -6,29 +6,33 @@ // Copyright (c) 2013 IFTTT Inc. All rights reserved. // -#import "IFTTTJazzHands.h" +#import "IFTTTAlphaAnimation.h" @implementation IFTTTAlphaAnimation -- (void)animate:(NSInteger)time +- (void)addKeyframeForTime:(CGFloat)time alpha:(CGFloat)alpha { - if (self.keyFrames.count <= 1) return; - - IFTTTAnimationFrame *animationFrame = [self animationFrameForTime:time]; - self.view.alpha = animationFrame.alpha; + if (![self validAlpha:alpha]) return; + [self addKeyframeForTime:time value:@(alpha)]; } -- (IFTTTAnimationFrame *)frameForTime:(NSInteger)time - startKeyFrame:(IFTTTAnimationKeyFrame *)startKeyFrame - endKeyFrame:(IFTTTAnimationKeyFrame *)endKeyFrame +- (void)addKeyframeForTime:(CGFloat)time alpha:(CGFloat)alpha withEasingFunction:(IFTTTEasingFunction)easingFunction { - IFTTTAnimationFrame *animationFrame = [IFTTTAnimationFrame new]; - animationFrame.alpha = [self tweenValueForStartTime:startKeyFrame.time - endTime:endKeyFrame.time - startValue:startKeyFrame.alpha - endValue:endKeyFrame.alpha atTime:time]; - - return animationFrame; + if (![self validAlpha:alpha]) return; + [self addKeyframeForTime:time value:@(alpha) withEasingFunction:easingFunction]; +} + +- (BOOL)validAlpha:(CGFloat)alpha +{ + NSAssert((alpha >= 0.f) && (alpha <= 1.f), @"Alpha values must be between zero and one."); + if ((alpha < 0.f) || (alpha > 1.f)) return NO; + return YES; +} + +- (void)animate:(CGFloat)time +{ + if (!self.hasKeyframes) return; + self.view.alpha = (CGFloat)[(NSNumber *)[self valueAtTime:time] floatValue]; } @end diff --git a/JazzHands/IFTTTAngleAnimation.h b/JazzHands/IFTTTAngleAnimation.h deleted file mode 100644 index b8b7da3..0000000 --- a/JazzHands/IFTTTAngleAnimation.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// IFTTTAngleAnimation.h -// JazzHands -// -// Created by Vahur Roosimaa on 12/7/13. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "IFTTTAnimation.h" - -@interface IFTTTAngleAnimation : IFTTTAnimation - -@end diff --git a/JazzHands/IFTTTAngleAnimation.m b/JazzHands/IFTTTAngleAnimation.m deleted file mode 100644 index bc80ce4..0000000 --- a/JazzHands/IFTTTAngleAnimation.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// IFTTTAngleAnimation.m -// JazzHands -// -// Created by Vahur Roosimaa on 12/7/13. -// Copyright (c) 2015 IFTTT Inc. All rights reserved. -// - -#import "IFTTTJazzHands.h" - -@implementation IFTTTAngleAnimation - -- (void)animate:(NSInteger)time -{ - if (self.keyFrames.count <= 1) return; - - IFTTTAnimationFrame *animationFrame = [self animationFrameForTime:time]; - self.view.transform = CGAffineTransformMakeRotation(animationFrame.angle); - -} - -- (IFTTTAnimationFrame *)frameForTime:(NSInteger)time - startKeyFrame:(IFTTTAnimationKeyFrame *)startKeyFrame - endKeyFrame:(IFTTTAnimationKeyFrame *)endKeyFrame -{ - IFTTTAnimationFrame *animationFrame = [IFTTTAnimationFrame new]; - animationFrame.angle = [self tweenValueForStartTime:startKeyFrame.time - endTime:endKeyFrame.time - startValue:startKeyFrame.angle - endValue:endKeyFrame.angle atTime:time]; - - return animationFrame; -} - -@end diff --git a/JazzHands/IFTTTAnimatable.h b/JazzHands/IFTTTAnimatable.h new file mode 100644 index 0000000..884b5e0 --- /dev/null +++ b/JazzHands/IFTTTAnimatable.h @@ -0,0 +1,15 @@ +// +// IFTTTAnimatable.h +// JazzHands +// +// Created by Laura Skelton on 6/17/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +@import UIKit; + +@protocol IFTTTAnimatable + +- (void)animate:(CGFloat)time; + +@end diff --git a/JazzHands/IFTTTAnimatedPagingScrollViewController.h b/JazzHands/IFTTTAnimatedPagingScrollViewController.h new file mode 100644 index 0000000..b91f8b1 --- /dev/null +++ b/JazzHands/IFTTTAnimatedPagingScrollViewController.h @@ -0,0 +1,29 @@ +// +// IFTTTAnimatedPagingScrollViewController.h +// JazzHands +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +@import UIKit; +@class IFTTTAnimator; + +@interface IFTTTAnimatedPagingScrollViewController : UIViewController + +@property (nonatomic, strong) IFTTTAnimator *animator; +@property (nonatomic, strong) UIScrollView *scrollView; +@property (nonatomic, strong) UIView *contentView; +@property (nonatomic, assign) NSUInteger numberOfPages; + +- (CGFloat)pageWidth; +- (CGFloat)pageOffset; + +- (void)animateCurrentFrame; +- (CGFloat)centerXMultiplierForPage:(CGFloat)page; + +- (void)keepView:(UIView *)view onPage:(CGFloat)page; +- (void)keepView:(UIView *)view onPages:(NSArray *)pages; +- (void)keepView:(UIView *)view onPages:(NSArray *)pages atTimes:(NSArray *)times; + +@end diff --git a/JazzHands/IFTTTAnimatedPagingScrollViewController.m b/JazzHands/IFTTTAnimatedPagingScrollViewController.m new file mode 100644 index 0000000..c0b26bc --- /dev/null +++ b/JazzHands/IFTTTAnimatedPagingScrollViewController.m @@ -0,0 +1,220 @@ +// +// IFTTTAnimatedPagingScrollViewController.m +// JazzHands +// +// Created by Laura Skelton on 6/18/15. +// Copyright (c) 2015 IFTTT Inc. All rights reserved. +// + +#import "IFTTTAnimatedPagingScrollViewController.h" +#import "IFTTTAnimator.h" +#import "IFTTTScrollViewPageConstraintAnimation.h" + +@interface IFTTTAnimatedPagingScrollViewController () + +@property (nonatomic, strong) NSMutableArray *scrollViewPageConstraintAnimations; + +@end + +@implementation IFTTTAnimatedPagingScrollViewController + +- (instancetype)init +{ + if ((self = [super init])) { + [self commonInit]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if ((self = [super initWithCoder:aDecoder])) { + [self commonInit]; + } + return self; +} + +- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { + [self commonInit]; + } + return self; +} + +- (void)commonInit +{ + _scrollViewPageConstraintAnimations = [NSMutableArray array]; + _animator = [IFTTTAnimator new]; + _scrollView = [UIScrollView new]; + _contentView = [UIView new]; + _numberOfPages = 2; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [self.view addSubview:self.scrollView]; + self.scrollView.frame = self.view.bounds; + self.scrollView.pagingEnabled = YES; + self.scrollView.showsHorizontalScrollIndicator = NO; + self.scrollView.delegate = self; + [self.scrollView addSubview:self.contentView]; + + self.scrollView.translatesAutoresizingMaskIntoConstraints = NO; + self.contentView.translatesAutoresizingMaskIntoConstraints = NO; + + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics: 0 views:@{ @"scrollView" : self.scrollView }]]; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics: 0 views:@{ @"scrollView" : self.scrollView }]]; + + [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeLeft multiplier:1.f constant:0.f]]; + [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeRight multiplier:1.f constant:0.f]]; + [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeTop multiplier:1.f constant:0.f]]; + [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.scrollView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]]; + + [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:(CGFloat)self.numberOfPages constant:0.f]]; + [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:1.f constant:0.f]]; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + for (IFTTTScrollViewPageConstraintAnimation *animation in self.scrollViewPageConstraintAnimations) { + animation.pageWidth = self.pageWidth; + } + + [self animateCurrentFrame]; +} + +#pragma mark - iOS8+ Resizing + +- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator +{ + CGFloat newPageWidth = size.width; + + for (IFTTTScrollViewPageConstraintAnimation *animation in self.scrollViewPageConstraintAnimations) { + animation.pageWidth = newPageWidth; + } + + CGFloat futurePixelOffset = self.pageOffset * newPageWidth; + + [coordinator animateAlongsideTransition:^(id context) { + [self animateCurrentFrame]; + [self.scrollView setContentOffset:CGPointMake(futurePixelOffset, 0.f)]; + } completion:nil]; +} + +#pragma mark - iOS7 Orientation Change Resizing + +- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration +{ + CGFloat newPageWidth; + + if ((UIInterfaceOrientationIsLandscape(self.interfaceOrientation) + && UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) + || (UIInterfaceOrientationIsPortrait(self.interfaceOrientation) + && UIInterfaceOrientationIsLandscape(toInterfaceOrientation))) { + + newPageWidth = CGRectGetHeight(self.scrollView.frame); + } else { + newPageWidth = CGRectGetWidth(self.scrollView.frame); + } + + for (IFTTTScrollViewPageConstraintAnimation *animation in self.scrollViewPageConstraintAnimations) { + animation.pageWidth = newPageWidth; + } + + CGFloat futurePixelOffset = self.pageOffset * newPageWidth; + + [UIView animateWithDuration:duration animations:^{ + [self animateCurrentFrame]; + [self.scrollView setContentOffset:CGPointMake(futurePixelOffset, 0.f)]; + } completion:^(BOOL finished){ + [UIView animateWithDuration:0.1f + animations:^{ + [self animateCurrentFrame]; + }]; + }]; +} + +#pragma mark - Scroll View + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView +{ + [self animateCurrentFrame]; +} + +- (void)animateCurrentFrame +{ + [self.animator animate:self.pageOffset]; +} + +- (CGFloat)pageWidth +{ + return CGRectGetWidth(self.scrollView.frame); +} + +- (CGFloat)pageOffset +{ + CGFloat currentOffset = self.scrollView.contentOffset.x; + if (self.pageWidth > 0.f) { + currentOffset = currentOffset / self.pageWidth; + } + return currentOffset; +} + +- (CGFloat)centerXMultiplierForPage:(CGFloat)page +{ + return (1.f + (2.f * page)) / ((CGFloat)self.numberOfPages); +} + +#pragma mark - Keep View On Page Animations + +- (void)keepView:(UIView *)view onPage:(CGFloat)page +{ + view.translatesAutoresizingMaskIntoConstraints = NO; + [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:view + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeCenterX + multiplier:[self centerXMultiplierForPage:page] + constant:0.f]]; +} + +- (void)keepView:(UIView *)view onPages:(NSArray *)pages +{ + [self keepView:view onPages:pages atTimes:pages]; +} + +- (void)keepView:(UIView *)view onPages:(NSArray *)pages atTimes:(NSArray *)times +{ + NSAssert((pages.count == times.count), @"Make sure you set a time for each position."); + + view.translatesAutoresizingMaskIntoConstraints = NO; + + NSLayoutConstraint *xPositionConstraint = [NSLayoutConstraint constraintWithItem:view + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.contentView + attribute:NSLayoutAttributeLeft + multiplier:1.f + constant:0.f]; + [self.contentView addConstraint:xPositionConstraint]; + + IFTTTScrollViewPageConstraintAnimation *xPositionAnimation = [IFTTTScrollViewPageConstraintAnimation animationWithSuperview:self.contentView + constraint:xPositionConstraint + pageWidth:self.pageWidth]; + + for (NSUInteger i = 0; i < pages.count; i++) { + [xPositionAnimation addKeyframeForTime:(CGFloat)[(NSNumber *)times[i] floatValue] + page:(CGFloat)[(NSNumber *)pages[i] floatValue]]; + } + + [self.animator addAnimation:xPositionAnimation]; + [self.scrollViewPageConstraintAnimations addObject:xPositionAnimation]; +} + +@end diff --git a/JazzHands/IFTTTAnimatedScrollViewController.m b/JazzHands/IFTTTAnimatedScrollViewController.m index 5eba108..91dc074 100644 --- a/JazzHands/IFTTTAnimatedScrollViewController.m +++ b/JazzHands/IFTTTAnimatedScrollViewController.m @@ -21,7 +21,7 @@ @interface IFTTTAnimatedScrollViewController () @implementation IFTTTAnimatedScrollViewController -- (id)init +- (instancetype)init { if ((self = [super init])) { [self commonInit]; @@ -30,7 +30,7 @@ - (id)init return self; } -- (id)initWithCoder:(NSCoder *)aDecoder +- (instancetype)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { [self commonInit]; @@ -39,7 +39,7 @@ - (id)initWithCoder:(NSCoder *)aDecoder return self; } -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { [self commonInit]; @@ -64,7 +64,7 @@ - (void)viewDidLoad - (void)scrollViewDidScroll:(UIScrollView *)aScrollView { - [self.animator animate:(NSInteger)aScrollView.contentOffset.x]; + [self.animator animate:aScrollView.contentOffset.x]; self.isAtEnd = (aScrollView.contentOffset.x >= IFTTTMaxContentOffsetXForScrollView(aScrollView)); diff --git a/JazzHands/IFTTTAnimation.h b/JazzHands/IFTTTAnimation.h index f58b633..0cdb655 100644 --- a/JazzHands/IFTTTAnimation.h +++ b/JazzHands/IFTTTAnimation.h @@ -6,33 +6,16 @@ // Copyright (c) 2013 IFTTT Inc. All rights reserved. // -#import #import -@class IFTTTAnimationKeyFrame, IFTTTAnimationFrame; +#import "IFTTTEasingFunction.h" +#import "IFTTTInterpolatable.h" +#import "IFTTTAnimatable.h" @interface IFTTTAnimation : NSObject -@property (strong, nonatomic) UIView *view; -@property (strong, nonatomic) CALayer *layer; -@property (strong, nonatomic) NSLayoutConstraint *constraint; -@property (strong, nonatomic) NSMutableArray *keyFrames; - -+ (instancetype)animationWithView:(UIView *)view; -+ (instancetype)animationWithLayer:(CALayer *)layer; - -- (id)initWithView:(UIView *)view; -- (id)initWithLayer:(CALayer *)layer; - -- (void)animate:(NSInteger)time; - -- (void)addKeyFrames:(NSArray *)keyFrames; -- (void)addKeyFrame:(IFTTTAnimationKeyFrame *)keyFrame; - -- (IFTTTAnimationFrame *)animationFrameForTime:(NSInteger)time; -- (CGFloat)tweenValueForStartTime:(NSInteger)startTime - endTime:(NSInteger)endTime - startValue:(CGFloat)startValue - endValue:(CGFloat)endValue - atTime:(CGFloat)time; +- (void)addKeyframeForTime:(CGFloat)time value:(id)value; +- (void)addKeyframeForTime:(CGFloat)time value:(id)value withEasingFunction:(IFTTTEasingFunction)easingFunction; +- (id)valueAtTime:(CGFloat)time; +- (BOOL)hasKeyframes; @end diff --git a/JazzHands/IFTTTAnimation.m b/JazzHands/IFTTTAnimation.m index 90e64f8..8348d70 100644 --- a/JazzHands/IFTTTAnimation.m +++ b/JazzHands/IFTTTAnimation.m @@ -7,143 +7,45 @@ // #import "IFTTTAnimation.h" -#import "IFTTTAnimationKeyFrame.h" -#import "IFTTTAnimationFrame.h" +#import "IFTTTFilmstrip.h" @interface IFTTTAnimation () -@property (strong, nonatomic) NSMutableArray *timeline; // IFTTTAnimationFrames -@property (assign, nonatomic) NSInteger startTime; // in case timeline starts before t=0 +@property (nonatomic, strong) IFTTTFilmstrip *filmstrip; @end @implementation IFTTTAnimation -+ (instancetype)animationWithView:(UIView *)view -{ - return [[self alloc] initWithView:view]; -} - -+ (instancetype)animationWithLayer:(CALayer *)layer -{ - return [(IFTTTAnimation *)[self alloc] initWithLayer:layer]; -} - -- (id)init +- (instancetype)init { if ((self = [super init])) { - self.keyFrames = [NSMutableArray new]; - self.timeline = [NSMutableArray new]; - self.startTime = 0; + _filmstrip = [IFTTTFilmstrip new]; } - return self; } -- (id)initWithView:(UIView *)view -{ - if ((self = [self init])) { - self.view = view; - } - - return self; -} - -- (id)initWithLayer:(CALayer *)layer -{ - if ((self = [self init])) { - self.layer = layer; - } - - return self; -} - -- (void)addKeyFrames:(NSArray *)keyFrames -{ - for (IFTTTAnimationKeyFrame *keyFrame in keyFrames) { - [self addKeyFrame:keyFrame]; - } -} - -- (void)addKeyFrame:(IFTTTAnimationKeyFrame *)keyFrame +- (void)addKeyframeForTime:(CGFloat)time value:(id)value { - if (self.keyFrames.count == 0) { - [self.keyFrames addObject:keyFrame]; - return; - } - - // because folks might add keyframes out of order, we have to sort here - if (keyFrame.time > ((IFTTTAnimationKeyFrame *)self.keyFrames.lastObject).time) { - [self.keyFrames addObject:keyFrame]; - } else { - for (NSUInteger i = 0; i < self.keyFrames.count; i++) { - if (keyFrame.time < ((IFTTTAnimationKeyFrame *)[self.keyFrames objectAtIndex:i]).time) { - [self.keyFrames insertObject:keyFrame atIndex:i]; - break; - } - } - } - - self.timeline = [NSMutableArray new]; - for (NSUInteger i = 0; i < self.keyFrames.count - 1; i++) { - IFTTTAnimationKeyFrame *currentKeyFrame = self.keyFrames[i]; - IFTTTAnimationKeyFrame *nextKeyFrame = self.keyFrames[i+1]; - IFTTTEasingFunction easingFunction = currentKeyFrame.easingFunction; - - NSInteger startTime = currentKeyFrame.time; - NSInteger endTime = nextKeyFrame.time; - NSInteger duration = endTime - startTime; - - for (NSInteger currentTime = (i == 0 ? 0 : 1); currentTime <= duration; currentTime++) { - CGFloat fraction = (CGFloat)currentTime / (CGFloat)duration; - NSInteger time = startTime + easingFunction(fraction) * (CGFloat)duration; - - [self.timeline addObject:[self frameForTime:time - startKeyFrame:currentKeyFrame - endKeyFrame:nextKeyFrame]]; - } - } - - self.startTime = ((IFTTTAnimationKeyFrame *)self.keyFrames[0]).time; -} - -- (IFTTTAnimationFrame *)animationFrameForTime:(NSInteger)time -{ - if (time < self.startTime) { - return [self.timeline objectAtIndex:0]; - } - - if (time - self.startTime < (NSInteger)self.timeline.count) { - return [self.timeline objectAtIndex:(NSUInteger)(time - self.startTime)]; - } - - return [self.timeline lastObject]; + if (!value) return; + [self.filmstrip setValue:value atTime:time]; } -- (void)animate:(NSInteger)time +- (void)addKeyframeForTime:(CGFloat)time value:(id)value withEasingFunction:(IFTTTEasingFunction)easingFunction { - NSLog(@"Hey pal! You need to use a subclass of IFTTTAnimation."); + if ((!value) || (!easingFunction)) return; + [self.filmstrip setValue:value atTime:time withEasingFunction:easingFunction]; } -- (IFTTTAnimationFrame *)frameForTime:(NSInteger)time - startKeyFrame:(IFTTTAnimationKeyFrame *)startKeyFrame - endKeyFrame:(IFTTTAnimationKeyFrame *)endKeyFrame +- (id)valueAtTime:(CGFloat)time { - NSLog(@"Hey pal! You need to use a subclass of IFTTTAnimation."); - return startKeyFrame; + if (self.filmstrip.isEmpty) return nil; + return [self.filmstrip valueAtTime:time]; } -- (CGFloat)tweenValueForStartTime:(NSInteger)startTime - endTime:(NSInteger)endTime - startValue:(CGFloat)startValue - endValue:(CGFloat)endValue - atTime:(CGFloat)time +- (BOOL)hasKeyframes { - CGFloat dt = (endTime - startTime); - CGFloat timePassed = (time - startTime); - CGFloat dv = (endValue - startValue); - CGFloat vv = dv / dt; - return (timePassed * vv) + startValue; + return !self.filmstrip.isEmpty; } @end diff --git a/JazzHands/IFTTTAnimationFrame.h b/JazzHands/IFTTTAnimationFrame.h deleted file mode 100755 index 6657994..0000000 --- a/JazzHands/IFTTTAnimationFrame.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// IFTTTAnimationFrame.h -// JazzHands -// -// Created by Devin Foley on 9/27/13. -// Copyright (c) 2013 IFTTT Inc. All rights reserved. -// - -#import -@class IFTTTTransform3D; - -@interface IFTTTAnimationFrame : NSObject - -@property (nonatomic, assign) CGRect frame; -@property (nonatomic, assign) CGFloat alpha; -@property (nonatomic, assign) CGFloat cornerRadius; -@property (nonatomic, assign) BOOL hidden; -@property (nonatomic, copy) UIColor *color; -@property (nonatomic, assign) CGFloat angle; -@property (nonatomic, strong) IFTTTTransform3D *transform; -@property (nonatomic, assign) CGFloat scale; -@property (nonatomic, assign) CGFloat constraintConstant; - -@property (nonatomic, assign) CGFloat strokeStart; -@property (nonatomic, assign) CGFloat strokeEnd; - -@end diff --git a/JazzHands/IFTTTAnimationFrame.m b/JazzHands/IFTTTAnimationFrame.m deleted file mode 100644 index bf6cdf7..0000000 --- a/JazzHands/IFTTTAnimationFrame.m +++ /dev/null @@ -1,13 +0,0 @@ -// -// IFTTTAnimationFrame.m -// JazzHands -// -// Created by Devin Foley on 9/27/13. -// Copyright (c) 2013 IFTTT Inc. All rights reserved. -// - -#import "IFTTTAnimationFrame.h" - -@implementation IFTTTAnimationFrame - -@end diff --git a/JazzHands/IFTTTAnimationKeyFrame.h b/JazzHands/IFTTTAnimationKeyFrame.h deleted file mode 100755 index ac28a4d..0000000 --- a/JazzHands/IFTTTAnimationKeyFrame.h +++ /dev/null @@ -1,68 +0,0 @@ -// -// IFTTTAnimationKeyFrame.h -// JazzHands -// -// Created by Devin Foley on 9/27/13. -// Copyright (c) 2013 IFTTT Inc. All rights reserved. -// - -#import "IFTTTAnimationFrame.h" -#import "IFTTTEasingFunction.h" - -@interface IFTTTAnimationKeyFrame : IFTTTAnimationFrame - -// These variadic methods require arguments to be of the form -// -// n, time_1, value_1, time_2, value_2, ..., time_n, value_n, -// -// where n is the number of time-value pairs. That is, the number of pairs must be the -// first argument, then the method will take care of unpacking the rest of the times and -// values into keyframe objects. -// -+ (NSArray *)keyFramesWithTimesAndAlphas:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndCornerRadius:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndFrames:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndHiddens:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndColors:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndAngles:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndTransform3D:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndScales:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndConstraint:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndStrokeStarts:(NSInteger)pairCount,...; -+ (NSArray *)keyFramesWithTimesAndStrokeEnds:(NSInteger)pairCount,...; - -+ (instancetype)keyFrameWithTime:(NSInteger)time andAlpha:(CGFloat)alpha; -+ (instancetype)keyFrameWithTime:(NSInteger)time andCornerRadius:(CGFloat)cornerRadius; -+ (instancetype)keyFrameWithTime:(NSInteger)time andFrame:(CGRect)frame; -+ (instancetype)keyFrameWithTime:(NSInteger)time andHidden:(BOOL)hidden; -+ (instancetype)keyFrameWithTime:(NSInteger)time andColor:(UIColor*)color; -+ (instancetype)keyFrameWithTime:(NSInteger)time andAngle:(CGFloat)angle; -+ (instancetype)keyFrameWithTime:(NSInteger)time andTransform3D:(IFTTTTransform3D *)transform; -+ (instancetype)keyFrameWithTime:(NSInteger)time andScale:(CGFloat)scale; -+ (instancetype)keyFrameWithTime:(NSInteger)time andConstraint:(CGFloat)constraint; -+ (instancetype)keyFrameWithTime:(NSInteger)time andStrokeStart:(CGFloat)strokeStart; -+ (instancetype)keyFrameWithTime:(NSInteger)time andStrokeEnd:(CGFloat)strokeEnd; - -- (id)initWithTime:(NSInteger)time andAlpha:(CGFloat)alpha; -- (id)initWithTime:(NSInteger)time andCornerRadius:(CGFloat)cornerRadius; -- (id)initWithTime:(NSInteger)time andFrame:(CGRect)frame; -- (id)initWithTime:(NSInteger)time andHidden:(BOOL)hidden; -- (id)initWithTime:(NSInteger)time andColor:(UIColor*)color; -- (id)initWithTime:(NSInteger)time andAngle:(CGFloat)angle; -- (id)initWithTime:(NSInteger)time andTransform3D:(IFTTTTransform3D *)transform; -- (id)initWithTime:(NSInteger)time andScale:(CGFloat)scale; -- (id)initWithTime:(NSInteger)time andConstraint:(CGFloat)constraint; -- (id)initWithTime:(NSInteger)time andStrokeStart:(CGFloat)strokeStart; -- (id)initWithTime:(NSInteger)time andStrokeEnd:(CGFloat)strokeEnd; - -@property (assign, nonatomic) NSInteger time; - -/** - * The easing function defines the rate of change in your key frames over time. - * By default, IFTTTEasingFunctionLinear. - * - * @see IFTTTEasingFunction.h - */ -@property (copy, nonatomic) IFTTTEasingFunction easingFunction; - -@end diff --git a/JazzHands/IFTTTAnimationKeyFrame.m b/JazzHands/IFTTTAnimationKeyFrame.m deleted file mode 100755 index a76eb95..0000000 --- a/JazzHands/IFTTTAnimationKeyFrame.m +++ /dev/null @@ -1,492 +0,0 @@ -// -// IFTTTAnimationKeyFrame.m -// JazzHands -// -// Created by Devin Foley on 9/27/13. -// Copyright (c) 2013 IFTTT Inc. All rights reserved. -// - -#import "IFTTTJazzHands.h" - -@implementation IFTTTAnimationKeyFrame - -+ (NSArray *)keyFramesWithTimesAndAlphas:(NSInteger)pairCount,... -{ - va_list argumentList; - NSInteger time; - CGFloat alpha; - if (pairCount > 0) { - NSMutableArray *keyFrames = [NSMutableArray arrayWithCapacity:(NSUInteger)pairCount]; - - va_start(argumentList, pairCount); - - for (int i=0; i 0) { - NSMutableArray *keyFrames = [NSMutableArray arrayWithCapacity:(NSUInteger)pairCount]; - - va_start(argumentList, pairCount); - - for (int i=0; i 0) { - NSMutableArray *keyFrames = [NSMutableArray arrayWithCapacity:(NSUInteger)pairCount]; - - va_start(argumentList, pairCount); - - for (int i=0; i 0) { - NSMutableArray *keyFrames = [NSMutableArray arrayWithCapacity:(NSUInteger)pairCount]; - - va_start(argumentList, pairCount); - - for (int i=0; i