- First Commit
@ -20,7 +20,10 @@
|
|||||||
6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; };
|
6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; };
|
||||||
6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; };
|
6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; };
|
||||||
6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; };
|
6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; };
|
||||||
|
681785911C69DCB50032DAAC /* PNImagePickerViewController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 681785901C69DCB50032DAAC /* PNImagePickerViewController.framework */; };
|
||||||
|
7D97D76088572AF45812187E /* Pods_PNImagePickerViewController_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4328521B225C017B57B0EA26 /* Pods_PNImagePickerViewController_Tests.framework */; };
|
||||||
873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; };
|
873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; };
|
||||||
|
D6C71C75B8F5800EC9990F14 /* Pods_PNImagePickerViewController_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 685260EDF68D7C851442C12E /* Pods_PNImagePickerViewController_Example.framework */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -34,7 +37,9 @@
|
|||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
2A510C8BD6FA22FF4BF841CC /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file; name = README.md; path = ../README.md; sourceTree = "<group>"; };
|
12535CEF396FF4D6369EA5C0 /* Pods-PNImagePickerViewController_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PNImagePickerViewController_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-PNImagePickerViewController_Tests/Pods-PNImagePickerViewController_Tests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
2A510C8BD6FA22FF4BF841CC /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
|
||||||
|
4328521B225C017B57B0EA26 /* Pods_PNImagePickerViewController_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PNImagePickerViewController_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
6003F58A195388D20070C39A /* PNImagePickerViewController_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PNImagePickerViewController_Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
6003F58A195388D20070C39A /* PNImagePickerViewController_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PNImagePickerViewController_Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||||
6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
||||||
@ -54,8 +59,13 @@
|
|||||||
6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = "<group>"; };
|
6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = "<group>"; };
|
||||||
606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = "<group>"; };
|
606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = "<group>"; };
|
||||||
|
681785901C69DCB50032DAAC /* PNImagePickerViewController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PNImagePickerViewController.framework; path = "Pods/../build/Debug-iphoneos/PNImagePickerViewController.framework"; sourceTree = "<group>"; };
|
||||||
|
685260EDF68D7C851442C12E /* Pods_PNImagePickerViewController_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PNImagePickerViewController_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
86D18E23BB421419B8132D08 /* Pods-PNImagePickerViewController_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PNImagePickerViewController_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-PNImagePickerViewController_Example/Pods-PNImagePickerViewController_Example.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
|
873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
|
||||||
930DB7C275684056258BA5EF /* PNImagePickerViewController.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file; name = PNImagePickerViewController.podspec; path = ../PNImagePickerViewController.podspec; sourceTree = "<group>"; };
|
930DB7C275684056258BA5EF /* PNImagePickerViewController.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = PNImagePickerViewController.podspec; path = ../PNImagePickerViewController.podspec; sourceTree = "<group>"; };
|
||||||
|
98D3978B62130F866F704B9C /* Pods-PNImagePickerViewController_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PNImagePickerViewController_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-PNImagePickerViewController_Example/Pods-PNImagePickerViewController_Example.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
9DECFF91FBC10CAD6C7AEE1E /* Pods-PNImagePickerViewController_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PNImagePickerViewController_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-PNImagePickerViewController_Tests/Pods-PNImagePickerViewController_Tests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
AD447568A76DA895F7B37A24 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
|
AD447568A76DA895F7B37A24 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
@ -64,9 +74,11 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
681785911C69DCB50032DAAC /* PNImagePickerViewController.framework in Frameworks */,
|
||||||
6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */,
|
6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */,
|
||||||
6003F592195388D20070C39A /* UIKit.framework in Frameworks */,
|
6003F592195388D20070C39A /* UIKit.framework in Frameworks */,
|
||||||
6003F58E195388D20070C39A /* Foundation.framework in Frameworks */,
|
6003F58E195388D20070C39A /* Foundation.framework in Frameworks */,
|
||||||
|
D6C71C75B8F5800EC9990F14 /* Pods_PNImagePickerViewController_Example.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -77,6 +89,7 @@
|
|||||||
6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */,
|
6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */,
|
||||||
6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */,
|
6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */,
|
||||||
6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */,
|
6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */,
|
||||||
|
7D97D76088572AF45812187E /* Pods_PNImagePickerViewController_Tests.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -91,6 +104,7 @@
|
|||||||
6003F5B5195388D20070C39A /* Tests */,
|
6003F5B5195388D20070C39A /* Tests */,
|
||||||
6003F58C195388D20070C39A /* Frameworks */,
|
6003F58C195388D20070C39A /* Frameworks */,
|
||||||
6003F58B195388D20070C39A /* Products */,
|
6003F58B195388D20070C39A /* Products */,
|
||||||
|
9BA892B7D07729CC69D18118 /* Pods */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@ -106,10 +120,13 @@
|
|||||||
6003F58C195388D20070C39A /* Frameworks */ = {
|
6003F58C195388D20070C39A /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
681785901C69DCB50032DAAC /* PNImagePickerViewController.framework */,
|
||||||
6003F58D195388D20070C39A /* Foundation.framework */,
|
6003F58D195388D20070C39A /* Foundation.framework */,
|
||||||
6003F58F195388D20070C39A /* CoreGraphics.framework */,
|
6003F58F195388D20070C39A /* CoreGraphics.framework */,
|
||||||
6003F591195388D20070C39A /* UIKit.framework */,
|
6003F591195388D20070C39A /* UIKit.framework */,
|
||||||
6003F5AF195388D20070C39A /* XCTest.framework */,
|
6003F5AF195388D20070C39A /* XCTest.framework */,
|
||||||
|
685260EDF68D7C851442C12E /* Pods_PNImagePickerViewController_Example.framework */,
|
||||||
|
4328521B225C017B57B0EA26 /* Pods_PNImagePickerViewController_Tests.framework */,
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -169,6 +186,17 @@
|
|||||||
name = "Podspec Metadata";
|
name = "Podspec Metadata";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
9BA892B7D07729CC69D18118 /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
86D18E23BB421419B8132D08 /* Pods-PNImagePickerViewController_Example.debug.xcconfig */,
|
||||||
|
98D3978B62130F866F704B9C /* Pods-PNImagePickerViewController_Example.release.xcconfig */,
|
||||||
|
9DECFF91FBC10CAD6C7AEE1E /* Pods-PNImagePickerViewController_Tests.debug.xcconfig */,
|
||||||
|
12535CEF396FF4D6369EA5C0 /* Pods-PNImagePickerViewController_Tests.release.xcconfig */,
|
||||||
|
);
|
||||||
|
name = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
@ -176,9 +204,12 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "PNImagePickerViewController_Example" */;
|
buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "PNImagePickerViewController_Example" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
F8D96CF8CF3D374B5AAE33C4 /* Check Pods Manifest.lock */,
|
||||||
6003F586195388D20070C39A /* Sources */,
|
6003F586195388D20070C39A /* Sources */,
|
||||||
6003F587195388D20070C39A /* Frameworks */,
|
6003F587195388D20070C39A /* Frameworks */,
|
||||||
6003F588195388D20070C39A /* Resources */,
|
6003F588195388D20070C39A /* Resources */,
|
||||||
|
B94FCDE98F285449578D9F34 /* Embed Pods Frameworks */,
|
||||||
|
56476F9757949999164002B1 /* Copy Pods Resources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@ -193,9 +224,12 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "PNImagePickerViewController_Tests" */;
|
buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "PNImagePickerViewController_Tests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
2FD43162D7B4455C62B23FFC /* Check Pods Manifest.lock */,
|
||||||
6003F5AA195388D20070C39A /* Sources */,
|
6003F5AA195388D20070C39A /* Sources */,
|
||||||
6003F5AB195388D20070C39A /* Frameworks */,
|
6003F5AB195388D20070C39A /* Frameworks */,
|
||||||
6003F5AC195388D20070C39A /* Resources */,
|
6003F5AC195388D20070C39A /* Resources */,
|
||||||
|
6C7D9A9333266674130B4B6D /* Embed Pods Frameworks */,
|
||||||
|
B6A2E7AB4CD0217BA75EC551 /* Copy Pods Resources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@ -222,7 +256,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "PROJECT" */;
|
buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "PNImagePickerViewController" */;
|
||||||
compatibilityVersion = "Xcode 3.2";
|
compatibilityVersion = "Xcode 3.2";
|
||||||
developmentRegion = English;
|
developmentRegion = English;
|
||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
@ -262,6 +296,99 @@
|
|||||||
};
|
};
|
||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
2FD43162D7B4455C62B23FFC /* Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Check Pods Manifest.lock";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
56476F9757949999164002B1 /* Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Copy Pods Resources";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PNImagePickerViewController_Example/Pods-PNImagePickerViewController_Example-resources.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
6C7D9A9333266674130B4B6D /* Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Embed Pods Frameworks";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PNImagePickerViewController_Tests/Pods-PNImagePickerViewController_Tests-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
B6A2E7AB4CD0217BA75EC551 /* Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Copy Pods Resources";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PNImagePickerViewController_Tests/Pods-PNImagePickerViewController_Tests-resources.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
B94FCDE98F285449578D9F34 /* Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Embed Pods Frameworks";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PNImagePickerViewController_Example/Pods-PNImagePickerViewController_Example-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
F8D96CF8CF3D374B5AAE33C4 /* Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Check Pods Manifest.lock";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
6003F586195388D20070C39A /* Sources */ = {
|
6003F586195388D20070C39A /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
@ -344,7 +471,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
@ -377,7 +504,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
@ -386,9 +513,14 @@
|
|||||||
};
|
};
|
||||||
6003F5C0195388D20070C39A /* Debug */ = {
|
6003F5C0195388D20070C39A /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 86D18E23BB421419B8132D08 /* Pods-PNImagePickerViewController_Example.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||||
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)/build/Debug-iphoneos",
|
||||||
|
);
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||||
GCC_PREFIX_HEADER = "PNImagePickerViewController/PNImagePickerViewController-Prefix.pch";
|
GCC_PREFIX_HEADER = "PNImagePickerViewController/PNImagePickerViewController-Prefix.pch";
|
||||||
INFOPLIST_FILE = "PNImagePickerViewController/PNImagePickerViewController-Info.plist";
|
INFOPLIST_FILE = "PNImagePickerViewController/PNImagePickerViewController-Info.plist";
|
||||||
@ -401,9 +533,14 @@
|
|||||||
};
|
};
|
||||||
6003F5C1195388D20070C39A /* Release */ = {
|
6003F5C1195388D20070C39A /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 98D3978B62130F866F704B9C /* Pods-PNImagePickerViewController_Example.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||||
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)/build/Debug-iphoneos",
|
||||||
|
);
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||||
GCC_PREFIX_HEADER = "PNImagePickerViewController/PNImagePickerViewController-Prefix.pch";
|
GCC_PREFIX_HEADER = "PNImagePickerViewController/PNImagePickerViewController-Prefix.pch";
|
||||||
INFOPLIST_FILE = "PNImagePickerViewController/PNImagePickerViewController-Info.plist";
|
INFOPLIST_FILE = "PNImagePickerViewController/PNImagePickerViewController-Info.plist";
|
||||||
@ -416,6 +553,7 @@
|
|||||||
};
|
};
|
||||||
6003F5C3195388D20070C39A /* Debug */ = {
|
6003F5C3195388D20070C39A /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 9DECFF91FBC10CAD6C7AEE1E /* Pods-PNImagePickerViewController_Tests.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
@ -439,6 +577,7 @@
|
|||||||
};
|
};
|
||||||
6003F5C4195388D20070C39A /* Release */ = {
|
6003F5C4195388D20070C39A /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 12535CEF396FF4D6369EA5C0 /* Pods-PNImagePickerViewController_Tests.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
@ -459,7 +598,7 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
6003F585195388D10070C39A /* Build configuration list for PBXProject "PROJECT" */ = {
|
6003F585195388D10070C39A /* Build configuration list for PBXProject "PNImagePickerViewController" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
6003F5BD195388D20070C39A /* Debug */,
|
6003F5BD195388D20070C39A /* Debug */,
|
||||||
|
|||||||
10
Example/PNImagePickerViewController.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "group:PNImagePickerViewController.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@ -5,16 +5,31 @@
|
|||||||
"size" : "29x29",
|
"size" : "29x29",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "29x29",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "iphone",
|
"idiom" : "iphone",
|
||||||
"size" : "40x40",
|
"size" : "40x40",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "40x40",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "iphone",
|
"idiom" : "iphone",
|
||||||
"size" : "60x60",
|
"size" : "60x60",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "60x60",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "ipad",
|
"idiom" : "ipad",
|
||||||
"size" : "29x29",
|
"size" : "29x29",
|
||||||
@ -44,6 +59,11 @@
|
|||||||
"idiom" : "ipad",
|
"idiom" : "ipad",
|
||||||
"size" : "76x76",
|
"size" : "76x76",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"size" : "83.5x83.5",
|
||||||
|
"scale" : "2x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
|
|||||||
@ -1,46 +1,157 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"extent" : "full-screen",
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Default.png",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Default@2x.png",
|
||||||
"minimum-system-version" : "7.0",
|
"minimum-system-version" : "7.0",
|
||||||
|
"orientation" : "portrait",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"orientation" : "portrait",
|
"extent" : "full-screen",
|
||||||
"idiom" : "iphone",
|
"idiom" : "iphone",
|
||||||
"subtype" : "retina4",
|
"subtype" : "retina4",
|
||||||
"extent" : "full-screen",
|
"filename" : "Default-568h@2x.png",
|
||||||
"minimum-system-version" : "7.0",
|
"orientation" : "portrait",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"subtype" : "retina4",
|
||||||
|
"filename" : "Default-568h@2x.png",
|
||||||
|
"minimum-system-version" : "7.0",
|
||||||
"orientation" : "portrait",
|
"orientation" : "portrait",
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "landscape",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"orientation" : "landscape",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Default@2x.png",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "to-status-bar",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad.png",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "to-status-bar",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad@2x.png",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "to-status-bar",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~landscape.png",
|
||||||
|
"orientation" : "landscape",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "to-status-bar",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~landscape@2x.png",
|
||||||
|
"orientation" : "landscape",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~nostatusbar.png",
|
||||||
"minimum-system-version" : "7.0",
|
"minimum-system-version" : "7.0",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~nostatusbar.png",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~nostatusbar@2x.png",
|
||||||
|
"minimum-system-version" : "7.0",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~nostatusbar@2x.png",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~landscape~nostatusbar.png",
|
||||||
|
"minimum-system-version" : "7.0",
|
||||||
|
"orientation" : "landscape",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~landscape~nostatusbar.png",
|
||||||
|
"orientation" : "landscape",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~landscape~nostatusbar@2x.png",
|
||||||
|
"minimum-system-version" : "7.0",
|
||||||
|
"orientation" : "landscape",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Default~ipad~landscape~nostatusbar@2x.png",
|
||||||
|
"orientation" : "landscape",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"subtype" : "736h",
|
||||||
|
"filename" : "Default-Portrait-736h@3x.png",
|
||||||
|
"minimum-system-version" : "8.0",
|
||||||
|
"orientation" : "portrait",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"subtype" : "736h",
|
||||||
|
"filename" : "Default-Landscape-736h@3x.png",
|
||||||
|
"minimum-system-version" : "8.0",
|
||||||
|
"orientation" : "landscape",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"extent" : "full-screen",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"subtype" : "667h",
|
||||||
|
"filename" : "Default-667h@2x.png",
|
||||||
|
"minimum-system-version" : "8.0",
|
||||||
|
"orientation" : "portrait",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 58 KiB |
@ -7,8 +7,14 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "PNImagePickerViewControllerViewController.h"
|
#import "PNImagePickerViewControllerViewController.h"
|
||||||
|
#import "PNImagePickerViewController.h"
|
||||||
|
#import <PureLayout/PureLayout.h>
|
||||||
|
|
||||||
@interface PNImagePickerViewControllerViewController ()
|
@interface PNImagePickerViewControllerViewController () <PNImagePickerViewControllerDelegate>
|
||||||
|
|
||||||
|
@property (nonatomic) BOOL didSetupConstraints;
|
||||||
|
@property (nonatomic, strong) UIButton *button;
|
||||||
|
@property (nonatomic, strong) UIImageView *imageView;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -17,9 +23,60 @@
|
|||||||
- (void)viewDidLoad
|
- (void)viewDidLoad
|
||||||
{
|
{
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
|
|
||||||
|
_button = [UIButton newAutoLayoutView];
|
||||||
|
[_button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
|
||||||
|
[_button setTitle:@"Show Picker" forState:UIControlStateNormal];
|
||||||
|
[_button addTarget:self action:@selector(showPicker) forControlEvents:UIControlEventTouchUpInside];
|
||||||
|
[self.view addSubview:_button];
|
||||||
|
|
||||||
|
_imageView = [UIImageView newAutoLayoutView];
|
||||||
|
[_imageView setBackgroundColor:[[UIColor lightGrayColor] colorWithAlphaComponent:0.6]];
|
||||||
|
|
||||||
|
[self.view addSubview:_imageView];
|
||||||
|
|
||||||
|
[self.view setNeedsUpdateConstraints];
|
||||||
|
|
||||||
// Do any additional setup after loading the view, typically from a nib.
|
// Do any additional setup after loading the view, typically from a nib.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) updateViewConstraints {
|
||||||
|
if (!_didSetupConstraints) {
|
||||||
|
_didSetupConstraints = YES;
|
||||||
|
|
||||||
|
[self.view autoPinEdgesToSuperviewEdges];
|
||||||
|
|
||||||
|
[_imageView autoPinEdgeToSuperviewEdge:ALEdgeTop];
|
||||||
|
[_imageView autoPinEdgeToSuperviewEdge:ALEdgeTrailing];
|
||||||
|
[_imageView autoPinEdgeToSuperviewEdge:ALEdgeLeading];
|
||||||
|
[_imageView autoAlignAxisToSuperviewAxis:ALAxisVertical];
|
||||||
|
|
||||||
|
[_button autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:_imageView withOffset:20];
|
||||||
|
[_button autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:20];
|
||||||
|
[_button autoAlignAxisToSuperviewAxis:ALAxisVertical];
|
||||||
|
[_button autoSetDimension:ALDimensionHeight toSize:30];
|
||||||
|
[_button autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:100 relation:NSLayoutRelationGreaterThanOrEqual];
|
||||||
|
[_button autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:100 relation:NSLayoutRelationGreaterThanOrEqual];
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
[super updateViewConstraints];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) showPicker {
|
||||||
|
|
||||||
|
PNImagePickerViewController *imagePicker = [[PNImagePickerViewController alloc] init];
|
||||||
|
imagePicker.delegate = self;
|
||||||
|
[imagePicker showImagePickerInController:self animated:YES];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - PNImagePickerViewControllerDelegate
|
||||||
|
|
||||||
|
- (void)imagePicker:(PNImagePickerViewController *)imagePicker didSelectImage:(UIImage *)image {
|
||||||
|
self.imageView.image = image;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)didReceiveMemoryWarning
|
- (void)didReceiveMemoryWarning
|
||||||
{
|
{
|
||||||
[super didReceiveMemoryWarning];
|
[super didReceiveMemoryWarning];
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
source 'https://github.com/CocoaPods/Specs.git'
|
source 'https://github.com/CocoaPods/Specs.git'
|
||||||
use_frameworks!
|
use_frameworks!
|
||||||
|
|
||||||
target 'PNImagePickerViewController_Example', :exclusive => true do
|
target 'PNImagePickerViewController_Example' do
|
||||||
pod 'PNImagePickerViewController', :path => '../'
|
pod 'PNImagePickerViewController', :path => '../'
|
||||||
|
pod 'PureLayout'
|
||||||
end
|
end
|
||||||
|
|
||||||
target 'PNImagePickerViewController_Tests', :exclusive => true do
|
target 'PNImagePickerViewController_Tests' do
|
||||||
pod 'PNImagePickerViewController', :path => '../'
|
pod 'PNImagePickerViewController', :path => '../'
|
||||||
|
|
||||||
pod 'Specta'
|
pod 'Specta'
|
||||||
|
|||||||
38
Example/Podfile.lock
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
PODS:
|
||||||
|
- Expecta (1.0.5)
|
||||||
|
- Expecta+Snapshots (2.0.0):
|
||||||
|
- Expecta (~> 1.0)
|
||||||
|
- FBSnapshotTestCase/Core (~> 2.0.3)
|
||||||
|
- FBSnapshotTestCase (2.0.7):
|
||||||
|
- FBSnapshotTestCase/SwiftSupport (= 2.0.7)
|
||||||
|
- FBSnapshotTestCase/Core (2.0.7)
|
||||||
|
- FBSnapshotTestCase/SwiftSupport (2.0.7):
|
||||||
|
- FBSnapshotTestCase/Core
|
||||||
|
- PNImagePickerViewController (0.1.0):
|
||||||
|
- PureLayout
|
||||||
|
- PureLayout (3.0.1)
|
||||||
|
- Specta (1.0.5)
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- Expecta
|
||||||
|
- Expecta+Snapshots
|
||||||
|
- FBSnapshotTestCase
|
||||||
|
- PNImagePickerViewController (from `../`)
|
||||||
|
- PureLayout
|
||||||
|
- Specta
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
PNImagePickerViewController:
|
||||||
|
:path: "../"
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
Expecta: e1c022fcd33910b6be89c291d2775b3fe27a89fe
|
||||||
|
Expecta+Snapshots: 29b38dd695bc72a0ed2bea833937d78df41943ba
|
||||||
|
FBSnapshotTestCase: 7e85180d0d141a0cf472352edda7e80d7eaeb547
|
||||||
|
PNImagePickerViewController: 9eaf2575e70de776463e23904f9d466f98d27ad4
|
||||||
|
PureLayout: f35f5384c9c4e4479df041dbe33ad7577b71ddfb
|
||||||
|
Specta: ac94d110b865115fe60ff2c6d7281053c6f8e8a2
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: dfe253f9ffc18c2f381e56e26aeba9f722b4a230
|
||||||
|
|
||||||
|
COCOAPODS: 1.0.0.beta.3
|
||||||
22
Example/Pods/Expecta+Snapshots/EXPMatchers+FBSnapshotTest.h
generated
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// EXPMatchers+FBSnapshotTest.h
|
||||||
|
// Artsy
|
||||||
|
//
|
||||||
|
// Created by Daniel Doubrovkine on 1/14/14.
|
||||||
|
// Copyright (c) 2014 Artsy Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Expecta/Expecta.h>
|
||||||
|
#import "ExpectaObject+FBSnapshotTest.h"
|
||||||
|
|
||||||
|
@interface EXPExpectFBSnapshotTest : NSObject
|
||||||
|
@end
|
||||||
|
|
||||||
|
/// Set the default folder for image tests to run in
|
||||||
|
extern void setGlobalReferenceImageDir(char *reference);
|
||||||
|
|
||||||
|
EXPMatcherInterface(haveValidSnapshot, (void));
|
||||||
|
EXPMatcherInterface(recordSnapshot, (void));
|
||||||
|
|
||||||
|
EXPMatcherInterface(haveValidSnapshotNamed, (NSString *snapshot));
|
||||||
|
EXPMatcherInterface(recordSnapshotNamed, (NSString *snapshot));
|
||||||
319
Example/Pods/Expecta+Snapshots/EXPMatchers+FBSnapshotTest.m
generated
Normal file
@ -0,0 +1,319 @@
|
|||||||
|
//
|
||||||
|
// EXPMatchers+FBSnapshotTest.h
|
||||||
|
// Artsy
|
||||||
|
//
|
||||||
|
// Created by Daniel Doubrovkine on 1/14/14.
|
||||||
|
// Copyright (c) 2014 Artsy Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "EXPMatchers+FBSnapshotTest.h"
|
||||||
|
#import <Expecta/EXPMatcherHelpers.h>
|
||||||
|
#import <FBSnapshotTestCase/FBSnapshotTestController.h>
|
||||||
|
|
||||||
|
@interface EXPExpectFBSnapshotTest()
|
||||||
|
@property (nonatomic, strong) NSString *referenceImagesDirectory;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation EXPExpectFBSnapshotTest
|
||||||
|
|
||||||
|
+ (id)instance
|
||||||
|
{
|
||||||
|
static EXPExpectFBSnapshotTest *instance = nil;
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
instance = [[self alloc] init];
|
||||||
|
});
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer snapshot:(NSString *)snapshot testCase:(id)testCase record:(BOOL)record referenceDirectory:(NSString *)referenceDirectory error:(NSError **)error
|
||||||
|
|
||||||
|
{
|
||||||
|
FBSnapshotTestController *snapshotController = [[FBSnapshotTestController alloc] initWithTestClass:[testCase class]];
|
||||||
|
snapshotController.recordMode = record;
|
||||||
|
snapshotController.referenceImagesDirectory = referenceDirectory;
|
||||||
|
snapshotController.usesDrawViewHierarchyInRect = [Expecta usesDrawViewHierarchyInRect];
|
||||||
|
|
||||||
|
if (! snapshotController.referenceImagesDirectory) {
|
||||||
|
[NSException raise:@"Missing value for referenceImagesDirectory" format:@"Call [[EXPExpectFBSnapshotTest instance] setReferenceImagesDirectory"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [snapshotController compareSnapshotOfViewOrLayer:viewOrLayer
|
||||||
|
selector:NSSelectorFromString(snapshot)
|
||||||
|
identifier:nil
|
||||||
|
tolerance:0
|
||||||
|
error:error];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)combinedError:(NSString *)message test:(NSString *)test error:(NSError *)error
|
||||||
|
{
|
||||||
|
NSAssert(message, @"missing message");
|
||||||
|
NSAssert(test, @"missing test name");
|
||||||
|
|
||||||
|
NSMutableArray *ary = [NSMutableArray array];
|
||||||
|
|
||||||
|
[ary addObject:[NSString stringWithFormat:@"%@ %@", message, test]];
|
||||||
|
|
||||||
|
for(NSString *key in error.userInfo.keyEnumerator) {
|
||||||
|
[ary addObject:[NSString stringWithFormat:@" %@: %@", key, [error.userInfo valueForKey:key]]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [ary componentsJoinedByString:@"\n"];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
void setGlobalReferenceImageDir(char *reference) {
|
||||||
|
NSString *referenceImagesDirectory = [NSString stringWithFormat:@"%s", reference];
|
||||||
|
[[EXPExpectFBSnapshotTest instance] setReferenceImagesDirectory:referenceImagesDirectory];
|
||||||
|
};
|
||||||
|
|
||||||
|
@interface EXPExpect(ReferenceDirExtension)
|
||||||
|
- (NSString *)_getDefaultReferenceDirectory;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation EXPExpect(ReferenceDirExtension)
|
||||||
|
|
||||||
|
- (NSString *)_getDefaultReferenceDirectory
|
||||||
|
{
|
||||||
|
NSString *globalReference = [[EXPExpectFBSnapshotTest instance] referenceImagesDirectory];
|
||||||
|
if (globalReference) {
|
||||||
|
return globalReference;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search the test file's path to find the first folder with the substring "tests"
|
||||||
|
// then append "/ReferenceImages" and use that
|
||||||
|
|
||||||
|
NSString *testFileName = [NSString stringWithCString:self.fileName encoding:NSUTF8StringEncoding];
|
||||||
|
NSArray *pathComponents = [testFileName pathComponents];
|
||||||
|
|
||||||
|
for (NSString *folder in pathComponents) {
|
||||||
|
if ([folder.lowercaseString rangeOfString:@"tests"].location != NSNotFound) {
|
||||||
|
|
||||||
|
NSArray *folderPathComponents = [pathComponents subarrayWithRange:NSMakeRange(0, [pathComponents indexOfObject:folder] + 1)];
|
||||||
|
return [NSString stringWithFormat:@"%@/ReferenceImages", [folderPathComponents componentsJoinedByString:@"/"]];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[NSException raise:@"Could not infer reference image folder" format:@"You should provide a reference dir using setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR);"];
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// If you're bringing in Speca via CocoaPods
|
||||||
|
// use the test path to get the test's image file URL
|
||||||
|
|
||||||
|
#if __has_include(<Specta/Specta.h>)
|
||||||
|
#import <Specta/Specta.h>
|
||||||
|
#import <Specta/SpectaUtility.h>
|
||||||
|
#import <Specta/SPTExample.h>
|
||||||
|
|
||||||
|
NSString *sanitizedTestPath();
|
||||||
|
|
||||||
|
NSString *sanitizedTestPath(){
|
||||||
|
id compiledExample = [[NSThread currentThread] threadDictionary][@"SPTCurrentSpec"]; // SPTSpec
|
||||||
|
NSString *name;
|
||||||
|
if ([compiledExample respondsToSelector:@selector(name)]) {
|
||||||
|
// Specta 0.3 syntax
|
||||||
|
name = [compiledExample performSelector:@selector(name)];
|
||||||
|
} else if ([compiledExample respondsToSelector:@selector(fileName)]) {
|
||||||
|
// Specta 0.2 syntax
|
||||||
|
name = [compiledExample performSelector:@selector(fileName)];
|
||||||
|
}
|
||||||
|
name = [[[[name componentsSeparatedByString:@" test_"] lastObject] stringByReplacingOccurrencesOfString:@"__" withString:@"_"] stringByReplacingOccurrencesOfString:@"]" withString:@""];
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPMatcherImplementationBegin(haveValidSnapshot, (void)){
|
||||||
|
__block NSError *error = nil;
|
||||||
|
|
||||||
|
match(^BOOL{
|
||||||
|
NSString *referenceImageDir = [self _getDefaultReferenceDirectory];
|
||||||
|
NSString *name = sanitizedTestPath();
|
||||||
|
if ([actual isKindOfClass:UIViewController.class]) {
|
||||||
|
[actual beginAppearanceTransition:YES animated:NO];
|
||||||
|
[actual endAppearanceTransition];
|
||||||
|
|
||||||
|
actual = [actual view];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [EXPExpectFBSnapshotTest compareSnapshotOfViewOrLayer:actual snapshot:name testCase:[self testCase] record:NO referenceDirectory:referenceImageDir error:&error];
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForTo(^NSString *{
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected a matching snapshot in" test:sanitizedTestPath() error:error];
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForNotTo(^NSString *{
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected to not have a matching snapshot in" test:sanitizedTestPath() error:error];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPMatcherImplementationEnd
|
||||||
|
|
||||||
|
EXPMatcherImplementationBegin(recordSnapshot, (void)) {
|
||||||
|
__block NSError *error = nil;
|
||||||
|
|
||||||
|
BOOL actualIsViewLayerOrViewController = ([actual isKindOfClass:UIView.class] || [actual isKindOfClass:CALayer.class] || [actual isKindOfClass:UIViewController.class]);
|
||||||
|
|
||||||
|
prerequisite(^BOOL{
|
||||||
|
return actualIsViewLayerOrViewController;
|
||||||
|
});
|
||||||
|
|
||||||
|
match(^BOOL{
|
||||||
|
NSString *referenceImageDir = [self _getDefaultReferenceDirectory];
|
||||||
|
|
||||||
|
// For view controllers do the viewWill/viewDid dance, then pass view through
|
||||||
|
if ([actual isKindOfClass:UIViewController.class]) {
|
||||||
|
|
||||||
|
[actual beginAppearanceTransition:YES animated:NO];
|
||||||
|
[actual endAppearanceTransition];
|
||||||
|
actual = [actual view];
|
||||||
|
}
|
||||||
|
|
||||||
|
[EXPExpectFBSnapshotTest compareSnapshotOfViewOrLayer:actual snapshot:sanitizedTestPath() testCase:[self testCase] record:YES referenceDirectory:referenceImageDir error:&error];
|
||||||
|
return NO;
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForTo(^NSString *{
|
||||||
|
if (!actualIsViewLayerOrViewController) {
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"Expected a View, Layer or View Controller." test:sanitizedTestPath() error:nil];
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected to record a snapshot in" test:sanitizedTestPath() error:error];
|
||||||
|
} else {
|
||||||
|
return [NSString stringWithFormat:@"snapshot %@ successfully recorded, replace recordSnapshot with a check", sanitizedTestPath()];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForNotTo(^NSString *{
|
||||||
|
if (error) {
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected to record a snapshot in" test:sanitizedTestPath() error:error];
|
||||||
|
} else {
|
||||||
|
return [NSString stringWithFormat:@"snapshot %@ successfully recorded, replace recordSnapshot with a check", sanitizedTestPath()];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPMatcherImplementationEnd
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// If you don't have Speca stub the functions
|
||||||
|
|
||||||
|
EXPMatcherImplementationBegin(haveValidSnapshot, (void)){
|
||||||
|
|
||||||
|
prerequisite(^BOOL{
|
||||||
|
return NO;
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForTo(^NSString *{
|
||||||
|
return @"you need Specta installed via CocoaPods to use haveValidSnapshot, use haveValidSnapshotNamed instead";
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForNotTo(^NSString *{
|
||||||
|
return @"you need Specta installed via CocoaPods to use haveValidSnapshot, use haveValidSnapshotNamed instead";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPMatcherImplementationEnd
|
||||||
|
|
||||||
|
|
||||||
|
EXPMatcherImplementationBegin(recordSnapshot, (void)) {
|
||||||
|
|
||||||
|
prerequisite(^BOOL{
|
||||||
|
return NO;
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForTo(^NSString *{
|
||||||
|
return @"you need Specta installed via CocoaPods to use recordSnapshot, use recordSnapshotNamed instead";
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForNotTo(^NSString *{
|
||||||
|
return @"you need Specta installed via CocoaPods to use recordSnapshot, use recordSnapshotNamed instead";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPMatcherImplementationEnd
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EXPMatcherImplementationBegin(haveValidSnapshotNamed, (NSString *snapshot)){
|
||||||
|
BOOL snapshotIsNil = (snapshot == nil);
|
||||||
|
__block NSError *error = nil;
|
||||||
|
|
||||||
|
prerequisite(^BOOL{
|
||||||
|
return !(snapshotIsNil);
|
||||||
|
});
|
||||||
|
|
||||||
|
match(^BOOL{
|
||||||
|
NSString *referenceImageDir = [self _getDefaultReferenceDirectory];
|
||||||
|
if ([actual isKindOfClass:UIViewController.class]) {
|
||||||
|
[actual beginAppearanceTransition:YES animated:NO];
|
||||||
|
[actual endAppearanceTransition];
|
||||||
|
|
||||||
|
actual = [actual view];
|
||||||
|
}
|
||||||
|
return [EXPExpectFBSnapshotTest compareSnapshotOfViewOrLayer:actual snapshot:snapshot testCase:[self testCase] record:NO referenceDirectory:referenceImageDir error:&error];
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForTo(^NSString *{
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected a matching snapshot named" test:snapshot error:error];
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForNotTo(^NSString *{
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected not to have a matching snapshot named" test:snapshot error:error];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPMatcherImplementationEnd
|
||||||
|
|
||||||
|
EXPMatcherImplementationBegin(recordSnapshotNamed, (NSString *snapshot)) {
|
||||||
|
BOOL snapshotExists = (snapshot != nil);
|
||||||
|
BOOL actualIsViewLayerOrViewController = ([actual isKindOfClass:UIView.class] || [actual isKindOfClass:CALayer.class] || [actual isKindOfClass:UIViewController.class]);
|
||||||
|
__block NSError *error = nil;
|
||||||
|
id actualRef = actual;
|
||||||
|
|
||||||
|
prerequisite(^BOOL{
|
||||||
|
return actualRef && snapshotExists && actualIsViewLayerOrViewController;
|
||||||
|
});
|
||||||
|
|
||||||
|
match(^BOOL{
|
||||||
|
NSString *referenceImageDir = [self _getDefaultReferenceDirectory];
|
||||||
|
|
||||||
|
// For view controllers do the viewWill/viewDid dance, then pass view through
|
||||||
|
if ([actual isKindOfClass:UIViewController.class]) {
|
||||||
|
[actual beginAppearanceTransition:YES animated:NO];
|
||||||
|
[actual endAppearanceTransition];
|
||||||
|
actual = [actual view];
|
||||||
|
}
|
||||||
|
|
||||||
|
[EXPExpectFBSnapshotTest compareSnapshotOfViewOrLayer:actual snapshot:snapshot testCase:[self testCase] record:YES referenceDirectory:referenceImageDir error:&error];
|
||||||
|
return NO;
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForTo(^NSString *{
|
||||||
|
if (!actualIsViewLayerOrViewController) {
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"Expected a View, Layer or View Controller." test:snapshot error:nil];
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected to record a matching snapshot named" test:snapshot error:error];
|
||||||
|
} else {
|
||||||
|
return [NSString stringWithFormat:@"snapshot %@ successfully recorded, replace recordSnapshot with a check", snapshot];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForNotTo(^NSString *{
|
||||||
|
if (!actualIsViewLayerOrViewController) {
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"Expected a View, Layer or View Controller." test:snapshot error:nil];
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
return [EXPExpectFBSnapshotTest combinedError:@"expected to record a matching snapshot named" test:snapshot error:error];
|
||||||
|
} else {
|
||||||
|
return [NSString stringWithFormat:@"snapshot %@ successfully recorded, replace recordSnapshot with a check", snapshot];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPMatcherImplementationEnd
|
||||||
17
Example/Pods/Expecta+Snapshots/ExpectaObject+FBSnapshotTest.h
generated
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// ExpectaObject+FBSnapshotTest.h
|
||||||
|
// Expecta+Snapshots
|
||||||
|
//
|
||||||
|
// Created by John Boiles on 8/3/15.
|
||||||
|
// Copyright (c) 2015 Expecta+Snapshots All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Expecta/ExpectaObject.h>
|
||||||
|
|
||||||
|
@interface Expecta (FBSnapshotTest)
|
||||||
|
|
||||||
|
+ (void)setUsesDrawViewHierarchyInRect:(BOOL)usesDrawViewHierarchyInRect;
|
||||||
|
|
||||||
|
+ (BOOL)usesDrawViewHierarchyInRect;
|
||||||
|
|
||||||
|
@end
|
||||||
25
Example/Pods/Expecta+Snapshots/ExpectaObject+FBSnapshotTest.m
generated
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
//
|
||||||
|
// ExpectaObject+FBSnapshotTest.m
|
||||||
|
// Expecta+Snapshots
|
||||||
|
//
|
||||||
|
// Created by John Boiles on 8/3/15.
|
||||||
|
// Copyright (c) 2015 Expecta+Snapshots All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "ExpectaObject+FBSnapshotTest.h"
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
|
static NSString const *kUsesDrawViewHierarchyInRectKey = @"ExpectaObject+FBSnapshotTest.usesDrawViewHierarchyInRect";
|
||||||
|
|
||||||
|
@implementation Expecta (FBSnapshotTest)
|
||||||
|
|
||||||
|
+ (void)setUsesDrawViewHierarchyInRect:(BOOL)usesDrawViewHierarchyInRect {
|
||||||
|
objc_setAssociatedObject(self, (__bridge const void *)(kUsesDrawViewHierarchyInRectKey), @(usesDrawViewHierarchyInRect), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)usesDrawViewHierarchyInRect {
|
||||||
|
NSNumber *usesDrawViewHierarchyInRect = objc_getAssociatedObject(self, (__bridge const void *)(kUsesDrawViewHierarchyInRectKey));
|
||||||
|
return usesDrawViewHierarchyInRect.boolValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
22
Example/Pods/Expecta+Snapshots/LICENSE.md
generated
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2014 Daniel Doubrovkine, Artsy Inc.
|
||||||
|
|
||||||
|
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.
|
||||||
87
Example/Pods/Expecta+Snapshots/README.md
generated
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
Expecta Matchers for FBSnapshotTestCase
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
[Expecta](https://github.com/specta/expecta) matchers for [ios-snapshot-test-case](https://github.com/facebook/ios-snapshot-test-case).
|
||||||
|
|
||||||
|
[](https://travis-ci.org/dblock/ios-snapshot-test-case-expecta)
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
Add `Expecta+Snapshots` to your Podfile, the latest `FBSnapshotTestCase` will come in as a dependency.
|
||||||
|
|
||||||
|
``` ruby
|
||||||
|
pod 'Expecta+Snapshots'
|
||||||
|
```
|
||||||
|
|
||||||
|
### App setup
|
||||||
|
|
||||||
|
Use `expect(view).to.recordSnapshotNamed(@"unique snapshot name")` to record a snapshot and `expect(view).to.haveValidSnapshotNamed(@"unique snapshot name")` to check it.
|
||||||
|
|
||||||
|
If you project was compiled with Specta included, you have two extra methods that use the spec hierarchy to generate the snapshot name for you: `recordSnapshot()` and `haveValidSnapshot()`. You should only call these once per `it()` block.
|
||||||
|
|
||||||
|
If you need the `usesDrawViewHierarchyInRect` property in order to correctly render UIVisualEffect, UIAppearance and Size Classes, call `[Expecta setUsesDrawViewHierarchyInRect:NO];` inside `beforeAll`.
|
||||||
|
|
||||||
|
``` Objective-C
|
||||||
|
#define EXP_SHORTHAND
|
||||||
|
#include <Specta/Specta.h>
|
||||||
|
#include <Expecta/Expecta.h>
|
||||||
|
#include <Expecta+Snapshots/EXPMatchers+FBSnapshotTest.h>
|
||||||
|
#include "FBExampleView.h"
|
||||||
|
|
||||||
|
SpecBegin(FBExampleView)
|
||||||
|
|
||||||
|
describe(@"manual matching", ^{
|
||||||
|
|
||||||
|
it(@"matches view", ^{
|
||||||
|
FBExampleView *view = [[FBExampleView alloc] initWithFrame:CGRectMake(0, 0, 64, 64)];
|
||||||
|
expect(view).to.recordSnapshotNamed(@"FBExampleView");
|
||||||
|
expect(view).to.haveValidSnapshotNamed(@"FBExampleView");
|
||||||
|
});
|
||||||
|
|
||||||
|
it(@"doesn't match a view", ^{
|
||||||
|
FBExampleView *view = [[FBExampleView alloc] initWithFrame:CGRectMake(0, 0, 64, 64)];
|
||||||
|
expect(view).toNot.haveValidSnapshotNamed(@"FBExampleViewDoesNotExist");
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe(@"test name derived matching", ^{
|
||||||
|
|
||||||
|
it(@"matches view", ^{
|
||||||
|
FBExampleView *view = [[FBExampleView alloc] initWithFrame:CGRectMake(0, 0, 64, 64)];
|
||||||
|
expect(view).to.recordSnapshot();
|
||||||
|
expect(view).to.haveValidSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
it(@"doesn't match a view", ^{
|
||||||
|
FBExampleView *view = [[FBExampleView alloc] initWithFrame:CGRectMake(0, 0, 64, 64)];
|
||||||
|
expect(view).toNot.haveValidSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
SpecEnd
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sane defaults
|
||||||
|
|
||||||
|
`EXPMatchers+FBSnapshotTest` will automatically figure out the tests folder, and [add a reference image](https://github.com/dblock/ios-snapshot-test-case-expecta/blob/master/EXPMatchers%2BFBSnapshotTest.m#L84-L85) directory, if you'd like to override this, you should include a `beforeAll` block setting the `setGlobalReferenceImageDir` in each file containing tests.
|
||||||
|
|
||||||
|
```
|
||||||
|
beforeAll(^{
|
||||||
|
setGlobalReferenceImageDir(FB_REFERENCE_IMAGE_DIR);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
A complete project can be found in [FBSnapshotTestCaseDemo](FBSnapshotTestCaseDemo).
|
||||||
|
|
||||||
|
Notably, take a look at [FBSnapshotTestCaseDemoSpecs.m](FBSnapshotTestCaseDemo/FBSnapshotTestCaseDemoTests/FBSnapshotTestCaseDemoSpecs.m) for a complete example, which is an expanded Specta version version of [FBSnapshotTestCaseDemoTests.m](https://github.com/facebook/ios-snapshot-test-case/blob/master/FBSnapshotTestCaseDemo/FBSnapshotTestCaseDemoTests/FBSnapshotTestCaseDemoTests.m).
|
||||||
|
|
||||||
|
Finally you can consult the tests for [ARTiledImageView](https://github.com/dblock/ARTiledImageView/tree/master/IntegrationTests) or [NAMapKit](https://github.com/neilang/NAMapKit/tree/master/Demo/DemoTests).
|
||||||
|
|
||||||
|
### License
|
||||||
|
|
||||||
|
MIT, see [LICENSE](LICENSE.md)
|
||||||
25
Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.h
generated
Normal file
@ -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 <Foundation/Foundation.h>
|
||||||
|
#import "EXPMatcher.h"
|
||||||
|
#import "EXPDefines.h"
|
||||||
|
|
||||||
|
@interface EXPBlockDefinedMatcher : NSObject <EXPMatcher> {
|
||||||
|
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
|
||||||
60
Example/Pods/Expecta/Expecta/EXPBlockDefinedMatcher.m
generated
Normal file
@ -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
|
||||||
17
Example/Pods/Expecta/Expecta/EXPDefines.h
generated
Normal file
@ -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
|
||||||
13
Example/Pods/Expecta/Expecta/EXPDoubleTuple.h
generated
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@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
|
||||||
45
Example/Pods/Expecta/Expecta/EXPDoubleTuple.m
generated
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#import "EXPDoubleTuple.h"
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
|
||||||
|
@implementation EXPDoubleTuple
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
@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
|
||||||
45
Example/Pods/Expecta/Expecta/EXPExpect.h
generated
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#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<EXPMatcher>)matcher;
|
||||||
|
- (void)applyMatcher:(id<EXPMatcher>)matcher to:(NSObject **)actual;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface EXPDynamicPredicateMatcher : NSObject <EXPMatcher> {
|
||||||
|
EXPExpect *_expectation;
|
||||||
|
SEL _selector;
|
||||||
|
}
|
||||||
|
- (instancetype)initWithExpectation:(EXPExpect *)expectation selector:(SEL)selector NS_DESIGNATED_INITIALIZER;
|
||||||
|
@property (nonatomic, readonly, copy) void (^dispatch)(void);
|
||||||
|
@end
|
||||||
221
Example/Pods/Expecta/Expecta/EXPExpect.m
generated
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
#import "EXPExpect.h"
|
||||||
|
#import "NSObject+Expecta.h"
|
||||||
|
#import "Expecta.h"
|
||||||
|
#import "EXPUnsupportedObject.h"
|
||||||
|
#import "EXPMatcher.h"
|
||||||
|
#import "EXPBlockDefinedMatcher.h"
|
||||||
|
#import <libkern/OSAtomic.h>
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
|
||||||
|
@implementation EXPExpect
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
@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 release];
|
||||||
|
_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<EXPMatcher>)matcher
|
||||||
|
{
|
||||||
|
id actual = [self actual];
|
||||||
|
[self applyMatcher:matcher to:&actual];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)applyMatcher:(id<EXPMatcher>)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
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
|
||||||
|
@implementation EXPDynamicPredicateMatcher
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
- (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
|
||||||
13
Example/Pods/Expecta/Expecta/EXPFloatTuple.h
generated
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@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
|
||||||
55
Example/Pods/Expecta/Expecta/EXPFloatTuple.m
generated
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#import "EXPFloatTuple.h"
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
|
||||||
|
@implementation EXPFloatTuple
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
@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<self.size; i++) {
|
||||||
|
hash = prime * hash + (NSUInteger)self.values[i];
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *)description {
|
||||||
|
if (self.size == 2) {
|
||||||
|
return [NSString stringWithFormat:@"Float tuple: {%f, %f}", self.values[0], self.values[1]];
|
||||||
|
} else if (self.size == 4) {
|
||||||
|
return [NSString stringWithFormat:@"Float tuple: {%f, %f, %f, %f}", self.values[0], self.values[1], self.values[2], self.values[3]];
|
||||||
|
}
|
||||||
|
return [NSString stringWithFormat:@"Float tuple of unexpected size %zd, sadly", self.size];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
20
Example/Pods/Expecta/Expecta/EXPMatcher.h
generated
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// EXPMatcher.h
|
||||||
|
// Expecta
|
||||||
|
//
|
||||||
|
// Created by Luke Redpath on 26/03/2012.
|
||||||
|
// Copyright (c) 2012 Peter Jihoon Kim. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@protocol EXPMatcher <NSObject>
|
||||||
|
|
||||||
|
- (BOOL)matches:(id)actual;
|
||||||
|
|
||||||
|
@optional
|
||||||
|
- (BOOL)meetsPrerequesiteFor:(id)actual;
|
||||||
|
- (NSString *)failureMessageForTo:(id)actual;
|
||||||
|
- (NSString *)failureMessageForNotTo:(id)actual;
|
||||||
|
|
||||||
|
@end
|
||||||
11
Example/Pods/Expecta/Expecta/EXPUnsupportedObject.h
generated
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface EXPUnsupportedObject : NSObject {
|
||||||
|
NSString *_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic, retain) NSString *type;
|
||||||
|
|
||||||
|
- (instancetype)initWithType:(NSString *)type NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
|
@end
|
||||||
23
Example/Pods/Expecta/Expecta/EXPUnsupportedObject.m
generated
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#import "EXPUnsupportedObject.h"
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wobjc-designated-initializers"
|
||||||
|
@implementation EXPUnsupportedObject
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
@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
|
||||||
15
Example/Pods/Expecta/Expecta/Expecta.h
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
//! Project version number for Expecta.
|
||||||
|
FOUNDATION_EXPORT double ExpectaVersionNumber;
|
||||||
|
|
||||||
|
//! Project version string for Expecta.
|
||||||
|
FOUNDATION_EXPORT const unsigned char ExpectaVersionString[];
|
||||||
|
|
||||||
|
#import <Expecta/ExpectaObject.h>
|
||||||
|
#import <Expecta/ExpectaSupport.h>
|
||||||
|
#import <Expecta/EXPMatchers.h>
|
||||||
|
|
||||||
|
// Enable shorthand by default
|
||||||
|
#define expect(...) EXP_expect((__VA_ARGS__))
|
||||||
|
#define failure(...) EXP_failure((__VA_ARGS__))
|
||||||
18
Example/Pods/Expecta/Expecta/ExpectaObject.h
generated
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#define EXPObjectify(value) _EXPObjectify(@encode(__typeof__((value))), (value))
|
||||||
|
#define EXP_expect(actual) _EXP_expect(self, __LINE__, __FILE__, ^id{ __typeof__((actual)) strongActual = (actual); return EXPObjectify(strongActual); })
|
||||||
|
#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
|
||||||
15
Example/Pods/Expecta/Expecta/ExpectaObject.m
generated
Normal file
@ -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
|
||||||
74
Example/Pods/Expecta/Expecta/ExpectaSupport.h
generated
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#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]; \
|
||||||
|
[[[NSThread currentThread] threadDictionary] removeObjectForKey:@"EXP_currentMatcher"]; \
|
||||||
|
} 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
|
||||||
176
Example/Pods/Expecta/Expecta/ExpectaSupport.m
generated
Normal file
@ -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 <objc/runtime.h>
|
||||||
|
|
||||||
|
@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];
|
||||||
|
}
|
||||||
|
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
BOOL EXPIsValuePointer(NSValue *value);
|
||||||
|
BOOL EXPIsNumberFloat(NSNumber *number);
|
||||||
9
Example/Pods/Expecta/Expecta/Matchers/EXPMatcherHelpers.m
generated
Normal file
@ -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;
|
||||||
|
}
|
||||||
7
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.h
generated
Normal file
@ -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)))
|
||||||
49
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beCloseTo.m
generated
Normal file
@ -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
|
||||||
3
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.h
generated
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beFalsy, (void));
|
||||||
24
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beFalsy.m
generated
Normal file
@ -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
|
||||||
6
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.h
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(_beGreaterThan, (id expected));
|
||||||
|
EXPMatcherInterface(beGreaterThan, (id expected));
|
||||||
|
|
||||||
|
#define beGreaterThan(expected) _beGreaterThan(EXPObjectify((expected)))
|
||||||
20
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThan.m
generated
Normal file
@ -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
|
||||||
6
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(_beGreaterThanOrEqualTo, (id expected));
|
||||||
|
EXPMatcherInterface(beGreaterThanOrEqualTo, (id expected));
|
||||||
|
|
||||||
|
#define beGreaterThanOrEqualTo(expected) _beGreaterThanOrEqualTo(EXPObjectify((expected)))
|
||||||
20
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.m
generated
Normal file
@ -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
|
||||||
10
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.h
generated
Normal file
@ -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
|
||||||
24
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beIdenticalTo.m
generated
Normal file
@ -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
|
||||||
6
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.h
generated
Normal file
@ -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)))
|
||||||
30
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInTheRangeOf.m
generated
Normal file
@ -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
|
||||||
6
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.h
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beInstanceOf, (Class expected));
|
||||||
|
EXPMatcherInterface(beAnInstanceOf, (Class expected));
|
||||||
|
EXPMatcherInterface(beMemberOf, (Class expected));
|
||||||
|
EXPMatcherInterface(beAMemberOf, (Class expected));
|
||||||
31
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beInstanceOf.m
generated
Normal file
@ -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));
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beKindOf, (Class expected));
|
||||||
|
EXPMatcherInterface(beAKindOf, (Class expected));
|
||||||
29
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beKindOf.m
generated
Normal file
@ -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));
|
||||||
6
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.h
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(_beLessThan, (id expected));
|
||||||
|
EXPMatcherInterface(beLessThan, (id expected));
|
||||||
|
|
||||||
|
#define beLessThan(expected) _beLessThan(EXPObjectify((expected)))
|
||||||
20
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThan.m
generated
Normal file
@ -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
|
||||||
6
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.h
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(_beLessThanOrEqualTo, (id expected));
|
||||||
|
EXPMatcherInterface(beLessThanOrEqualTo, (id expected));
|
||||||
|
|
||||||
|
#define beLessThanOrEqualTo(expected) _beLessThanOrEqualTo(EXPObjectify((expected)))
|
||||||
20
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beLessThanOrEqualTo.m
generated
Normal file
@ -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
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beNil, (void));
|
||||||
|
EXPMatcherInterface(beNull, (void));
|
||||||
18
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beNil.m
generated
Normal file
@ -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));
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beSubclassOf, (Class expected));
|
||||||
|
EXPMatcherInterface(beASubclassOf, (Class expected));
|
||||||
29
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSubclassOf.m
generated
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#import "EXPMatchers+beSubclassOf.h"
|
||||||
|
#import "NSValue+Expecta.h"
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
|
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));
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beSupersetOf, (id subset));
|
||||||
|
|
||||||
62
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beSupersetOf.m
generated
Normal file
@ -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
|
||||||
3
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.h
generated
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beTruthy, (void));
|
||||||
24
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beTruthy.m
generated
Normal file
@ -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
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(beginWith, (id expected));
|
||||||
|
EXPMatcherInterface(startWith, (id expected));
|
||||||
51
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+beginWith.m
generated
Normal file
@ -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));
|
||||||
3
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.h
generated
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(conformTo, (Protocol *expected));
|
||||||
33
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+conformTo.m
generated
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#import "EXPMatchers+conformTo.h"
|
||||||
|
#import "NSValue+Expecta.h"
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
|
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
|
||||||
5
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.h
generated
Normal file
@ -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)))
|
||||||
38
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+contain.m
generated
Normal file
@ -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
|
||||||
3
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.h
generated
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(endWith, (id expected));
|
||||||
49
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+endWith.m
generated
Normal file
@ -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
|
||||||
5
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.h
generated
Normal file
@ -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__)))
|
||||||
38
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+equal.m
generated
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#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 *{
|
||||||
|
NSString *expectedDescription = EXPDescribeObject(expected);
|
||||||
|
NSString *actualDescription = EXPDescribeObject(actual);
|
||||||
|
|
||||||
|
if (![expectedDescription isEqualToString:actualDescription]) {
|
||||||
|
return [NSString stringWithFormat:@"expected: %@, got: %@", EXPDescribeObject(expected), EXPDescribeObject(actual)];
|
||||||
|
} else {
|
||||||
|
return [NSString stringWithFormat:@"expected (%@): %@, got (%@): %@", NSStringFromClass([expected class]), EXPDescribeObject(expected), NSStringFromClass([actual class]), EXPDescribeObject(actual)];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
failureMessageForNotTo(^NSString *{
|
||||||
|
return [NSString stringWithFormat:@"expected: not %@, got: %@", EXPDescribeObject(expected), EXPDescribeObject(actual)];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
EXPMatcherImplementationEnd
|
||||||
10
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.h
generated
Normal file
@ -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)
|
||||||
42
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+haveCountOf.m
generated
Normal file
@ -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));
|
||||||
3
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.h
generated
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(match, (NSString *expected));
|
||||||
38
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+match.m
generated
Normal file
@ -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
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(postNotification, (id expectedNotification));
|
||||||
|
EXPMatcherInterface(notify, (id expectedNotification));
|
||||||
88
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+postNotification.m
generated
Normal file
@ -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))
|
||||||
4
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.h
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(raise, (NSString *expectedExceptionName));
|
||||||
|
#define raiseAny() raise(nil)
|
||||||
30
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raise.m
generated
Normal file
@ -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
|
||||||
3
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.h
generated
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(raiseWithReason, (NSString *expectedExceptionName, NSString *expectedReason));
|
||||||
35
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+raiseWithReason.m
generated
Normal file
@ -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
|
||||||
3
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.h
generated
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#import "Expecta.h"
|
||||||
|
|
||||||
|
EXPMatcherInterface(respondTo, (SEL expected));
|
||||||
28
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers+respondTo.m
generated
Normal file
@ -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
|
||||||
25
Example/Pods/Expecta/Expecta/Matchers/EXPMatchers.h
generated
Normal file
@ -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"
|
||||||
10
Example/Pods/Expecta/Expecta/NSObject+Expecta.h
generated
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface NSObject (Expecta)
|
||||||
|
|
||||||
|
- (void)recordFailureWithDescription:(NSString *)description
|
||||||
|
inFile:(NSString *)filename
|
||||||
|
atLine:(NSUInteger)lineNumber
|
||||||
|
expected:(BOOL)expected;
|
||||||
|
|
||||||
|
@end
|
||||||
7
Example/Pods/Expecta/Expecta/NSValue+Expecta.h
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface NSValue (Expecta)
|
||||||
|
|
||||||
|
@property (nonatomic) const char *_EXP_objCType;
|
||||||
|
|
||||||
|
@end
|
||||||
21
Example/Pods/Expecta/Expecta/NSValue+Expecta.m
generated
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#import "NSValue+Expecta.h"
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
#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
|
||||||