Skip to content

Commit a3408cc

Browse files
committed
Add support for having warnings vs errors
A basic framework for dealing with issues that users may want to treat as either warnings or errors. It supports setting a default from compile time, modifying it at runtime using an environment variable, and push/popping states off of a stack. It also changes some exceptions that were being thrown to issues specifically because those exceptions are making it very difficult for me to transition my codebase from OCMock 3.4.1 to OCMock 3.6, and I know it will also be an issue for https://github.com/TextureGroup/Texture moving to OCMock 3.6.
1 parent ffeeed2 commit a3408cc

11 files changed

+404
-12
lines changed

OCMock.podspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ Pod::Spec.new do |s|
2929
s.public_header_files = ["OCMock.h", "OCMockObject.h", "OCMArg.h", "OCMConstraint.h",
3030
"OCMLocation.h", "OCMMacroState.h", "OCMRecorder.h",
3131
"OCMStubRecorder.h", "NSNotificationCenter+OCMAdditions.h",
32-
"OCMFunctions.h", "OCMVerifier.h", "OCMQuantifier.h" ]
32+
"OCMFunctions.h", "OCMVerifier.h", "OCMQuantifier.h",
33+
"OCMIssueReporter.h"]
3334
.map { |file| "Source/OCMock/" + file }
3435

3536
end

