]> git.wincent.com - WOTest.git/blob - NSObject+WOTest.h
Fix object-to-pointer comparisons on Leopard
[WOTest.git] / NSObject+WOTest.h
1 //
2 //  NSObject+WOTest.h
3 //  WOTest
4 //
5 //  Created by Wincent Colaiuta on 12 June 2005.
6 //
7 //  Copyright 2005-2007 Wincent Colaiuta.
8 //  This program is free software: you can redistribute it and/or modify
9 //  it under the terms of the GNU General Public License as published by
10 //  the Free Software Foundation, either version 3 of the License, or
11 //  (at your option) any later version.
12 //
13 //  This program is distributed in the hope that it will be useful,
14 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 //  GNU General Public License for more details.
17 //
18 //  You should have received a copy of the GNU General Public License
19 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 //
21
22 #import <Foundation/Foundation.h>
23
24 /*! WOTest is designed to work with any Objective-C class or object. You are not limited to working only with classes that derive from the Apple root classes (NSObject and NSProxy) or the other root classes (such as Object and NSZombie) that are implemented in libobjc (libobjc is part of Darwin and open source but the headers do not ship with Mac OS X). In most Objective-C programming you can assume that the objects with which you are working descend from NSObject and implement the NSObject protocol. This means that you can avoid exceptions by testing objects to see whether they implement selectors before sending messages; NSObject methods such as conformsToProtocol:, respondsToSelector: and performSelector: are frequently used for this purpose. 
25
26 If you try sending these messages to objects which do not implement them then you could cause a non-catchable exception (generated in _objc_error and _objc_trap) which will terminate the testing process. One of the goals of WOTest is to be extremely robust; exceptions should be caught and reported and they should not crash the program. It is true that custom root classes are extremely uncommon but WOTest nevertheless has been designed to cope with them. WOTest interacts with the Objective-C runtime at a low level and implements a number of convenience wrapper routines that enable the framework to work with any Objective-C object without fear of provoking uncatchable exceptions. The wrapper methods are described in this section. In simple cases (for example when invoking the objc_msgSend function) the framework calls the function directly without a wrapper. */
27
28 @interface NSObject (WOTest) 
29
30 /*! Substitute for NSObject description method. Returns "(nil)" if \p anObject is nil. */
31 + (NSString *)WOTest_descriptionForObject:(id)anObject;
32
33 /*! Returns YES if \p aClass is a class definition registered with the runtime. Returns NO otherwise. Does not raise an exception if passed a non-class pointer (in fact, the purpose of this method is to provide a way for checking for valid class pointers). */
34 + (BOOL)WOTest_isRegisteredClass:(Class)aClass;
35
36 /*! Returns YES if aClass is the metaclass of a class that is registered with the runtime. */
37 + (BOOL)WOTest_isMetaClass:(Class)aClass;
38
39 /*! Substitute for NSObject isKindOfClass: method. */
40 + (BOOL)WOTest_object:(id)anObject isKindOfClass:(Class)aClass;
41
42 /*! Substitute for NSObject isKindOfClass: method. */
43 + (BOOL)WOTest_instancesOfClass:(Class)aClass areKindOfClass:(Class)otherClass;
44
45 + (BOOL)WOTest_class:(Class)aClass respondsToSelector:(SEL)aSelector;
46
47 /*! WOTest can work with objects that do not derive from any of the Apple root classes (NSObject, NSProxy) or implement the standard protocols (such as NSObject). This means that it is possible that the objects could be passed that do not even implement the respondsToSelector: method. If such objects are sent the selector then the program running the tests could crash. The WOTest_object:respondsToSelector: method avoids these crashes by providing a wrapper for the low level class_getInstanceMethod function. */
48 + (BOOL)WOTest_object:(id)anObject respondsToSelector:(SEL)aSelector;
49
50 /*! Similar to WOTest_object:respondsToSelector:. */
51 + (BOOL)WOTest_instancesOfClass:(Class)aClass respondToSelector:(SEL)aSelector;
52
53 /*! Similar to WOTest_instancesOfClass:respondToSelector:. */
54 + (BOOL)WOTest_instancesOfClass:(Class)aClass conformToProtocol:(Protocol *)aProtocol;
55
56 + (NSString *)WOTest_returnTypeForClass:(Class)aClass selector:(SEL)aSelector;
57
58 + (NSString *)WOTest_returnTypeForObject:(id)anObject selector:(SEL)aSelector;
59
60 + (BOOL)WOTest_isIdReturnType:(NSString *)returnType;
61
62 + (BOOL)WOTest_isCharacterStringReturnType:(NSString *)returnType;
63
64 + (BOOL)WOTest_isConstantCharacterStringReturnType:(NSString *)returnType;
65
66 /*! Raises if \p anObject is nil or \p aSelector is NULL. Returns no if \p aSelector is not implemented by \p anObject. */
67 + (BOOL)WOTest_objectReturnsId:(id)anObject forSelector:(SEL)aSelector;
68
69 /*! Raises if \p anObject is nil or \p aSelector is NULL. Returns no if \p aSelector is not implemented by \p anObject. */
70 + (BOOL)WOTest_objectReturnsCharacterString:(id)anObject forSelector:(SEL)aSelector;
71
72 /*! Raises if \p anObject is nil or \p aSelector is NULL. Returns no if \p aSelector is not implemented by \p anObject. */
73 + (BOOL)WOTest_objectReturnsConstantCharacterString:(id)anObject forSelector:(SEL)aSelector;
74
75 @end