second_curtain 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +20 -0
  3. data/.travis.yml +7 -0
  4. data/CHANGELOG +20 -0
  5. data/Demo/Demo/ASHAppDelegate.h +15 -0
  6. data/Demo/Demo/ASHAppDelegate.m +18 -0
  7. data/Demo/Demo/ASHViewController.h +13 -0
  8. data/Demo/Demo/ASHViewController.m +30 -0
  9. data/Demo/Demo/Base.lproj/Main.storyboard +30 -0
  10. data/Demo/Demo/Demo-Info.plist +40 -0
  11. data/Demo/Demo/Demo-Prefix.pch +16 -0
  12. data/Demo/Demo/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
  13. data/Demo/Demo/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
  14. data/Demo/Demo/en.lproj/InfoPlist.strings +2 -0
  15. data/Demo/Demo/main.m +18 -0
  16. data/Demo/Demo.xcodeproj/project.pbxproj +517 -0
  17. data/Demo/Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  18. data/Demo/Demo.xcodeproj/project.xcworkspace/xcshareddata/Demo.xccheckout +41 -0
  19. data/Demo/Demo.xcodeproj/project.xcworkspace/xcuserdata/ash.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  20. data/Demo/Demo.xcodeproj/xcshareddata/xcschemes/Demo.xcscheme +96 -0
  21. data/Demo/Demo.xcodeproj/xcuserdata/ash.xcuserdatad/xcschemes/xcschememanagement.plist +27 -0
  22. data/Demo/Demo.xcodeproj/xcuserdata/orta.xcuserdatad/xcschemes/xcschememanagement.plist +27 -0
  23. data/Demo/Demo.xcworkspace/contents.xcworkspacedata +1 -0
  24. data/Demo/Demo.xcworkspace/xcshareddata/Demo.xccheckout +41 -0
  25. data/Demo/Demo.xcworkspace/xcuserdata/ash.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  26. data/Demo/Demo.xcworkspace/xcuserdata/orta.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  27. data/Demo/DemoTests/DemoTests-Info.plist +22 -0
  28. data/Demo/DemoTests/DemoTests.m +52 -0
  29. data/Demo/DemoTests/ReferenceImages/ASHViewControllerSpec/a_view_controller_with_a_loaded_view_should_have_a_valid_snapshot@2x.png +0 -0
  30. data/Demo/DemoTests/ReferenceImages/ASHViewControllerSpec/views_should_be_green@2x.png +0 -0
  31. data/Demo/DemoTests/ReferenceImages/ASHViewControllerSpec/views_should_be_red@2x.png +0 -0
  32. data/Demo/DemoTests/en.lproj/InfoPlist.strings +2 -0
  33. data/Demo/Makefile +15 -0
  34. data/Demo/Podfile +16 -0
  35. data/Demo/Podfile.lock +21 -0
  36. data/Demo/Pods/BuildHeaders/Expecta/EXPBackwardCompatibility.h +42 -0
  37. data/Demo/Pods/BuildHeaders/Expecta/EXPBlockDefinedMatcher.h +25 -0
  38. data/Demo/Pods/BuildHeaders/Expecta/EXPDefines.h +17 -0
  39. data/Demo/Pods/BuildHeaders/Expecta/EXPDoubleTuple.h +13 -0
  40. data/Demo/Pods/BuildHeaders/Expecta/EXPExpect.h +45 -0
  41. data/Demo/Pods/BuildHeaders/Expecta/EXPFloatTuple.h +13 -0
  42. data/Demo/Pods/BuildHeaders/Expecta/EXPMatcher.h +20 -0
  43. data/Demo/Pods/BuildHeaders/Expecta/EXPMatcherHelpers.h +4 -0
  44. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beCloseTo.h +7 -0
  45. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beFalsy.h +3 -0
  46. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beGreaterThan.h +6 -0
  47. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h +6 -0
  48. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beIdenticalTo.h +10 -0
  49. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beInTheRangeOf.h +6 -0
  50. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beInstanceOf.h +7 -0
  51. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beKindOf.h +5 -0
  52. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beLessThan.h +6 -0
  53. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beLessThanOrEqualTo.h +6 -0
  54. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beNil.h +5 -0
  55. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beSubclassOf.h +5 -0
  56. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beSupersetOf.h +4 -0
  57. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beTruthy.h +3 -0
  58. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+beginWith.h +5 -0
  59. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+conformTo.h +3 -0
  60. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+contain.h +5 -0
  61. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+endWith.h +3 -0
  62. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+equal.h +5 -0
  63. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+haveCountOf.h +10 -0
  64. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+notify.h +4 -0
  65. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+raise.h +4 -0
  66. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+raiseWithReason.h +3 -0
  67. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers+respondTo.h +3 -0
  68. data/Demo/Pods/BuildHeaders/Expecta/EXPMatchers.h +24 -0
  69. data/Demo/Pods/BuildHeaders/Expecta/EXPUnsupportedObject.h +11 -0
  70. data/Demo/Pods/BuildHeaders/Expecta/Expecta.h +27 -0
  71. data/Demo/Pods/BuildHeaders/Expecta/ExpectaSupport.h +64 -0
  72. data/Demo/Pods/BuildHeaders/Expecta/NSObject+Expecta.h +14 -0
  73. data/Demo/Pods/BuildHeaders/Expecta/NSValue+Expecta.h +8 -0
  74. data/Demo/Pods/BuildHeaders/Expecta+Snapshots/EXPMatchers+FBSnapshotTest.h +21 -0
  75. data/Demo/Pods/BuildHeaders/FBSnapshotTestCase/FBSnapshotTestCase.h +87 -0
  76. data/Demo/Pods/BuildHeaders/FBSnapshotTestCase/FBSnapshotTestController.h +147 -0
  77. data/Demo/Pods/BuildHeaders/FBSnapshotTestCase/UIImage+Compare.h +37 -0
  78. data/Demo/Pods/BuildHeaders/FBSnapshotTestCase/UIImage+Diff.h +37 -0
  79. data/Demo/Pods/BuildHeaders/Specta/SPTExample.h +14 -0
  80. data/Demo/Pods/BuildHeaders/Specta/SPTExampleGroup.h +40 -0
  81. data/Demo/Pods/BuildHeaders/Specta/SPTNestedReporter.h +5 -0
  82. data/Demo/Pods/BuildHeaders/Specta/SPTReporter.h +33 -0
  83. data/Demo/Pods/BuildHeaders/Specta/SPTSharedExampleGroups.h +17 -0
  84. data/Demo/Pods/BuildHeaders/Specta/SPTSpec.h +21 -0
  85. data/Demo/Pods/BuildHeaders/Specta/SPTXCTestCase.h +27 -0
  86. data/Demo/Pods/BuildHeaders/Specta/SPTXCTestReporter.h +9 -0
  87. data/Demo/Pods/BuildHeaders/Specta/Specta.h +70 -0
  88. data/Demo/Pods/BuildHeaders/Specta/SpectaSupport.h +46 -0
  89. data/Demo/Pods/BuildHeaders/Specta/SpectaTypes.h +3 -0
  90. data/Demo/Pods/BuildHeaders/Specta/SpectaUtility.h +14 -0
  91. data/Demo/Pods/BuildHeaders/Specta/XCTestCase+Specta.h +4 -0
  92. data/Demo/Pods/BuildHeaders/Specta/XCTestLog+Specta.h +7 -0
  93. data/Demo/Pods/BuildHeaders/Specta/XCTestRun+Specta.h +8 -0
  94. data/Demo/Pods/Expecta/LICENSE +19 -0
  95. data/Demo/Pods/Expecta/README.md +308 -0
  96. data/Demo/Pods/Expecta/src/EXPBackwardCompatibility.h +42 -0
  97. data/Demo/Pods/Expecta/src/EXPBackwardCompatibility.m +17 -0
  98. data/Demo/Pods/Expecta/src/EXPBlockDefinedMatcher.h +25 -0
  99. data/Demo/Pods/Expecta/src/EXPBlockDefinedMatcher.m +60 -0
  100. data/Demo/Pods/Expecta/src/EXPDefines.h +17 -0
  101. data/Demo/Pods/Expecta/src/EXPDoubleTuple.h +13 -0
  102. data/Demo/Pods/Expecta/src/EXPDoubleTuple.m +42 -0
  103. data/Demo/Pods/Expecta/src/EXPExpect.h +45 -0
  104. data/Demo/Pods/Expecta/src/EXPExpect.m +214 -0
  105. data/Demo/Pods/Expecta/src/EXPFloatTuple.h +13 -0
  106. data/Demo/Pods/Expecta/src/EXPFloatTuple.m +42 -0
  107. data/Demo/Pods/Expecta/src/EXPMatcher.h +20 -0
  108. data/Demo/Pods/Expecta/src/EXPUnsupportedObject.h +11 -0
  109. data/Demo/Pods/Expecta/src/EXPUnsupportedObject.m +20 -0
  110. data/Demo/Pods/Expecta/src/Expecta.h +27 -0
  111. data/Demo/Pods/Expecta/src/Expecta.m +15 -0
  112. data/Demo/Pods/Expecta/src/ExpectaSupport.h +64 -0
  113. data/Demo/Pods/Expecta/src/ExpectaSupport.m +187 -0
  114. data/Demo/Pods/Expecta/src/NSObject+Expecta.h +14 -0
  115. data/Demo/Pods/Expecta/src/NSValue+Expecta.h +8 -0
  116. data/Demo/Pods/Expecta/src/NSValue+Expecta.m +21 -0
  117. data/Demo/Pods/Expecta/src/matchers/EXPMatcherHelpers.h +4 -0
  118. data/Demo/Pods/Expecta/src/matchers/EXPMatcherHelpers.m +9 -0
  119. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beCloseTo.h +7 -0
  120. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beCloseTo.m +49 -0
  121. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beFalsy.h +3 -0
  122. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beFalsy.m +24 -0
  123. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beGreaterThan.h +6 -0
  124. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beGreaterThan.m +20 -0
  125. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beGreaterThanOrEqualTo.h +6 -0
  126. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beGreaterThanOrEqualTo.m +20 -0
  127. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beIdenticalTo.h +10 -0
  128. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beIdenticalTo.m +24 -0
  129. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beInTheRangeOf.h +6 -0
  130. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beInTheRangeOf.m +30 -0
  131. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beInstanceOf.h +7 -0
  132. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beInstanceOf.m +27 -0
  133. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beKindOf.h +5 -0
  134. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beKindOf.m +27 -0
  135. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beLessThan.h +6 -0
  136. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beLessThan.m +20 -0
  137. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beLessThanOrEqualTo.h +6 -0
  138. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beLessThanOrEqualTo.m +20 -0
  139. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beNil.h +5 -0
  140. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beNil.m +16 -0
  141. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beSubclassOf.h +5 -0
  142. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beSubclassOf.m +27 -0
  143. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beSupersetOf.h +4 -0
  144. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beSupersetOf.m +57 -0
  145. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beTruthy.h +3 -0
  146. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beTruthy.m +24 -0
  147. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beginWith.h +5 -0
  148. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+beginWith.m +49 -0
  149. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+conformTo.h +3 -0
  150. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+conformTo.m +33 -0
  151. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+contain.h +5 -0
  152. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+contain.m +38 -0
  153. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+endWith.h +3 -0
  154. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+endWith.m +49 -0
  155. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+equal.h +5 -0
  156. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+equal.m +24 -0
  157. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+haveCountOf.h +10 -0
  158. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+haveCountOf.m +36 -0
  159. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+notify.h +4 -0
  160. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+notify.m +63 -0
  161. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+raise.h +4 -0
  162. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+raise.m +30 -0
  163. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+raiseWithReason.h +3 -0
  164. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+raiseWithReason.m +35 -0
  165. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+respondTo.h +3 -0
  166. data/Demo/Pods/Expecta/src/matchers/EXPMatchers+respondTo.m +28 -0
  167. data/Demo/Pods/Expecta/src/matchers/EXPMatchers.h +24 -0
  168. data/Demo/Pods/Expecta+Snapshots/EXPMatchers+FBSnapshotTest.h +21 -0
  169. data/Demo/Pods/Expecta+Snapshots/EXPMatchers+FBSnapshotTest.m +308 -0
  170. data/Demo/Pods/Expecta+Snapshots/LICENSE.md +22 -0
  171. data/Demo/Pods/Expecta+Snapshots/README.md +85 -0
  172. data/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase.h +87 -0
  173. data/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestCase.m +82 -0
  174. data/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestController.h +147 -0
  175. data/Demo/Pods/FBSnapshotTestCase/FBSnapshotTestController.m +376 -0
  176. data/Demo/Pods/FBSnapshotTestCase/LICENSE +29 -0
  177. data/Demo/Pods/FBSnapshotTestCase/README.md +83 -0
  178. data/Demo/Pods/FBSnapshotTestCase/UIImage+Compare.h +37 -0
  179. data/Demo/Pods/FBSnapshotTestCase/UIImage+Compare.m +87 -0
  180. data/Demo/Pods/FBSnapshotTestCase/UIImage+Diff.h +37 -0
  181. data/Demo/Pods/FBSnapshotTestCase/UIImage+Diff.m +56 -0
  182. data/Demo/Pods/Headers/Expecta/EXPBackwardCompatibility.h +42 -0
  183. data/Demo/Pods/Headers/Expecta/EXPBlockDefinedMatcher.h +25 -0
  184. data/Demo/Pods/Headers/Expecta/EXPDefines.h +17 -0
  185. data/Demo/Pods/Headers/Expecta/EXPDoubleTuple.h +13 -0
  186. data/Demo/Pods/Headers/Expecta/EXPExpect.h +45 -0
  187. data/Demo/Pods/Headers/Expecta/EXPFloatTuple.h +13 -0
  188. data/Demo/Pods/Headers/Expecta/EXPMatcher.h +20 -0
  189. data/Demo/Pods/Headers/Expecta/EXPMatcherHelpers.h +4 -0
  190. data/Demo/Pods/Headers/Expecta/EXPMatchers+beCloseTo.h +7 -0
  191. data/Demo/Pods/Headers/Expecta/EXPMatchers+beFalsy.h +3 -0
  192. data/Demo/Pods/Headers/Expecta/EXPMatchers+beGreaterThan.h +6 -0
  193. data/Demo/Pods/Headers/Expecta/EXPMatchers+beGreaterThanOrEqualTo.h +6 -0
  194. data/Demo/Pods/Headers/Expecta/EXPMatchers+beIdenticalTo.h +10 -0
  195. data/Demo/Pods/Headers/Expecta/EXPMatchers+beInTheRangeOf.h +6 -0
  196. data/Demo/Pods/Headers/Expecta/EXPMatchers+beInstanceOf.h +7 -0
  197. data/Demo/Pods/Headers/Expecta/EXPMatchers+beKindOf.h +5 -0
  198. data/Demo/Pods/Headers/Expecta/EXPMatchers+beLessThan.h +6 -0
  199. data/Demo/Pods/Headers/Expecta/EXPMatchers+beLessThanOrEqualTo.h +6 -0
  200. data/Demo/Pods/Headers/Expecta/EXPMatchers+beNil.h +5 -0
  201. data/Demo/Pods/Headers/Expecta/EXPMatchers+beSubclassOf.h +5 -0
  202. data/Demo/Pods/Headers/Expecta/EXPMatchers+beSupersetOf.h +4 -0
  203. data/Demo/Pods/Headers/Expecta/EXPMatchers+beTruthy.h +3 -0
  204. data/Demo/Pods/Headers/Expecta/EXPMatchers+beginWith.h +5 -0
  205. data/Demo/Pods/Headers/Expecta/EXPMatchers+conformTo.h +3 -0
  206. data/Demo/Pods/Headers/Expecta/EXPMatchers+contain.h +5 -0
  207. data/Demo/Pods/Headers/Expecta/EXPMatchers+endWith.h +3 -0
  208. data/Demo/Pods/Headers/Expecta/EXPMatchers+equal.h +5 -0
  209. data/Demo/Pods/Headers/Expecta/EXPMatchers+haveCountOf.h +10 -0
  210. data/Demo/Pods/Headers/Expecta/EXPMatchers+notify.h +4 -0
  211. data/Demo/Pods/Headers/Expecta/EXPMatchers+raise.h +4 -0
  212. data/Demo/Pods/Headers/Expecta/EXPMatchers+raiseWithReason.h +3 -0
  213. data/Demo/Pods/Headers/Expecta/EXPMatchers+respondTo.h +3 -0
  214. data/Demo/Pods/Headers/Expecta/EXPMatchers.h +24 -0
  215. data/Demo/Pods/Headers/Expecta/EXPUnsupportedObject.h +11 -0
  216. data/Demo/Pods/Headers/Expecta/Expecta.h +27 -0
  217. data/Demo/Pods/Headers/Expecta/ExpectaSupport.h +64 -0
  218. data/Demo/Pods/Headers/Expecta/NSObject+Expecta.h +14 -0
  219. data/Demo/Pods/Headers/Expecta/NSValue+Expecta.h +8 -0
  220. data/Demo/Pods/Headers/Expecta+Snapshots/EXPMatchers+FBSnapshotTest.h +21 -0
  221. data/Demo/Pods/Headers/FBSnapshotTestCase/FBSnapshotTestCase.h +87 -0
  222. data/Demo/Pods/Headers/FBSnapshotTestCase/FBSnapshotTestController.h +147 -0
  223. data/Demo/Pods/Headers/FBSnapshotTestCase/UIImage+Compare.h +37 -0
  224. data/Demo/Pods/Headers/FBSnapshotTestCase/UIImage+Diff.h +37 -0
  225. data/Demo/Pods/Headers/Specta/SPTExample.h +14 -0
  226. data/Demo/Pods/Headers/Specta/SPTExampleGroup.h +40 -0
  227. data/Demo/Pods/Headers/Specta/SPTNestedReporter.h +5 -0
  228. data/Demo/Pods/Headers/Specta/SPTReporter.h +33 -0
  229. data/Demo/Pods/Headers/Specta/SPTSharedExampleGroups.h +17 -0
  230. data/Demo/Pods/Headers/Specta/SPTSpec.h +21 -0
  231. data/Demo/Pods/Headers/Specta/SPTXCTestCase.h +27 -0
  232. data/Demo/Pods/Headers/Specta/SPTXCTestReporter.h +9 -0
  233. data/Demo/Pods/Headers/Specta/Specta.h +70 -0
  234. data/Demo/Pods/Headers/Specta/SpectaSupport.h +46 -0
  235. data/Demo/Pods/Headers/Specta/SpectaTypes.h +3 -0
  236. data/Demo/Pods/Headers/Specta/SpectaUtility.h +14 -0
  237. data/Demo/Pods/Headers/Specta/XCTestCase+Specta.h +4 -0
  238. data/Demo/Pods/Headers/Specta/XCTestLog+Specta.h +7 -0
  239. data/Demo/Pods/Headers/Specta/XCTestRun+Specta.h +8 -0
  240. data/Demo/Pods/Manifest.lock +21 -0
  241. data/Demo/Pods/Pods-DemoTests-EXPMatchers+FBSnapshotTest-Private.xcconfig +6 -0
  242. data/Demo/Pods/Pods-DemoTests-EXPMatchers+FBSnapshotTest-dummy.m +5 -0
  243. data/Demo/Pods/Pods-DemoTests-EXPMatchers+FBSnapshotTest-prefix.pch +5 -0
  244. data/Demo/Pods/Pods-DemoTests-EXPMatchers+FBSnapshotTest.xcconfig +2 -0
  245. data/Demo/Pods/Pods-DemoTests-Expecta+Snapshots-Private.xcconfig +6 -0
  246. data/Demo/Pods/Pods-DemoTests-Expecta+Snapshots-dummy.m +5 -0
  247. data/Demo/Pods/Pods-DemoTests-Expecta+Snapshots-prefix.pch +5 -0
  248. data/Demo/Pods/Pods-DemoTests-Expecta+Snapshots.xcconfig +2 -0
  249. data/Demo/Pods/Pods-DemoTests-Expecta-Private.xcconfig +5 -0
  250. data/Demo/Pods/Pods-DemoTests-Expecta-dummy.m +5 -0
  251. data/Demo/Pods/Pods-DemoTests-Expecta-prefix.pch +5 -0
  252. data/Demo/Pods/Pods-DemoTests-Expecta.xcconfig +1 -0
  253. data/Demo/Pods/Pods-DemoTests-FBSnapshotTestCase-Private.xcconfig +6 -0
  254. data/Demo/Pods/Pods-DemoTests-FBSnapshotTestCase-dummy.m +5 -0
  255. data/Demo/Pods/Pods-DemoTests-FBSnapshotTestCase-prefix.pch +6 -0
  256. data/Demo/Pods/Pods-DemoTests-FBSnapshotTestCase.xcconfig +2 -0
  257. data/Demo/Pods/Pods-DemoTests-Specta-Private.xcconfig +6 -0
  258. data/Demo/Pods/Pods-DemoTests-Specta-dummy.m +5 -0
  259. data/Demo/Pods/Pods-DemoTests-Specta-prefix.pch +5 -0
  260. data/Demo/Pods/Pods-DemoTests-Specta.xcconfig +2 -0
  261. data/Demo/Pods/Pods-DemoTests-acknowledgements.markdown +109 -0
  262. data/Demo/Pods/Pods-DemoTests-acknowledgements.plist +151 -0
  263. data/Demo/Pods/Pods-DemoTests-dummy.m +5 -0
  264. data/Demo/Pods/Pods-DemoTests-environment.h +32 -0
  265. data/Demo/Pods/Pods-DemoTests-resources.sh +68 -0
  266. data/Demo/Pods/Pods-DemoTests.xcconfig +6 -0
  267. data/Demo/Pods/Pods.xcodeproj/project.pbxproj +1390 -0
  268. data/Demo/Pods/Pods.xcodeproj/xcuserdata/ash.xcuserdatad/xcschemes/Pods-DemoTests-Expecta+Snapshots.xcscheme +59 -0
  269. data/Demo/Pods/Pods.xcodeproj/xcuserdata/ash.xcuserdatad/xcschemes/Pods-DemoTests-Expecta.xcscheme +59 -0
  270. data/Demo/Pods/Pods.xcodeproj/xcuserdata/ash.xcuserdatad/xcschemes/Pods-DemoTests-FBSnapshotTestCase.xcscheme +59 -0
  271. data/Demo/Pods/Pods.xcodeproj/xcuserdata/ash.xcuserdatad/xcschemes/Pods-DemoTests-Specta.xcscheme +59 -0
  272. data/Demo/Pods/Pods.xcodeproj/xcuserdata/ash.xcuserdatad/xcschemes/Pods-DemoTests.xcscheme +59 -0
  273. data/Demo/Pods/Pods.xcodeproj/xcuserdata/ash.xcuserdatad/xcschemes/xcschememanagement.plist +62 -0
  274. data/Demo/Pods/Specta/LICENSE +20 -0
  275. data/Demo/Pods/Specta/README.md +146 -0
  276. data/Demo/Pods/Specta/src/SPTExample.h +14 -0
  277. data/Demo/Pods/Specta/src/SPTExample.m +16 -0
  278. data/Demo/Pods/Specta/src/SPTExampleGroup.h +40 -0
  279. data/Demo/Pods/Specta/src/SPTExampleGroup.m +326 -0
  280. data/Demo/Pods/Specta/src/SPTNestedReporter.h +5 -0
  281. data/Demo/Pods/Specta/src/SPTNestedReporter.m +194 -0
  282. data/Demo/Pods/Specta/src/SPTReporter.h +33 -0
  283. data/Demo/Pods/Specta/src/SPTReporter.m +134 -0
  284. data/Demo/Pods/Specta/src/SPTSharedExampleGroups.h +17 -0
  285. data/Demo/Pods/Specta/src/SPTSharedExampleGroups.m +62 -0
  286. data/Demo/Pods/Specta/src/SPTSpec.h +21 -0
  287. data/Demo/Pods/Specta/src/SPTSpec.m +31 -0
  288. data/Demo/Pods/Specta/src/SPTXCTestCase.h +27 -0
  289. data/Demo/Pods/Specta/src/SPTXCTestCase.m +151 -0
  290. data/Demo/Pods/Specta/src/SPTXCTestReporter.h +9 -0
  291. data/Demo/Pods/Specta/src/SPTXCTestReporter.m +11 -0
  292. data/Demo/Pods/Specta/src/Specta.h +70 -0
  293. data/Demo/Pods/Specta/src/Specta.m +144 -0
  294. data/Demo/Pods/Specta/src/SpectaSupport.h +46 -0
  295. data/Demo/Pods/Specta/src/SpectaTypes.h +3 -0
  296. data/Demo/Pods/Specta/src/SpectaUtility.h +14 -0
  297. data/Demo/Pods/Specta/src/SpectaUtility.m +65 -0
  298. data/Demo/Pods/Specta/src/XCTestCase+Specta.h +4 -0
  299. data/Demo/Pods/Specta/src/XCTestCase+Specta.m +26 -0
  300. data/Demo/Pods/Specta/src/XCTestLog+Specta.h +7 -0
  301. data/Demo/Pods/Specta/src/XCTestLog+Specta.m +49 -0
  302. data/Demo/Pods/Specta/src/XCTestRun+Specta.h +8 -0
  303. data/Demo/Pods/Specta/src/XCTestRun+Specta.m +44 -0
  304. data/Gemfile +5 -0
  305. data/LICENSE +21 -0
  306. data/README.md +146 -0
  307. data/Rakefile +7 -0
  308. data/second_curtain.gemspec +20 -0
  309. data/spec/sample_output.txt +79 -0
  310. data/spec/second_shutter/kaleidoscope_command_spec.rb +25 -0
  311. data/spec/second_shutter/parser_spec.rb +39 -0
  312. data/spec/second_shutter/test_suite_spec.rb +32 -0
  313. data/spec/second_shutter/upload_manager_spec.rb +60 -0
  314. data/spec/second_shutter/upload_spec.rb +34 -0
  315. data/spec/second_shutter/xcode_test_case_spec.rb +22 -0
  316. metadata +315 -1