Source/OCMock.xcodeproj/project.pbxproj

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,20 @@
283283
8B11D4B82448E2F400247BE2 /* OCMCPlusPlus98Tests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B11D4B62448E2E900247BE2 /* OCMCPlusPlus98Tests.mm */; settings = {COMPILER_FLAGS = "-std=gnu++98"; }; };
284284
8B11D4BA2448E53600247BE2 /* OCMCPlusPlus11Tests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B11D4B92448E53600247BE2 /* OCMCPlusPlus11Tests.mm */; settings = {COMPILER_FLAGS = "-std=gnu++11"; }; };
285285
8B11D4BB2448E53600247BE2 /* OCMCPlusPlus11Tests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B11D4B92448E53600247BE2 /* OCMCPlusPlus11Tests.mm */; settings = {COMPILER_FLAGS = "-std=gnu++11"; }; };
286+
8B911C8C247B97A500A3581F /* OCMIssueReporterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B911C8B247B97A500A3581F /* OCMIssueReporterTests.m */; };
287+
8B911C8D247B97A500A3581F /* OCMIssueReporterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B911C8B247B97A500A3581F /* OCMIssueReporterTests.m */; };
286288
8BF73E53246CA75E00B9A52C /* OCMNoEscapeBlockTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF73E52246CA75E00B9A52C /* OCMNoEscapeBlockTests.m */; settings = {COMPILER_FLAGS = "-Xclang -fexperimental-optimized-noescape"; }; };
287289
8BF73E54246CA75E00B9A52C /* OCMNoEscapeBlockTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF73E52246CA75E00B9A52C /* OCMNoEscapeBlockTests.m */; settings = {COMPILER_FLAGS = "-Xclang -fexperimental-optimized-noescape"; }; };
290+
8BF74028247AE3F100B9A52C /* OCMIssueReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF74026247AE3F100B9A52C /* OCMIssueReporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
291+
8BF74029247AE3F100B9A52C /* OCMIssueReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF74026247AE3F100B9A52C /* OCMIssueReporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
292+
8BF7402A247AE3F100B9A52C /* OCMIssueReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF74026247AE3F100B9A52C /* OCMIssueReporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
293+
8BF7402B247AE3F100B9A52C /* OCMIssueReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF74026247AE3F100B9A52C /* OCMIssueReporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
294+
8BF7402C247AE3F100B9A52C /* OCMIssueReporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF74026247AE3F100B9A52C /* OCMIssueReporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
295+
8BF7402D247AE3F100B9A52C /* OCMIssueReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF74027247AE3F100B9A52C /* OCMIssueReporter.m */; };
296+
8BF7402E247AE3F100B9A52C /* OCMIssueReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF74027247AE3F100B9A52C /* OCMIssueReporter.m */; };
297+
8BF7402F247AE3F100B9A52C /* OCMIssueReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF74027247AE3F100B9A52C /* OCMIssueReporter.m */; };
298+
8BF74030247AE3F100B9A52C /* OCMIssueReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF74027247AE3F100B9A52C /* OCMIssueReporter.m */; };
299+
8BF74031247AE3F100B9A52C /* OCMIssueReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF74027247AE3F100B9A52C /* OCMIssueReporter.m */; };
288300
8DE97C5522B43EE60098C63F /* OCMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 03B3159E146333BF0052CD09 /* OCMockObject.m */; };
289301
8DE97C5622B43EE60098C63F /* OCClassMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 03B3158C146333BF0052CD09 /* OCClassMockObject.m */; };
290302
8DE97C5722B43EE60098C63F /* OCPartialMockObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 03B315AA146333BF0052CD09 /* OCPartialMockObject.m */; };
@@ -577,7 +589,10 @@
577589
817EB1621BD765130047E85A /* OCMock.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OCMock.framework; sourceTree = BUILT_PRODUCTS_DIR; };
578590
8B11D4B62448E2E900247BE2 /* OCMCPlusPlus98Tests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OCMCPlusPlus98Tests.mm; sourceTree = "<group>"; };
579591
8B11D4B92448E53600247BE2 /* OCMCPlusPlus11Tests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OCMCPlusPlus11Tests.mm; sourceTree = "<group>"; };
592+
8B911C8B247B97A500A3581F /* OCMIssueReporterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OCMIssueReporterTests.m; sourceTree = "<group>"; };
580593
8BF73E52246CA75E00B9A52C /* OCMNoEscapeBlockTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OCMNoEscapeBlockTests.m; sourceTree = "<group>"; };
594+
8BF74026247AE3F100B9A52C /* OCMIssueReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMIssueReporter.h; sourceTree = "<group>"; };
595+
8BF74027247AE3F100B9A52C /* OCMIssueReporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OCMIssueReporter.m; sourceTree = "<group>"; };
581596
8DE97CA022B43EE60098C63F /* OCMock.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OCMock.framework; sourceTree = BUILT_PRODUCTS_DIR; };
582597
A02926811CA0725A00594AAF /* TestObjects.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = TestObjects.xcdatamodel; sourceTree = "<group>"; };
583598
D31108AD1828DB8700737925 /* OCMockLibTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OCMockLibTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -759,6 +774,7 @@
759774
03B316211463350E0052CD09 /* OCMConstraintTests.m */,
760775
8B11D4B62448E2E900247BE2 /* OCMCPlusPlus98Tests.mm */,
761776
8B11D4B92448E53600247BE2 /* OCMCPlusPlus11Tests.mm */,
777+
8B911C8B247B97A500A3581F /* OCMIssueReporterTests.m */,
762778
2FA28EDBF243639C57F88A1B /* OCMArgTests.m */,
763779
036865631D3571A8005E6BEE /* OCMQuantifierTests.m */,
764780
03B316291463350E0052CD09 /* OCObserverMockObjectTests.m */,
@@ -794,6 +810,8 @@
794810
037ECD5618FB0D2E00AF0E4C /* Helper */ = {
795811
isa = PBXGroup;
796812
children = (
813+
8BF74026247AE3F100B9A52C /* OCMIssueReporter.h */,
814+
8BF74027247AE3F100B9A52C /* OCMIssueReporter.m */,
797815
03E98D4918F308B400522D42 /* OCMLocation.h */,
798816
03E98D4A18F308B400522D42 /* OCMLocation.m */,
799817
2FA28006D043CBDBBAEF6E3F /* OCMMacroState.h */,
@@ -974,6 +992,7 @@
974992
0368656D1D357317005E6BEE /* OCMQuantifier.h in Headers */,
975993
3C0FF06A1BAA3FD10021AD20 /* OCMFunctionsPrivate.h in Headers */,
976994
03B31613146333C00052CD09 /* OCProtocolMockObject.h in Headers */,
995+
8BF74028247AE3F100B9A52C /* OCMIssueReporter.h in Headers */,
977996
2FA287ACE547BB41937BDEC3 /* NSObject+OCMAdditions.h in Headers */,
978997
2FA28641AAD0AC2F876C9E48 /* OCMInvocationMatcher.h in Headers */,
979998
0322DA6919118B4600CACAF1 /* OCMVerifier.h in Headers */,
@@ -1015,6 +1034,7 @@
10151034
03B315FB146333C00052CD09 /* OCMRealObjectForwarder.h in Headers */,
10161035
03DCED6F183406DA0059089E /* NSObject+OCMAdditions.h in Headers */,
10171036
0368656E1D357318005E6BEE /* OCMQuantifier.h in Headers */,
1037+
8BF74029247AE3F100B9A52C /* OCMIssueReporter.h in Headers */,
10181038
817EB1661BD7674D0047E85A /* OCMFunctionsPrivate.h in Headers */,
10191039
03B31605146333C00052CD09 /* OCObserverMockObject.h in Headers */,
10201040
03B3160A146333C00052CD09 /* OCPartialMockObject.h in Headers */,
@@ -1069,6 +1089,7 @@
10691089
817EB15A1BD765130047E85A /* NSValue+OCMAdditions.h in Headers */,
10701090
817EB15B1BD765130047E85A /* OCMFunctions.h in Headers */,
10711091
817EB15C1BD765130047E85A /* OCMBlockArgCaller.h in Headers */,
1092+
8BF7402B247AE3F100B9A52C /* OCMIssueReporter.h in Headers */,
10721093
817EB15D1BD765130047E85A /* OCMArgAction.h in Headers */,
10731094
2FA28806443827E286F12F6F /* OCMNonRetainingObjectReturnValueProvider.h in Headers */,
10741095
);
@@ -1105,6 +1126,7 @@
11051126
8DE97C9122B43EE60098C63F /* OCMFunctionsPrivate.h in Headers */,
11061127
8DE97C9222B43EE60098C63F /* OCObserverMockObject.h in Headers */,
11071128
8DE97C9322B43EE60098C63F /* OCMObserverRecorder.h in Headers */,
1129+
8BF7402C247AE3F100B9A52C /* OCMIssueReporter.h in Headers */,
11081130
8DE97C9422B43EE60098C63F /* OCMPassByRefSetter.h in Headers */,
11091131
8DE97C9522B43EE60098C63F /* NSInvocation+OCMAdditions.h in Headers */,
11101132
8DE97C9622B43EE60098C63F /* NSMethodSignature+OCMAdditions.h in Headers */,
@@ -1157,6 +1179,7 @@
11571179
F0B951491B00810C00942C38 /* NSValue+OCMAdditions.h in Headers */,
11581180
F0B9514A1B00810C00942C38 /* OCMFunctions.h in Headers */,
11591181
2FA28B7BDB3319A499E90525 /* OCMBlockArgCaller.h in Headers */,
1182+
8BF7402A247AE3F100B9A52C /* OCMIssueReporter.h in Headers */,
11601183
2FA280E60213BA09F007C173 /* OCMArgAction.h in Headers */,
11611184
2FA28AFBD67EAB9DD1F23BF5 /* OCMNonRetainingObjectReturnValueProvider.h in Headers */,
11621185
);
@@ -1412,6 +1435,7 @@
14121435
03B315B6146333BF0052CD09 /* NSMethodSignature+OCMAdditions.m in Sources */,
14131436
03618D85195B553400389166 /* OCMRecorder.m in Sources */,
14141437
03C7BF0C195DA2F200A545DD /* OCMInvocationStub.m in Sources */,
1438+
8BF7402D247AE3F100B9A52C /* OCMIssueReporter.m in Sources */,
14151439
03B315BB146333BF0052CD09 /* NSNotificationCenter+OCMAdditions.m in Sources */,
14161440
0322DA6B19118B4600CACAF1 /* OCMVerifier.m in Sources */,
14171441
03B315C0146333BF0052CD09 /* OCClassMockObject.m in Sources */,
@@ -1454,6 +1478,7 @@
14541478
03B315B8146333BF0052CD09 /* NSMethodSignature+OCMAdditions.m in Sources */,
14551479
03618D86195B553400389166 /* OCMRecorder.m in Sources */,
14561480
03C7BF0D195DA2F200A545DD /* OCMInvocationStub.m in Sources */,
1481+
8BF7402E247AE3F100B9A52C /* OCMIssueReporter.m in Sources */,
14571482
03B315BD146333BF0052CD09 /* NSNotificationCenter+OCMAdditions.m in Sources */,
14581483
0322DA6C19118B4600CACAF1 /* OCMVerifier.m in Sources */,
14591484
03B315C2146333BF0052CD09 /* OCClassMockObject.m in Sources */,
@@ -1500,6 +1525,7 @@
15001525
03E98D5018F310EE00522D42 /* OCMockObjectMacroTests.m in Sources */,
15011526
03565A4A18F05721003AE91E /* OCObserverMockObjectTests.m in Sources */,
15021527
03565A4318F05721003AE91E /* OCMockObjectClassMethodMockingTests.m in Sources */,
1528+
8B911C8C247B97A500A3581F /* OCMIssueReporterTests.m in Sources */,
15031529
03565A4918F05721003AE91E /* OCMArgTests.m in Sources */,
15041530
036865641D3571A8005E6BEE /* OCMQuantifierTests.m in Sources */,
15051531
0322DA65191188D100CACAF1 /* OCMockObjectVerifyAfterRunTests.m in Sources */,
@@ -1527,6 +1553,7 @@
15271553
817EB1181BD765130047E85A /* OCClassMockObject.m in Sources */,
15281554
817EB1191BD765130047E85A /* OCPartialMockObject.m in Sources */,
15291555
817EB11A1BD765130047E85A /* OCProtocolMockObject.m in Sources */,
1556+
8BF74030247AE3F100B9A52C /* OCMIssueReporter.m in Sources */,
15301557
817EB11B1BD765130047E85A /* OCMRecorder.m in Sources */,
15311558
817EB11C1BD765130047E85A /* OCMStubRecorder.m in Sources */,
15321559
817EB11D1BD765130047E85A /* OCMExpectationRecorder.m in Sources */,
@@ -1569,6 +1596,7 @@
15691596
8DE97C5622B43EE60098C63F /* OCClassMockObject.m in Sources */,
15701597
8DE97C5722B43EE60098C63F /* OCPartialMockObject.m in Sources */,
15711598
8DE97C5822B43EE60098C63F /* OCProtocolMockObject.m in Sources */,
1599+
8BF74031247AE3F100B9A52C /* OCMIssueReporter.m in Sources */,
15721600
8DE97C5922B43EE60098C63F /* OCMRecorder.m in Sources */,
15731601
03A1CC9F23F8A045005ADA04 /* OCMQuantifier.m in Sources */,
15741602
8DE97C5A22B43EE60098C63F /* OCMStubRecorder.m in Sources */,
@@ -1615,6 +1643,7 @@
16151643
D31108C51828DBD600737925 /* OCMockObjectClassMethodMockingTests.m in Sources */,
16161644
D31108C71828DBD600737925 /* OCMConstraintTests.m in Sources */,
16171645
D31108C91828DBD600737925 /* OCObserverMockObjectTests.m in Sources */,
1646+
8B911C8D247B97A500A3581F /* OCMIssueReporterTests.m in Sources */,
16181647
037ECD5518FAD84100AF0E4C /* OCMInvocationMatcherTests.m in Sources */,
16191648
D31108C41828DBD600737925 /* OCMockObjectPartialMocksTests.m in Sources */,
16201649
D31108C81828DBD600737925 /* OCMStubRecorderTests.m in Sources */,
@@ -1642,6 +1671,7 @@
16421671
F0B9510D1B0080EC00942C38 /* OCClassMockObject.m in Sources */,
16431672
F0B9510E1B0080EC00942C38 /* OCPartialMockObject.m in Sources */,
16441673
F0B9510F1B0080EC00942C38 /* OCProtocolMockObject.m in Sources */,
1674+
8BF7402F247AE3F100B9A52C /* OCMIssueReporter.m in Sources */,
16451675
F0B951101B0080EC00942C38 /* OCMRecorder.m in Sources */,
16461676
F0B951111B0080EC00942C38 /* OCMStubRecorder.m in Sources */,
16471677
F0B951121B0080EC00942C38 /* OCMExpectationRecorder.m in Sources */,

