- First Commit
@ -20,7 +20,10 @@
|
||||
6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; };
|
||||
6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; };
|
||||
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 */; };
|
||||
D6C71C75B8F5800EC9990F14 /* Pods_PNImagePickerViewController_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 685260EDF68D7C851442C12E /* Pods_PNImagePickerViewController_Example.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@ -34,7 +37,9 @@
|
||||
/* End PBXContainerItemProxy 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; };
|
||||
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; };
|
||||
@ -54,8 +59,13 @@
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
@ -64,9 +74,11 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
681785911C69DCB50032DAAC /* PNImagePickerViewController.framework in Frameworks */,
|
||||
6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */,
|
||||
6003F592195388D20070C39A /* UIKit.framework in Frameworks */,
|
||||
6003F58E195388D20070C39A /* Foundation.framework in Frameworks */,
|
||||
D6C71C75B8F5800EC9990F14 /* Pods_PNImagePickerViewController_Example.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -77,6 +89,7 @@
|
||||
6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */,
|
||||
6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */,
|
||||
6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */,
|
||||
7D97D76088572AF45812187E /* Pods_PNImagePickerViewController_Tests.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -91,6 +104,7 @@
|
||||
6003F5B5195388D20070C39A /* Tests */,
|
||||
6003F58C195388D20070C39A /* Frameworks */,
|
||||
6003F58B195388D20070C39A /* Products */,
|
||||
9BA892B7D07729CC69D18118 /* Pods */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -106,10 +120,13 @@
|
||||
6003F58C195388D20070C39A /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
681785901C69DCB50032DAAC /* PNImagePickerViewController.framework */,
|
||||
6003F58D195388D20070C39A /* Foundation.framework */,
|
||||
6003F58F195388D20070C39A /* CoreGraphics.framework */,
|
||||
6003F591195388D20070C39A /* UIKit.framework */,
|
||||
6003F5AF195388D20070C39A /* XCTest.framework */,
|
||||
685260EDF68D7C851442C12E /* Pods_PNImagePickerViewController_Example.framework */,
|
||||
4328521B225C017B57B0EA26 /* Pods_PNImagePickerViewController_Tests.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@ -169,6 +186,17 @@
|
||||
name = "Podspec Metadata";
|
||||
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 */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@ -176,9 +204,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "PNImagePickerViewController_Example" */;
|
||||
buildPhases = (
|
||||
F8D96CF8CF3D374B5AAE33C4 /* Check Pods Manifest.lock */,
|
||||
6003F586195388D20070C39A /* Sources */,
|
||||
6003F587195388D20070C39A /* Frameworks */,
|
||||
6003F588195388D20070C39A /* Resources */,
|
||||
B94FCDE98F285449578D9F34 /* Embed Pods Frameworks */,
|
||||
56476F9757949999164002B1 /* Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -193,9 +224,12 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "PNImagePickerViewController_Tests" */;
|
||||
buildPhases = (
|
||||
2FD43162D7B4455C62B23FFC /* Check Pods Manifest.lock */,
|
||||
6003F5AA195388D20070C39A /* Sources */,
|
||||
6003F5AB195388D20070C39A /* Frameworks */,
|
||||
6003F5AC195388D20070C39A /* Resources */,
|
||||
6C7D9A9333266674130B4B6D /* Embed Pods Frameworks */,
|
||||
B6A2E7AB4CD0217BA75EC551 /* Copy Pods Resources */,
|
||||
);
|
||||
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";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
@ -262,6 +296,99 @@
|
||||
};
|
||||
/* 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 */
|
||||
6003F586195388D20070C39A /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
@ -344,7 +471,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@ -377,7 +504,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
@ -386,9 +513,14 @@
|
||||
};
|
||||
6003F5C0195388D20070C39A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 86D18E23BB421419B8132D08 /* Pods-PNImagePickerViewController_Example.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/build/Debug-iphoneos",
|
||||
);
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "PNImagePickerViewController/PNImagePickerViewController-Prefix.pch";
|
||||
INFOPLIST_FILE = "PNImagePickerViewController/PNImagePickerViewController-Info.plist";
|
||||
@ -401,9 +533,14 @@
|
||||
};
|
||||
6003F5C1195388D20070C39A /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 98D3978B62130F866F704B9C /* Pods-PNImagePickerViewController_Example.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/build/Debug-iphoneos",
|
||||
);
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "PNImagePickerViewController/PNImagePickerViewController-Prefix.pch";
|
||||
INFOPLIST_FILE = "PNImagePickerViewController/PNImagePickerViewController-Info.plist";
|
||||
@ -416,6 +553,7 @@
|
||||
};
|
||||
6003F5C3195388D20070C39A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9DECFF91FBC10CAD6C7AEE1E /* Pods-PNImagePickerViewController_Tests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
@ -439,6 +577,7 @@
|
||||
};
|
||||
6003F5C4195388D20070C39A /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 12535CEF396FF4D6369EA5C0 /* Pods-PNImagePickerViewController_Tests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
@ -459,7 +598,7 @@
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
6003F585195388D10070C39A /* Build configuration list for PBXProject "PROJECT" */ = {
|
||||
6003F585195388D10070C39A /* Build configuration list for PBXProject "PNImagePickerViewController" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
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",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "29x29",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "40x40",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "40x40",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "60x60",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "iphone",
|
||||
"size" : "60x60",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "29x29",
|
||||
@ -44,6 +59,11 @@
|
||||
"idiom" : "ipad",
|
||||
"size" : "76x76",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"idiom" : "ipad",
|
||||
"size" : "83.5x83.5",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
|
||||
@ -1,46 +1,157 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "iphone",
|
||||
"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",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "retina4",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "Default-568h@2x.png",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "retina4",
|
||||
"filename" : "Default-568h@2x.png",
|
||||
"minimum-system-version" : "7.0",
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"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",
|
||||
"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"
|
||||
}
|
||||
],
|
||||
|
||||
|
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 "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
|
||||
|
||||
@ -17,9 +23,60 @@
|
||||
- (void)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.
|
||||
}
|
||||
|
||||
- (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
|
||||
{
|
||||
[super didReceiveMemoryWarning];
|
||||
|
||||
@ -1,11 +1,12 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
use_frameworks!
|
||||
|
||||
target 'PNImagePickerViewController_Example', :exclusive => true do
|
||||
target 'PNImagePickerViewController_Example' do
|
||||
pod 'PNImagePickerViewController', :path => '../'
|
||||
pod 'PureLayout'
|
||||
end
|
||||
|
||||
target 'PNImagePickerViewController_Tests', :exclusive => true do
|
||||
target 'PNImagePickerViewController_Tests' do
|
||||
pod 'PNImagePickerViewController', :path => '../'
|
||||
|
||||
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
|
||||