@@ -0,0 +1,42 @@
1
+ #import "EXPDoubleTuple.h"
2
+
3
+ @implementation EXPDoubleTuple
4
+
5
+ @synthesize values = _values, size = _size;
6
+
7
+ - (id)initWithDoubleValues:(double *)values size:(size_t)size {
8
+ if ((self = [super init])) {
9
+ self.values = malloc(sizeof(double) * size);
10
+ memcpy(self.values, values, sizeof(double) * size);
11
+ self.size = size;
12
+ }
13
+ return self;
14
+ }
15
+
16
+ - (void)dealloc {
17
+ free(self.values);
18
+ [super dealloc];
19
+ }
20
+
21
+ - (BOOL)isEqual:(id)object {
22
+ if (![object isKindOfClass:[EXPDoubleTuple class]]) return NO;
23
+ EXPDoubleTuple *other = (EXPDoubleTuple *)object;
24
+ if (self.size == other.size) {
25
+ for (int i = 0; i < self.size; ++i) {
26
+ if (self.values[i] != other.values[i]) return NO;
27
+ }
28
+ return YES;
29
+ }
30
+ return NO;
31
+ }
32
+
33
+ - (NSString *)description {
34
+ if (self.size == 2) {
35
+ return [NSString stringWithFormat:@"Double tuple: {%f, %f}", self.values[0], self.values[1]];
36
+ } else if (self.size == 4) {
37
+ return [NSString stringWithFormat:@"Double tuple: {%f, %f, %f, %f}", self.values[0], self.values[1], self.values[2], self.values[3]];
38
+ }
39
+ return [NSString stringWithFormat:@"Double tuple of unexpected size %zd, sadly", self.size];
40
+ }
41
+
42
+ @end
@@ -0,0 +1,45 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import "EXPMatcher.h"
3
+ #import "EXPDefines.h"
4
+
5
+ @interface EXPExpect : NSObject {
6
+ EXPIdBlock _actualBlock;
7
+ id _testCase;
8
+ int _lineNumber;
9
+ char *_fileName;
10
+ BOOL _negative;
11
+ BOOL _asynchronous;
12
+ NSTimeInterval _timeout;
13
+ }
14
+
15
+ @property(nonatomic, copy) EXPIdBlock actualBlock;
16
+ @property(nonatomic, readonly) id actual;
17
+ @property(nonatomic, assign) id testCase;
18
+ @property(nonatomic) int lineNumber;
19
+ @property(nonatomic) const char *fileName;
20
+ @property(nonatomic) BOOL negative;
21
+ @property(nonatomic) BOOL asynchronous;
22
+ @property(nonatomic) NSTimeInterval timeout;
23
+
24
+ @property(nonatomic, readonly) EXPExpect *to;
25
+ @property(nonatomic, readonly) EXPExpect *toNot;
26
+ @property(nonatomic, readonly) EXPExpect *notTo;
27
+ @property(nonatomic, readonly) EXPExpect *will;
28
+ @property(nonatomic, readonly) EXPExpect *willNot;
29
+ @property(nonatomic, readonly) EXPExpect *(^after)(NSTimeInterval timeInterval);
30
+
31
+ - (id)initWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName;
32
+ + (EXPExpect *)expectWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName;
33
+
34
+ - (void)applyMatcher:(id<EXPMatcher>)matcher;
35
+ - (void)applyMatcher:(id<EXPMatcher>)matcher to:(NSObject **)actual;
36
+
37
+ @end
38
+
39
+ @interface EXPDynamicPredicateMatcher : NSObject <EXPMatcher> {
40
+ EXPExpect *_expectation;
41
+ SEL _selector;
42
+ }
43
+ - (id)initWithExpectation:(EXPExpect *)expectation selector:(SEL)selector;
44
+ - (void (^)(void))dispatch;
45
+ @end
@@ -0,0 +1,214 @@
1
+ #import "EXPExpect.h"
2
+ #import "NSObject+Expecta.h"
3
+ #import "Expecta.h"
4
+ #import "EXPUnsupportedObject.h"
5
+ #import "EXPMatcher.h"
6
+ #import "EXPBlockDefinedMatcher.h"
7
+ #import <libkern/OSAtomic.h>
8
+
9
+ @implementation EXPExpect
10
+
11
+ @dynamic
12
+ actual,
13
+ to,
14
+ toNot,
15
+ notTo,
16
+ will,
17
+ willNot,
18
+ after;
19
+
20
+ @synthesize
21
+ actualBlock=_actualBlock,
22
+ testCase=_testCase,
23
+ negative=_negative,
24
+ asynchronous=_asynchronous,
25
+ timeout=_timeout,
26
+ lineNumber=_lineNumber,
27
+ fileName=_fileName;
28
+
29
+ - (id)initWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName {
30
+ self = [super init];
31
+ if(self) {
32
+ self.actualBlock = actualBlock;
33
+ self.testCase = testCase;
34
+ self.negative = NO;
35
+ self.asynchronous = NO;
36
+ self.timeout = [Expecta asynchronousTestTimeout];
37
+ self.lineNumber = lineNumber;
38
+ self.fileName = fileName;
39
+ }
40
+ return self;
41
+ }
42
+
43
+ - (void)dealloc
44
+ {
45
+ self.actualBlock = nil;
46
+ [super dealloc];
47
+ }
48
+
49
+ + (EXPExpect *)expectWithActualBlock:(id)actualBlock testCase:(id)testCase lineNumber:(int)lineNumber fileName:(const char *)fileName {
50
+ return [[[EXPExpect alloc] initWithActualBlock:actualBlock testCase:(id)testCase lineNumber:lineNumber fileName:fileName] autorelease];
51
+ }
52
+
53
+ #pragma mark -
54
+
55
+ - (EXPExpect *)to {
56
+ return self;
57
+ }
58
+
59
+ - (EXPExpect *)toNot {
60
+ self.negative = !self.negative;
61
+ return self;
62
+ }
63
+
64
+ - (EXPExpect *)notTo {
65
+ return [self toNot];
66
+ }
67
+
68
+ - (EXPExpect *)will {
69
+ self.asynchronous = YES;
70
+ return self;
71
+ }
72
+
73
+ - (EXPExpect *)willNot {
74
+ return self.will.toNot;
75
+ }
76
+
77
+ - (EXPExpect *(^)(NSTimeInterval))after
78
+ {
79
+ EXPExpect * (^block)(NSTimeInterval) = [^EXPExpect *(NSTimeInterval timeout) {
80
+ self.asynchronous = YES;
81
+ self.timeout = timeout;
82
+ return self;
83
+ } copy];
84
+
85
+ return [block autorelease];
86
+ }
87
+
88
+ #pragma mark -
89
+
90
+ - (id)actual {
91
+ if(self.actualBlock) {
92
+ return self.actualBlock();
93
+ }
94
+ return nil;
95
+ }
96
+
97
+ - (void)applyMatcher:(id<EXPMatcher>)matcher
98
+ {
99
+ id actual = [self actual];
100
+ [self applyMatcher:matcher to:&actual];
101
+ }
102
+
103
+ - (void)applyMatcher:(id<EXPMatcher>)matcher to:(NSObject **)actual {
104
+ if([*actual isKindOfClass:[EXPUnsupportedObject class]]) {
105
+ EXPFail(self.testCase, self.lineNumber, self.fileName,
106
+ [NSString stringWithFormat:@"expecting a %@ is not supported", ((EXPUnsupportedObject *)*actual).type]);
107
+ } else {
108
+ BOOL failed = NO;
109
+ if([matcher respondsToSelector:@selector(meetsPrerequesiteFor:)] &&
110
+ ![matcher meetsPrerequesiteFor:*actual]) {
111
+ failed = YES;
112
+ } else {
113
+ BOOL matchResult = NO;
114
+ if(self.asynchronous) {
115
+ NSTimeInterval timeOut = self.timeout;
116
+ NSDate *expiryDate = [NSDate dateWithTimeIntervalSinceNow:timeOut];
117
+ while(1) {
118
+ matchResult = [matcher matches:*actual];
119
+ failed = self.negative ? matchResult : !matchResult;
120
+ if(!failed || ([(NSDate *)[NSDate date] compare:expiryDate] == NSOrderedDescending)) {
121
+ break;
122
+ }
123
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
124
+ OSMemoryBarrier();
125
+ *actual = self.actual;
126
+ }
127
+ } else {
128
+ matchResult = [matcher matches:*actual];
129
+ }
130
+ failed = self.negative ? matchResult : !matchResult;
131
+ }
132
+ if(failed) {
133
+ NSString *message = nil;
134
+
135
+ if(self.negative) {
136
+ if ([matcher respondsToSelector:@selector(failureMessageForNotTo:)]) {
137
+ message = [matcher failureMessageForNotTo:*actual];
138
+ }
139
+ } else {
140
+ if ([matcher respondsToSelector:@selector(failureMessageForTo:)]) {
141
+ message = [matcher failureMessageForTo:*actual];
142
+ }
143
+ }
144
+ if (message == nil) {
145
+ message = @"Match Failed.";
146
+ }
147
+
148
+ EXPFail(self.testCase, self.lineNumber, self.fileName, message);
149
+ }
150
+ }
151
+ self.negative = NO;
152
+ }
153
+
154
+ #pragma mark - Dynamic predicate dispatch
155
+
156
+ - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
157
+ {
158
+ if ([self.actual respondsToSelector:aSelector]) {
159
+ return [self.actual methodSignatureForSelector:aSelector];
160
+ }
161
+ return [super methodSignatureForSelector:aSelector];
162
+ }
163
+
164
+ - (void)forwardInvocation:(NSInvocation *)anInvocation
165
+ {
166
+ if ([self.actual respondsToSelector:anInvocation.selector]) {
167
+ EXPDynamicPredicateMatcher *matcher = [[EXPDynamicPredicateMatcher alloc] initWithExpectation:self selector:anInvocation.selector];
168
+ [anInvocation setSelector:@selector(dispatch)];
169
+ [anInvocation invokeWithTarget:matcher];
170
+ [matcher release];
171
+ }
172
+ else {
173
+ [super forwardInvocation:anInvocation];
174
+ }
175
+ }
176
+
177
+ @end
178
+
179
+ @implementation EXPDynamicPredicateMatcher
180
+
181
+ - (id)initWithExpectation:(EXPExpect *)expectation selector:(SEL)selector
182
+ {
183
+ if ((self = [super init])) {
184
+ _expectation = expectation;
185
+ _selector = selector;
186
+ }
187
+ return self;
188
+ }
189
+
190
+ - (BOOL)matches:(id)actual
191
+ {
192
+ return (BOOL)[actual performSelector:_selector];
193
+ }
194
+
195
+ - (NSString *)failureMessageForTo:(id)actual
196
+ {
197
+ return [NSString stringWithFormat:@"expected %@ to be true", NSStringFromSelector(_selector)];
198
+ }
199
+
200
+ - (NSString *)failureMessageForNotTo:(id)actual
201
+ {
202
+ return [NSString stringWithFormat:@"expected %@ to be false", NSStringFromSelector(_selector)];
203
+ }
204
+
205
+ - (void (^)(void))dispatch
206
+ {
207
+ __block id blockExpectation = _expectation;
208
+
209
+ return [[^{
210
+ [blockExpectation applyMatcher:self];
211
+ } copy] autorelease];
212
+ }
213
+
214
+ @end
@@ -0,0 +1,13 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ @interface EXPFloatTuple : NSObject {
4
+ float *_values;
5
+ size_t _size;
6
+ }
7
+
8
+ @property (nonatomic, assign) float *values;
9
+ @property (nonatomic, assign) size_t size;
10
+
11
+ - (id)initWithFloatValues:(float *)values size:(size_t)size;
12
+
13
+ @end
@@ -0,0 +1,42 @@
1
+ #import "EXPFloatTuple.h"
2
+
3
+ @implementation EXPFloatTuple
4
+
5
+ @synthesize values = _values, size = _size;
6
+
7
+ - (id)initWithFloatValues:(float *)values size:(size_t)size {
8
+ if ((self = [super init])) {
9
+ self.values = malloc(sizeof(float) * size);
10
+ memcpy(self.values, values, sizeof(float) * size);
11
+ self.size = size;
12
+ }
13
+ return self;
14
+ }
15
+
16
+ - (void)dealloc {
17
+ free(self.values);
18
+ [super dealloc];
19
+ }
20
+
21
+ - (BOOL)isEqual:(id)object {
22
+ if (![object isKindOfClass:[EXPFloatTuple class]]) return NO;
23
+ EXPFloatTuple *other = (EXPFloatTuple *)object;
24
+ if (self.size == other.size) {
25
+ for (int i = 0; i < self.size; ++i) {
26
+ if (self.values[i] != other.values[i]) return NO;
27
+ }
28
+ return YES;
29
+ }
30
+ return NO;
31
+ }
32
+
33
+ - (NSString *)description {
34
+ if (self.size == 2) {
35
+ return [NSString stringWithFormat:@"Float tuple: {%f, %f}", self.values[0], self.values[1]];
36
+ } else if (self.size == 4) {
37
+ return [NSString stringWithFormat:@"Float tuple: {%f, %f, %f, %f}", self.values[0], self.values[1], self.values[2], self.values[3]];
38
+ }
39
+ return [NSString stringWithFormat:@"Float tuple of unexpected size %zd, sadly", self.size];
40
+ }
41
+
42
+ @end
@@ -0,0 +1,20 @@
1
+ //
2
+ // EXPMatcher.h
3
+ // Expecta
4
+ //
5
+ // Created by Luke Redpath on 26/03/2012.
6
+ // Copyright (c) 2012 Peter Jihoon Kim. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+
11
+ @protocol EXPMatcher <NSObject>
12
+
13
+ - (BOOL)matches:(id)actual;
14
+
15
+ @optional
16
+ - (BOOL)meetsPrerequesiteFor:(id)actual;
17
+ - (NSString *)failureMessageForTo:(id)actual;
18
+ - (NSString *)failureMessageForNotTo:(id)actual;
19
+
20
+ @end
@@ -0,0 +1,11 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ @interface EXPUnsupportedObject : NSObject {
4
+ NSString *_type;
5
+ }
6
+
7
+ @property (nonatomic, retain) NSString *type;
8
+
9
+ - (id)initWithType:(NSString *)type;
10
+
11
+ @end
@@ -0,0 +1,20 @@
1
+ #import "EXPUnsupportedObject.h"
2
+
3
+ @implementation EXPUnsupportedObject
4
+
5
+ @synthesize type=_type;
6
+
7
+ - (id)initWithType:(NSString *)type {
8
+ self = [super init];
9
+ if(self) {
10
+ self.type = type;
11
+ }
12
+ return self;
13
+ }
14
+
15
+ - (void)dealloc {
16
+ self.type = nil;
17
+ [super dealloc];
18
+ }
19
+
20
+ @end
@@ -0,0 +1,27 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import "ExpectaSupport.h"
3
+
4
+ #define EXPObjectify(value) _EXPObjectify(@encode(__typeof__((value))), (value))
5
+
6
+ #define EXP_expect(actual) _EXP_expect(self, __LINE__, __FILE__, ^id{ return EXPObjectify((actual)); })
7
+
8
+ #define EXPMatcherInterface(matcherName, matcherArguments) _EXPMatcherInterface(matcherName, matcherArguments)
9
+ #define EXPMatcherImplementationBegin(matcherName, matcherArguments) _EXPMatcherImplementationBegin(matcherName, matcherArguments)
10
+ #define EXPMatcherImplementationEnd _EXPMatcherImplementationEnd
11
+
12
+ #import "EXPMatchers.h"
13
+
14
+ #ifdef EXP_SHORTHAND
15
+ # define expect(...) EXP_expect((__VA_ARGS__))
16
+ #endif
17
+
18
+ #ifdef EXP_OLD_SYNTAX
19
+ # import "EXPBackwardCompatibility.h"
20
+ #endif
21
+
22
+ @interface Expecta : NSObject
23
+
24
+ + (NSTimeInterval)asynchronousTestTimeout;
25
+ + (void)setAsynchronousTestTimeout:(NSTimeInterval)timeout;
26
+
27
+ @end
@@ -0,0 +1,15 @@
1
+ #import "Expecta.h"
2
+
3
+ @implementation Expecta
4
+
5
+ static NSTimeInterval _asynchronousTestTimeout = 1.0;
6
+
7
+ + (NSTimeInterval)asynchronousTestTimeout {
8
+ return _asynchronousTestTimeout;
9
+ }
10
+
11
+ + (void)setAsynchronousTestTimeout:(NSTimeInterval)timeout {
12
+ _asynchronousTestTimeout = timeout;
13
+ }
14
+
15
+ @end
@@ -0,0 +1,64 @@
1
+ #import "EXPExpect.h"
2
+ #import "EXPBlockDefinedMatcher.h"
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ id _EXPObjectify(const char *type, ...);
9
+ EXPExpect *_EXP_expect(id testCase, int lineNumber, const char *fileName, EXPIdBlock actualBlock);
10
+
11
+ void EXPFail(id testCase, int lineNumber, const char *fileName, NSString *message);
12
+ NSString *EXPDescribeObject(id obj);
13
+
14
+ void EXP_prerequisite(EXPBoolBlock block);
15
+ void EXP_match(EXPBoolBlock block);
16
+ void EXP_failureMessageForTo(EXPStringBlock block);
17
+ void EXP_failureMessageForNotTo(EXPStringBlock block);
18
+
19
+ #if __has_feature(objc_arc)
20
+ #define _EXP_release(x)
21
+ #define _EXP_autorelease(x) (x)
22
+
23
+ #else
24
+ #define _EXP_release(x) [x release]
25
+ #define _EXP_autorelease(x) [x autorelease]
26
+ #endif
27
+
28
+ // workaround for the categories bug: http://developer.apple.com/library/mac/#qa/qa1490/_index.html
29
+ #define EXPFixCategoriesBug(name) \
30
+ __attribute__((constructor)) static void EXPFixCategoriesBug##name() {}
31
+
32
+ #define _EXPMatcherInterface(matcherName, matcherArguments) \
33
+ @interface EXPExpect (matcherName##Matcher) \
34
+ @property (nonatomic, readonly) void(^ matcherName) matcherArguments; \
35
+ @end
36
+
37
+ #define _EXPMatcherImplementationBegin(matcherName, matcherArguments) \
38
+ EXPFixCategoriesBug(EXPMatcher##matcherName##Matcher); \
39
+ @implementation EXPExpect (matcherName##Matcher) \
40
+ @dynamic matcherName;\
41
+ - (void(^) matcherArguments) matcherName { \
42
+ EXPBlockDefinedMatcher *matcher = [[EXPBlockDefinedMatcher alloc] init]; \
43
+ [[[NSThread currentThread] threadDictionary] setObject:matcher forKey:@"EXP_currentMatcher"]; \
44
+ __block id actual = self.actual; \
45
+ __block void (^prerequisite)(EXPBoolBlock block) = ^(EXPBoolBlock block) { EXP_prerequisite(block); }; \
46
+ __block void (^match)(EXPBoolBlock block) = ^(EXPBoolBlock block) { EXP_match(block); }; \
47
+ __block void (^failureMessageForTo)(EXPStringBlock block) = ^(EXPStringBlock block) { EXP_failureMessageForTo(block); }; \
48
+ __block void (^failureMessageForNotTo)(EXPStringBlock block) = ^(EXPStringBlock block) { EXP_failureMessageForNotTo(block); }; \
49
+ prerequisite(nil); match(nil); failureMessageForTo(nil); failureMessageForNotTo(nil); \
50
+ void (^matcherBlock) matcherArguments = [^ matcherArguments { \
51
+ {
52
+
53
+ #define _EXPMatcherImplementationEnd \
54
+ } \
55
+ [self applyMatcher:matcher to:&actual]; \
56
+ } copy]; \
57
+ _EXP_release(matcher); \
58
+ return _EXP_autorelease(matcherBlock); \
59
+ } \
60
+ @end
61
+
62
+ #ifdef __cplusplus
63
+ }
64
+ #endif