Source/OCMock/OCMIssueReporter.h

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2014-2020 Erik Doernenburg and contributors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may
5+
* not use these files except in compliance with the License. You may obtain
6+
* a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13+
* License for the specific language governing permissions and limitations
14+
* under the License.
15+
*/
16+
17+
#import <Foundation/Foundation.h>
18+
#import "OCMFunctions.h"
19+
20+
// Use this define to be able to control the default issue treatment from a build.
21+
// It can be overridden by using `OCMIssueTreatmentDefaultEnvironmentVariable`.
22+
#ifndef OCMIssueTreatmentDefault
23+
#define OCMIssueTreatmentDefault OCMIssueTreatmentWarnings
24+
#endif
25+
26+
// Use this to control the default issue treatment through the environment.
27+
// It can be set to 0 for warnings or 1 for errors.
28+
#define OCMIssueTreatmentDefaultEnvironmentVariable @"OCMIssueTreatmentDefault"
29+
30+
// The name of NSExceptions thrown by default when an issue it treated as an error.
31+
OCMOCK_EXTERN NSExceptionName const OCMIssueException;
32+
33+
typedef NS_ENUM(NSUInteger, OCMIssueTreatment)
34+
{
35+
// Warnings are printed to stderr.
36+
OCMIssueTreatmentWarnings = 0,
37+
// Errors are thrown an NSExceptions.
38+
OCMIssueTreatmentErrors,
39+
};
40+
41+
@interface OCMIssueReporter : NSObject
42+
{
43+
NSMutableArray *issueTreatmentStack;
44+
}
45+
46+
+ (instancetype)defaultReporter;
47+
48+
- (void)reportIssueInFile:(const char *)file line:(NSUInteger)line format:(NSString *)format, ... NS_FORMAT_FUNCTION(3,4);
49+
- (void)reportIssueInFilev:(const char *)file line:(NSUInteger)line format:(NSString *)format arguments:(va_list)args NS_FORMAT_FUNCTION(3,0);
50+
- (void)reportIssueInFile:(const char *)file line:(NSUInteger)line exceptionName:(NSExceptionName)name reason:(NSString *)reason;
51+
52+
// Pushes/Pops an issue treatment on the stack. Push and Pop can only be called from the main thread and must be balanced.
53+
- (void)pushIssueTreatment:(OCMIssueTreatment)treatment;
54+
- (void)popIssueTreatment;
55+
56+
// The current issue treatment on the top of the stack.
57+
- (OCMIssueTreatment)issueTreatment;
58+
59+
@end
60+
61+
#define OCM_REPORT_ISSUE(_format, ...) ([[OCMIssueReporter defaultReporter] reportIssueInFile:__FILE__ line:__LINE__ format:_format, __VA_ARGS__ ])

0 commit comments

Comments
 (0)