aboutsummaryrefslogtreecommitdiff
path: root/Foundation
diff options
context:
space:
mode:
authorGravatar dmaclach <dmaclach@google.com>2016-10-07 12:10:23 -0400
committerGravatar Thomas Van Lenten <thomasvl@google.com>2016-10-07 12:21:06 -0400
commit42124b3691197c3c4f52f069775fa0390a8ff942 (patch)
treeebd373d398ea64b45bdc1d196fa0a2c5f57cabfd /Foundation
parent57eeab4193210df8ab0c81e9d3f1ee1ad3e24492 (diff)
First cut at pruning things/updating things.
Remove a bunch of code that Google stopped using/maintaining rather than trying to update it it. Some would be hard to update, some actually has system provided replacements; others are patterns that just don't seem as common now. Prune out the code related to macOS <= 10.5, start pruning some of the really old iOS support also. Get the projects mostly limping again with modern Xcodes so tests can be run. If someone ends up on this commit via history for something they still find as useful, feel free to do a pull request to bring the snippet of code back to life and update it for current SDKs.
Diffstat (limited to 'Foundation')
-rw-r--r--Foundation/GTMAbstractDOListener.h231
-rw-r--r--Foundation/GTMAbstractDOListener.m454
-rw-r--r--Foundation/GTMAbstractDOListenerTest.m365
-rw-r--r--Foundation/GTMCalculatedRange.h105
-rw-r--r--Foundation/GTMCalculatedRange.m148
-rw-r--r--Foundation/GTMCalculatedRangeTest.m101
-rw-r--r--Foundation/GTMExceptionalInlines.h56
-rw-r--r--Foundation/GTMExceptionalInlines.m56
-rw-r--r--Foundation/GTMExceptionalInlinesTest.m71
-rw-r--r--Foundation/GTMFileSystemKQueueTest.m197
-rw-r--r--Foundation/GTMFourCharCode.h51
-rw-r--r--Foundation/GTMFourCharCode.m97
-rw-r--r--Foundation/GTMFourCharCodeTest.m122
-rw-r--r--Foundation/GTMGeometryUtilsTest.m162
-rw-r--r--Foundation/GTMLightweightProxyTest.m60
-rw-r--r--Foundation/GTMLogger+ASLTest.m18
-rw-r--r--Foundation/GTMLogger.m2
-rw-r--r--Foundation/GTMLoggerRingBufferWriterTest.m123
-rw-r--r--Foundation/GTMLoggerTest.m332
-rw-r--r--Foundation/GTMNSAppleEvent+HandlerTest.applescript60
-rw-r--r--Foundation/GTMNSAppleEventDescriptor+Foundation.h102
-rw-r--r--Foundation/GTMNSAppleEventDescriptor+Foundation.m536
-rw-r--r--Foundation/GTMNSAppleEventDescriptor+FoundationTest.m643
-rw-r--r--Foundation/GTMNSAppleEventDescriptor+Handler.h45
-rw-r--r--Foundation/GTMNSAppleEventDescriptor+Handler.m130
-rw-r--r--Foundation/GTMNSAppleEventDescriptor+HandlerTest.m70
-rw-r--r--Foundation/GTMNSAppleScript+Handler.h132
-rw-r--r--Foundation/GTMNSAppleScript+Handler.m662
-rw-r--r--Foundation/GTMNSAppleScript+HandlerTest.m504
-rw-r--r--Foundation/GTMNSArray+Merge.m14
-rw-r--r--Foundation/GTMNSArray+MergeTest.m101
-rw-r--r--Foundation/GTMNSData+zlib.h93
-rw-r--r--Foundation/GTMNSData+zlib.m264
-rw-r--r--Foundation/GTMNSData+zlibTest.m689
-rw-r--r--Foundation/GTMNSDictionary+CaseInsensitive.h44
-rw-r--r--Foundation/GTMNSDictionary+CaseInsensitive.m116
-rw-r--r--Foundation/GTMNSDictionary+CaseInsensitiveTest.m119
-rw-r--r--Foundation/GTMNSDictionary+URLArguments.m4
-rw-r--r--Foundation/GTMNSDictionary+URLArgumentsTest.m68
-rw-r--r--Foundation/GTMNSEnumerator+Filter.h69
-rw-r--r--Foundation/GTMNSEnumerator+Filter.m221
-rw-r--r--Foundation/GTMNSEnumerator+FilterTest.m208
-rw-r--r--Foundation/GTMNSFileHandle+UniqueNameTest.m74
-rw-r--r--Foundation/GTMNSFileManager+CarbonTest.m60
-rw-r--r--Foundation/GTMNSFileManager+Path.h27
-rw-r--r--Foundation/GTMNSFileManager+Path.m40
-rw-r--r--Foundation/GTMNSFileManager+PathTest.m172
-rw-r--r--Foundation/GTMNSObject+KeyValueObserving.m14
-rw-r--r--Foundation/GTMNSObject+KeyValueObservingTest.m26
-rw-r--r--Foundation/GTMNSScanner+JSON.m17
-rw-r--r--Foundation/GTMNSScanner+JSONTest.m44
-rw-r--r--Foundation/GTMNSScanner+Unsigned.h32
-rw-r--r--Foundation/GTMNSScanner+Unsigned.m60
-rw-r--r--Foundation/GTMNSScanner+UnsignedTest.m116
-rw-r--r--Foundation/GTMNSString+FindFolderTest.m28
-rw-r--r--Foundation/GTMNSString+HTML.m513
-rw-r--r--Foundation/GTMNSString+HTMLTest.m249
-rw-r--r--Foundation/GTMNSString+URLArgumentsTest.m102
-rw-r--r--Foundation/GTMNSString+XML.m4
-rw-r--r--Foundation/GTMNSString+XMLTest.m38
-rw-r--r--Foundation/GTMNSThread+Blocks.h6
-rw-r--r--Foundation/GTMNSThread+Blocks.m32
-rw-r--r--Foundation/GTMNSThread+BlocksTest.m117
-rw-r--r--Foundation/GTMObjC2Runtime.h90
-rw-r--r--Foundation/GTMObjC2Runtime.m156
-rw-r--r--Foundation/GTMObjC2RuntimeTest.m445
-rw-r--r--Foundation/GTMPathTest.m1
-rw-r--r--Foundation/GTMRegex.m14
-rw-r--r--Foundation/GTMRegexTest.m1393
-rw-r--r--Foundation/GTMSQLite.h6
-rw-r--r--Foundation/GTMSQLite.m91
-rw-r--r--Foundation/GTMSQLiteTest.m767
-rw-r--r--Foundation/GTMScriptRunnerTest.m318
-rw-r--r--Foundation/GTMServiceManagement.c47
-rw-r--r--Foundation/GTMServiceManagement.h4
-rw-r--r--Foundation/GTMServiceManagementTest.m136
-rw-r--r--Foundation/GTMSignalHandlerTest.m43
-rw-r--r--Foundation/GTMStackTrace.h37
-rw-r--r--Foundation/GTMStackTrace.m94
-rw-r--r--Foundation/GTMStackTraceTest.m108
-rw-r--r--Foundation/GTMStringEncoding.h32
-rw-r--r--Foundation/GTMStringEncoding.m92
-rw-r--r--Foundation/GTMStringEncodingTest.m145
-rw-r--r--Foundation/GTMSystemVersion.m94
-rw-r--r--Foundation/GTMSystemVersionTest.m78
-rw-r--r--Foundation/GTMTransientRootPortProxy.h50
-rw-r--r--Foundation/GTMTransientRootPortProxy.m80
-rw-r--r--Foundation/GTMTransientRootPortProxyTest.m182
-rw-r--r--Foundation/GTMTransientRootProxy.h114
-rw-r--r--Foundation/GTMTransientRootProxy.m230
-rw-r--r--Foundation/GTMTransientRootProxyTest.m231
-rw-r--r--Foundation/GTMURITemplate.h44
-rw-r--r--Foundation/GTMURITemplate.m521
-rw-r--r--Foundation/GTMURITemplateTest.m133
-rw-r--r--Foundation/GTMURLBuilder.h4
-rw-r--r--Foundation/GTMURLBuilder.m11
-rw-r--r--Foundation/GTMURLBuilderTest.m44
-rw-r--r--Foundation/GTMValidatingContainers.h196
-rw-r--r--Foundation/GTMValidatingContainers.m491
-rw-r--r--Foundation/GTMValidatingContainersTest.m378
-rw-r--r--Foundation/TestData/GTMURITemplateExtraTests.json222
-rw-r--r--Foundation/TestData/GTMURITemplateRFCTests.json131
102 files changed, 3575 insertions, 13094 deletions
diff --git a/Foundation/GTMAbstractDOListener.h b/Foundation/GTMAbstractDOListener.h
deleted file mode 100644
index 104ec05..0000000
--- a/Foundation/GTMAbstractDOListener.h
+++ /dev/null
@@ -1,231 +0,0 @@
-//
-// GTMAbstractDOListener.h
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-@class GTMReceivePortDelegate;
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-
-// Abstract base class for DO "listeners".
-// A class that needs to vend itself over DO should subclass this abstract
-// class. This class takes care of certain things like creating a new thread
-// to handle requests, setting request/reply timeouts, and ensuring the vended
-// object only gets requests that comply with the specified protocol.
-//
-// Subclassers will want to use the
-// GTM_ABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL macro for easier debugging
-// of stack traces. Please read it's description below.
-//
-@interface GTMAbstractDOListener : NSObject <NSConnectionDelegate> {
- @protected
- NSString *registeredName_;
- GTM_WEAK Protocol *protocol_;
- NSConnection *connection_;
- BOOL isRunningInNewThread_;
- BOOL shouldShutdown_;
- NSTimeInterval requestTimeout_;
- NSTimeInterval replyTimeout_;
- NSPort *port_;
- NSTimeInterval heartRate_;
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
- GTMReceivePortDelegate *receivePortDelegate_; // Strong (only used on Tiger)
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-}
-
-// Returns a set of all live instances of GTMAbstractDOListener subclasses.
-// If no listeners have been created, this will return an empty array--not nil.
-//
-// TODO: Remove this method
-//
-+ (NSArray *)allListeners;
-
-// Initializer. This actually calls
-// initWithRegisteredName:protocol:port with [NSMachPort port] as the port.
-//
-// Args:
-// name - the name that the object will register under
-// proto - the protocol that this object (self) should conform to
-//
-- (id)initWithRegisteredName:(NSString *)name protocol:(Protocol *)proto;
-
-// The designated initializer.
-//
-// Args:
-// name - the name used to register the port. While not necessarily required
-// for an NSSocketPort this class still requires it.
-// proto - the protocol that this object (self) should conform to
-// port - the port to be used when creating the NSConnection. If a NSMachPort
-// is being used then initWithRegisteredName:protocol is recommended.
-// Otherwise the port must be allocted by the caller.
-//
-- (id)initWithRegisteredName:(NSString *)name
- protocol:(Protocol *)proto
- port:(NSPort *)port;
-
-// Returns the name that this server will register with the
-// mach port name sever. This is the name of the port that this class
-// will "listen" on when -runInNewThread is called.
-//
-// Returns:
-// The registered name as a string
-//
-- (NSString *)registeredName;
-
-// Sets the registered name to use when listening over DO. This only makes
-// sense to be called before -runInNewThread has been called, because
-// -runInNewThread will listen on this "registered name", so setting it
-// afterwards would do nothing.
-//
-// Args:
-// name - the name to register under. May not be nil.
-//
-- (void)setRegisteredName:(NSString *)name;
-
-// Get/set the request timeout interval. If set to a value less than 0,
-// the default DO connection timeout will be used (maximum possible value).
-//
-- (NSTimeInterval)requestTimeout;
-- (void)setRequestTimeout:(NSTimeInterval)timeout;
-
-// Get/set the reply timeout interval. If set to a value less than 0,
-// the default DO connection timeout will be used (maximum possible value).
-//
-- (NSTimeInterval)replyTimeout;
-- (void)setReplyTimeout:(NSTimeInterval)timeout;
-
-// Get/set how long the thread will spin the run loop. This only takes affect
-// if runInNewThreadWithErrorTarget:selector:withObjectArgument: is used. The
-// default heart rate is 10.0 seconds.
-//
-- (void)setThreadHeartRate:(NSTimeInterval)heartRate;
-- (NSTimeInterval)ThreadHeartRate;
-
-// Returns the listeners associated NSConnection. May be nil if no connection
-// has been setup yet.
-//
-- (NSConnection *)connection;
-
-// Starts the DO system listening using the current thread and current runloop.
-// It only makes sense to call this method -OR- -runInNewThread, but not both.
-// Returns YES if it was able to startup the DO listener, NO otherwise.
-//
-- (BOOL)runInCurrentThread;
-
-// Starts the DO system listening, and creates a new thread to handle the DO
-// connections. It only makes sense to call this method -OR-
-// -runInCurrentThread, but not both.
-// if |errObject| is non nil, it will be used along with |selector| and
-// |argument| to signal that the startup of the listener in the new thread
-// failed. The actual selector will be invoked back on the main thread so
-// it does not have to be thread safe.
-// The most basic way to call this method is as follows:
-// [listener runInNewThreadWithErrorTarget:nil
-// selector:NULL
-// withObjectArgument:nil];
-//
-// Note: Using the example above you will not know if the listener failed to
-// startup due to some error.
-//
-- (void)runInNewThreadWithErrorTarget:(id)errObject
- selector:(SEL)selector
- withObjectArgument:(id)argument;
-
-// Shuts down the connection. If it was running in a new thread, that thread
-// should exit (within about 10 seconds). This call does not block.
-//
-// NOTE: This method is called in -dealloc, so if -runInNewThread had previously
-// been called, -dealloc will return *before* the thread actually exits. This
-// can be a problem as "self" may be gone before the thread exits. This is a
-// bug and needs to be fixed. Currently, to be safe, only call -shutdown if
-// -runInCurrentThread had previously been called.
-//
-- (void)shutdown;
-
-@end
-
-
-// Methods that subclasses may implement to vary the behavior of this abstract
-// class.
-//
-@interface GTMAbstractDOListener (GTMAbstractDOListenerSubclassMethods)
-
-// Called by the -runIn* methods. In the case where a new thread is being used,
-// this method is called on the new thread. The default implementation of this
-// method just returns YES, but subclasses can override it to do subclass
-// specific initialization. If this method returns NO, the -runIn* method that
-// called it will fail with an error.
-//
-// Returns:
-// YES if the -runIn* method should continue successfully, NO if the it should
-// fail.
-//
-- (BOOL)doRunInitialization;
-
-// Called as the "main" for the thread spun off by GTMAbstractDOListener.
-// Not really for use by subclassers, except to use the
-// GTMABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL macro defined below.
-//
-// This method runs forever in a new thread. This method actually starts the
-// DO connection listening.
-//
-- (void)threadMain:(NSInvocation *)failureCallback;
-
-@end
-
-// GTMAbstractDOListeners used to be hard to debug because crashes in their
-// stacks looked like this:
-//
-// #0 0x90009cd7 in mach_msg_trap ()
-// #1 0x90009c38 in mach_msg ()
-// #2 0x9082d2b3 in CFRunLoopRunSpecific ()
-// #3 0x9082cace in CFRunLoopRunInMode ()
-// #4 0x9282ad3a in -[NSRunLoop runMode:beforeDate:] ()
-// #5 0x928788e4 in -[NSRunLoop runUntilDate:] ()
-// #6 0x00052696 in -[GTMAbstractDOListener(GTMAbstractDOListenerSubclassMethods) threadMain:] ...
-// #7 0x927f52e0 in forkThreadForFunction ()
-// #8 0x90024227 in _pthread_body ()
-//
-// and there was no good way to figure out what thread had the problem because
-// they all originated from
-// -[GTMAbstractDOListener(GTMAbstractDOListenerSubclassMethods) threadMain:]
-//
-// If you add GTMABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL to the impl of your
-// subclass you will get a stack that looks like this:
-// #0 0x90009cd7 in mach_msg_trap ()
-// #1 0x90009c38 in mach_msg ()
-// #2 0x9082d2b3 in CFRunLoopRunSpecific ()
-// #3 0x9082cace in CFRunLoopRunInMode ()
-// #4 0x9282ad3a in -[NSRunLoop runMode:beforeDate:] ()
-// #5 0x928788e4 in -[NSRunLoop runUntilDate:] ()
-// #6 0x00052696 in -[GTMAbstractDOListener(GTMAbstractDOListenerSubclassMethods) threadMain:] ...
-// #7 0x0004b35c in -[GDStatsListener threadMain:]
-// #8 0x927f52e0 in forkThreadForFunction () #9 0x90024227 in _pthread_body ()
-//
-// so we can see that this was the GDStatsListener thread that failed.
-// It will look something like this
-// @implemetation MySubclassOfGTMAbstractDOListenerSubclassMethods
-// GTM_ABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL
-// ....
-// @end
-
-#define GTM_ABSTRACTDOLISTENER_SUBCLASS_THREADMAIN_IMPL \
- - (void)threadMain:(NSInvocation *)failureCallback { \
- [super threadMain:failureCallback]; \
- }
diff --git a/Foundation/GTMAbstractDOListener.m b/Foundation/GTMAbstractDOListener.m
deleted file mode 100644
index 4ac69bd..0000000
--- a/Foundation/GTMAbstractDOListener.m
+++ /dev/null
@@ -1,454 +0,0 @@
-//
-// GTMAbstractDOListener.m
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMAbstractDOListener.h"
-#import "GTMSystemVersion.h"
-#import <mach/mach_init.h>
-
-// Hack workaround suggested by DTS for the DO deadlock bug. Basically, this
-// class intercepts the delegate role for DO's receive port (which is an
-// NSMachPort). When -handlePortMessage: is called, it verifies that the send
-// and receive ports are not nil, then forwards the message on to the original
-// delegate. If the ports are nil, then the resulting NSConnection would
-// eventually cause us to deadlock. In this case, it simply ignores the
-// message. This is only need on Tiger.
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-@interface GTMReceivePortDelegate : NSObject {
- GTM_WEAK id delegate_;
-}
-- (id)initWithDelegate:(id)delegate;
-- (void)handlePortMessage:(NSPortMessage *)message;
-@end
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-
-@interface GTMAbstractDOListener (PrivateMethods)
-- (BOOL)startListening;
-- (void)stopListening;
-
-// Returns a description of the port based on the type of port.
-- (NSString *)portDescription;
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-// Uses the GTMReceivePortDelegate hack (see comments above) if we're on Tiger.
-- (void)hackaroundTigerDOWedgeBug:(NSConnection *)conn;
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-@end
-
-// Static global set that holds a pointer to all instances of
-// GTMAbstractDOListener subclasses.
-//
-static NSMutableSet *gAllListeners = nil;
-
-@implementation GTMAbstractDOListener
-
-+ (void)initialize {
- if (self == [GTMAbstractDOListener class]) {
- // We create the set using CFSetCreateMutable because we don't
- // want to retain things in this set. If we retained things in the
- // set we would never be able to dealloc ourselves because we
- // add "self" to this set in it's init routine would cause an
- // extra retain to be added to it.
- gAllListeners = (NSMutableSet*)CFSetCreateMutable(NULL, 0, NULL);
- }
-}
-
-+ (NSArray *)allListeners {
- // We return an NSArray instead of an NSSet here because NSArrays look nicer
- // when displayed as %@
- NSArray *allListeners = nil;
-
- @synchronized (gAllListeners) {
- allListeners = [gAllListeners allObjects];
- }
- return allListeners;
-}
-
-- (id)init {
- return [self initWithRegisteredName:nil protocol:NULL];
-}
-
-- (id)initWithRegisteredName:(NSString *)name protocol:(Protocol *)proto {
- return [self initWithRegisteredName:name
- protocol:proto
- port:[NSMachPort port]];
-}
-
-- (id)initWithRegisteredName:(NSString *)name
- protocol:(Protocol *)proto
- port:(NSPort *)port {
- self = [super init];
- if (!self) {
- return nil;
- }
-
- if ((!proto) || (!port) || (!name)) {
- if (!proto) {
- _GTMDevLog(@"Failed to create a listener, a protocol must be specified");
- }
-
- if (!port) {
- _GTMDevLog(@"Failed to create a listener, a port must be specified");
- }
-
- if (!name) {
- _GTMDevLog(@"Failed to create a listener, a name must be specified");
- }
-
- [self release];
- return nil;
- }
-
- registeredName_ = [name copy];
- protocol_ = proto; // Can't retain protocols
- port_ = [port retain];
-
- requestTimeout_ = -1;
- replyTimeout_ = -1;
-
- heartRate_ = (NSTimeInterval)10.0;
-
- _GTMDevAssert(gAllListeners, @"gAllListeners is not nil");
- @synchronized (gAllListeners) {
- [gAllListeners addObject:self];
- }
-
- return self;
-}
-
-- (void)dealloc {
- _GTMDevAssert(gAllListeners, @"gAllListeners is not nil");
- @synchronized (gAllListeners) {
- [gAllListeners removeObject:self];
- }
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
- [receivePortDelegate_ release];
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-
- [self shutdown];
- [port_ release];
- [registeredName_ release];
- [super dealloc];
-}
-
-
-#pragma mark Getters and Setters
-
-- (NSString *)registeredName {
- return registeredName_;
-}
-
-- (void)setRegisteredName:(NSString *)name {
- if (!name) {
- return;
- }
- [registeredName_ autorelease];
- registeredName_ = [name copy];
-}
-
-- (NSTimeInterval)requestTimeout {
- return requestTimeout_;
-}
-
-- (void)setRequestTimeout:(NSTimeInterval)timeout {
- requestTimeout_ = timeout;
-}
-
-- (NSTimeInterval)replyTimeout {
- return replyTimeout_;
-}
-
-- (void)setReplyTimeout:(NSTimeInterval)timeout {
- replyTimeout_ = timeout;
-}
-
-- (void)setThreadHeartRate:(NSTimeInterval)heartRate {
- heartRate_ = heartRate;
-}
-
-- (NSTimeInterval)ThreadHeartRate {
- return heartRate_;
-}
-
-- (NSConnection *)connection {
- return connection_;
-}
-
-- (NSString *)description {
- return [NSString stringWithFormat:@"%@<%p> { name=\"%@\", %@ }",
- [self class], self, registeredName_, [self portDescription]];
-}
-
-#pragma mark "Run" methods
-
-- (BOOL)runInCurrentThread {
- return [self startListening];
-}
-
-- (void)runInNewThreadWithErrorTarget:(id)errObject
- selector:(SEL)selector
- withObjectArgument:(id)argument {
- NSInvocation *invocation = nil;
-
- _GTMDevAssert(((errObject != nil && selector != NULL) ||
- (!errObject && !selector)), @"errObject and selector must "
- @"both be nil or not nil");
-
- // create an invocation we can use if things fail
- if (errObject) {
- NSMethodSignature *signature =
- [errObject methodSignatureForSelector:selector];
- invocation = [NSInvocation invocationWithMethodSignature:signature];
- [invocation setSelector:selector];
- [invocation setTarget:errObject];
-
- // If the selector they passed in takes an arg (i.e., it has at least one
- // colon in the selector name), then set the first user-specified arg to be
- // the |argument| they specified. The first two args are self and _cmd.
- if ([signature numberOfArguments] > 2) {
- [invocation setArgument:&argument atIndex:2];
- }
-
- [invocation retainArguments];
- }
-
- shouldShutdown_ = NO;
- [NSThread detachNewThreadSelector:@selector(threadMain:)
- toTarget:self
- withObject:invocation];
-}
-
-- (void)shutdown {
- // If we're not running in a new thread (then we're running in the "current"
- // thread), tear down the NSConnection here. If we are running in a new
- // thread we just set the shouldShutdown_ flag, and the thread will teardown
- // the NSConnection itself.
- if (!isRunningInNewThread_) {
- [self stopListening];
- } else {
- shouldShutdown_ = YES;
- }
-}
-
-@end
-
-@implementation GTMAbstractDOListener (PrivateMethods)
-
-- (BOOL)startListening {
- BOOL result = NO;
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- _GTMDevAssert(!connection_, @"Connection_ should not be set. Was this "
- @"listener already started? %@", self);
- connection_ = [[NSConnection alloc] initWithReceivePort:port_ sendPort:nil];
-
- NSProtocolChecker *checker =
- [NSProtocolChecker protocolCheckerWithTarget:self
- protocol:protocol_];
-
- if (requestTimeout_ >= 0) {
- [connection_ setRequestTimeout:requestTimeout_];
- }
-
- if (replyTimeout_ >= 0) {
- [connection_ setReplyTimeout:replyTimeout_];
- }
-
- // Set the connection's root object to be the protocol checker so that only
- // methods listed in the protocol_ are available via DO.
- [connection_ setRootObject:checker];
-
- // Allow subclasses to be the connection delegate
- [connection_ setDelegate:self];
-
- // Because of radar 5493309 we need to do this. [NSConnection registeredName:]
- // returns NO when the connection is created using an NSSocketPort under
- // Leopard.
- //
- // The recommendation from Apple was to use the command:
- // [NSConnection registerName:withNameServer:].
- NSPortNameServer *server;
- if ([port_ isKindOfClass:[NSSocketPort class]]) {
- server = [NSSocketPortNameServer sharedInstance];
- } else {
- server = [NSPortNameServer systemDefaultPortNameServer];
- }
-
- BOOL registered = [connection_ registerName:registeredName_
- withNameServer:server];
-
- if (registeredName_ && registered) {
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
- [self hackaroundTigerDOWedgeBug:connection_];
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-
- result = YES;
-
- _GTMDevLog(@"listening on %@ with name '%@'", [self portDescription],
- registeredName_);
- } else {
- _GTMDevLog(@"failed to register %@ with %@", connection_, registeredName_);
- }
-
- // we're good, so call the overrideable initializer
- if (result) {
- // Call the virtual "runIn*" initializer
- result = [self doRunInitialization];
- } else {
- [connection_ invalidate];
- [connection_ release];
- connection_ = nil;
- }
-
- [pool drain];
-
- return result;
-}
-
-- (void)stopListening {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [connection_ invalidate];
- [connection_ release];
- connection_ = nil;
- [pool drain];
-}
-
-- (NSString *)portDescription {
- NSString *portDescription;
- if ([port_ isKindOfClass:[NSMachPort class]]) {
- portDescription = [NSString stringWithFormat:@"mach_port=%#x",
- [(NSMachPort *)port_ machPort]];
- } else {
- portDescription = [NSString stringWithFormat:@"port=%@",
- [port_ description]];
- }
- return portDescription;
-}
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-- (void)hackaroundTigerDOWedgeBug:(NSConnection *)conn {
- if ([GTMSystemVersion isTiger]) {
- NSPort *receivePort = [conn receivePort];
- if ([receivePort isKindOfClass:[NSMachPort class]]) {
- id portDelegate = [receivePort delegate];
- receivePortDelegate_ =
- [[GTMReceivePortDelegate alloc] initWithDelegate:portDelegate];
- [receivePort setDelegate:receivePortDelegate_];
- }
- }
-}
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-
-@end
-
-@implementation GTMAbstractDOListener (GTMAbstractDOListenerSubclassMethods)
-
-- (BOOL)doRunInitialization {
- return YES;
-}
-
-//
-// -threadMain:
-//
-
-//
-- (void)threadMain:(NSInvocation *)failureCallback {
- isRunningInNewThread_ = YES;
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- // register
- if ([self startListening]) {
- // spin
- for (;;) { // Run forever
-
- // check if we were asked to shutdown
- if (shouldShutdown_) {
- break;
- }
-
- NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
- // Wrap our runloop in case we get an exception from DO
- @try {
- NSDate *waitDate = [NSDate dateWithTimeIntervalSinceNow:heartRate_];
- [[NSRunLoop currentRunLoop] runUntilDate:waitDate];
- } @catch (id e) {
- _GTMDevLog(@"Listener '%@' caught exception: %@", registeredName_, e);
- }
- [localPool drain];
- }
- } else {
- // failed, if we had something to invoke, call it on the main thread
- if (failureCallback) {
- [failureCallback performSelectorOnMainThread:@selector(invoke)
- withObject:nil
- waitUntilDone:NO];
- }
- }
-
- [self stopListening];
- [pool drain];
-
- isRunningInNewThread_ = NO;
-}
-
-@end
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-@implementation GTMReceivePortDelegate
-
-- (id)initWithDelegate:(id)delegate {
- if ((self = [super init])) {
- delegate_ = delegate; // delegates aren't retained
- }
- return self;
-}
-
-- (void)handlePortMessage:(NSPortMessage *)message {
- NSPort *receivePort = [message receivePort];
- NSPort *sendPort = [message sendPort];
-
- // If we don't have a sensible send or receive port, just act like
- // the message never arrived. Otherwise, hand it off to the original
- // delegate (which is the NSMachPort itself).
- if (receivePort == nil || sendPort == nil || [receivePort isEqual:sendPort]) {
- _GTMDevLog(@"Dropping port message destined for itself to avoid DO wedge.");
- } else {
- // Uncomment for super-duper verbose DO message forward logging
- // _GTMDevLog(@"--> Forwarding message %@ to delegate %@",
- // message, delegate_);
- [delegate_ handlePortMessage:message];
- }
-
- // If processing the message caused us to drop no longer being the delegate,
- // set us back. Due to interactions between NSConnection and NSMachPort,
- // it's possible for the NSMachPort's delegate to get set back to its
- // original value. If that happens, we set it back to the value we want.
- if ([delegate_ delegate] != self) {
- if ([delegate_ delegate] == delegate_) {
- _GTMDevLog(@"Restoring DO delegate to %@", self);
- [delegate_ setDelegate:self];
- } else {
- _GTMDevLog(@"GMReceivePortDelegate replaced with %@",
- [delegate_ delegate]);
- }
- }
-}
-@end
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
diff --git a/Foundation/GTMAbstractDOListenerTest.m b/Foundation/GTMAbstractDOListenerTest.m
deleted file mode 100644
index 6a5a90a..0000000
--- a/Foundation/GTMAbstractDOListenerTest.m
+++ /dev/null
@@ -1,365 +0,0 @@
-//
-// GTMAbstractDOListenerTest.m
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMAbstractDOListener.h"
-
-// Needed for GTMUnitTestDevLog expectPattern
-#import "GTMUnitTestDevLog.h"
-
-// Used for request/reply timeouts
-#define kDefaultTimeout 0.5
-
-// Used when waiting for something to shutdown
-#define kDelayTimeout 30.0
-
-enum {
- kGTMAbstractDOConditionWaiting = 123,
- kGTMAbstractDOConditionReceivedMessage
-};
-
-#pragma mark -
-#pragma mark Test Protocols
-
-@protocol TestServerDOProtocol
-- (oneway void)testCommand;
-- (in bycopy NSNumber *)delayResponseForTime:(in byref NSNumber *)delay;
-@end
-
-@protocol TestServerEvilDOProtocol
-// This command is not implemented, but is declared to remove all compiler
-// warnings.
-//
-- (oneway void)evilCommand;
-@end
-
-@protocol TestServerDelegateProtocol
-- (void)clientSentMessage;
-@end
-
-#pragma mark -
-#pragma mark Test Server
-
-@interface TestServer : GTMAbstractDOListener<TestServerDOProtocol> {
- @private
- GTM_WEAK id delegate_;
-}
-- (void)setDelegate:(id)delegate;
-@end
-
-@implementation TestServer
-
-- (void)setDelegate:(id)delegate {
- delegate_ = delegate;
-}
-
-- (in bycopy NSNumber *)delayResponseForTime:(in byref NSNumber *)delay {
- NSDate *future = [NSDate dateWithTimeIntervalSinceNow:[delay doubleValue]];
- [NSThread sleepUntilDate:future];
- return [NSNumber numberWithDouble:kDefaultTimeout];
-}
-
-- (oneway void)testCommand {
- [delegate_ performSelector:@selector(clientSentMessage)];
-}
-
-@end
-
-#pragma mark -
-#pragma mark Test Client
-
-@interface TestClient : NSObject {
- @private
- id proxy_;
- NSString *serverName_;
-}
-- (id)initWithName:(NSString *)name;
-- (id)connect;
-- (void)disconnect;
-@end
-
-@implementation TestClient
-- (id)initWithName:(NSString *)name {
- self = [super init];
- if (self) {
- serverName_ = [[NSString alloc] initWithString:name];
- if (!serverName_) {
- [self release];
- self = nil;
- }
- }
- return self;
-}
-
-- (void)finalize {
- [self disconnect];
- [super finalize];
-}
-
-- (void)dealloc {
- [self disconnect];
- [serverName_ release];
- [super dealloc];
-}
-
-- (id)connect {
- NSConnection *connection =
- [NSConnection connectionWithRegisteredName:serverName_ host:nil];
-
- [connection setReplyTimeout:kDefaultTimeout];
- [connection setRequestTimeout:kDefaultTimeout];
-
- @try {
- proxy_ = [[connection rootProxy] retain];
- } @catch (NSException *e) {
- [self disconnect];
- }
- return proxy_;
-}
-
-- (void)disconnect {
- NSConnection *connection =
- [NSConnection connectionWithRegisteredName:serverName_ host:nil];
- [connection invalidate];
- [proxy_ release];
- proxy_ = nil;
-}
-
-@end
-
-#pragma mark -
-#pragma mark Tests
-
-@interface GTMAbstractDOListenerTest : GTMTestCase<TestServerDelegateProtocol> {
- @private
- NSConditionLock *lock_;
-}
-@end
-
-@implementation GTMAbstractDOListenerTest
-
-- (void)clientSentMessage {
- NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout];
- STAssertTrue([lock_ lockWhenCondition:kGTMAbstractDOConditionWaiting
- beforeDate:future], @"Unable to acquire lock "
- @"for client send message. This is BAD!");
- [lock_ unlockWithCondition:kGTMAbstractDOConditionReceivedMessage];
-}
-
-- (void)listenerErrorEncountered:(id)error {
- // Do nothing
-}
-
-- (void)testAbstractDOListenerProtocol {
- lock_ =
- [[NSConditionLock alloc] initWithCondition:kGTMAbstractDOConditionWaiting];
- [lock_ autorelease];
-
- NSString *serverName = @"ProtoTest";
-
- // Build and start the server
- TestServer *listener =
- [[TestServer alloc] initWithRegisteredName:serverName
- protocol:@protocol(TestServerDOProtocol)];
- [listener autorelease];
- [listener setDelegate:self];
- [GTMUnitTestDevLog expectPattern:@"listening on.*"];
- [listener runInCurrentThread];
-
- // Connect with our simple client
- TestClient *client =
- [[[TestClient alloc] initWithName:serverName] autorelease];
- id proxy = [client connect];
- STAssertNotNil(proxy, @"should have a proxy object");
-
- [proxy testCommand];
-
- NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:kDelayTimeout];
- while (![lock_ tryLockWhenCondition:kGTMAbstractDOConditionReceivedMessage] &&
- ([timeout compare:[NSDate date]] == NSOrderedDescending)) {
- NSDate* runUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
- [[NSRunLoop currentRunLoop] runUntilDate:runUntil];
- }
-
- STAssertFalse([lock_ tryLockWhenCondition:kGTMAbstractDOConditionWaiting],
- @"A message was never received from the client.");
-
- STAssertThrows([proxy evilCommand],
- @"An exception should have been thrown for a method not in"
- @"the specified protocol.");
-
- [client disconnect];
- [listener shutdown];
-
- STAssertNil([listener connection], @"The connection should be nil after "
- @"shutdown.");
-
- // We are done with the lock.
- [lock_ unlockWithCondition:kGTMAbstractDOConditionWaiting];
-}
-
-- (void)testAbstractDOListenerBadInitializers {
- [GTMUnitTestDevLog expectString:
- @"Failed to create a listener, a protocol must be specified"];
- [GTMUnitTestDevLog expectString:
- @"Failed to create a listener, a name must be specified"];
- TestServer *listener = [[TestServer alloc] init];
- STAssertNil(listener, @"We should not have created a server using init");
-
- [GTMUnitTestDevLog expectString:
- @"Failed to create a listener, a name must be specified"];
- listener =
- [[TestServer alloc] initWithRegisteredName:nil
- protocol:@protocol(TestServerDOProtocol)
- port:[NSMachPort port]];
- STAssertNil(listener, @"We should not have created a server with a nil name");
-
- [GTMUnitTestDevLog expectString:
- @"Failed to create a listener, a protocol must be specified"];
- listener =
- [[TestServer alloc] initWithRegisteredName:@"NilProtocol"
- protocol:nil
- port:[NSMachPort port]];
- STAssertNil(listener,
- @"We should not have created a server with a nil protocol");
-
- [GTMUnitTestDevLog expectString:
- @"Failed to create a listener, a port must be specified"];
- listener =
- [[TestServer alloc] initWithRegisteredName:@"NilPort"
- protocol:@protocol(TestServerDOProtocol)
- port:nil];
- STAssertNil(listener, @"We should not have created a server with a nil port");
-
-}
-
-- (void)testAbstractDOListenerMultipleRegistration {
- TestServer *listener =
- [[[TestServer alloc] initWithRegisteredName:@"MyUniqueName"
- protocol:@protocol(TestServerDOProtocol)
- port:[NSMachPort port]] autorelease];
- [GTMUnitTestDevLog expectPattern:@"listening on.*"];
- [listener runInCurrentThread];
-
- TestServer *copyCat =
- [[[TestServer alloc] initWithRegisteredName:@"copyCat"
- protocol:@protocol(TestServerDOProtocol)
- port:[NSMachPort port]] autorelease];
- STAssertTrue(([[copyCat registeredName] isEqualToString:@"copyCat"]),
- @"The name we set to register with is not correct.");
-
- TestServer *listener2 =
- [[[TestServer alloc] initWithRegisteredName:@"MyUniqueName"
- protocol:@protocol(TestServerDOProtocol)
- port:[NSMachPort port]] autorelease];
-
- [GTMUnitTestDevLog expectPattern:@"failed to register.*"];
- [listener2 runInCurrentThread];
- STAssertNil([listener2 connection], @"We should not have been able to create "
- @"a server with a name that has already been taken.");
-}
-
-- (void)testAbstractDOListenerRequestTimeout {
- NSString *serverName = @"RequestTimeoutTest";
-
- // Build and start the server
- TestServer *listener =
- [[TestServer alloc] initWithRegisteredName:serverName
- protocol:@protocol(TestServerDOProtocol)];
- [listener autorelease];
- [listener setReplyTimeout:kDefaultTimeout];
- [listener setRequestTimeout:kDefaultTimeout];
-
- STAssertLessThanOrEqual(ABS([listener replyTimeout] - kDefaultTimeout),
- (kDefaultTimeout / pow(kDefaultTimeout, 15)), nil);
-
- STAssertLessThanOrEqual(ABS([listener requestTimeout] - kDefaultTimeout),
- (kDefaultTimeout / pow(kDefaultTimeout, 15)), nil);
-
- NSTimeInterval customHeartRate = 0.25;
- [listener setThreadHeartRate:0.25];
-
- STAssertLessThanOrEqual(ABS([listener ThreadHeartRate] - customHeartRate),
- (customHeartRate / pow(customHeartRate, 15)), nil);
-
- [GTMUnitTestDevLog expectPattern:@"listening on.*"];
- [listener runInNewThreadWithErrorTarget:self
- selector:@selector(listenerErrorEncountered:)
- withObjectArgument:nil];
-
- // It will take a little while for the new thread to spin up and start
- // listening. We will spin here and wait for it to come on-line.
- NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:kDelayTimeout];
- while (![listener connection] &&
- ([timeout compare:[NSDate date]] == NSOrderedDescending)) {
- NSDate *waitTime = [NSDate dateWithTimeIntervalSinceNow:0.05];
- [[NSRunLoop currentRunLoop] runUntilDate:waitTime];
- }
-
- STAssertNotNil([listener connection],
- @"The server never created a connection.");
-
- // Connect with our simple client
- TestClient *client =
- [[[TestClient alloc] initWithName:serverName] autorelease];
- id proxy = [client connect];
- STAssertNotNil(proxy, @"should have a proxy object");
-
- NSNumber *overDelay = [NSNumber numberWithDouble:(kDefaultTimeout + 0.25)];
- STAssertThrows([proxy delayResponseForTime:overDelay],
- @"An exception should have been thrown for the response taking"
- @"longer than the replyTimout.");
-
- [client disconnect];
- [listener shutdown];
-
- timeout = [NSDate dateWithTimeIntervalSinceNow:kDelayTimeout];
- while ([listener connection] &&
- ([timeout compare:[NSDate date]] == NSOrderedDescending)) {
- NSDate *waitTime = [NSDate dateWithTimeIntervalSinceNow:0.05];
- [[NSRunLoop currentRunLoop] runUntilDate:waitTime];
- }
-
- STAssertNil([listener connection],
- @"The connection should be nil after shutdown.");
-}
-
-- (void)testAbstractDOListenerRelease {
- NSUInteger listenerCount = [[GTMAbstractDOListener allListeners] count];
- GTMAbstractDOListener *listener =
- [[GTMAbstractDOListener alloc] initWithRegisteredName:@"FOO"
- protocol:@protocol(NSObject)
- port:[NSPort port]];
- STAssertNotNil(listener, nil);
-
- // We throw an autorelease pool here because allStores does a couple of
- // autoreleased retains on us which would screws up our retain count
- // numbers.
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- STAssertEquals([[GTMAbstractDOListener allListeners] count],
- listenerCount + 1, nil);
- [pool drain];
-
- STAssertEquals([listener retainCount], (NSUInteger)1, nil);
-
- [listener release];
- STAssertEquals([[GTMAbstractDOListener allListeners] count], listenerCount,
- nil);
-}
-
-@end
diff --git a/Foundation/GTMCalculatedRange.h b/Foundation/GTMCalculatedRange.h
deleted file mode 100644
index c51181a..0000000
--- a/Foundation/GTMCalculatedRange.h
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// GTMCalculatedRange.h
-//
-// This is a collection that allows you to calculate a value based on
-// defined stops in a range.
-//
-// Copyright 2006-2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-#if GTM_IPHONE_SDK
-#import <CoreGraphics/CoreGraphics.h>
-#endif // GTM_IPHONE_SDK
-
-/// Allows you to calculate a value based on defined stops in a range.
-//
-/// For example if you have a range from 0.0 to 1.0 where the stop
-/// located at 0.0 is red and the stop located at 1.0 is blue,
-/// the value based on the position 0.5 would come out as purple assuming
-/// that the valueAtPosition function calculates a purely linear mapping between
-/// the stops at 0.0 and 1.0. Stops have indices and are sorted from lowest to
-/// highest. The example above would have 2 stops. Stop 0 would be red and stop
-/// 1 would be blue.
-///
-/// Subclasses of GTMCalculatedRange are expected to override the valueAtPosition:
-/// method to return a value based on the position passed in, and the stops
-/// that are currently set in the range. Stops do not necessarily have to
-/// be the same type as the values that are calculated, but normally they are.
-@interface GTMCalculatedRange : NSObject {
- NSMutableArray *storage_;
-}
-
-// Adds a stop to the range at |position|. If there is already a stop
-// at position |position| it is replaced.
-//
-// Args:
-// item: the object to place at |position|.
-// position: the position in the range to put |item|.
-//
-- (void)insertStop:(id)item atPosition:(CGFloat)position;
-
-// Removes a stop from the range at |position|.
-//
-// Args:
-// position: the position in the range to remove |item|.
-//
-// Returns:
-// YES if there is a stop at |position| that has been removed
-// NO if there is not a stop at the |position|
-- (BOOL)removeStopAtPosition:(CGFloat)position;
-
-// Removes stop |index| from the range. Stops are ordered
-// based on position where index of x < index of y if position
-// of x < position of y.
-//
-// Args:
-// item: the object to place at |position|.
-// position: the position in the range to put |item|.
-//
-- (void)removeStopAtIndex:(NSUInteger)index;
-
-// Returns the number of stops in the range.
-//
-// Returns:
-// number of stops
-- (NSUInteger)stopCount;
-
-// Returns the value at position |position|.
-// This function should be overridden by subclasses to calculate a
-// value for any given range.
-// The default implementation returns a value if there happens to be
-// a stop for the given position. Otherwise it returns nil.
-//
-// Args:
-// position: the position to calculate a value for.
-//
-// Returns:
-// value for position
-- (id)valueAtPosition:(CGFloat)position;
-
-// Returns the |index|'th stop and position in the set.
-// Throws an exception if out of range.
-//
-// Args:
-// index: the index of the stop
-// outPosition: a pointer to a value to be filled in with a position.
-// this can be NULL, in which case no position is returned.
-//
-// Returns:
-// the stop at the index.
-- (id)stopAtIndex:(NSUInteger)index position:(CGFloat*)outPosition;
-@end
diff --git a/Foundation/GTMCalculatedRange.m b/Foundation/GTMCalculatedRange.m
deleted file mode 100644
index 3e8aa69..0000000
--- a/Foundation/GTMCalculatedRange.m
+++ /dev/null
@@ -1,148 +0,0 @@
-//
-// GTMCalculatedRange.m
-//
-// Copyright 2006-2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMCalculatedRange.h"
-
-// Our internal storage type. It keeps track of an item and it's
-// position.
-@interface GTMCalculatedRangeStopPrivate : NSObject {
- id item_; // the item (STRONG)
- CGFloat position_; //
-}
-+ (id)stopWithObject:(id)item position:(CGFloat)inPosition;
-- (id)initWithObject:(id)item position:(CGFloat)inPosition;
-- (id)item;
-- (CGFloat)position;
-@end
-
-GTM_INLINE BOOL FPEqual(CGFloat a, CGFloat b) {
- return (fpclassify(a - b) == FP_ZERO);
-}
-
-@implementation GTMCalculatedRangeStopPrivate
-+ (id)stopWithObject:(id)item position:(CGFloat)inPosition {
- return [[[self alloc] initWithObject:item position:inPosition] autorelease];
-}
-
-- (id)initWithObject:(id)item position:(CGFloat)inPosition {
- self = [super init];
- if (self != nil) {
- item_ = [item retain];
- position_ = inPosition;
- }
- return self;
-}
-
-- (void)dealloc {
- [item_ release];
- [super dealloc];
-}
-
-- (id)item {
- return item_;
-}
-
-- (CGFloat)position {
- return position_;
-}
-
-- (NSString *)description {
- return [NSString stringWithFormat: @"%f %@", position_, item_];
-}
-@end
-
-@implementation GTMCalculatedRange
-- (id)init {
- self = [super init];
- if (self != nil) {
- storage_ = [[NSMutableArray arrayWithCapacity:0] retain];
- }
- return self;
-}
-- (void)dealloc {
- [storage_ release];
- [super dealloc];
-}
-
-- (void)insertStop:(id)item atPosition:(CGFloat)position {
- NSUInteger positionIndex = 0;
- GTMCalculatedRangeStopPrivate *theStop;
- GTM_FOREACH_OBJECT(theStop, storage_) {
- if ([theStop position] < position) {
- positionIndex += 1;
- }
- else if (FPEqual([theStop position], position)) {
- // remove and stop the enum since we just modified the object
- [storage_ removeObjectAtIndex:positionIndex];
- break;
- }
- }
- [storage_ insertObject:[GTMCalculatedRangeStopPrivate stopWithObject:item position:position]
- atIndex:positionIndex];
-}
-
-- (BOOL)removeStopAtPosition:(CGFloat)position {
- NSUInteger positionIndex = 0;
- BOOL foundStop = NO;
- GTMCalculatedRangeStopPrivate *theStop;
- GTM_FOREACH_OBJECT(theStop, storage_) {
- if (FPEqual([theStop position], position)) {
- break;
- } else {
- positionIndex += 1;
- }
- }
- if (nil != theStop) {
- [self removeStopAtIndex:positionIndex];
- foundStop = YES;
- }
- return foundStop;
-}
-
-- (void)removeStopAtIndex:(NSUInteger)positionIndex {
- [storage_ removeObjectAtIndex:positionIndex];
-}
-
-- (NSUInteger)stopCount {
- return [storage_ count];
-}
-
-- (id)stopAtIndex:(NSUInteger)positionIndex position:(CGFloat*)outPosition {
- GTMCalculatedRangeStopPrivate *theStop = [storage_ objectAtIndex:positionIndex];
- if (nil != outPosition) {
- *outPosition = [theStop position];
- }
- return [theStop item];
-}
-
-- (id)valueAtPosition:(CGFloat)position {
- id theValue = nil;
- GTMCalculatedRangeStopPrivate *theStop;
- GTM_FOREACH_OBJECT(theStop, storage_) {
- if (FPEqual([theStop position], position)) {
- theValue = [theStop item];
- break;
- }
- }
- return theValue;
-}
-
-- (NSString *)description {
- return [storage_ description];
-}
-@end
diff --git a/Foundation/GTMCalculatedRangeTest.m b/Foundation/GTMCalculatedRangeTest.m
deleted file mode 100644
index 0806a0d..0000000
--- a/Foundation/GTMCalculatedRangeTest.m
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// GTMCalculatedRangeTest.m
-//
-// Copyright 2006-2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMCalculatedRange.h"
-#import "GTMSenTestCase.h"
-
-@interface GTMCalculatedRangeTest : GTMTestCase {
- GTMCalculatedRange *range_;
-}
-@end
-
-@implementation GTMCalculatedRangeTest
-NSString *kStrings[] = { @"Fee", @"Fi", @"Fo", @"Fum" };
-const NSUInteger kStringCount = sizeof(kStrings) / sizeof(NSString*);
-const CGFloat kOddPosition = 0.14159265f;
-const CGFloat kExistingPosition = 0.5f;
-const NSUInteger kExisitingIndex = 2;
-
-- (void)setUp {
- range_ = [[GTMCalculatedRange alloc] init];
- for(NSUInteger i = kStringCount; i > 0; --i) {
- [range_ insertStop:kStrings[kStringCount - i] atPosition:(CGFloat)(1.0 / i)];
- }
-}
-
-- (void)tearDown {
- [range_ release];
-}
-
-- (void)testInsertStop {
- // new position
- NSString *theString = @"I smell the blood of an Englishman!";
- [range_ insertStop:theString atPosition:kOddPosition];
- STAssertEquals([range_ stopCount], kStringCount + 1, @"Stop count was bad");
- NSString *getString = [range_ valueAtPosition:kOddPosition];
- STAssertNotNil(getString, @"String was bad");
- STAssertEquals(theString, getString, @"Stops weren't equal");
- // existing position
- NSString *theStringTake2 = @"I smell the blood of an Englishman! Take 2";
- [range_ insertStop:theStringTake2 atPosition:kOddPosition];
- STAssertEquals([range_ stopCount], kStringCount + 1, @"Stop count was bad");
- getString = [range_ valueAtPosition:kOddPosition];
- STAssertNotNil(getString, @"String was bad");
- STAssertEquals(theStringTake2, getString, @"Stops weren't equal");
- STAssertNotEquals(theString, getString, @"Should be the new value");
- STAssertNotEqualObjects(theString, getString, @"Should be the new value");
-}
-
-- (void)testRemoveStopAtPosition {
- STAssertFalse([range_ removeStopAtPosition: kOddPosition], @"Was able to remove non-existant stop");
- STAssertTrue([range_ removeStopAtPosition: kExistingPosition], @"Was unable to remove good stop");
- STAssertEquals([range_ stopCount], kStringCount - 1, @"Removing stop should adjust stop count");
-}
-
-- (void)testRemoveStopAtIndex {
- STAssertThrows([range_ removeStopAtIndex: kStringCount], @"Was able to remove non-existant stop");
- STAssertNoThrow([range_ removeStopAtIndex: kStringCount - 1], @"Was unable to remove good stop");
- STAssertEquals([range_ stopCount], kStringCount - 1, @"Removing stop should adjust stop count");
-}
-
-- (void)testStopCount {
- STAssertEquals([range_ stopCount], kStringCount, @"Bad stop count");
-}
-
-- (void)testValueAtPosition {
- STAssertEqualObjects([range_ valueAtPosition: kExistingPosition], kStrings[kExisitingIndex], nil);
- STAssertNotEqualObjects([range_ valueAtPosition: kExistingPosition], kStrings[kStringCount - 1], nil);
- STAssertNil([range_ valueAtPosition: kOddPosition], nil);
-}
-
-- (void)testStopAtIndex {
- CGFloat thePosition;
-
- STAssertEqualObjects([range_ stopAtIndex:kStringCount - 1 position:nil], kStrings[kStringCount - 1], nil);
- STAssertEqualObjects([range_ stopAtIndex:kExisitingIndex position:&thePosition], kStrings[kExisitingIndex], nil);
- STAssertEquals(thePosition, kExistingPosition, nil);
- STAssertNotEqualObjects([range_ stopAtIndex:kStringCount - 1 position:nil], kStrings[2], nil);
- STAssertThrows([range_ stopAtIndex:kStringCount position:nil], nil);
-}
-
-- (void)testDescription {
- // we expect a description of atleast a few chars
- STAssertGreaterThan([[range_ description] length], (NSUInteger)10, nil);
-}
-
-@end
diff --git a/Foundation/GTMExceptionalInlines.h b/Foundation/GTMExceptionalInlines.h
deleted file mode 100644
index ee3a3db..0000000
--- a/Foundation/GTMExceptionalInlines.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// GTMExceptionalInlines.h
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-#if GTM_IPHONE_SDK
-#import <CoreGraphics/CoreGraphics.h>
-#endif // GTM_IPHONE_SDK
-
-// This file exists because when you have full warnings on you can run into
-// troubles with functions that Apple has inlined that have structures or
-// local variables defined in them.
-// You only see this warning if you have -Wuninitialized turned on,
-// and you will only see them in release mode. -Wno-unitialized turns them
-// off, but you also lose all the good warnings that come with -Wuninitialized.
-// If you have the inline versions of any of the functions below in a
-// @syncronized, or @try block, you will get
-// warning: variable 'r' might be clobbered by 'longjmp' or 'vfork'
-// By moving this local vars "out of line" you fix the problem.
-// These functions do nothing more than act as "out of line" calls to the
-// functions they are masking to avoid the warning.
-// If you run into others, feel free to add them.
-
-// Please only use these to avoid the warning above. Use the Apple defined
-// functions where possible.
-
-FOUNDATION_EXPORT NSRange GTMNSMakeRange(NSUInteger loc, NSUInteger len);
-FOUNDATION_EXPORT CFRange GTMCFRangeMake(NSUInteger loc, NSUInteger len);
-
-FOUNDATION_EXPORT CGPoint GTMCGPointMake(CGFloat x, CGFloat y);
-FOUNDATION_EXPORT CGSize GTMCGSizeMake(CGFloat width, CGFloat height);
-FOUNDATION_EXPORT CGRect GTMCGRectMake(CGFloat x, CGFloat y,
- CGFloat width, CGFloat height);
-
-#if !GTM_IPHONE_SDK
-// iPhone does not have NSTypes defined, only CGTypes. So no NSRect, NSPoint etc.
-FOUNDATION_EXPORT NSPoint GTMNSMakePoint(CGFloat x, CGFloat y);
-FOUNDATION_EXPORT NSSize GTMNSMakeSize(CGFloat w, CGFloat h);
-FOUNDATION_EXPORT NSRect GTMNSMakeRect(CGFloat x, CGFloat y,
- CGFloat w, CGFloat h);
-#endif
diff --git a/Foundation/GTMExceptionalInlines.m b/Foundation/GTMExceptionalInlines.m
deleted file mode 100644
index d803ea9..0000000
--- a/Foundation/GTMExceptionalInlines.m
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// GTMExceptionalInlines.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMExceptionalInlines.h"
-
-NSRange GTMNSMakeRange(NSUInteger loc, NSUInteger len) {
- return NSMakeRange(loc, len);
-}
-
-CFRange GTMCFRangeMake(NSUInteger loc, NSUInteger len) {
- return CFRangeMake(loc, len);
-}
-
-CGPoint GTMCGPointMake(CGFloat x, CGFloat y) {
- return CGPointMake(x, y);
-}
-
-CGSize GTMCGSizeMake(CGFloat width, CGFloat height) {
- return CGSizeMake(width, height);
-}
-
-CGRect GTMCGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) {
- return CGRectMake(x, y, width, height);
-}
-
-#if !GTM_IPHONE_SDK
-// iPhone does not have NSTypes defined, only CGTypes. So no NSRect, NSPoint etc.
-
-NSPoint GTMNSMakePoint(CGFloat x, CGFloat y) {
- return NSMakePoint(x, y);
-}
-
-NSSize GTMNSMakeSize(CGFloat w, CGFloat h) {
- return NSMakeSize(w, h);
-}
-
-NSRect GTMNSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h) {
- return NSMakeRect(x, y, w, h);
-}
-
-#endif
diff --git a/Foundation/GTMExceptionalInlinesTest.m b/Foundation/GTMExceptionalInlinesTest.m
deleted file mode 100644
index 6142236..0000000
--- a/Foundation/GTMExceptionalInlinesTest.m
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// GTMExceptionalInlinesTest.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMExceptionalInlines.h"
-
-@interface GTMExceptionalInlinesTest : GTMTestCase
-@end
-
-@implementation GTMExceptionalInlinesTest
-- (void)testExceptionalInlines {
- // Numbers chosen basically at random.
- NSUInteger loc = 5;
- NSUInteger len = 10;
- CGFloat x = 22.5;
- CGFloat y = 40.2;
- CGFloat h = 21.6;
- CGFloat w = 54.2;
-
- NSRange range1 = GTMNSMakeRange(loc, len);
- NSRange range2 = NSMakeRange(loc, len);
- STAssertTrue(NSEqualRanges(range1, range2), nil);
-
- CFRange cfrange1 = GTMCFRangeMake(loc, len);
- CFRange cfrange2 = CFRangeMake(loc, len);
- STAssertEquals(cfrange1.length, cfrange2.length, nil);
- STAssertEquals(cfrange1.location, cfrange2.location, nil);
-
-
- CGPoint cgpoint1 = GTMCGPointMake(x, y);
- CGPoint cgpoint2 = CGPointMake(x, y);
- STAssertTrue(CGPointEqualToPoint(cgpoint1, cgpoint2), nil);
-
- CGSize cgsize1 = GTMCGSizeMake(x, y);
- CGSize cgsize2 = CGSizeMake(x, y);
- STAssertTrue(CGSizeEqualToSize(cgsize1, cgsize2), nil);
-
- CGRect cgrect1 = GTMCGRectMake(x, y, w, h);
- CGRect cgrect2 = CGRectMake(x, y, w, h);
- STAssertTrue(CGRectEqualToRect(cgrect1, cgrect2), nil);
-
-#if !GTM_IPHONE_SDK
- NSPoint point1 = GTMNSMakePoint(x, y);
- NSPoint point2 = NSMakePoint(x, y);
- STAssertTrue(NSEqualPoints(point1, point2), nil);
-
- NSSize size1 = GTMNSMakeSize(w, h);
- NSSize size2 = NSMakeSize(w, h);
- STAssertTrue(NSEqualSizes(size1, size2), nil);
-
- NSRect rect1 = GTMNSMakeRect(x, y, w, h);
- NSRect rect2 = NSMakeRect(x, y, w, h);
- STAssertTrue(NSEqualRects(rect1, rect2), nil);
-#endif
-}
-@end
diff --git a/Foundation/GTMFileSystemKQueueTest.m b/Foundation/GTMFileSystemKQueueTest.m
index 3919b86..9ffc046 100644
--- a/Foundation/GTMFileSystemKQueueTest.m
+++ b/Foundation/GTMFileSystemKQueueTest.m
@@ -18,7 +18,6 @@
#import "GTMSenTestCase.h"
#import "GTMFileSystemKQueue.h"
-#import "GTMUnitTestDevLog.h"
// Private methods of GTMFileSystemKQueue we use for some tests
@@ -47,17 +46,9 @@
- (void)callbackForQueue:(GTMFileSystemKQueue *)queue
events:(GTMFileSystemKQueueEvents)event {
- // Can't use standard ST macros here because our helper
- // is not a subclass of GTMTestCase. This is intentional.
if (queue != queue_) {
- NSString *file = [NSString stringWithUTF8String:__FILE__];
- NSException *exception
- = [NSException failureInEqualityBetweenObject:queue
- andObject:queue_
- inFile:file
- atLine:__LINE__
- withDescription:nil];
- [exception raise];
+ // We should never get here.
+ [NSException raise:NSInternalInconsistencyException format:@"Bad Queue!"];
}
if (event & kGTMFileSystemKQueueWriteEvent) {
@@ -132,13 +123,11 @@
- (void)testInit {
GTMFileSystemKQueue *testKQ;
GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease];
- STAssertNotNil(helper, nil);
+ XCTAssertNotNil(helper);
// init should fail
- [GTMUnitTestDevLog expectString:@"Don't call init, use "
- @"initWithPath:forEvents:acrossReplace:target:action:"];
testKQ = [[[GTMFileSystemKQueue alloc] init] autorelease];
- STAssertNil(testKQ, nil);
+ XCTAssertNil(testKQ);
// no path
testKQ
@@ -147,7 +136,7 @@
acrossReplace:YES
target:helper
action:@selector(callbackForQueue:events:)] autorelease];
- STAssertNil(testKQ, nil);
+ XCTAssertNil(testKQ);
// not events
testKQ
@@ -156,7 +145,7 @@
acrossReplace:YES
target:helper
action:@selector(callbackForQueue:events:)] autorelease];
- STAssertNil(testKQ, nil);
+ XCTAssertNil(testKQ);
// no target
testKQ
@@ -165,7 +154,7 @@
acrossReplace:YES
target:nil
action:@selector(callbackForQueue:events:)] autorelease];
- STAssertNil(testKQ, nil);
+ XCTAssertNil(testKQ);
// no handler
testKQ
@@ -174,7 +163,7 @@
acrossReplace:YES
target:helper
action:nil] autorelease];
- STAssertNil(testKQ, nil);
+ XCTAssertNil(testKQ);
// path that doesn't exist
@@ -184,7 +173,7 @@
acrossReplace:YES
target:helper
action:@selector(callbackForQueue:events:)] autorelease];
- STAssertNil(testKQ, nil);
+ XCTAssertNil(testKQ);
}
- (void)spinForEvents:(GTMFSKQTestHelper *)helper {
@@ -201,11 +190,11 @@
NSFileManager *fm = [NSFileManager defaultManager];
GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease];
- STAssertNotNil(helper, nil);
+ XCTAssertNotNil(helper);
- STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil);
+ XCTAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil]);
NSFileHandle *testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_];
- STAssertNotNil(testFH, nil);
+ XCTAssertNotNil(testFH);
// Start monitoring the file
GTMFileSystemKQueue *testKQ
@@ -214,8 +203,8 @@
acrossReplace:YES
target:helper
action:@selector(callbackForQueue:events:)];
- STAssertNotNil(testKQ, nil);
- STAssertEqualObjects([testKQ path], testPath_, nil);
+ XCTAssertNotNil(testKQ);
+ XCTAssertEqualObjects([testKQ path], testPath_);
[helper setKQueue:testKQ];
// Write to the file
@@ -223,27 +212,27 @@
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 1, nil);
+ XCTAssertEqual([helper totals], 1);
// Close and delete
[testFH closeFile];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
NSError *error = nil;
- STAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
+ XCTAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
#else
- STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil);
+ XCTAssertTrue([fm removeFileAtPath:testPath_ handler:nil]);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
[self spinForEvents:helper];
- STAssertEquals([helper totals], 2, nil);
+ XCTAssertEqual([helper totals], 2);
// Clean up the kqueue
[testKQ release];
testKQ = nil;
- STAssertEquals([helper writes], 1, nil);
- STAssertEquals([helper deletes], 1, nil);
- STAssertEquals([helper renames], 0, nil);
+ XCTAssertEqual([helper writes], 1);
+ XCTAssertEqual([helper deletes], 1);
+ XCTAssertEqual([helper renames], 0);
}
- (void)testWriteAndDeleteAndWrite {
@@ -252,14 +241,14 @@
NSFileManager *fm = [NSFileManager defaultManager];
GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease];
- STAssertNotNil(helper, nil);
+ XCTAssertNotNil(helper);
GTMFSKQTestHelper *helper2 = [[[GTMFSKQTestHelper alloc] init] autorelease];
- STAssertNotNil(helper, nil);
+ XCTAssertNotNil(helper);
// Create a temp file path
- STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil);
+ XCTAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil]);
NSFileHandle *testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_];
- STAssertNotNil(testFH, nil);
+ XCTAssertNotNil(testFH);
// Start monitoring the file
GTMFileSystemKQueue *testKQ
@@ -268,8 +257,8 @@
acrossReplace:YES
target:helper
action:@selector(callbackForQueue:events:)];
- STAssertNotNil(testKQ, nil);
- STAssertEqualObjects([testKQ path], testPath_, nil);
+ XCTAssertNotNil(testKQ);
+ XCTAssertEqualObjects([testKQ path], testPath_);
[helper setKQueue:testKQ];
GTMFileSystemKQueue *testKQ2
@@ -278,8 +267,8 @@
acrossReplace:NO
target:helper2
action:@selector(callbackForQueue:events:)];
- STAssertNotNil(testKQ2, nil);
- STAssertEqualObjects([testKQ2 path], testPath_, nil);
+ XCTAssertNotNil(testKQ2);
+ XCTAssertEqualObjects([testKQ2 path], testPath_);
[helper2 setKQueue:testKQ2];
// Write to the file
@@ -287,49 +276,49 @@
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 1, nil);
- STAssertEquals([helper2 totals], 1, nil);
+ XCTAssertEqual([helper totals], 1);
+ XCTAssertEqual([helper2 totals], 1);
// Close and delete
[testFH closeFile];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
NSError *error = nil;
- STAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
+ XCTAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
#else
- STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil);
+ XCTAssertTrue([fm removeFileAtPath:testPath_ handler:nil]);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
// Recreate
- STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil);
+ XCTAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil]);
testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_];
- STAssertNotNil(testFH, nil);
+ XCTAssertNotNil(testFH);
[testFH writeData:[@"ha!" dataUsingEncoding:NSUnicodeStringEncoding]];
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 2, nil);
- STAssertEquals([helper2 totals], 2, nil);
+ XCTAssertEqual([helper totals], 2);
+ XCTAssertEqual([helper2 totals], 2);
// Write to it again
[testFH writeData:[@"continued..." dataUsingEncoding:NSUnicodeStringEncoding]];
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 3, nil);
- STAssertEquals([helper2 totals], 2, nil);
+ XCTAssertEqual([helper totals], 3);
+ XCTAssertEqual([helper2 totals], 2);
// Close and delete
[testFH closeFile];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- STAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
+ XCTAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
#else
- STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil);
+ XCTAssertTrue([fm removeFileAtPath:testPath_ handler:nil]);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 4, nil);
- STAssertEquals([helper2 totals], 2, nil);
+ XCTAssertEqual([helper totals], 4);
+ XCTAssertEqual([helper2 totals], 2);
// Clean up the kqueue
[testKQ release];
@@ -337,12 +326,12 @@
[testKQ2 release];
testKQ2 = nil;
- STAssertEquals([helper writes], 2, nil);
- STAssertEquals([helper deletes], 2, nil);
- STAssertEquals([helper renames], 0, nil);
- STAssertEquals([helper2 writes], 1, nil);
- STAssertEquals([helper2 deletes], 1, nil);
- STAssertEquals([helper2 renames], 0, nil);
+ XCTAssertEqual([helper writes], 2);
+ XCTAssertEqual([helper deletes], 2);
+ XCTAssertEqual([helper renames], 0);
+ XCTAssertEqual([helper2 writes], 1);
+ XCTAssertEqual([helper2 deletes], 1);
+ XCTAssertEqual([helper2 renames], 0);
}
- (void)testWriteAndRenameAndWrite {
@@ -351,14 +340,14 @@
NSFileManager *fm = [NSFileManager defaultManager];
GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease];
- STAssertNotNil(helper, nil);
+ XCTAssertNotNil(helper);
GTMFSKQTestHelper *helper2 = [[[GTMFSKQTestHelper alloc] init] autorelease];
- STAssertNotNil(helper2, nil);
+ XCTAssertNotNil(helper2);
// Create a temp file path
- STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil);
+ XCTAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil]);
NSFileHandle *testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_];
- STAssertNotNil(testFH, nil);
+ XCTAssertNotNil(testFH);
// Start monitoring the file
GTMFileSystemKQueue *testKQ
@@ -367,8 +356,8 @@
acrossReplace:YES
target:helper
action:@selector(callbackForQueue:events:)];
- STAssertNotNil(testKQ, nil);
- STAssertEqualObjects([testKQ path], testPath_, nil);
+ XCTAssertNotNil(testKQ);
+ XCTAssertEqualObjects([testKQ path], testPath_);
[helper setKQueue:testKQ];
GTMFileSystemKQueue *testKQ2
@@ -377,8 +366,8 @@
acrossReplace:NO
target:helper2
action:@selector(callbackForQueue:events:)];
- STAssertNotNil(testKQ2, nil);
- STAssertEqualObjects([testKQ2 path], testPath_, nil);
+ XCTAssertNotNil(testKQ2);
+ XCTAssertEqualObjects([testKQ2 path], testPath_);
[helper2 setKQueue:testKQ2];
// Write to the file
@@ -386,70 +375,70 @@
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 1, nil);
- STAssertEquals([helper2 totals], 1, nil);
+ XCTAssertEqual([helper totals], 1);
+ XCTAssertEqual([helper2 totals], 1);
// Move it and create the file again
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
NSError *error = nil;
- STAssertTrue([fm moveItemAtPath:testPath_ toPath:testPath2_ error:&error],
- @"Error: %@", error);
+ XCTAssertTrue([fm moveItemAtPath:testPath_ toPath:testPath2_ error:&error],
+ @"Error: %@", error);
#else
- STAssertTrue([fm movePath:testPath_ toPath:testPath2_ handler:nil], nil);
+ XCTAssertTrue([fm movePath:testPath_ toPath:testPath2_ handler:nil]);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil);
+ XCTAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil]);
NSFileHandle *testFHPrime
= [NSFileHandle fileHandleForWritingAtPath:testPath_];
- STAssertNotNil(testFHPrime, nil);
+ XCTAssertNotNil(testFHPrime);
[testFHPrime writeData:[@"eh?" dataUsingEncoding:NSUnicodeStringEncoding]];
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 2, nil);
- STAssertEquals([helper2 totals], 2, nil);
+ XCTAssertEqual([helper totals], 2);
+ XCTAssertEqual([helper2 totals], 2);
// Write to the new file
[testFHPrime writeData:[@"continue..." dataUsingEncoding:NSUnicodeStringEncoding]];
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 3, nil);
- STAssertEquals([helper2 totals], 2, nil);
+ XCTAssertEqual([helper totals], 3);
+ XCTAssertEqual([helper2 totals], 2);
// Write to the old file
[testFH writeData:[@"continue old..." dataUsingEncoding:NSUnicodeStringEncoding]];
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 3, nil);
- STAssertEquals([helper2 totals], 3, nil);
+ XCTAssertEqual([helper totals], 3);
+ XCTAssertEqual([helper2 totals], 3);
// and now close old
[testFH closeFile];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- STAssertTrue([fm removeItemAtPath:testPath2_ error:&error], @"Err: %@", error);
+ XCTAssertTrue([fm removeItemAtPath:testPath2_ error:&error], @"Err: %@", error);
#else
- STAssertTrue([fm removeFileAtPath:testPath2_ handler:nil], nil);
+ XCTAssertTrue([fm removeFileAtPath:testPath2_ handler:nil]);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 3, nil);
- STAssertEquals([helper2 totals], 4, nil);
+ XCTAssertEqual([helper totals], 3);
+ XCTAssertEqual([helper2 totals], 4);
// and now close new
[testFHPrime closeFile];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- STAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
+ XCTAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
#else
- STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil);
+ XCTAssertTrue([fm removeFileAtPath:testPath_ handler:nil]);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
// Spin the runloop for a second so that the helper callbacks fire
[self spinForEvents:helper];
- STAssertEquals([helper totals], 4, nil);
- STAssertEquals([helper2 totals], 4, nil);
+ XCTAssertEqual([helper totals], 4);
+ XCTAssertEqual([helper2 totals], 4);
// Clean up the kqueue
[testKQ release];
@@ -457,12 +446,12 @@
[testKQ2 release];
testKQ2 = nil;
- STAssertEquals([helper writes], 2, nil);
- STAssertEquals([helper deletes], 1, nil);
- STAssertEquals([helper renames], 1, nil);
- STAssertEquals([helper2 writes], 2, nil);
- STAssertEquals([helper2 deletes], 1, nil);
- STAssertEquals([helper2 renames], 1, nil);
+ XCTAssertEqual([helper writes], 2);
+ XCTAssertEqual([helper deletes], 1);
+ XCTAssertEqual([helper renames], 1);
+ XCTAssertEqual([helper2 writes], 2);
+ XCTAssertEqual([helper2 deletes], 1);
+ XCTAssertEqual([helper2 renames], 1);
}
- (void)testNoSpinHang {
@@ -480,10 +469,10 @@
NSFileManager *fm = [NSFileManager defaultManager];
GTMFSKQTestHelper *helper = [[[GTMFSKQTestHelper alloc] init] autorelease];
- STAssertNotNil(helper, nil);
- STAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil], nil);
+ XCTAssertNotNil(helper);
+ XCTAssertTrue([fm createFileAtPath:testPath_ contents:nil attributes:nil]);
NSFileHandle *testFH = [NSFileHandle fileHandleForWritingAtPath:testPath_];
- STAssertNotNil(testFH, nil);
+ XCTAssertNotNil(testFH);
// Start monitoring the file
GTMFileSystemKQueue *testKQ
@@ -492,8 +481,8 @@
acrossReplace:YES
target:helper
action:@selector(callbackForQueue:events:)];
- STAssertNotNil(testKQ, nil);
- STAssertEqualObjects([testKQ path], testPath_, nil);
+ XCTAssertNotNil(testKQ);
+ XCTAssertEqualObjects([testKQ path], testPath_);
[helper setKQueue:testKQ];
// Write to the file
@@ -502,20 +491,20 @@
[testFH closeFile];
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
NSError *error = nil;
- STAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
+ XCTAssertTrue([fm removeItemAtPath:testPath_ error:&error], @"Err: %@", error);
#else
- STAssertTrue([fm removeFileAtPath:testPath_ handler:nil], nil);
+ XCTAssertTrue([fm removeFileAtPath:testPath_ handler:nil]);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
// Now destroy the queue, with events outstanding from the CFSocket, but
// unconsumed.
- STAssertEquals([testKQ retainCount], (NSUInteger)1, nil);
+ XCTAssertEqual([testKQ retainCount], (NSUInteger)1);
[testKQ release];
testKQ = nil;
// Spin the runloop, no events were delivered (and we should not hang)
[self spinForEvents:helper];
- STAssertEquals([helper totals], 0, nil);
+ XCTAssertEqual([helper totals], 0);
}
@end
diff --git a/Foundation/GTMFourCharCode.h b/Foundation/GTMFourCharCode.h
deleted file mode 100644
index 90853b5..0000000
--- a/Foundation/GTMFourCharCode.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// GTMFourCharCode
-// Wrapper for FourCharCodes
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-
-// FourCharCodes are OSTypes, ResTypes etc. This class wraps them if
-// you need to store them in dictionaries etc.
-@interface GTMFourCharCode : NSObject <NSCopying, NSCoding> {
- FourCharCode code_;
-}
-
-// returns a string for a FourCharCode
-+ (id)stringWithFourCharCode:(FourCharCode)code;
-
-// String must be 4 chars or less, or you will get nil back.
-+ (id)fourCharCodeWithString:(NSString*)string;
-+ (id)fourCharCodeWithFourCharCode:(FourCharCode)code;
-
-// String must be 4 chars or less, or you will get nil back.
-- (id)initWithString:(NSString*)string;
-
-// Designated Initializer
-- (id)initWithFourCharCode:(FourCharCode)code;
-
-// Returns 'APPL' for "APPL"
-- (FourCharCode)fourCharCode;
-
-// For FourCharCode of 'APPL' returns "APPL". For 1 returns "\0\0\0\1"
-- (NSString*)stringValue;
-
-// For FourCharCode of "APPL" returns an NSNumber with 1095782476 (0x4150504C).
-// For 1 returns 1.
-- (NSNumber*)numberValue;
-
-@end
diff --git a/Foundation/GTMFourCharCode.m b/Foundation/GTMFourCharCode.m
deleted file mode 100644
index 02eea23..0000000
--- a/Foundation/GTMFourCharCode.m
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// GTMFourCharCode.m
-// Wrapper for FourCharCodes
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMDefines.h"
-#import "GTMFourCharCode.h"
-#import <CoreServices/CoreServices.h>
-
-@implementation GTMFourCharCode
-
-+ (id)stringWithFourCharCode:(FourCharCode)code {
- return GTMCFAutorelease(UTCreateStringForOSType(code));
-}
-
-+ (id)fourCharCodeWithString:(NSString*)string {
- return [[[self alloc] initWithString:string] autorelease];
-}
-
-+ (id)fourCharCodeWithFourCharCode:(FourCharCode)code {
- return [[[self alloc] initWithFourCharCode:code] autorelease];
-}
-
-- (id)initWithString:(NSString*)string {
- NSUInteger length = [string length];
- if (length == 0 || length > 4) {
- [self release];
- return nil;
- } else {
- return [self initWithFourCharCode:UTGetOSTypeFromString((CFStringRef)string)];
- }
-}
-
-- (id)initWithFourCharCode:(FourCharCode)code {
- if ((self = [super init])) {
- code_ = code;
- }
- return self;
-}
-
-- (id)initWithCoder:(NSCoder *)aDecoder {
- if ((self = [super init])) {
- code_ = [aDecoder decodeInt32ForKey:@"FourCharCode"];
- }
- return self;
-}
-
-- (void)encodeWithCoder:(NSCoder *)aCoder {
- [aCoder encodeInt32:code_ forKey:@"FourCharCode"];
-}
-
-- (id)copyWithZone:(NSZone *)zone {
- return [[[self class] alloc] initWithFourCharCode:code_];
-}
-
-- (BOOL)isEqual:(id)object {
- return [object isKindOfClass:[self class]] && [object fourCharCode] == code_;
-}
-
-- (NSUInteger)hash {
- return (NSUInteger)code_;
-}
-
-- (NSString *)description {
- return [NSString stringWithFormat:@"%@ - %@ (0x%lX)",
- [self class],
- [self stringValue],
- (unsigned long)code_];
-}
-
-- (FourCharCode)fourCharCode {
- return code_;
-}
-
-- (NSString*)stringValue {
- return GTMCFAutorelease(UTCreateStringForOSType(code_));
-}
-
-- (NSNumber*)numberValue {
- return [NSNumber numberWithUnsignedInt:code_];
-}
-
-@end
diff --git a/Foundation/GTMFourCharCodeTest.m b/Foundation/GTMFourCharCodeTest.m
deleted file mode 100644
index 1799629..0000000
--- a/Foundation/GTMFourCharCodeTest.m
+++ /dev/null
@@ -1,122 +0,0 @@
-//
-// GTMFourCharCodeTest.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMFourCharCode.h"
-
-@interface GTMFourCharCodeTest : GTMTestCase {
- @private
- NSString *lowAsciiString_;
- NSString *highMacOSRomanString_;
-}
-
-@end
-
-@implementation GTMFourCharCodeTest
-
-static const FourCharCode kGTMHighMacOSRomanCode = 0xA5A8A9AA; // '•®©™'
-
-- (void)setUp {
- // There appears to be a bug in the gcc 4.0 that is included with Xcode
- // 3.2.5 where in release mode it doesn't like some string constants
- // that include high or low ascii using the @"blah" string style.
- // So we build them by hand.
- // Use 8 bytes instead of 4, because stack protection gives us a warning
- // if we have a buffer smaller than 8 bytes.
- char string[8] = { 0, 0, 0, 1, 0, 0, 0, 0 };
- lowAsciiString_ = [[NSString alloc] initWithBytes:string
- length:4
- encoding:NSASCIIStringEncoding];
-
- // Must make sure our bytes are in the right order for building strings with,
- // otherwise the string comes out in the wrong order on low-endian systems.
- FourCharCode orderedString = htonl(kGTMHighMacOSRomanCode);
- highMacOSRomanString_
- = [[NSString alloc] initWithBytes:&orderedString
- length:sizeof(orderedString)
- encoding:NSMacOSRomanStringEncoding];
-}
-
-- (void)tearDown {
- [lowAsciiString_ release];
- [highMacOSRomanString_ release];
-}
-
-- (void)testFourCharCode {
- GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithString:@"APPL"];
- STAssertNotNil(fcc, nil);
- STAssertEqualObjects([fcc stringValue], @"APPL", nil);
- STAssertEqualObjects([fcc numberValue],
- [NSNumber numberWithUnsignedInt:'APPL'], nil);
- STAssertEquals([fcc fourCharCode], (FourCharCode)'APPL', nil);
-
- STAssertEqualObjects([fcc description],
- @"GTMFourCharCode - APPL (0x4150504C)", nil);
- STAssertEquals([fcc hash], (NSUInteger)'APPL', nil);
-
- NSData *data = [NSKeyedArchiver archivedDataWithRootObject:fcc];
- STAssertNotNil(data, nil);
- GTMFourCharCode *fcc2
- = (GTMFourCharCode*)[NSKeyedUnarchiver unarchiveObjectWithData:data];
- STAssertNotNil(fcc2, nil);
- STAssertEqualObjects(fcc, fcc2, nil);
-
- fcc = [[[GTMFourCharCode alloc] initWithFourCharCode:'\?\?\?\?'] autorelease];
- STAssertNotNil(fcc, nil);
- STAssertEqualObjects([fcc stringValue], @"????", nil);
- STAssertEqualObjects([fcc numberValue],
- [NSNumber numberWithUnsignedInt:'\?\?\?\?'], nil);
- STAssertEquals([fcc fourCharCode], (FourCharCode)'\?\?\?\?', nil);
-
- fcc = [[[GTMFourCharCode alloc] initWithString:@"????"] autorelease];
- STAssertNotNil(fcc, nil);
- STAssertEqualObjects([fcc stringValue], @"????", nil);
- STAssertEqualObjects([fcc numberValue],
- [NSNumber numberWithUnsignedInt:'\?\?\?\?'], nil);
- STAssertEquals([fcc fourCharCode], (FourCharCode)'\?\?\?\?', nil);
-
- fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:1];
- STAssertNotNil(fcc, nil);
- STAssertTrue([[fcc stringValue] isEqualToString:lowAsciiString_], nil);
- STAssertEqualObjects([fcc numberValue],
- [NSNumber numberWithUnsignedInt:1], nil);
- STAssertEquals([fcc fourCharCode], (FourCharCode)1, nil);
-
- fcc = [GTMFourCharCode fourCharCodeWithString:@"BADDSTRING"];
- STAssertNil(fcc, nil);
-
- fcc2 = [GTMFourCharCode fourCharCodeWithFourCharCode:kGTMHighMacOSRomanCode];
- STAssertNotNil(fcc2, nil);
- STAssertEqualObjects([fcc2 stringValue], highMacOSRomanString_, nil);
- STAssertEqualObjects([fcc2 numberValue],
- [NSNumber numberWithUnsignedInt:kGTMHighMacOSRomanCode],
- nil);
- STAssertEquals([fcc2 fourCharCode],
- (FourCharCode)kGTMHighMacOSRomanCode, nil);
-}
-
-- (void)testStringWithCode {
- STAssertEqualObjects([GTMFourCharCode stringWithFourCharCode:'APPL'],
- @"APPL", nil);
- STAssertEqualObjects([GTMFourCharCode stringWithFourCharCode:1],
- lowAsciiString_, nil);
- STAssertEqualObjects([GTMFourCharCode stringWithFourCharCode:kGTMHighMacOSRomanCode],
- highMacOSRomanString_, nil);
-}
-
-@end
diff --git a/Foundation/GTMGeometryUtilsTest.m b/Foundation/GTMGeometryUtilsTest.m
index f765526..f4cf731 100644
--- a/Foundation/GTMGeometryUtilsTest.m
+++ b/Foundation/GTMGeometryUtilsTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -28,49 +28,49 @@
- (void)testGTMNSRectToCGRect {
NSRect nsRect = NSMakeRect(4.6,3.2,22.1,45.0);
CGRect cgRect = GTMNSRectToCGRect(nsRect);
- STAssertTrue(CGRectEqualToRect(cgRect, *(CGRect*)&nsRect), nil);
+ XCTAssertTrue(CGRectEqualToRect(cgRect, *(CGRect*)&nsRect));
}
- (void)testGTMNSSizeToCGSize {
NSSize nsSize = {22,15};
CGSize cgSize = GTMNSSizeToCGSize(nsSize);
- STAssertTrue(CGSizeEqualToSize(cgSize, *(CGSize*)&nsSize), nil);
+ XCTAssertTrue(CGSizeEqualToSize(cgSize, *(CGSize*)&nsSize));
}
- (void)testGTMNSPointsOnRect {
NSRect rect = NSMakeRect(0, 0, 2, 2);
-
+
NSPoint point = GTMNSMidMinX(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)0.0, (CGFloat)0.01, nil);
-
+ XCTAssertEqualWithAccuracy(point.y, 1.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 0.0, 0.01);
+
point = GTMNSMidMaxX(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)2.0, (CGFloat)0.01, nil);
-
+ XCTAssertEqualWithAccuracy(point.y, 1.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 2.0, 0.01);
+
point = GTMNSMidMaxY(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)2.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil);
-
+ XCTAssertEqualWithAccuracy(point.y, 2.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 1.0, 0.01);
+
point = GTMNSMidMinY(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)0.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil);
+ XCTAssertEqualWithAccuracy(point.y, 0.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 1.0, 0.01);
point = GTMNSCenter(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil);
+ XCTAssertEqualWithAccuracy(point.y, 1.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 1.0, 0.01);
}
- (void)testGTMNSRectSize {
NSSize nsSize = GTMNSRectSize(NSMakeRect(1, 1, 10, 5));
- STAssertEqualsWithAccuracy(nsSize.width, (CGFloat)10.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(nsSize.height, (CGFloat)5.0, (CGFloat)0.01, nil);
+ XCTAssertEqualWithAccuracy(nsSize.width, 10.0, 0.01);
+ XCTAssertEqualWithAccuracy(nsSize.height, 5.0, 0.01);
}
- (void)testGTMNSRectOfSize {
NSRect outRect = GTMNSRectOfSize(NSMakeSize(10, 5));
NSRect expectedRect = NSMakeRect(0, 0, 10, 5);
- STAssertEquals(outRect, expectedRect, nil);
+ XCTAssertTrue(NSEqualRects(outRect, expectedRect));
}
- (void)testGTMNSAlignRectangles {
@@ -78,7 +78,7 @@
NSPoint expectedOrigin;
GTMRectAlignment alignment;
} TestData;
-
+
TestData data[] = {
{ {1,2}, GTMRectAlignTop },
{ {0,2}, GTMRectAlignTopLeft },
@@ -90,17 +90,17 @@
{ {2,1}, GTMRectAlignRight },
{ {1,1}, GTMRectAlignCenter },
};
-
+
NSRect rect1 = NSMakeRect(0, 0, 4, 4);
NSRect rect2 = NSMakeRect(0, 0, 2, 2);
-
+
NSRect expectedRect;
expectedRect.size = NSMakeSize(2, 2);
-
+
for (size_t i = 0; i < sizeof(data) / sizeof(TestData); i++) {
expectedRect.origin = data[i].expectedOrigin;
NSRect outRect = GTMNSAlignRectangles(rect2, rect1, data[i].alignment);
- STAssertEquals(outRect, expectedRect, nil);
+ XCTAssertTrue(NSEqualRects(outRect, expectedRect));
}
}
@@ -120,24 +120,25 @@
{ { 2.0, 2.0 }, { 2.0, 2.0 } },
{ { 0.0, 10.0 }, { 0.0, 0.0 } }
};
-
+
for (size_t i = 0; i < sizeof(tests) / sizeof(Test); ++i) {
NSRect result = GTMNSScaleRectangleToSize(rect, tests[i].size_,
GTMScaleProportionally);
- STAssertEquals(result, GTMNSRectOfSize(tests[i].newSize_), @"failed on test %zd", i);
+ XCTAssertTrue(NSEqualRects(result, GTMNSRectOfSize(tests[i].newSize_)),
+ @"failed on test %zd", i);
}
-
+
NSRect result = GTMNSScaleRectangleToSize(NSZeroRect, tests[0].size_,
GTMScaleProportionally);
- STAssertEquals(result, NSZeroRect, nil);
-
+ XCTAssertTrue(NSEqualRects(result, NSZeroRect));
+
result = GTMNSScaleRectangleToSize(rect, tests[0].size_,
GTMScaleToFit);
- STAssertEquals(result, GTMNSRectOfSize(tests[0].size_), nil);
-
+ XCTAssertTrue(NSEqualRects(result, GTMNSRectOfSize(tests[0].size_)));
+
result = GTMNSScaleRectangleToSize(rect, tests[0].size_,
GTMScaleNone);
- STAssertEquals(result, rect, nil);
+ XCTAssertTrue(NSEqualRects(result, rect));
}
@@ -147,20 +148,20 @@
GTMScaling scaling;
GTMRectAlignment alignment;
} TestData;
-
+
NSRect rect1 = NSMakeRect(0, 0, 4, 4);
NSRect rect2 = NSMakeRect(0, 0, 2, 1);
-
+
TestData data[] = {
{ NSMakeRect(2, 3, 2, 1), GTMScaleToFillProportionally, GTMRectAlignTopRight },
{ NSMakeRect(0, 0, 4, 4), GTMScaleToFit, GTMRectAlignCenter },
{ NSMakeRect(1, 1.5, 2, 1), GTMScaleNone, GTMRectAlignCenter },
{ NSMakeRect(1, 0, 2, 1), GTMScaleProportionally, GTMRectAlignBottom },
};
-
+
for (size_t i = 0; i < sizeof(data) / sizeof(TestData); i++) {
NSRect outRect = GTMNSScaleRectToRect(rect2, rect1, data[i].scaling, data[i].alignment);
- STAssertEquals(outRect, data[i].expectedRect, nil);
+ XCTAssertTrue(NSEqualRects(outRect, data[i].expectedRect));
}
}
@@ -168,18 +169,17 @@
- (void)testGTMNSDistanceBetweenPoints {
NSPoint pt1 = NSMakePoint(0, 0);
NSPoint pt2 = NSMakePoint(3, 4);
- STAssertEquals(GTMNSDistanceBetweenPoints(pt1, pt2), (CGFloat)5.0, nil);
- STAssertEquals(GTMNSDistanceBetweenPoints(pt2, pt1), (CGFloat)5.0, nil);
+ XCTAssertEqualWithAccuracy(GTMNSDistanceBetweenPoints(pt1, pt2), 5.0, 0.01);
+ XCTAssertEqualWithAccuracy(GTMNSDistanceBetweenPoints(pt2, pt1), 5.0, 0.01);
pt1 = NSMakePoint(1, 1);
pt2 = NSMakePoint(1, 1);
- STAssertEquals(GTMNSDistanceBetweenPoints(pt1, pt2), (CGFloat)0.0, nil);
+ XCTAssertEqualWithAccuracy(GTMNSDistanceBetweenPoints(pt1, pt2), 0.0, 0.01);
}
- (void)testGTMNSRectScaling {
NSRect rect = NSMakeRect(1.0f, 2.0f, 5.0f, 10.0f);
- NSRect rect2 = NSMakeRect((CGFloat)1.0, (CGFloat)2.0, (CGFloat)1.0, (CGFloat)12.0);
- STAssertEquals(GTMNSRectScale(rect, (CGFloat)0.2, (CGFloat)1.2),
- rect2, nil);
+ NSRect rect2 = NSMakeRect(1.0, 2.0, 1.0, 12.0);
+ XCTAssertTrue(NSEqualRects(GTMNSRectScale(rect, 0.2, 1.2), rect2));
}
#endif // !GTM_IPHONE_SDK
@@ -187,11 +187,11 @@
- (void)testGTMCGDistanceBetweenPoints {
CGPoint pt1 = CGPointMake(0, 0);
CGPoint pt2 = CGPointMake(3, 4);
- STAssertEquals(GTMCGDistanceBetweenPoints(pt1, pt2), (CGFloat)5.0, nil);
- STAssertEquals(GTMCGDistanceBetweenPoints(pt2, pt1), (CGFloat)5.0, nil);
+ XCTAssertEqualWithAccuracy(GTMCGDistanceBetweenPoints(pt1, pt2), 5.0, 0.01);
+ XCTAssertEqualWithAccuracy(GTMCGDistanceBetweenPoints(pt2, pt1), 5.0, 0.01);
pt1 = CGPointMake(1, 1);
pt2 = CGPointMake(1, 1);
- STAssertEquals(GTMCGDistanceBetweenPoints(pt1, pt2), (CGFloat)0.0, nil);
+ XCTAssertEqualWithAccuracy(GTMCGDistanceBetweenPoints(pt1, pt2), 0.0, 0.01);
}
- (void)testGTMCGAlignRectangles {
@@ -199,7 +199,7 @@
CGPoint expectedOrigin;
GTMRectAlignment alignment;
} TestData;
-
+
TestData data[] = {
{ {1,2}, GTMRectAlignTop },
{ {0,2}, GTMRectAlignTopLeft },
@@ -211,61 +211,60 @@
{ {2,1}, GTMRectAlignRight },
{ {1,1}, GTMRectAlignCenter },
};
-
+
CGRect rect1 = CGRectMake(0, 0, 4, 4);
CGRect rect2 = CGRectMake(0, 0, 2, 2);
-
+
CGRect expectedRect;
expectedRect.size = CGSizeMake(2, 2);
-
+
for (size_t i = 0; i < sizeof(data) / sizeof(TestData); i++) {
expectedRect.origin = data[i].expectedOrigin;
CGRect outRect = GTMCGAlignRectangles(rect2, rect1, data[i].alignment);
- STAssertEquals(outRect, expectedRect, nil);
+ XCTAssertTrue(CGRectEqualToRect(outRect, expectedRect));
}
}
- (void)testGTMCGPointsOnRect {
CGRect rect = CGRectMake(0, 0, 2, 2);
-
+
CGPoint point = GTMCGMidMinX(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)0.0, (CGFloat)0.01, nil);
-
+ XCTAssertEqualWithAccuracy(point.y, 1.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 0.0, 0.01);
+
point = GTMCGMidMaxX(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)2.0, (CGFloat)0.01, nil);
-
+ XCTAssertEqualWithAccuracy(point.y, 1.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 2.0, 0.01);
+
point = GTMCGMidMaxY(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)2.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil);
-
+ XCTAssertEqualWithAccuracy(point.y, 2.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 1.0, 0.01);
+
point = GTMCGMidMinY(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)0.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil);
-
+ XCTAssertEqualWithAccuracy(point.y, 0.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 1.0, 0.01);
+
point = GTMCGCenter(rect);
- STAssertEqualsWithAccuracy(point.y, (CGFloat)1.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(point.x, (CGFloat)1.0, (CGFloat)0.01, nil);
+ XCTAssertEqualWithAccuracy(point.y, 1.0, 0.01);
+ XCTAssertEqualWithAccuracy(point.x, 1.0, 0.01);
}
- (void)testGTMCGRectSize {
CGSize cgSize = GTMCGRectSize(CGRectMake(1, 1, 10, 5));
- STAssertEqualsWithAccuracy(cgSize.width, (CGFloat)10.0, (CGFloat)0.01, nil);
- STAssertEqualsWithAccuracy(cgSize.height, (CGFloat)5.0, (CGFloat)0.01, nil);
+ XCTAssertEqualWithAccuracy(cgSize.width, 10.0, 0.01);
+ XCTAssertEqualWithAccuracy(cgSize.height, 5.0, 0.01);
}
- (void)testGTMCGRectOfSize {
CGRect outRect = GTMCGRectOfSize(CGSizeMake(10, 5));
CGRect expectedRect = CGRectMake(0, 0, 10, 5);
- STAssertEquals(outRect, expectedRect, nil);
+ XCTAssertTrue(CGRectEqualToRect(outRect, expectedRect));
}
- (void)testGTMCGRectScaling {
CGRect rect = CGRectMake(1.0f, 2.0f, 5.0f, 10.0f);
- CGRect rect2 = CGRectMake((CGFloat)1.0, (CGFloat)2.0, (CGFloat)1.0, (CGFloat)12.0);
- STAssertEquals(GTMCGRectScale(rect, (CGFloat)0.2, (CGFloat)1.2),
- rect2, nil);
+ CGRect rect2 = CGRectMake(1.0, 2.0, 1.0, 12.0);
+ XCTAssertTrue(CGRectEqualToRect(GTMCGRectScale(rect, 0.2, 1.2), rect2));
}
- (void)testGTMCGScaleRectangleToSize {
@@ -284,24 +283,25 @@
{ { 2.0, 2.0 }, { 2.0, 2.0 } },
{ { 0.0, 10.0 }, { 0.0, 0.0 } }
};
-
+
for (size_t i = 0; i < sizeof(tests) / sizeof(Test); ++i) {
CGRect result = GTMCGScaleRectangleToSize(rect, tests[i].size_,
GTMScaleProportionally);
- STAssertEquals(result, GTMCGRectOfSize(tests[i].newSize_), @"failed on test %zd", i);
+ XCTAssertTrue(CGRectEqualToRect(result, GTMCGRectOfSize(tests[i].newSize_)),
+ @"failed on test %zd", i);
}
-
+
CGRect result = GTMCGScaleRectangleToSize(CGRectZero, tests[0].size_,
GTMScaleProportionally);
- STAssertEquals(result, CGRectZero, nil);
-
+ XCTAssertTrue(CGRectEqualToRect(result, CGRectZero));
+
result = GTMCGScaleRectangleToSize(rect, tests[0].size_,
GTMScaleToFit);
- STAssertEquals(result, GTMCGRectOfSize(tests[0].size_), nil);
-
+ XCTAssertTrue(CGRectEqualToRect(result, GTMCGRectOfSize(tests[0].size_)));
+
result = GTMCGScaleRectangleToSize(rect, tests[0].size_,
GTMScaleNone);
- STAssertEquals(result, rect, nil);
+ XCTAssertTrue(CGRectEqualToRect(result, rect));
}
@end
diff --git a/Foundation/GTMLightweightProxyTest.m b/Foundation/GTMLightweightProxyTest.m
index 03a1979..cdf29b6 100644
--- a/Foundation/GTMLightweightProxyTest.m
+++ b/Foundation/GTMLightweightProxyTest.m
@@ -37,59 +37,59 @@
- (void)testInit {
id proxy = [[[GTMLightweightProxy alloc]
initWithRepresentedObject:self] autorelease];
- STAssertNotNil(proxy, nil);
+ XCTAssertNotNil(proxy);
proxy = [[[GTMLightweightProxy alloc] init] autorelease];
- STAssertNotNil(proxy, nil);
+ XCTAssertNotNil(proxy);
}
- (void)testProxy {
id proxy
= [[[GTMLightweightProxy alloc] initWithRepresentedObject:self] autorelease];
- STAssertEqualObjects(self, [proxy representedObject],
- @"Represented object setup failed");
+ XCTAssertEqualObjects(self, [proxy representedObject],
+ @"Represented object setup failed");
// Check that it identifies itself as a proxy.
- STAssertTrue([proxy isProxy], @"Should identify as a proxy");
+ XCTAssertTrue([proxy isProxy], @"Should identify as a proxy");
// Check that it passes class requests on
- STAssertTrue([proxy isMemberOfClass:[self class]],
- @"Should pass class requests through");
+ XCTAssertTrue([proxy isMemberOfClass:[self class]],
+ @"Should pass class requests through");
// Check that it claims to respond to its selectors.
- STAssertTrue([proxy respondsToSelector:@selector(initWithRepresentedObject:)],
- @"Claims not to respond to initWithRepresentedObject:");
- STAssertTrue([proxy respondsToSelector:@selector(representedObject)],
- @"Claims not to respond to representedObject:");
- STAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
- @"Claims not to respond to setRepresentedObject:");
+ XCTAssertTrue([proxy respondsToSelector:@selector(initWithRepresentedObject:)],
+ @"Claims not to respond to initWithRepresentedObject:");
+ XCTAssertTrue([proxy respondsToSelector:@selector(representedObject)],
+ @"Claims not to respond to representedObject:");
+ XCTAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
+ @"Claims not to respond to setRepresentedObject:");
// Check that it responds to its represented object's selectors
- STAssertTrue([proxy respondsToSelector:@selector(returnYes)],
- @"Claims not to respond to returnYes");
+ XCTAssertTrue([proxy respondsToSelector:@selector(returnYes)],
+ @"Claims not to respond to returnYes");
// ... but not to made up selectors.
#if !(__IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_3_2 || __IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_4_0)
// Exceptions thrown by - (void)doesNotRecognizeSelector:(SEL)aSelector
// does not get caught on iOS 3.2 and greater.
// http://openradar.appspot.com/radar?id=420401
- STAssertThrows([proxy someMadeUpMethod],
- @"Calling a bogus method should throw");
+ XCTAssertThrows([proxy someMadeUpMethod],
+ @"Calling a bogus method should throw");
#endif
// Check that callthrough works.
- STAssertTrue([proxy returnYes],
- @"Calling through to the represented object failed");
+ XCTAssertTrue([proxy returnYes],
+ @"Calling through to the represented object failed");
// Check that nilling out the represented object works.
[proxy setRepresentedObject:nil];
- STAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
- @"Claims not to respond to setRepresentedObject: after nilling"
- @" out represented object");
- STAssertFalse([proxy respondsToSelector:@selector(returnYes)],
- @"Claims to respond to returnYes after nilling out represented"
- @" object");
+ XCTAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
+ @"Claims not to respond to setRepresentedObject: after nilling"
+ @" out represented object");
+ XCTAssertFalse([proxy respondsToSelector:@selector(returnYes)],
+ @"Claims to respond to returnYes after nilling out represented"
+ @" object");
// Calling through once the represented object is nil should fail silently
- STAssertNoThrow([proxy returnYes],
- @"Calling through without a represented object should fail"
- @" silently");
+ XCTAssertNoThrow([proxy returnYes],
+ @"Calling through without a represented object should fail"
+ @" silently");
// ... even when they are made up.
#if !(__IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_3_2 || __IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_4_0)
@@ -97,8 +97,8 @@
// does not get caught on iOS 3.2 and greater.
// http://openradar.appspot.com/radar?id=420401
- STAssertNoThrow([proxy someMadeUpMethod],
- @"Calling a bogus method on a nilled proxy should not throw");
+ XCTAssertNoThrow([proxy someMadeUpMethod],
+ @"Calling a bogus method on a nilled proxy should not throw");
#endif
}
diff --git a/Foundation/GTMLogger+ASLTest.m b/Foundation/GTMLogger+ASLTest.m
index 2756bfc..db85d70 100644
--- a/Foundation/GTMLogger+ASLTest.m
+++ b/Foundation/GTMLogger+ASLTest.m
@@ -57,10 +57,10 @@ static NSMutableArray *gDummyLog; // weak
- (void)testCreation {
GTMLogger *aslLogger = [GTMLogger standardLoggerWithASL];
- STAssertNotNil(aslLogger, nil);
+ XCTAssertNotNil(aslLogger);
GTMLogASLWriter *writer = [GTMLogASLWriter aslWriter];
- STAssertNotNil(writer, nil);
+ XCTAssertNotNil(writer);
}
- (void)testLogWriter {
@@ -71,8 +71,8 @@ static NSMutableArray *gDummyLog; // weak
autorelease];
- STAssertNotNil(writer, nil);
- STAssertEquals([gDummyLog count], (NSUInteger)0, nil);
+ XCTAssertNotNil(writer);
+ XCTAssertEqual([gDummyLog count], (NSUInteger)0);
// Log some messages
[writer logMessage:@"unknown" level:kGTMLoggerLevelUnknown];
@@ -93,7 +93,7 @@ static NSMutableArray *gDummyLog; // weak
@"-assert-1",
nil];
- STAssertEqualObjects(gDummyLog, expected, nil);
+ XCTAssertEqualObjects(gDummyLog, expected);
[gDummyLog removeAllObjects];
// Same test with facility
@@ -102,8 +102,8 @@ static NSMutableArray *gDummyLog; // weak
facility:@"testfac"] autorelease];
- STAssertNotNil(writer, nil);
- STAssertEquals([gDummyLog count], (NSUInteger)0, nil);
+ XCTAssertNotNil(writer);
+ XCTAssertEqual([gDummyLog count], (NSUInteger)0);
[writer logMessage:@"unknown" level:kGTMLoggerLevelUnknown];
[writer logMessage:@"debug" level:kGTMLoggerLevelDebug];
@@ -117,14 +117,14 @@ static NSMutableArray *gDummyLog; // weak
@"testfac-error-3",
@"testfac-assert-1",
nil];
- STAssertEqualObjects(gDummyLog, expected, nil);
+ XCTAssertEqualObjects(gDummyLog, expected);
gDummyLog = nil;
}
- (void)testASLClient {
GTMLoggerASLClient *client = [[GTMLoggerASLClient alloc] init];
- STAssertNotNil(client, nil);
+ XCTAssertNotNil(client);
[client release];
}
diff --git a/Foundation/GTMLogger.m b/Foundation/GTMLogger.m
index 3ace20f..e6b2ba1 100644
--- a/Foundation/GTMLogger.m
+++ b/Foundation/GTMLogger.m
@@ -367,7 +367,7 @@ static GTMLogger *gSharedLogger = nil;
- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
@synchronized(self) {
id<GTMLogWriter> child = nil;
- GTM_FOREACH_OBJECT(child, self) {
+ for (child in self) {
if ([child conformsToProtocol:@protocol(GTMLogWriter)])
[child logMessage:msg level:level];
}
diff --git a/Foundation/GTMLoggerRingBufferWriterTest.m b/Foundation/GTMLoggerRingBufferWriterTest.m
index 1c5d72b..73cc306 100644
--- a/Foundation/GTMLoggerRingBufferWriterTest.m
+++ b/Foundation/GTMLoggerRingBufferWriterTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,7 +19,6 @@
#import "GTMSenTestCase.h"
#import "GTMLoggerRingBufferWriter.h"
#import "GTMLogger.h"
-#import "GTMUnitTestDevLog.h"
// --------------------------------------------------
// CountingWriter keeps a count of the number of times it has been
@@ -87,16 +86,16 @@
line:(int)line {
NSArray *loggedContents = [writer loggedContents];
- STAssertEquals([expected count], [loggedContents count],
+ XCTAssertEqual([expected count], [loggedContents count],
@"count mismatch from line %d", line);
for (unsigned int i = 0; i < [expected count]; i++) {
- STAssertEqualObjects([expected objectAtIndex:i],
- [loggedContents objectAtIndex:i],
- @"logging mistmatch at index %d from line %d",
- i, line);
+ XCTAssertEqualObjects([expected objectAtIndex:i],
+ [loggedContents objectAtIndex:i],
+ @"logging mistmatch at index %d from line %d",
+ i, line);
}
-
+
} // compareWithExpectedLogging
@@ -118,24 +117,24 @@
GTMLoggerRingBufferWriter *writer =
[GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:32
writer:countingWriter_];
- STAssertEquals([writer capacity], (NSUInteger)32, nil);
- STAssertTrue([writer writer] == countingWriter_, nil);
- STAssertEquals([writer count], (NSUInteger)0, nil);
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
- STAssertEquals([writer totalLogged], (NSUInteger)0, nil);
+ XCTAssertEqual([writer capacity], (NSUInteger)32);
+ XCTAssertTrue([writer writer] == countingWriter_);
+ XCTAssertEqual([writer count], (NSUInteger)0);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
+ XCTAssertEqual([writer totalLogged], (NSUInteger)0);
// Try with invalid arguments. Should always get nil back.
writer =
[GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:0
writer:countingWriter_];
- STAssertNil(writer, nil);
+ XCTAssertNil(writer);
writer = [GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:32
writer:nil];
- STAssertNil(writer, nil);
+ XCTAssertNil(writer);
writer = [[GTMLoggerRingBufferWriter alloc] init];
- STAssertNil(writer, nil);
+ XCTAssertNil(writer);
} // testCreation
@@ -145,31 +144,31 @@
[GTMLoggerRingBufferWriter ringBufferWriterWithCapacity:4
writer:countingWriter_];
[logger_ setWriter:writer];
-
+
// Shouldn't do anything if there are no contents.
[writer dumpContents];
- STAssertEquals([writer count], (NSUInteger)0, nil);
- STAssertEquals([countingWriter_ count], (NSUInteger)0, nil);
+ XCTAssertEqual([writer count], (NSUInteger)0);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)0);
// Log a single item. Make sure the counts are accurate.
[logger_ logDebug:@"oop"];
- STAssertEquals([writer count], (NSUInteger)1, nil);
- STAssertEquals([writer totalLogged], (NSUInteger)1, nil);
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
- STAssertEquals([countingWriter_ count], (NSUInteger)0, nil);
+ XCTAssertEqual([writer count], (NSUInteger)1);
+ XCTAssertEqual([writer totalLogged], (NSUInteger)1);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)0);
// Log a second item. Also make sure counts are accurate.
[logger_ logDebug:@"ack"];
- STAssertEquals([writer count], (NSUInteger)2, nil);
- STAssertEquals([writer totalLogged], (NSUInteger)2, nil);
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
- STAssertEquals([countingWriter_ count], (NSUInteger)0, nil);
+ XCTAssertEqual([writer count], (NSUInteger)2);
+ XCTAssertEqual([writer totalLogged], (NSUInteger)2);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)0);
// Print them, and make sure the countingWriter sees the right stuff.
[writer dumpContents];
- STAssertEquals([countingWriter_ count], (NSUInteger)2, nil);
- STAssertEquals([writer count], (NSUInteger)2, nil); // Should not be zeroed.
- STAssertEquals([writer totalLogged], (NSUInteger)2, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)2);
+ XCTAssertEqual([writer count], (NSUInteger)2); // Should not be zeroed.
+ XCTAssertEqual([writer totalLogged], (NSUInteger)2);
[self compareWriter:countingWriter_
withExpectedLogging:[NSArray arrayWithObjects:@"oop",@"ack", nil]
@@ -179,18 +178,18 @@
// Wipe the slates clean.
[writer reset];
[countingWriter_ reset];
- STAssertEquals([writer count], (NSUInteger)0, nil);
- STAssertEquals([writer totalLogged], (NSUInteger)0, nil);
+ XCTAssertEqual([writer count], (NSUInteger)0);
+ XCTAssertEqual([writer totalLogged], (NSUInteger)0);
// An error log level should print the buffer and empty it.
[logger_ logDebug:@"oop"];
[logger_ logInfo:@"ack"];
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
- STAssertEquals([writer totalLogged], (NSUInteger)2, nil);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
+ XCTAssertEqual([writer totalLogged], (NSUInteger)2);
[logger_ logError:@"blargh"];
- STAssertEquals([countingWriter_ count], (NSUInteger)3, nil);
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)3);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
[self compareWriter:countingWriter_
withExpectedLogging:[NSArray arrayWithObjects:@"oop", @"ack",
@@ -204,13 +203,13 @@
[logger_ logDebug:@"oop"];
[logger_ logInfo:@"ack"];
[logger_ logDebug:@"blargh"];
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
- STAssertEquals([writer count], (NSUInteger)3, nil);
- STAssertEquals([writer totalLogged], (NSUInteger)3, nil);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
+ XCTAssertEqual([writer count], (NSUInteger)3);
+ XCTAssertEqual([writer totalLogged], (NSUInteger)3);
[logger_ logAssert:@"ouch"];
- STAssertEquals([countingWriter_ count], (NSUInteger)4, nil);
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)4);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
[self compareWriter:countingWriter_
withExpectedLogging:[NSArray arrayWithObjects:@"oop", @"ack",
@"blargh", @"ouch", nil]
@@ -223,11 +222,11 @@
[logger_ logDebug:@"oop"];
[logger_ logDebug:@"blargh"];
[logger_ logDebug:@"flong"]; // Fills buffer
- STAssertEquals([writer droppedLogCount], (NSUInteger)0, nil);
- STAssertEquals([writer count], (NSUInteger)4, nil);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)0);
+ XCTAssertEqual([writer count], (NSUInteger)4);
[logger_ logAssert:@"ouch"]; // should drop "ack"
- STAssertEquals([countingWriter_ count], (NSUInteger)4, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)4);
[self compareWriter:countingWriter_
withExpectedLogging:[NSArray arrayWithObjects:@"oop", @"blargh",
@@ -242,11 +241,11 @@
[logger_ logDebug:@"blargh"];
[logger_ logDebug:@"flong"]; // Fills buffer
[logger_ logDebug:@"bloogie"]; // should drop "ack"
- STAssertEquals([writer droppedLogCount], (NSUInteger)1, nil);
- STAssertEquals([writer count], (NSUInteger)4, nil);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)1);
+ XCTAssertEqual([writer count], (NSUInteger)4);
[logger_ logAssert:@"ouch"]; // should drop "oop"
- STAssertEquals([countingWriter_ count], (NSUInteger)4, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)4);
[self compareWriter:countingWriter_
withExpectedLogging:[NSArray arrayWithObjects:@"blargh",
@@ -264,22 +263,22 @@
[logger_ setWriter:writer];
[logger_ logInfo:@"ack"];
- STAssertEquals([countingWriter_ count], (NSUInteger)0, nil);
- STAssertEquals([writer count], (NSUInteger)1, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)0);
+ XCTAssertEqual([writer count], (NSUInteger)1);
[writer dumpContents];
- STAssertEquals([countingWriter_ count], (NSUInteger)1, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)1);
[self compareWriter:countingWriter_
- withExpectedLogging:[NSArray arrayWithObjects:@"ack", nil]
+ withExpectedLogging:[NSArray arrayWithObject:@"ack"]
line:__LINE__];
[logger_ logDebug:@"oop"]; // should drop "ack"
- STAssertEquals([writer count], (NSUInteger)1, nil);
- STAssertEquals([writer droppedLogCount], (NSUInteger)1, nil);
+ XCTAssertEqual([writer count], (NSUInteger)1);
+ XCTAssertEqual([writer droppedLogCount], (NSUInteger)1);
[countingWriter_ reset];
[logger_ logError:@"snoogy"]; // should drop "oop"
- STAssertEquals([countingWriter_ count], (NSUInteger)1, nil);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)1);
[self compareWriter:countingWriter_
withExpectedLogging:[NSArray arrayWithObjects:@"snoogy", nil]
@@ -289,7 +288,7 @@
-// Run 10 threads, all logging through the same logger.
+// Run 10 threads, all logging through the same logger.
static volatile NSUInteger gStoppedThreads = 0; // Total number that have stopped.
@@ -343,15 +342,15 @@ static volatile NSUInteger gStoppedThreads = 0; // Total number that have stoppe
}
// Now make sure we get back what's expected.
- STAssertEquals([writer count], kThreadCount, nil);
- STAssertEquals([countingWriter_ count], (NSUInteger)0, nil); // Nothing should be logged
- STAssertEquals([writer totalLogged], (NSUInteger)420, nil);
+ XCTAssertEqual([writer count], kThreadCount);
+ XCTAssertEqual([countingWriter_ count], (NSUInteger)0); // Nothing should be logged
+ XCTAssertEqual([writer totalLogged], (NSUInteger)420);
[logger_ logError:@"bork"];
- STAssertEquals([countingWriter_ count], kCapacity, nil);
-
+ XCTAssertEqual([countingWriter_ count], kCapacity);
+
NSArray *expected = [NSArray arrayWithObjects:
- @"ack", @"ack", @"ack", @"ack", @"ack",
+ @"ack", @"ack", @"ack", @"ack", @"ack",
@"ack", @"ack", @"ack", @"ack", @"bork",
nil];
[self compareWriter:countingWriter_
diff --git a/Foundation/GTMLoggerTest.m b/Foundation/GTMLoggerTest.m
index bea75b2..6ce60bd 100644
--- a/Foundation/GTMLoggerTest.m
+++ b/Foundation/GTMLoggerTest.m
@@ -112,22 +112,14 @@
- (void)setUp {
path_ = [[NSTemporaryDirectory() stringByAppendingPathComponent:
@"GTMLoggerUnitTest.log"] retain];
- STAssertNotNil(path_, nil);
+ XCTAssertNotNil(path_);
// Make sure we're cleaned up from the last run
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
- [[NSFileManager defaultManager] removeFileAtPath:path_ handler:nil];
-#else
[[NSFileManager defaultManager] removeItemAtPath:path_ error:NULL];
-#endif
}
- (void)tearDown {
- STAssertNotNil(path_, nil);
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
- [[NSFileManager defaultManager] removeFileAtPath:path_ handler:nil];
-#else
+ XCTAssertNotNil(path_);
[[NSFileManager defaultManager] removeItemAtPath:path_ error:NULL];
-#endif
[path_ release];
path_ = nil;
}
@@ -138,58 +130,58 @@
logger1 = [GTMLogger sharedLogger];
logger2 = [GTMLogger sharedLogger];
- STAssertTrue(logger1 == logger2, nil);
+ XCTAssertTrue(logger1 == logger2);
- STAssertNotNil([logger1 writer], nil);
- STAssertNotNil([logger1 formatter], nil);
- STAssertNotNil([logger1 filter], nil);
+ XCTAssertNotNil([logger1 writer]);
+ XCTAssertNotNil([logger1 formatter]);
+ XCTAssertNotNil([logger1 filter]);
// Get a new instance; not the shared instance
logger2 = [GTMLogger standardLogger];
- STAssertTrue(logger1 != logger2, nil);
- STAssertNotNil([logger2 writer], nil);
- STAssertNotNil([logger2 formatter], nil);
- STAssertNotNil([logger2 filter], nil);
+ XCTAssertTrue(logger1 != logger2);
+ XCTAssertNotNil([logger2 writer]);
+ XCTAssertNotNil([logger2 formatter]);
+ XCTAssertNotNil([logger2 filter]);
// Set the new instance to be the shared logger.
[GTMLogger setSharedLogger:logger2];
- STAssertTrue(logger2 == [GTMLogger sharedLogger], nil);
- STAssertTrue(logger1 != [GTMLogger sharedLogger], nil);
+ XCTAssertTrue(logger2 == [GTMLogger sharedLogger]);
+ XCTAssertTrue(logger1 != [GTMLogger sharedLogger]);
// Set the shared logger to nil, which should reset it to a new "standard"
// logger.
[GTMLogger setSharedLogger:nil];
- STAssertNotNil([GTMLogger sharedLogger], nil);
- STAssertTrue(logger2 != [GTMLogger sharedLogger], nil);
- STAssertTrue(logger1 != [GTMLogger sharedLogger], nil);
+ XCTAssertNotNil([GTMLogger sharedLogger]);
+ XCTAssertTrue(logger2 != [GTMLogger sharedLogger]);
+ XCTAssertTrue(logger1 != [GTMLogger sharedLogger]);
GTMLogger *logger = [GTMLogger logger];
- STAssertNotNil(logger, nil);
+ XCTAssertNotNil(logger);
logger = [GTMLogger standardLoggerWithStderr];
- STAssertNotNil(logger, nil);
+ XCTAssertNotNil(logger);
logger = [GTMLogger standardLoggerWithPath:path_];
- STAssertNotNil(logger, nil);
+ XCTAssertNotNil(logger);
}
- (void)testAccessors {
GTMLogger *logger = [GTMLogger standardLogger];
- STAssertNotNil(logger, nil);
+ XCTAssertNotNil(logger);
- STAssertNotNil([logger writer], nil);
- STAssertNotNil([logger formatter], nil);
- STAssertNotNil([logger filter], nil);
+ XCTAssertNotNil([logger writer]);
+ XCTAssertNotNil([logger formatter]);
+ XCTAssertNotNil([logger filter]);
[logger setWriter:nil];
[logger setFormatter:nil];
[logger setFilter:nil];
// These attributes should NOT be nil. They should be set to their defaults.
- STAssertNotNil([logger writer], nil);
- STAssertNotNil([logger formatter], nil);
- STAssertNotNil([logger filter], nil);
+ XCTAssertNotNil([logger writer]);
+ XCTAssertNotNil([logger formatter]);
+ XCTAssertNotNil([logger filter]);
}
- (void)testLogger {
@@ -212,7 +204,7 @@
formatter:nil // basic formatter
filter:filter];
- STAssertNotNil(logger, nil);
+ XCTAssertNotNil(logger);
// Log a few messages to test with
[logger logInfo:@"hi"];
@@ -222,22 +214,22 @@
// Makes sure the messages got logged
NSArray *messages = [writer messages];
- STAssertNotNil(messages, nil);
- STAssertEquals([messages count], (NSUInteger)4, nil);
- STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
- STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
- STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
- STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil);
+ XCTAssertNotNil(messages);
+ XCTAssertEqual([messages count], (NSUInteger)4);
+ XCTAssertEqualObjects([messages objectAtIndex:0], @"hi");
+ XCTAssertEqualObjects([messages objectAtIndex:1], @"foo");
+ XCTAssertEqualObjects([messages objectAtIndex:2], @"blah");
+ XCTAssertEqualObjects([messages objectAtIndex:3], @"baz");
// Log a message that should be ignored, and make sure it did NOT get logged
[logger logInfo:@"please ignore this"];
messages = [writer messages];
- STAssertNotNil(messages, nil);
- STAssertEquals([messages count], (NSUInteger)4, nil);
- STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
- STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
- STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
- STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil);
+ XCTAssertNotNil(messages);
+ XCTAssertEqual([messages count], (NSUInteger)4);
+ XCTAssertEqualObjects([messages objectAtIndex:0], @"hi");
+ XCTAssertEqualObjects([messages objectAtIndex:1], @"foo");
+ XCTAssertEqualObjects([messages objectAtIndex:2], @"blah");
+ XCTAssertEqualObjects([messages objectAtIndex:3], @"baz");
// Change the formatter to our "dumb formatter"
id<GTMLogFormatter> formatter = [[[DumbFormatter alloc] init] autorelease];
@@ -245,14 +237,14 @@
[logger logInfo:@"bleh"];
messages = [writer messages];
- STAssertNotNil(messages, nil);
- STAssertEquals([messages count], (NSUInteger)5, nil); // Message count should increase
+ XCTAssertNotNil(messages);
+ XCTAssertEqual([messages count], (NSUInteger)5); // Message count should increase
// The previously logged messages should not change
- STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
- STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
- STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
- STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil);
- STAssertEqualObjects([messages objectAtIndex:4], @"DUMB [2] bleh", nil);
+ XCTAssertEqualObjects([messages objectAtIndex:0], @"hi");
+ XCTAssertEqualObjects([messages objectAtIndex:1], @"foo");
+ XCTAssertEqualObjects([messages objectAtIndex:2], @"blah");
+ XCTAssertEqualObjects([messages objectAtIndex:3], @"baz");
+ XCTAssertEqualObjects([messages objectAtIndex:4], @"DUMB [2] bleh");
}
- (void)testConvenienceMacros {
@@ -267,10 +259,10 @@
// test to make sure the logged message does indeed contain the name of the
// current function "testConvenienceMacros".
GTMLoggerError(@"test ========================");
- STAssertEquals([[writer messages] count], (NSUInteger)1, nil);
+ XCTAssertEqual([[writer messages] count], (NSUInteger)1);
NSRange rangeOfFuncName =
[[[writer messages] objectAtIndex:0] rangeOfString:@"testConvenienceMacros"];
- STAssertTrue(rangeOfFuncName.location != NSNotFound, nil);
+ XCTAssertTrue(rangeOfFuncName.location != NSNotFound);
[writer clear];
[[GTMLogger sharedLogger] setFormatter:nil];
@@ -281,19 +273,19 @@
GTMLoggerAssert(@"test %d", 4);
NSArray *messages = [writer messages];
- STAssertNotNil(messages, nil);
+ XCTAssertNotNil(messages);
#ifdef DEBUG
- STAssertEquals([messages count], (NSUInteger)4, nil);
- STAssertEqualObjects([messages objectAtIndex:0], @"test 1", nil);
- STAssertEqualObjects([messages objectAtIndex:1], @"test 2", nil);
- STAssertEqualObjects([messages objectAtIndex:2], @"test 3", nil);
- STAssertEqualObjects([messages objectAtIndex:3], @"test 4", nil);
+ XCTAssertEqual([messages count], (NSUInteger)4);
+ XCTAssertEqualObjects([messages objectAtIndex:0], @"test 1");
+ XCTAssertEqualObjects([messages objectAtIndex:1], @"test 2");
+ XCTAssertEqualObjects([messages objectAtIndex:2], @"test 3");
+ XCTAssertEqualObjects([messages objectAtIndex:3], @"test 4");
#else
// In Release builds, only the Error and Assert messages will be logged
- STAssertEquals([messages count], (NSUInteger)2, nil);
- STAssertEqualObjects([messages objectAtIndex:0], @"test 3", nil);
- STAssertEqualObjects([messages objectAtIndex:1], @"test 4", nil);
+ XCTAssertEqual([messages count], (NSUInteger)2);
+ XCTAssertEqualObjects([messages objectAtIndex:0], @"test 3");
+ XCTAssertEqualObjects([messages objectAtIndex:1], @"test 4");
#endif
}
@@ -302,10 +294,10 @@
NSFileHandle *fh = nil;
fh = [NSFileHandle fileHandleForWritingAtPath:path_];
- STAssertNil(fh, nil);
+ XCTAssertNil(fh);
fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644];
- STAssertNotNil(fh, nil);
+ XCTAssertNotNil(fh);
[fh logMessage:@"test 0" level:kGTMLoggerLevelUnknown];
[fh logMessage:@"test 1" level:kGTMLoggerLevelDebug];
@@ -318,24 +310,24 @@
NSString *contents = [NSString stringWithContentsOfFile:path_
encoding:NSUTF8StringEncoding
error:&err];
- STAssertNotNil(contents, @"Error loading log file: %@", err);
- STAssertEqualObjects(@"test 0\ntest 1\ntest 2\ntest 3\ntest 4\n", contents, nil);
+ XCTAssertNotNil(contents, @"Error loading log file: %@", err);
+ XCTAssertEqualObjects(@"test 0\ntest 1\ntest 2\ntest 3\ntest 4\n", contents);
}
- (void)testLoggerAdapterWriter {
ArrayWriter *writer = [[[ArrayWriter alloc] init] autorelease];
- STAssertNotNil(writer, nil);
+ XCTAssertNotNil(writer);
GTMLogger *sublogger = [GTMLogger loggerWithWriter:writer
formatter:nil
filter:nil];
- STAssertNotNil(sublogger, nil);
+ XCTAssertNotNil(sublogger);
GTMLogger *logger = [GTMLogger loggerWithWriter:sublogger
formatter:nil
filter:nil];
- STAssertNotNil(logger, nil);
+ XCTAssertNotNil(logger);
// Log a few messages to test with
[logger logInfo:@"hi"];
@@ -345,12 +337,12 @@
// Makes sure the messages got logged
NSArray *messages = [writer messages];
- STAssertNotNil(messages, nil);
- STAssertEquals([messages count], (NSUInteger)4, nil);
- STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
- STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
- STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
- STAssertEqualObjects([messages objectAtIndex:3], @"assert", nil);
+ XCTAssertNotNil(messages);
+ XCTAssertEqual([messages count], (NSUInteger)4);
+ XCTAssertEqualObjects([messages objectAtIndex:0], @"hi");
+ XCTAssertEqualObjects([messages objectAtIndex:1], @"foo");
+ XCTAssertEqualObjects([messages objectAtIndex:2], @"blah");
+ XCTAssertEqualObjects([messages objectAtIndex:3], @"assert");
}
// Helper method to help testing GTMLogFormatters
@@ -370,211 +362,177 @@
- (void)testFunctionPrettifier {
GTMLogBasicFormatter *fmtr = [[[GTMLogBasicFormatter alloc] init]
autorelease];
- STAssertNotNil(fmtr, nil);
+ XCTAssertNotNil(fmtr);
// Nil, empty and whitespace
- STAssertEqualObjects([fmtr prettyNameForFunc:nil], @"(unknown)", nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@""], @"(unknown)", nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@" \n\t"], @"(unknown)", nil);
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:nil], @"(unknown)");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@""], @"(unknown)");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@" \n\t"], @"(unknown)");
// C99 __func__
- STAssertEqualObjects([fmtr prettyNameForFunc:@"main"], @"main()", nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@"main"], @"main()", nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@" main "], @"main()", nil);
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@"main"], @"main()");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@"main"], @"main()");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@" main "], @"main()");
// GCC Obj-C __func__ and __PRETTY_FUNCTION__
- STAssertEqualObjects([fmtr prettyNameForFunc:@"+[Foo bar]"], @"+[Foo bar]",
- nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@" +[Foo bar] "], @"+[Foo bar]",
- nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@"-[Foo baz]"], @"-[Foo baz]",
- nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@" -[Foo baz] "], @"-[Foo baz]",
- nil);
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@"+[Foo bar]"], @"+[Foo bar]");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@" +[Foo bar] "], @"+[Foo bar]");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@"-[Foo baz]"], @"-[Foo baz]");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@" -[Foo baz] "], @"-[Foo baz]");
// GCC C++ __PRETTY_FUNCTION__
- STAssertEqualObjects([fmtr prettyNameForFunc:@"void a::sub(int)"],
- @"void a::sub(int)", nil);
- STAssertEqualObjects([fmtr prettyNameForFunc:@" void a::sub(int) "],
- @"void a::sub(int)", nil);
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@"void a::sub(int)"],
+ @"void a::sub(int)");
+ XCTAssertEqualObjects([fmtr prettyNameForFunc:@" void a::sub(int) "],
+ @"void a::sub(int)");
}
- (void)testBasicFormatter {
id<GTMLogFormatter> fmtr = [[[GTMLogBasicFormatter alloc] init] autorelease];
- STAssertNotNil(fmtr, nil);
+ XCTAssertNotNil(fmtr);
NSString *msg = nil;
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelDebug
format:@"test"];
- STAssertEqualObjects(msg, @"test", nil);
+ XCTAssertEqualObjects(msg, @"test");
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelDebug
format:@"test %d", 1];
- STAssertEqualObjects(msg, @"test 1", nil);
+ XCTAssertEqualObjects(msg, @"test 1");
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelDebug
format:@"test %@", @"foo"];
- STAssertEqualObjects(msg, @"test foo", nil);
+ XCTAssertEqualObjects(msg, @"test foo");
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelDebug
format:@""];
- STAssertEqualObjects(msg, @"", nil);
+ XCTAssertEqualObjects(msg, @"");
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelDebug
format:@" "];
- STAssertEqualObjects(msg, @" ", nil);
+ XCTAssertEqualObjects(msg, @" ");
}
- (void)testStandardFormatter {
id<GTMLogFormatter> fmtr = [[[GTMLogStandardFormatter alloc] init] autorelease];
- STAssertNotNil(fmtr, nil);
-
- NSString * kFormatBasePattern;
-#if GTM_MACOS_SDK
- // E.g. 2008-01-04 09:16:26.906 otest[5567/0xa07d0f60] [lvl=1] (no func) test
- // E.g. 2009-10-26 22:26:25.086 otest-i386[53200/0xa0438500] [lvl=1] (no func) test
- kFormatBasePattern =
- @"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3} ((otest)|(otest-i386)|(otest-x86_64)|(otest-ppc))\\[[0-9]+/0x[0-9a-f]+\\] \\[lvl=[0-3]\\] \\(unknown\\) ";
-#else // GTM_MACOS_SDK
- // E.g. 2008-01-04 09:16:26.906 otest[5567/0xa07d0f60] [lvl=1] (no func) test
- // 2011-11-29 12:32:24.129 GTMiPhoneUnitTestingOCUnitTestRig[31540/0xa04dd540] [lvl=1] (unknown) test
- kFormatBasePattern =
- @"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3} (GTMiPhoneTest|GTMiPhoneUnitTestingOCUnitTestRig)\\[[0-9]+/0x[0-9a-f]+\\] \\[lvl=[0-3]\\] \\(unknown\\) ";
-#endif // GTM_MACOS_SDK
+ XCTAssertNotNil(fmtr);
+
+ // E.g. 2008-01-04 09:16:26.906 xctest[5567/0xa07d0f60] [lvl=1] (no func) test
+ #define kFormatBasePattern @"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3} %@\\[[0-9]+/0x[0-9a-f]+\\] \\[lvl=[0-3]\\] \\(unknown\\) %@"
NSString *msg = nil;
+ NSString *executableName = [[[NSBundle mainBundle] executablePath] lastPathComponent];
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelDebug
format:@"test"];
- STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test"]],
- @"msg: %@", msg);
+ NSString *pattern = [NSString stringWithFormat:kFormatBasePattern, executableName, @"test"];
+ XCTAssertTrue([msg gtm_matchesPattern:pattern], @"msg: %@", msg);
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelError
format:@"test %d", 1];
- STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test 1"]],
- @"msg: %@", msg);
-
+ pattern = [NSString stringWithFormat:kFormatBasePattern, executableName, @"test 1"];
+ XCTAssertTrue([msg gtm_matchesPattern:pattern], @"msg: %@", msg);
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelInfo
format:@"test %@", @"hi"];
- STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test hi"]],
- @"msg: %@", msg);
+ pattern = [NSString stringWithFormat:kFormatBasePattern, executableName, @"test hi"];
+ XCTAssertTrue([msg gtm_matchesPattern:pattern], @"msg: %@", msg);
msg = [self stringFromFormatter:fmtr
level:kGTMLoggerLevelUnknown
format:@"test"];
- STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test"]],
- @"msg: %@", msg);
+ pattern = [NSString stringWithFormat:kFormatBasePattern, executableName, @"test"];
+ XCTAssertTrue([msg gtm_matchesPattern:pattern], @"msg: %@", msg);
}
- (void)testNoFilter {
id<GTMLogFilter> filter = [[[GTMLogNoFilter alloc] init] autorelease];
- STAssertNotNil(filter, nil);
-
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown], nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug], nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo], nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError], nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert], nil);
- STAssertTrue([filter filterAllowsMessage:@"" level:kGTMLoggerLevelDebug], nil);
- STAssertTrue([filter filterAllowsMessage:nil level:kGTMLoggerLevelDebug], nil);
+ XCTAssertNotNil(filter);
+
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert]);
+ XCTAssertTrue([filter filterAllowsMessage:@"" level:kGTMLoggerLevelDebug]);
+ XCTAssertTrue([filter filterAllowsMessage:nil level:kGTMLoggerLevelDebug]);
}
- (void)testMinimumFilter {
id<GTMLogFilter> filter = [[[GTMLogMininumLevelFilter alloc]
initWithMinimumLevel:kGTMLoggerLevelInfo]
autorelease];
- STAssertNotNil(filter, nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
- nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
- nil);
+ XCTAssertNotNil(filter);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown]);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert]);
filter = [[[GTMLogMininumLevelFilter alloc]
initWithMinimumLevel:kGTMLoggerLevelDebug] autorelease];
- STAssertNotNil(filter, nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
- nil);
+ XCTAssertNotNil(filter);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert]);
// Cannot exceed min/max levels filter
filter = [[[GTMLogMininumLevelFilter alloc]
initWithMinimumLevel:kGTMLoggerLevelAssert + 1] autorelease];
- STAssertNil(filter, nil);
+ XCTAssertNil(filter);
filter = [[[GTMLogMininumLevelFilter alloc]
initWithMinimumLevel:kGTMLoggerLevelUnknown - 1] autorelease];
- STAssertNil(filter, nil);
+ XCTAssertNil(filter);
}
- (void)testMaximumFilter {
id<GTMLogFilter> filter = [[[GTMLogMaximumLevelFilter alloc]
initWithMaximumLevel:kGTMLoggerLevelInfo]
autorelease];
- STAssertNotNil(filter, nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
- nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
- nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
- nil);
+ XCTAssertNotNil(filter);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo]);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError]);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert]);
filter = [[[GTMLogMaximumLevelFilter alloc]
initWithMaximumLevel:kGTMLoggerLevelDebug] autorelease];
- STAssertNotNil(filter, nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
- nil);
- STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
- nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
- nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
- nil);
- STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
- nil);
+ XCTAssertNotNil(filter);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown]);
+ XCTAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug]);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo]);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError]);
+ XCTAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert]);
// Cannot exceed min/max levels filter
filter = [[[GTMLogMaximumLevelFilter alloc]
initWithMaximumLevel:kGTMLoggerLevelAssert + 1] autorelease];
- STAssertNil(filter, nil);
+ XCTAssertNil(filter);
filter = [[[GTMLogMaximumLevelFilter alloc]
initWithMaximumLevel:kGTMLoggerLevelUnknown - 1] autorelease];
- STAssertNil(filter, nil);
+ XCTAssertNil(filter);
}
- (void)testFileHandleCreation {
NSFileHandle *fh = nil;
fh = [NSFileHandle fileHandleForLoggingAtPath:nil mode:0644];
- STAssertNil(fh, nil);
+ XCTAssertNil(fh);
fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644];
- STAssertNotNil(fh, nil);
+ XCTAssertNotNil(fh);
[fh logMessage:@"test 1" level:kGTMLoggerLevelInfo];
[fh logMessage:@"test 2" level:kGTMLoggerLevelInfo];
@@ -583,7 +541,7 @@
// Re-open file and make sure our log messages get appended
fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644];
- STAssertNotNil(fh, nil);
+ XCTAssertNotNil(fh);
[fh logMessage:@"test 4" level:kGTMLoggerLevelInfo];
[fh logMessage:@"test 5" level:kGTMLoggerLevelInfo];
@@ -594,8 +552,8 @@
NSString *contents = [NSString stringWithContentsOfFile:path_
encoding:NSUTF8StringEncoding
error:&err];
- STAssertNotNil(contents, @"Error loading log file: %@", err);
- STAssertEqualObjects(@"test 1\ntest 2\ntest 3\ntest 4\ntest 5\ntest 6\n", contents, nil);
+ XCTAssertNotNil(contents, @"Error loading log file: %@", err);
+ XCTAssertEqualObjects(@"test 1\ntest 2\ntest 3\ntest 4\ntest 5\ntest 6\n", contents);
}
@end
diff --git a/Foundation/GTMNSAppleEvent+HandlerTest.applescript b/Foundation/GTMNSAppleEvent+HandlerTest.applescript
deleted file mode 100644
index 377d733..0000000
--- a/Foundation/GTMNSAppleEvent+HandlerTest.applescript
+++ /dev/null
@@ -1,60 +0,0 @@
---
--- Copyright 2008 Google Inc.
---
--- Licensed under the Apache License, Version 2.0 (the "License"); you may not
--- use this file except in compliance with the License. You may obtain a copy
--- of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
--- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
--- License for the specific language governing permissions and limitations under
--- the License.
---
-
-script parentTestScript
- property parentTestScriptProperty : 6
- on parentTestScriptFunc()
- return "parent"
- end parentTestScriptFunc
-end script
-
-script testScript
- property parent : parentTestScript
- property testScriptProperty : 5
- on testScriptFunc()
- return "child"
- end testScriptFunc
- on open foo
- end open
-end script
-
-property foo : 1
-
-on test()
-end test
-
-on testReturnOne()
- return 1
-end testReturnOne
-
-on testReturnParam(param)
- return param
-end testReturnParam
-
-on testAddParams(param1, param2)
- return param1 + param2
-end testAddParams
-
-on testAdd of a onto b given otherValue:d
- return a + b + d
-end testAdd
-
-on testGetScript()
- return testScript
-end testGetScript
-
-on print
-end print
diff --git a/Foundation/GTMNSAppleEventDescriptor+Foundation.h b/Foundation/GTMNSAppleEventDescriptor+Foundation.h
deleted file mode 100644
index 8e62bcc..0000000
--- a/Foundation/GTMNSAppleEventDescriptor+Foundation.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// GTMNSAppleEventDescriptor+Foundation.h
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-#import "GTMFourCharCode.h"
-
-// A category for dealing with NSAppleEventDescriptors and NSArrays.
-@interface NSAppleEventDescriptor (GTMAppleEventDescriptorArrayAdditions)
-// Used to register the types you know how to convert into
-// NSAppleEventDescriptors.
-// See examples in GTMNSAppleEventDescriptor+Foundation.
-// Args:
-// selector - selector to call for any of the types in |types|
-// -(NSAppleEventDesc *)selector_name;
-// types - an std c array of types of length |count|
-// count - number of types in |types|
-+ (void)gtm_registerSelector:(SEL)selector
- forTypes:(DescType*)types
- count:(NSUInteger)count;
-
-// Returns an NSObject for any NSAppleEventDescriptor
-// Uses types registerd by registerSelector:forTypes:count: to determine
-// what type of object to create. If it doesn't know a type, it attempts
-// to return [self stringValue].
-- (id)gtm_objectValue;
-
-// Return an NSArray for an AEList
-// Returns nil on failure.
-- (NSArray*)gtm_arrayValue;
-
-// Return an NSDictionary for an AERecord
-// Returns nil on failure.
-- (NSDictionary*)gtm_dictionaryValue;
-
-// Return an NSNull for a desc of typeNull
-// Returns nil on failure.
-- (NSNull*)gtm_nullValue;
-
-// Return a NSAppleEventDescriptor for a double value.
-+ (NSAppleEventDescriptor*)gtm_descriptorWithDouble:(double)real;
-
-// Return a NSAppleEventDescriptor for a float value.
-+ (NSAppleEventDescriptor*)gtm_descriptorWithFloat:(float)real;
-
-// Return a NSAppleEventDescriptor for a CGFloat value.
-+ (NSAppleEventDescriptor*)gtm_descriptorWithCGFloat:(CGFloat)real;
-
-// Attempt to extract a double value. Returns NAN on error.
-- (double)gtm_doubleValue;
-
-// Attempt to extract a float value. Returns NAN on error.
-- (float)gtm_floatValue;
-
-// Attempt to extract a CGFloat value. Returns NAN on error.
-- (CGFloat)gtm_cgFloatValue;
-
-// Attempt to extract a NSNumber. Returns nil on error.
-- (NSNumber*)gtm_numberValue;
-
-// Attempt to return a GTMFourCharCode. Returns nil on error.
-- (GTMFourCharCode*)gtm_fourCharCodeValue;
-@end
-
-@interface NSObject (GTMAppleEventDescriptorObjectAdditions)
-// A informal protocol that objects can override to return appleEventDescriptors
-// for their type. The default is to return [self description] rolled up
-// in an NSAppleEventDescriptor. Built in support for:
-// NSArray, NSDictionary, NSNull, NSString, NSNumber and NSProcessInfo
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor;
-@end
-
-@interface NSAppleEventDescriptor (GTMAppleEventDescriptorAdditions)
-// Allows you to send events.
-// Returns YES if send was successful.
-- (BOOL)gtm_sendEventWithMode:(AESendMode)mode
- timeOut:(NSTimeInterval)timeout
- reply:(NSAppleEventDescriptor**)reply;
-@end
-
-@interface GTMFourCharCode (GTMAppleEventDescriptorObjectAdditions)
-
-// if you call gtm_appleEventDescriptor on GTMFourCharCode it will be of
-// type typeType. If you need something different (like typeProperty) this
-// allows you to define the type you want.
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptorOfType:(DescType)type;
-@end
diff --git a/Foundation/GTMNSAppleEventDescriptor+Foundation.m b/Foundation/GTMNSAppleEventDescriptor+Foundation.m
deleted file mode 100644
index f9828d4..0000000
--- a/Foundation/GTMNSAppleEventDescriptor+Foundation.m
+++ /dev/null
@@ -1,536 +0,0 @@
-//
-// GTMNSAppleEventDescriptor+Foundation.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMNSAppleEventDescriptor+Foundation.h"
-#import "GTMDebugSelectorValidation.h"
-#import <Carbon/Carbon.h> // Needed Solely For keyASUserRecordFields
-
-// Map of types to selectors.
-static NSMutableDictionary *gTypeMap = nil;
-
-@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorArrayAdditions)
-
-+ (void)gtm_registerSelector:(SEL)selector
- forTypes:(DescType*)types
- count:(NSUInteger)count {
- if (selector && types && count > 0) {
-#if DEBUG
- NSAppleEventDescriptor *desc
- = [[[NSAppleEventDescriptor alloc] initListDescriptor] autorelease];
- GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(desc,
- selector,
- @encode(id),
- NULL);
-#endif
- @synchronized(self) {
- if (!gTypeMap) {
- gTypeMap = [[NSMutableDictionary alloc] init];
- }
- NSString *selString = NSStringFromSelector(selector);
- for (NSUInteger i = 0; i < count; ++i) {
- NSNumber *key = [NSNumber numberWithUnsignedInt:types[i]];
- NSString *exists = [gTypeMap objectForKey:key];
- if (exists) {
- _GTMDevLog(@"%@ being replaced with %@ exists for type: %@",
- exists, selString, key);
- }
- [gTypeMap setObject:selString forKey:key];
- }
- }
- }
-}
-
-- (id)gtm_objectValue {
- id value = nil;
-
- // Check our registered types to see if we have anything
- if (gTypeMap) {
- @synchronized(gTypeMap) {
- DescType type = [self descriptorType];
- NSNumber *key = [NSNumber numberWithUnsignedInt:type];
- NSString *selectorString = [gTypeMap objectForKey:key];
- if (selectorString) {
- SEL selector = NSSelectorFromString(selectorString);
- value = [self performSelector:selector];
- } else {
- value = [self stringValue];
- }
- }
- }
- return value;
-}
-
-- (NSArray*)gtm_arrayValue {
- NSUInteger count = [self numberOfItems];
- NSAppleEventDescriptor *workingDesc = self;
- if (count == 0) {
- // Create a list to work with.
- workingDesc = [self coerceToDescriptorType:typeAEList];
- count = [workingDesc numberOfItems];
- }
- NSMutableArray *items = [NSMutableArray arrayWithCapacity:count];
- for (NSUInteger i = 1; i <= count; ++i) {
- NSAppleEventDescriptor *desc = [workingDesc descriptorAtIndex:i];
- id value = [desc gtm_objectValue];
- if (!value) {
- _GTMDevLog(@"Unknown type of descriptor %@", [desc description]);
- return nil;
- }
- [items addObject:value];
- }
- return items;
-}
-
-- (NSDictionary*)gtm_dictionaryValue {
- NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
- NSAppleEventDescriptor *userRecord = [self descriptorForKeyword:keyASUserRecordFields];
- if (userRecord) {
- NSArray *userItems = [userRecord gtm_arrayValue];
- NSString *key = nil;
- NSString *item;
- GTM_FOREACH_OBJECT(item, userItems) {
- if (key) {
- // Save the pair and reset our state
- [dictionary setObject:item forKey:key];
- key = nil;
- } else {
- // Save it for the next pair
- key = item;
- }
- }
- if (key) {
- _GTMDevLog(@"Got a key %@ with no value in %@", key, userItems);
- return nil;
- }
- } else {
- NSUInteger count = [self numberOfItems];
- for (NSUInteger i = 1; i <= count; ++i) {
- AEKeyword key = [self keywordForDescriptorAtIndex:i];
- NSAppleEventDescriptor *desc = [self descriptorForKeyword:key];
- id value = [desc gtm_objectValue];
- if (!value) {
- _GTMDevLog(@"Unknown type of descriptor %@", [desc description]);
- return nil;
- }
- [dictionary setObject:value
- forKey:[GTMFourCharCode fourCharCodeWithFourCharCode:key]];
- }
- }
- return dictionary;
-}
-
-- (NSNull*)gtm_nullValue {
- return [NSNull null];
-}
-
-+ (NSAppleEventDescriptor*)gtm_descriptorWithDouble:(double)real {
- return [NSAppleEventDescriptor descriptorWithDescriptorType:typeIEEE64BitFloatingPoint
- bytes:&real
- length:sizeof(real)];
-}
-
-+ (NSAppleEventDescriptor*)gtm_descriptorWithFloat:(float)real {
- return [NSAppleEventDescriptor descriptorWithDescriptorType:typeIEEE32BitFloatingPoint
- bytes:&real
- length:sizeof(real)];
-}
-
-
-+ (NSAppleEventDescriptor*)gtm_descriptorWithCGFloat:(CGFloat)real {
-#if CGFLOAT_IS_DOUBLE
- return [self gtm_descriptorWithDouble:real];
-#else
- return [self gtm_descriptorWithFloat:real];
-#endif
-}
-
-- (double)gtm_doubleValue {
- // Be careful modifying this code as Xcode 3.2.5 gcc 4.2.1 (5664) was
- // generating bad code with a previous incarnation.
- NSNumber *number = [self gtm_numberValue];
- if (number) {
- return [number doubleValue];
- }
- return NAN;
-}
-
-- (float)gtm_floatValue {
- NSNumber *number = [self gtm_numberValue];
- if (number) {
- return [number floatValue];
- }
- return NAN;
-}
-
-- (CGFloat)gtm_cgFloatValue {
-#if CGFLOAT_IS_DOUBLE
- return [self gtm_doubleValue];
-#else
- return [self gtm_floatValue];
-#endif
-}
-
-- (NSNumber*)gtm_numberValue {
- typedef struct {
- DescType type;
- SEL selector;
- } TypeSelectorMap;
- TypeSelectorMap typeSelectorMap[] = {
- { typeFalse, @selector(numberWithBool:) },
- { typeTrue, @selector(numberWithBool:) },
- { typeBoolean, @selector(numberWithBool:) },
- { typeSInt16, @selector(numberWithShort:) },
- { typeSInt32, @selector(numberWithInt:) },
- { typeUInt32, @selector(numberWithUnsignedInt:) },
- { typeSInt64, @selector(numberWithLongLong:) },
- { typeIEEE32BitFloatingPoint, @selector(numberWithFloat:) },
- { typeIEEE64BitFloatingPoint, @selector(numberWithDouble:) }
- };
- DescType type = [self descriptorType];
- SEL selector = nil;
- for (size_t i = 0; i < sizeof(typeSelectorMap) / sizeof(TypeSelectorMap); ++i) {
- if (type == typeSelectorMap[i].type) {
- selector = typeSelectorMap[i].selector;
- break;
- }
- }
- NSAppleEventDescriptor *desc = self;
- if (!selector) {
- // COV_NF_START - Don't know how to force this in a unittest
- _GTMDevLog(@"Didn't get a valid selector?");
- desc = [self coerceToDescriptorType:typeIEEE64BitFloatingPoint];
- selector = @selector(numberWithDouble:);
- // COV_NF_END
- }
- NSData *descData = [desc data];
- const void *bytes = [descData bytes];
- if (!bytes) {
- // COV_NF_START - Don't know how to force this in a unittest
- _GTMDevLog(@"Unable to get bytes from %@", desc);
- return nil;
- // COV_NF_END
- }
- Class numberClass = [NSNumber class];
- NSMethodSignature *signature = [numberClass methodSignatureForSelector:selector];
- NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
- [invocation setSelector:selector];
- [invocation setArgument:(void*)bytes atIndex:2];
- [invocation setTarget:numberClass];
- [invocation invoke];
- NSNumber *value = nil;
- [invocation getReturnValue:&value];
- return value;
-}
-
-- (GTMFourCharCode*)gtm_fourCharCodeValue {
- return [GTMFourCharCode fourCharCodeWithFourCharCode:[self typeCodeValue]];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- return self;
-}
-
-@end
-
-@implementation NSObject (GTMAppleEventDescriptorObjectAdditions)
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- return [NSAppleEventDescriptor descriptorWithString:[self description]];
-}
-@end
-
-@implementation NSArray (GTMAppleEventDescriptorObjectAdditions)
-
-+ (void)load {
- DescType types[] = {
- typeAEList,
- };
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_arrayValue)
- forTypes:types
- count:sizeof(types)/sizeof(DescType)];
- [pool drain];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- NSAppleEventDescriptor *desc = [NSAppleEventDescriptor listDescriptor];
- NSUInteger count = [self count];
- for (NSUInteger i = 1; i <= count; ++i) {
- id item = [self objectAtIndex:i-1];
- NSAppleEventDescriptor *itemDesc = [item gtm_appleEventDescriptor];
- if (!itemDesc) {
- _GTMDevLog(@"Unable to create Apple Event Descriptor for %@", [self description]);
- return nil;
- }
- [desc insertDescriptor:itemDesc atIndex:i];
- }
- return desc;
-}
-@end
-
-@implementation NSDictionary (GTMAppleEventDescriptorObjectAdditions)
-
-+ (void)load {
- DescType types[] = {
- typeAERecord,
- };
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_dictionaryValue)
- forTypes:types
- count:sizeof(types)/sizeof(DescType)];
- [pool drain];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- Class keyClass = nil;
- id key = nil;
- GTM_FOREACH_KEY(key, self) {
- if (!keyClass) {
- if ([key isKindOfClass:[GTMFourCharCode class]]) {
- keyClass = [GTMFourCharCode class];
- } else if ([key isKindOfClass:[NSString class]]) {
- keyClass = [NSString class];
- } else {
- _GTMDevLog(@"Keys must be of type NSString or GTMFourCharCode: %@", key);
- return nil;
- }
- }
- if (![key isKindOfClass:keyClass]) {
- _GTMDevLog(@"Keys must be homogenous (first key was of type %@) "
- "and of type NSString or GTMFourCharCode: %@", keyClass, key);
- return nil;
- }
- }
- NSAppleEventDescriptor *desc = [NSAppleEventDescriptor recordDescriptor];
- if ([keyClass isEqual:[NSString class]]) {
- NSMutableArray *array = [NSMutableArray arrayWithCapacity:[self count] * 2];
- GTM_FOREACH_KEY(key, self) {
- [array addObject:key];
- [array addObject:[self objectForKey:key]];
- }
- NSAppleEventDescriptor *userRecord = [array gtm_appleEventDescriptor];
- if (!userRecord) {
- return nil;
- }
- [desc setDescriptor:userRecord forKeyword:keyASUserRecordFields];
- } else {
- GTM_FOREACH_KEY(key, self) {
- id value = [self objectForKey:key];
- NSAppleEventDescriptor *valDesc = [value gtm_appleEventDescriptor];
- if (!valDesc) {
- return nil;
- }
- [desc setDescriptor:valDesc forKeyword:[key fourCharCode]];
- }
- }
- return desc;
-}
-
-@end
-
-@implementation NSNull (GTMAppleEventDescriptorObjectAdditions)
-+ (void)load {
- DescType types[] = {
- typeNull
- };
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_nullValue)
- forTypes:types
- count:sizeof(types)/sizeof(DescType)];
- [pool drain];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- return [NSAppleEventDescriptor nullDescriptor];
-}
-@end
-
-@implementation NSString (GTMAppleEventDescriptorObjectAdditions)
-
-+ (void)load {
- DescType types[] = {
- typeUTF16ExternalRepresentation,
- typeUnicodeText,
- typeUTF8Text,
- typeCString,
- typePString,
- typeChar,
- typeIntlText };
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(stringValue)
- forTypes:types
- count:sizeof(types)/sizeof(DescType)];
- [pool drain];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- return [NSAppleEventDescriptor descriptorWithString:self];
-}
-@end
-
-@implementation NSNumber (GTMAppleEventDescriptorObjectAdditions)
-
-+ (void)load {
- DescType types[] = {
- typeTrue,
- typeFalse,
- typeBoolean,
- typeSInt16,
- typeSInt32,
- typeUInt32,
- typeSInt64,
- typeIEEE32BitFloatingPoint,
- typeIEEE64BitFloatingPoint };
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_numberValue)
- forTypes:types
- count:sizeof(types)/sizeof(DescType)];
- [pool drain];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- const char *type = [self objCType];
- if (!type || strlen(type) != 1) return nil;
-
- DescType desiredType = typeNull;
- NSAppleEventDescriptor *desc = nil;
- switch (type[0]) {
- // COV_NF_START
- // I can't seem to convince objcType to return something of this type
- case 'B':
- desc = [NSAppleEventDescriptor descriptorWithBoolean:[self boolValue]];
- break;
- // COV_NF_END
-
- case 'c':
- case 'C':
- case 's':
- case 'S':
- desiredType = typeSInt16;
- break;
-
- case 'i':
- case 'l':
- desiredType = typeSInt32;
- break;
-
- // COV_NF_START
- // I can't seem to convince objcType to return something of this type
- case 'I':
- case 'L':
- desiredType = typeUInt32;
- break;
- // COV_NF_END
-
- case 'q':
- case 'Q':
- desiredType = typeSInt64;
- break;
-
- case 'f':
- desiredType = typeIEEE32BitFloatingPoint;
- break;
-
- case 'd':
- default:
- desiredType = typeIEEE64BitFloatingPoint;
- break;
- }
-
- if (!desc) {
- desc = [NSAppleEventDescriptor gtm_descriptorWithDouble:[self doubleValue]];
- if (desc && desiredType != typeIEEE64BitFloatingPoint) {
- desc = [desc coerceToDescriptorType:desiredType];
- }
- }
- return desc;
-}
-
-@end
-
-@implementation NSProcessInfo (GTMAppleEventDescriptorObjectAdditions)
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- ProcessSerialNumber psn = { 0, kCurrentProcess };
- return [NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber
- bytes:&psn
- length:sizeof(ProcessSerialNumber)];
-}
-
-@end
-
-@implementation GTMFourCharCode (GTMAppleEventDescriptorObjectAdditions)
-
-+ (void)load {
- DescType types[] = {
- typeType,
- typeKeyword,
- typeApplSignature,
- typeEnumerated,
- };
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_fourCharCodeValue)
- forTypes:types
- count:sizeof(types)/sizeof(DescType)];
- [pool drain];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- return [self gtm_appleEventDescriptorOfType:typeType];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptorOfType:(DescType)type {
- FourCharCode code = [self fourCharCode];
- return [NSAppleEventDescriptor descriptorWithDescriptorType:type
- bytes:&code
- length:sizeof(code)];
-}
-@end
-
-@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorAdditions)
-
-- (BOOL)gtm_sendEventWithMode:(AESendMode)mode
- timeOut:(NSTimeInterval)timeout
- reply:(NSAppleEventDescriptor**)reply {
- BOOL isGood = YES;
- AppleEvent replyEvent = { typeNull, NULL };
- OSStatus err = AESendMessage([self aeDesc], &replyEvent, mode, timeout * 60);
- NSAppleEventDescriptor *replyDesc
- = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&replyEvent] autorelease];
- if (err) {
- isGood = NO;
- _GTMDevLog(@"Unable to send message: %@ %d", self, (int)err);
- }
- if (isGood) {
- NSAppleEventDescriptor *errorDesc = [replyDesc descriptorForKeyword:keyErrorNumber];
- if (errorDesc && [errorDesc int32Value]) {
- isGood = NO;
- }
- }
- if (reply) {
- *reply = replyDesc;
- }
- return isGood;
-}
-
-@end
diff --git a/Foundation/GTMNSAppleEventDescriptor+FoundationTest.m b/Foundation/GTMNSAppleEventDescriptor+FoundationTest.m
deleted file mode 100644
index f346e99..0000000
--- a/Foundation/GTMNSAppleEventDescriptor+FoundationTest.m
+++ /dev/null
@@ -1,643 +0,0 @@
-//
-// GTMNSAppleEventDescriptor+FoundationTest.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import <Carbon/Carbon.h>
-#import "GTMNSAppleEventDescriptor+Foundation.h"
-#import "GTMFourCharCode.h"
-#import "GTMUnitTestDevLog.h"
-
-@interface GTMNSAppleEventDescriptor_TestObject : NSObject
-@end
-
-@implementation GTMNSAppleEventDescriptor_TestObject
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- return nil;
-}
-
-@end
-
-@interface GTMNSAppleEventDescriptor_FoundationTest : GTMTestCase {
- BOOL gotEvent_;
-}
-- (void)handleEvent:(NSAppleEventDescriptor*)event
- withReply:(NSAppleEventDescriptor*)reply;
-- (void)handleEvent:(NSAppleEventDescriptor*)event
- withError:(NSAppleEventDescriptor*)reply;
-
-@end
-
-@implementation GTMNSAppleEventDescriptor_FoundationTest
-- (void)testRegisterSelectorForTypesCount {
- // Weird edge casey stuff.
- // + (void)registerSelector:(SEL)selector
- // forTypes:(DescType*)types count:(int)count
- // is tested heavily by the other NSAppleEventDescriptor+foo categories.
- DescType type;
- [NSAppleEventDescriptor gtm_registerSelector:nil
- forTypes:&type count:1];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor)
- forTypes:nil count:1];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor)
- forTypes:&type count:0];
- // Test the duplicate case
- [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor)
- forTypes:&type count:1];
- [GTMUnitTestDevLog expectPattern:@"initListDescriptor being replaced with "
- "initListDescriptor exists for type: [0-9]+"];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(initListDescriptor)
- forTypes:&type count:1];
-}
-
-- (void)testObjectValue {
- // - (void)testObjectValue is tested heavily by the other
- // NSAppleEventDescriptor+foo categories.
- long data = 1;
- // v@#f is just a bogus descriptor type that we don't recognize.
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor descriptorWithDescriptorType:'v@#f'
- bytes:&data
- length:sizeof(data)];
- id value = [desc gtm_objectValue];
- STAssertNil(value, nil);
-}
-
-- (void)testAppleEventDescriptor {
- // - (NSAppleEventDescriptor*)appleEventDescriptor is tested heavily by the
- // other NSAppleEventDescriptor+foo categories.
- NSAppleEventDescriptor *desc = [self gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- STAssertEquals([desc descriptorType], (DescType)typeUnicodeText, nil);
-}
-
-- (void)testDescriptorWithArrayAndArrayValue {
- // Test empty array
- NSAppleEventDescriptor *desc = [[NSArray array] gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- STAssertEquals([desc numberOfItems], (NSInteger)0, nil);
-
- // Complex array
- NSArray *array = [NSArray arrayWithObjects:
- [NSNumber numberWithInt:4],
- @"foo",
- [NSNumber numberWithInt:2],
- @"bar",
- [NSArray arrayWithObjects:
- @"bam",
- [NSArray arrayWithObject:[NSNumber numberWithFloat:4.2f]],
- nil],
- nil];
- STAssertNotNil(array, nil);
- desc = [array gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- NSArray *array2 = [desc gtm_objectValue];
- STAssertNotNil(array2, nil);
- NSArray *array3 = [desc gtm_arrayValue];
- STAssertNotNil(array3, nil);
- STAssertTrue([array isEqualToArray:array2],
- @"array: %@\narray2: %@\ndesc: %@",
- [array description], [array2 description], [desc description]);
- STAssertTrue([array2 isEqualToArray:array3],
- @"array: %@\narray2: %@\ndesc: %@",
- [array description], [array2 description], [desc description]);
-
- // Test a single object
- array = [NSArray arrayWithObject:@"foo"];
- desc = [NSAppleEventDescriptor descriptorWithString:@"foo"];
- STAssertNotNil(desc, nil);
- array2 = [desc gtm_arrayValue];
- STAssertTrue([array isEqualToArray:array2],
- @"array: %@\narray2: %@\ndesc: %@",
- [array description], [array2 description], [desc description]);
-
- // Something that doesn't know how to register itself.
- GTMNSAppleEventDescriptor_TestObject *obj
- = [[[GTMNSAppleEventDescriptor_TestObject alloc] init] autorelease];
- [GTMUnitTestDevLog expectPattern:@"Unable to create Apple Event Descriptor for .*"];
- desc = [[NSArray arrayWithObject:obj] gtm_appleEventDescriptor];
- STAssertNil(desc, @"Should be nil");
-
- // A list containing something we don't know how to deal with
- desc = [NSAppleEventDescriptor listDescriptor];
- NSAppleEventDescriptor *desc2
- = [NSAppleEventDescriptor descriptorWithDescriptorType:'@!@#'
- bytes:&desc
- length:sizeof(desc)];
- [GTMUnitTestDevLog expectPattern:@"Unknown type of descriptor "
- "<NSAppleEventDescriptor: '@!@#'\\(\\$[0-9A-F]*\\$\\)>"];
- [desc insertDescriptor:desc2 atIndex:0];
- array = [desc gtm_objectValue];
- STAssertEquals([array count], (NSUInteger)0, @"Should have 0 items");
-}
-
-- (void)testDescriptorWithDictionaryAndDictionaryValue {
- // Test empty dictionary
- NSAppleEventDescriptor *desc
- = [[NSDictionary dictionary] gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- STAssertEquals([desc numberOfItems], (NSInteger)0, nil);
-
- // Complex dictionary
- NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
- @"fooobject",
- @"fookey",
- @"barobject",
- @"barkey",
- [NSDictionary dictionaryWithObjectsAndKeys:
- @"january",
- [GTMFourCharCode fourCharCodeWithFourCharCode:cJanuary],
- @"february",
- [GTMFourCharCode fourCharCodeWithFourCharCode:cFebruary],
- nil],
- @"dictkey",
- nil];
- STAssertNotNil(dictionary, nil);
- desc = [dictionary gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- NSDictionary *dictionary2 = [desc gtm_objectValue];
- STAssertNotNil(dictionary2, nil);
- NSDictionary *dictionary3 = [desc gtm_dictionaryValue];
- STAssertNotNil(dictionary3, nil);
- STAssertEqualObjects(dictionary, dictionary2,
- @"desc: %@", [desc description]);
- STAssertEqualObjects(dictionary2, dictionary3,
- @"desc: %@", [desc description]);
-
- // Something that doesn't know how to register itself.
- GTMNSAppleEventDescriptor_TestObject *obj
- = [[[GTMNSAppleEventDescriptor_TestObject alloc] init] autorelease];
- [GTMUnitTestDevLog expectPattern:@"Unable to create Apple Event Descriptor for .*"];
- desc = [[NSDictionary dictionaryWithObject:obj
- forKey:@"foo"] gtm_appleEventDescriptor];
- STAssertNil(desc, @"Should be nil");
-
- GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:cJanuary];
- desc = [[NSDictionary dictionaryWithObject:obj
- forKey:fcc] gtm_appleEventDescriptor];
- STAssertNil(desc, @"Should be nil");
-
- // A list containing something we don't know how to deal with
- desc = [NSAppleEventDescriptor recordDescriptor];
- NSAppleEventDescriptor *desc2
- = [NSAppleEventDescriptor descriptorWithDescriptorType:'@!@#'
- bytes:&desc
- length:sizeof(desc)];
- [desc setDescriptor:desc2 forKeyword:cJanuary];
- [GTMUnitTestDevLog expectPattern:@"Unknown type of descriptor "
- "<NSAppleEventDescriptor: '@!@#'\\(\\$[0-9A-F]+\\$\\)>"];
- dictionary = [desc gtm_objectValue];
- STAssertEquals([dictionary count], (NSUInteger)0, @"Should have 0 items");
-
- // A bad dictionary
- dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
- @"foo",
- [GTMFourCharCode fourCharCodeWithFourCharCode:'APPL'],
- @"bam",
- @"bar",
- nil];
- STAssertNotNil(dictionary, nil);
- // I cannot use expectString here to the exact string because interestingly
- // dictionaries in 64 bit enumerate in a different order from dictionaries
- // on 32 bit. This is the closest pattern I can match.
- [GTMUnitTestDevLog expectPattern:@"Keys must be homogenous .*"];
- desc = [dictionary gtm_appleEventDescriptor];
- STAssertNil(desc, nil);
-
- // Another bad dictionary
- dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
- @"foo",
- [NSNumber numberWithInt:4],
- @"bam",
- @"bar",
- nil];
- STAssertNotNil(dictionary, nil);
- // I cannot use expectString here to the exact string because interestingly
- // dictionaries in 64 bit enumerate in a different order from dictionaries
- // on 32 bit. This is the closest pattern I can match.
- [GTMUnitTestDevLog expectPattern:@"Keys must be .*"];
- desc = [dictionary gtm_appleEventDescriptor];
- STAssertNil(desc, nil);
-
- // A bad descriptor
- desc = [NSAppleEventDescriptor recordDescriptor];
- STAssertNotNil(desc, @"");
- NSArray *array = [NSArray arrayWithObjects:@"foo", @"bar", @"bam", nil];
- STAssertNotNil(array, @"");
- NSAppleEventDescriptor *userRecord = [array gtm_appleEventDescriptor];
- STAssertNotNil(userRecord, @"");
- [desc setDescriptor:userRecord forKeyword:keyASUserRecordFields];
- [GTMUnitTestDevLog expectPattern:@"Got a key bam with no value in \\(.*"];
- dictionary = [desc gtm_objectValue];
- STAssertNil(dictionary, @"Should be nil");
-}
-
-- (void)testDescriptorWithNull {
- // Test Null
- NSNull *null = [NSNull null];
- NSAppleEventDescriptor *desc = [null gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- NSNull *null2 = [desc gtm_objectValue];
- STAssertNotNil(null2, nil);
- NSNull *null3 = [desc gtm_nullValue];
- STAssertNotNil(null2, nil);
- STAssertEqualObjects(null, null2,
- @"null: %@\null2: %@\ndesc: %@",
- [null description], [null2 description],
- [desc description]);
- STAssertEqualObjects(null, null3,
- @"null: %@\null3: %@\ndesc: %@",
- [null description], [null3 description],
- [desc description]);
-}
-
-- (void)testDescriptorWithString {
- // Test empty String
- NSAppleEventDescriptor *desc = [[NSString string] gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
-
- // Test String
- NSString *string = @"Ratatouille!";
- desc = [string gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- NSString *string2 = [desc gtm_objectValue];
- STAssertNotNil(string2, nil);
- STAssertEqualObjects(string, string2,
- @"string: %@\nstring: %@\ndesc: %@",
- [string description], [string2 description], [desc description]);
-
-}
-
-- (void)testDescriptorWithNumberAndNumberValue {
- // There's really no good way to make this into a loop sadly due
- // to me having to pass a pointer of bytes to NSInvocation as an argument.
- // I want the compiler to convert my int to the appropriate type.
-
- NSNumber *original = [NSNumber numberWithBool:YES];
- STAssertNotNil(original, @"Value: YES");
- NSAppleEventDescriptor *desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: YES");
- id returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: YES");
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: YES");
- STAssertEqualObjects(original, returned, @"Value: YES");
- desc = [desc coerceToDescriptorType:typeBoolean];
- NSNumber *number = [desc gtm_numberValue];
- STAssertEqualObjects(number, original, @"Value: YES");
-
- original = [NSNumber numberWithBool:NO];
- STAssertNotNil(original, @"Value: NO");
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: NO");
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: NO");
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: NO");
- STAssertEqualObjects(original, returned, @"Value: NO");
-
- sranddev();
- double value = rand();
-
- original = [NSNumber numberWithChar:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithUnsignedChar:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithShort:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithUnsignedShort:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithInt:(int)value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithUnsignedInt:(unsigned int)value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithLong:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithUnsignedLong:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithLongLong:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithUnsignedLongLong:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- float floatA = rand();
- float floatB = rand();
- value = floatA / floatB;
- original = [NSNumber numberWithFloat:(float)value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- double doubleA = rand();
- double doubleB = rand();
- value = doubleA / doubleB;
- original = [NSNumber numberWithDouble:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = rand();
- original = [NSNumber numberWithBool:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = NAN;
- original = [NSNumber numberWithDouble:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = INFINITY;
- original = [NSNumber numberWithDouble:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = -0.0;
- original = [NSNumber numberWithDouble:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-
- value = -INFINITY;
- original = [NSNumber numberWithDouble:value];
- STAssertNotNil(original, @"Value: %g", value);
- desc = [original gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Value: %g", value);
- returned = [desc gtm_objectValue];
- STAssertNotNil(returned, @"Value: %g", value);
- STAssertTrue([returned isKindOfClass:[NSNumber class]], @"Value: %g", value);
- STAssertEqualObjects(original, returned, @"Value: %g", value);
-}
-
-- (void)testDescriptorWithDoubleAndDoubleValue {
- sranddev();
- for (int i = 0; i < 1000; ++i) {
- double value1 = rand();
- double value2 = rand();
- double value = value1 / value2;
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor gtm_descriptorWithDouble:value];
- STAssertNotNil(desc, @"Value: %g", value);
- double returnedValue = [desc gtm_doubleValue];
- STAssertEquals(value, returnedValue, @"Value: %g", value);
- }
-
- double specialCases[] = { 0.0f, __DBL_MIN__, __DBL_EPSILON__, INFINITY, NAN };
- for (size_t i = 0; i < sizeof(specialCases) / sizeof(double); ++i) {
- double value = specialCases[i];
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor gtm_descriptorWithDouble:value];
- STAssertNotNil(desc, @"Value: %g", value);
- double returnedValue = [desc gtm_doubleValue];
- STAssertEquals(value, returnedValue, @"Value: %g", value);
- }
-}
-
-- (void)testDescriptorWithFloatAndFloatValue {
- sranddev();
- for (int i = 0; i < 1000; ++i) {
- float value1 = rand();
- float value2 = rand();
- float value = value1 / value2;
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor gtm_descriptorWithFloat:value];
- STAssertNotNil(desc, @"Value: %f", value);
- float returnedValue = [desc gtm_floatValue];
- STAssertEquals(value, returnedValue, @"Value: %f", value);
- }
-
- float specialCases[] = { 0.0f, FLT_MIN, FLT_MAX, FLT_EPSILON, INFINITY, NAN };
- for (size_t i = 0; i < sizeof(specialCases) / sizeof(float); ++i) {
- float value = specialCases[i];
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor gtm_descriptorWithFloat:value];
- STAssertNotNil(desc, @"Value: %f", value);
- float returnedValue = [desc gtm_floatValue];
- STAssertEquals(value, returnedValue, @"Value: %f", value);
- }
-}
-
-- (void)testDescriptorWithCGFloatAndCGFloatValue {
- sranddev();
- for (int i = 0; i < 1000; ++i) {
- CGFloat value1 = rand();
- CGFloat value2 = rand();
- CGFloat value = value1 / value2;
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor gtm_descriptorWithCGFloat:value];
- STAssertNotNil(desc, @"Value: %g", (double)value);
- CGFloat returnedValue = [desc gtm_cgFloatValue];
- STAssertEquals(value, returnedValue, @"Value: %g", (double)value);
- }
-
- CGFloat specialCases[] = { 0.0f, CGFLOAT_MIN, CGFLOAT_MAX, NAN };
- for (size_t i = 0; i < sizeof(specialCases) / sizeof(CGFloat); ++i) {
- CGFloat value = specialCases[i];
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor gtm_descriptorWithCGFloat:value];
- STAssertNotNil(desc, @"Value: %g", (double)value);
- CGFloat returnedValue = [desc gtm_cgFloatValue];
- STAssertEquals(value, returnedValue, @"Value: %g", (double)value);
- }
-}
-
-- (void)testDescriptorWithGTMFourCharCode {
- GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:'APPL'];
- STAssertNotNil(fcc, nil);
- NSAppleEventDescriptor *desc = [fcc gtm_appleEventDescriptor];
- STAssertNotNil(desc, nil);
- GTMFourCharCode *fcc2 = [desc gtm_objectValue];
- STAssertNotNil(fcc2, nil);
- STAssertEqualObjects(fcc, fcc2, nil);
- STAssertEquals([desc descriptorType], (DescType)typeType, nil);
- desc = [fcc gtm_appleEventDescriptorOfType:typeKeyword];
- STAssertNotNil(desc, nil);
- fcc2 = [desc gtm_objectValue];
- STAssertNotNil(fcc2, nil);
- STAssertEqualObjects(fcc, fcc2, nil);
- STAssertEquals([desc descriptorType], (DescType)typeKeyword, nil);
-}
-
-- (void)testDescriptorWithDescriptor {
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor descriptorWithString:@"foo"];
- NSAppleEventDescriptor *desc2 = [desc gtm_appleEventDescriptor];
- STAssertEqualObjects(desc, desc2, nil);
-}
-
-- (void)handleEvent:(NSAppleEventDescriptor*)event
- withReply:(NSAppleEventDescriptor*)reply {
- gotEvent_ = YES;
- NSAppleEventDescriptor *answer = [NSAppleEventDescriptor descriptorWithInt32:1];
- [reply setDescriptor:answer forKeyword:keyDirectObject];
-}
-
-- (void)handleEvent:(NSAppleEventDescriptor*)event
- withError:(NSAppleEventDescriptor*)error {
- gotEvent_ = YES;
- NSAppleEventDescriptor *answer = [NSAppleEventDescriptor descriptorWithInt32:1];
- [error setDescriptor:answer forKeyword:keyErrorNumber];
-}
-
-- (void)testSend {
- const AEEventClass eventClass = 'Fooz';
- const AEEventID eventID = 'Ball';
- NSAppleEventManager *mgr = [NSAppleEventManager sharedAppleEventManager];
- [mgr setEventHandler:self
- andSelector:@selector(handleEvent:withReply:)
- forEventClass:eventClass
- andEventID:'Ball'];
- NSAppleEventDescriptor *currentProcess
- = [[NSProcessInfo processInfo] gtm_appleEventDescriptor];
- NSAppleEventDescriptor *event
- = [NSAppleEventDescriptor appleEventWithEventClass:eventClass
- eventID:eventID
- targetDescriptor:currentProcess
- returnID:kAutoGenerateReturnID
- transactionID:kAnyTransactionID];
- gotEvent_ = NO;
- NSAppleEventDescriptor *reply;
- BOOL goodEvent = [event gtm_sendEventWithMode:kAEWaitReply timeOut:60 reply:&reply];
- [mgr removeEventHandlerForEventClass:eventClass andEventID:eventID];
- STAssertTrue(goodEvent, @"bad event?");
- STAssertTrue(gotEvent_, @"Handler not called");
- NSAppleEventDescriptor *value = [reply descriptorForKeyword:keyDirectObject];
- STAssertEquals([value int32Value], (SInt32)1, @"didn't get reply");
-
-
- gotEvent_ = NO;
- [GTMUnitTestDevLog expectString:@"Unable to send message: "
- "<NSAppleEventDescriptor: 'Fooz'\\'Ball'{ }> -1708"];
- goodEvent = [event gtm_sendEventWithMode:kAEWaitReply timeOut:60 reply:&reply];
- STAssertFalse(goodEvent, @"good event?");
- STAssertFalse(gotEvent_, @"Handler called?");
-
- [mgr setEventHandler:self
- andSelector:@selector(handleEvent:withError:)
- forEventClass:eventClass
- andEventID:eventID];
- gotEvent_ = NO;
- goodEvent = [event gtm_sendEventWithMode:kAEWaitReply timeOut:60 reply:&reply];
- STAssertFalse(goodEvent, @"good event?");
- STAssertTrue(gotEvent_, @"Handler not called?");
- [mgr removeEventHandlerForEventClass:eventClass andEventID:eventID];
-}
-
-@end
diff --git a/Foundation/GTMNSAppleEventDescriptor+Handler.h b/Foundation/GTMNSAppleEventDescriptor+Handler.h
deleted file mode 100644
index 29c9c1e..0000000
--- a/Foundation/GTMNSAppleEventDescriptor+Handler.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// GTMNSAppleEventDescriptor+Handler.h
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-
-@interface NSAppleEventDescriptor (GTMAppleEventDescriptorHandlerAdditions)
-+ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler
- parametersArray:(NSArray*)params;
-+ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler
- parametersDescriptor:(NSAppleEventDescriptor*)params;
-+ (id)gtm_descriptorWithLabeledHandler:(NSString*)handler
- labels:(AEKeyword*)labels
- parameters:(id*)params
- count:(NSUInteger)count;
-
-- (id)gtm_initWithPositionalHandler:(NSString*)handler
- parametersArray:(NSArray*)params
- NS_RETURNS_RETAINED NS_CONSUMES_SELF;
-
-- (id)gtm_initWithPositionalHandler:(NSString*)handler
- parametersDescriptor:(NSAppleEventDescriptor*)params
- NS_RETURNS_RETAINED NS_CONSUMES_SELF;
-
-- (id)gtm_initWithLabeledHandler:(NSString*)handler
- labels:(AEKeyword*)labels
- parameters:(id*)params
- count:(NSUInteger)count
- NS_RETURNS_RETAINED NS_CONSUMES_SELF;
-@end
diff --git a/Foundation/GTMNSAppleEventDescriptor+Handler.m b/Foundation/GTMNSAppleEventDescriptor+Handler.m
deleted file mode 100644
index 76b6e85..0000000
--- a/Foundation/GTMNSAppleEventDescriptor+Handler.m
+++ /dev/null
@@ -1,130 +0,0 @@
-//
-// GTMNSAppleEventDescriptor+Handler.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMNSAppleEventDescriptor+Handler.h"
-#import "GTMNSAppleEventDescriptor+Foundation.h"
-#import "GTMMethodCheck.h"
-#import <Carbon/Carbon.h>
-
-@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorHandlerAdditions)
-GTM_METHOD_CHECK(NSProcessInfo, gtm_appleEventDescriptor);
-
-+ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler
- parametersArray:(NSArray*)params {
- return [[[self alloc] gtm_initWithPositionalHandler:handler
- parametersArray:params] autorelease];
-}
-
-+ (id)gtm_descriptorWithPositionalHandler:(NSString*)handler
- parametersDescriptor:(NSAppleEventDescriptor*)params {
- return [[[self alloc] gtm_initWithPositionalHandler:handler
- parametersDescriptor:params] autorelease];
-}
-
-+ (id)gtm_descriptorWithLabeledHandler:(NSString*)handler
- labels:(AEKeyword*)labels
- parameters:(id*)params
- count:(NSUInteger)count {
- return [[[self alloc] gtm_initWithLabeledHandler:handler
- labels:labels
- parameters:params
- count:count] autorelease];
-}
-
-- (id)gtm_initWithPositionalHandler:(NSString*)handler
- parametersArray:(NSArray*)params {
- return [self gtm_initWithPositionalHandler:handler
- parametersDescriptor:[params gtm_appleEventDescriptor]];
-}
-
-- (id)gtm_initWithPositionalHandler:(NSString*)handler
- parametersDescriptor:(NSAppleEventDescriptor*)params {
- if ((self = [self initWithEventClass:kASAppleScriptSuite
- eventID:kASSubroutineEvent
- targetDescriptor:[[NSProcessInfo processInfo] gtm_appleEventDescriptor]
- returnID:kAutoGenerateReturnID
- transactionID:kAnyTransactionID])) {
- // Create an NSAppleEventDescriptor with the method handler. Note that the
- // name must be lowercase (even if it is uppercase in AppleScript).
- // http://developer.apple.com/qa/qa2001/qa1111.html
- // has details.
- handler = [handler lowercaseString];
- if (!handler) {
- [self release];
- return nil;
- }
- NSAppleEventDescriptor *handlerDesc
- = [NSAppleEventDescriptor descriptorWithString:handler];
- [self setParamDescriptor:handlerDesc forKeyword:keyASSubroutineName];
- if (params) {
- [self setParamDescriptor:params forKeyword:keyDirectObject];
- }
- }
- return self;
-}
-
-
-- (id)gtm_initWithLabeledHandler:(NSString*)handler
- labels:(AEKeyword*)labels
- parameters:(id*)params
- count:(NSUInteger)count {
- if ((self = [self initWithEventClass:kASAppleScriptSuite
- eventID:kASSubroutineEvent
- targetDescriptor:[[NSProcessInfo processInfo] gtm_appleEventDescriptor]
- returnID:kAutoGenerateReturnID
- transactionID:kAnyTransactionID])) {
- if (!handler) {
- [self release];
- return nil;
- }
- // Create an NSAppleEventDescriptor with the method handler. Note that the
- // name must be lowercase (even if it is uppercase in AppleScript).
- NSAppleEventDescriptor *handlerDesc
- = [NSAppleEventDescriptor descriptorWithString:[handler lowercaseString]];
- [self setParamDescriptor:handlerDesc forKeyword:keyASSubroutineName];
- for (NSUInteger i = 0; i < count; i++) {
- NSAppleEventDescriptor *paramDesc = [params[i] gtm_appleEventDescriptor];
- if(labels[i] == keyASPrepositionGiven) {
- if (![params[i] isKindOfClass:[NSDictionary class]]) {
- _GTMDevLog(@"Must pass in dictionary for keyASPrepositionGiven "
- "(got %@)", params[i]);
- [self release];
- self = nil;
- break;
- }
- NSAppleEventDescriptor *userDesc
- = [paramDesc descriptorForKeyword:keyASUserRecordFields];
- if (!userDesc) {
- _GTMDevLog(@"Dictionary for keyASPrepositionGiven must be a user "
- "record field dictionary (got %@)", params[i]);
- [self release];
- self = nil;
- break;
- }
- [self setParamDescriptor:userDesc
- forKeyword:keyASUserRecordFields];
- } else {
- [self setParamDescriptor:paramDesc
- forKeyword:labels[i]];
- }
- }
- }
- return self;
-}
-
-@end
diff --git a/Foundation/GTMNSAppleEventDescriptor+HandlerTest.m b/Foundation/GTMNSAppleEventDescriptor+HandlerTest.m
deleted file mode 100644
index a137d8a..0000000
--- a/Foundation/GTMNSAppleEventDescriptor+HandlerTest.m
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-// GTNNSAppleEventDescriptor+HandlerTest.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Carbon/Carbon.h>
-#import "GTMSenTestCase.h"
-#import "GTMNSAppleEventDescriptor+Foundation.h"
-#import "GTMNSAppleEventDescriptor+Handler.h"
-#import "GTMUnitTestDevLog.h"
-
-@interface GTMNSAppleEventDescriptor_HandlerTest : GTMTestCase
-@end
-
-@implementation GTMNSAppleEventDescriptor_HandlerTest
-// Most of this gets tested by the NSAppleScript+Handler tests.
-- (void)testPositionalHandlers {
- NSAppleEventDescriptor *desc
- = [NSAppleEventDescriptor gtm_descriptorWithPositionalHandler:nil
- parametersArray:[NSArray array]];
- STAssertNil(desc, @"got a desc?");
-
- desc = [NSAppleEventDescriptor gtm_descriptorWithPositionalHandler:@"happy"
- parametersDescriptor:nil];
- STAssertNotNil(desc, @"didn't get a desc?");
-
- desc = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:nil
- labels:nil
- parameters:nil
- count:0];
- STAssertNil(desc, @"got a desc?");
-
- AEKeyword keys[] = { keyASPrepositionGiven };
- NSString *string = @"foo";
- [GTMUnitTestDevLog expectString:@"Must pass in dictionary for "
- "keyASPrepositionGiven (got foo)"];
- desc = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:@"happy"
- labels:keys
- parameters:&string
- count:1];
- STAssertNil(desc, @"got a desc?");
-
- NSDictionary *dict = [NSDictionary dictionaryWithObject:@"bart"
- forKey:[NSNumber numberWithInt:4]];
- [GTMUnitTestDevLog expectString:@"Keys must be of type NSString or "
- "GTMFourCharCode: 4"];
- [GTMUnitTestDevLog expectPattern:@"Dictionary for keyASPrepositionGiven must "
- "be a user record field dictionary \\(got .*"];
- desc = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:@"happy"
- labels:keys
- parameters:&dict
- count:1];
- STAssertNil(desc, @"got a desc?");
-
-}
-
-@end
diff --git a/Foundation/GTMNSAppleScript+Handler.h b/Foundation/GTMNSAppleScript+Handler.h
deleted file mode 100644
index ba4fe72..0000000
--- a/Foundation/GTMNSAppleScript+Handler.h
+++ /dev/null
@@ -1,132 +0,0 @@
-//
-// GTMNSAppleScript+Handler.h
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-
-// A category for calling handlers in NSAppleScript
-
-enum {
- // Data type is OSAID. These will generally be representing
- // scripts.
- typeGTMOSAID = 'GTMO'
-};
-
-@interface NSAppleScript(GTMAppleScriptHandlerAdditions)
-// Allows us to call a specific handler in an AppleScript.
-// parameters are passed in left-right order 0-n.
-//
-// Args:
-// handler - name of the handler to call in the Applescript
-// params - the parameters to pass to the handler
-// error - in non-nil returns any error that may have occurred.
-//
-// Returns:
-// The result of the handler being called. nil on failure.
-- (NSAppleEventDescriptor*)gtm_executePositionalHandler:(NSString*)handler
- parameters:(NSArray*)params
- error:(NSDictionary**)error;
-
-
-// Allows us to call a specific labeled handler in an AppleScript.
-// Parameters for a labeled handler can be in any order, as long as the
-// order of the params array corresponds to the order of the labels array
-// such that labels are associated with their correct parameter values.
-//
-// Args:
-// handler - name of the handler to call in the Applescript
-// labels - the labels to associate with the parameters
-// params - the parameters to pass to the handler
-// count - number of labels/parameters
-// error - in non-nil returns any error that may have occurred.
-//
-// Returns:
-// The result of the handler being called. nil on failure.
-- (NSAppleEventDescriptor*)gtm_executeLabeledHandler:(NSString*)handler
- labels:(AEKeyword*)labels
- parameters:(id*)params
- count:(NSUInteger)count
- error:(NSDictionary **)error;
-
-// Same as executeAppleEvent:error: except that it handles return values of
-// script correctly. Return values containing scripts will have the
-// typeGTMOSAID. Calling gtm_objectValue on a NSAppleEventDescriptor of
-// typeGTMOSAID will resolve correctly to a script value. We don't use
-// typeScript because that actually copies the script instead of returning the
-// actual value. Therefore if you called executeAppleEvent:error: (instead of
-// the GTM version) to execute an event that returns a script, you will
-// get a completely new Applescript, instead of the actual script you wanted. If
-// you are working with script information, use gtm_executeAppleEvent:error
-// instead of executeAppleEvent:error: to avoid the problem.
-- (NSAppleEventDescriptor *)gtm_executeAppleEvent:(NSAppleEventDescriptor *)event
- error:(NSDictionary **)error;
-
-// The set of all handlers that are defined in this script and its parents.
-// Remember that handlers that are defined in an sdef will have their
-// eventclass/eventid as their handler instead of the name seen in the script.
-// So:
-// on open(a)
-// blah
-// end open
-// won't be "open" it will be "aevtodoc".
-- (NSSet*)gtm_handlers;
-
-// The set of all properties that are defined in this script and its parents.
-// Note that properties can be strings or GTMNSFourCharCodes, so expect both
-// coming back in the set.
-- (NSSet*)gtm_properties;
-
-// Return a value for a property. Will look up the inheritence tree.
-// Property must be an NSString or a GTMFourCharCode.
-- (id)gtm_valueForProperty:(id)property;
-
-// Return a value for a property by type (eg pASParent). Will look up the
-// inheritence tree
-- (id)gtm_valueForPropertyEnum:(DescType)property;
-
-// Set a script property value. Returns YES/NO on success/failure.
-// Property must be of kind NSString or GTMFourCharCode.
-// If addingDefinition is YES, it will add a definition to the script
-// if the value doesn't exist in the script or one of it's parents.
-- (BOOL)gtm_setValue:(id)value
- forProperty:(id)property
- addingDefinition:(BOOL)adding;
-
-// Set a value for a property by type (eg pASParent). See note above
-// for gtm_setValue:forProperty.
-- (BOOL)gtm_setValue:(id)value
- forPropertyEnum:(DescType)property
- addingDefinition:(BOOL)adding;
-
-// Return YES if the script has an open documents (odoc) handler
-// Does not require script compilation, so it's a fast check.
-- (BOOL)gtm_hasOpenDocumentsHandler;
-
-@end
-
-// Error keys that we may return in the error dictionary on top of the standard
-// NSAppleScriptError* keys.
-extern NSString const* GTMNSAppleScriptErrorPartialResult; // id
-extern NSString const* GTMNSAppleScriptErrorOffendingObject; // id
-extern NSString const* GTMNSAppleScriptErrorExpectedType; // GTMFourCharCode
-
-@interface NSAppleEventDescriptor (GTMAppleEventDescriptorOSAAdditions)
-// Returns an NSValue containing an NSRange of script source when an error
-// occurs while compiling and/or executing a script.
-- (id)gtm_OSAErrorRangeValue;
-@end
diff --git a/Foundation/GTMNSAppleScript+Handler.m b/Foundation/GTMNSAppleScript+Handler.m
deleted file mode 100644
index 850de58..0000000
--- a/Foundation/GTMNSAppleScript+Handler.m
+++ /dev/null
@@ -1,662 +0,0 @@
-//
-// GTMNSAppleScript+Handler.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Carbon/Carbon.h>
-#import "GTMNSAppleScript+Handler.h"
-#import "GTMNSAppleEventDescriptor+Foundation.h"
-#import "GTMNSAppleEventDescriptor+Handler.h"
-#import "GTMFourCharCode.h"
-#import "GTMMethodCheck.h"
-
-// Keys for passing AppleScript calls from other threads to the main thread
-// and back through gtm_internalExecuteAppleEvent:
-static NSString *const GTMNSAppleScriptEventKey = @"GTMNSAppleScriptEvent";
-static NSString *const GTMNSAppleScriptResultKey = @"GTMNSAppleScriptResult";
-static NSString *const GTMNSAppleScriptErrorKey = @"GTMNSAppleScriptError";
-
-// Error keys that we may return in the error dictionary on top of the standard
-// NSAppleScriptError* keys.
-NSString const* GTMNSAppleScriptErrorPartialResult
- = @"GTMNSAppleScriptErrorPartialResult";
-NSString const* GTMNSAppleScriptErrorOffendingObject
- = @"GTMNSAppleScriptErrorOffendingObject";
-NSString const* GTMNSAppleScriptErrorExpectedType
- = @"GTMNSAppleScriptErrorExpectedType";
-
-// Some private methods that we need to call
-@interface NSAppleScript (NSPrivate)
-+ (ComponentInstance)_defaultScriptingComponent;
-- (OSAID) _compiledScriptID;
-- (id)_initWithData:(NSData*)data error:(NSDictionary**)error;
-- (id)_initWithScriptIDNoCopy:(OSAID)osaID;
-@end
-
-@interface NSMethodSignature (NSPrivate)
-+ (id)signatureWithObjCTypes:(const char *)fp8;
-@end
-
-// Our own private interfaces.
-@interface NSAppleScript (GTMAppleScriptHandlerAdditionsPrivate)
-
-// Return an descriptor for a property. Properties are only supposed to be
-// of type NSString or GTMFourCharCode. GTMFourCharCode's need special handling
-// as they must be turned into NSAppleEventDescriptors of typeProperty.
-- (NSAppleEventDescriptor*)gtm_descriptorForPropertyValue:(id)property;
-
-// Return an NSAppleEventDescriptor for a given property.
-// |property| must be kind of class GTMFourCharCode
-- (NSAppleEventDescriptor*)gtm_valueDescriptorForProperty:(id)property;
-
-// Utility routine for extracting multiple values in scripts and their
-// parents.
-- (NSSet*)gtm_allValuesUsingSelector:(SEL)selector;
-
-// Utility routine for extracting the handlers for a specific script without
-// referring to parent scripts.
-- (NSSet*)gtm_scriptHandlers;
-
-// Utility routine for extracting the properties for a specific script without
-// referring to parent scripts.
-- (NSSet*)gtm_scriptProperties;
-
-// Handles creating an NSAppleEventDescriptor from an OSAID
-- (NSAppleEventDescriptor*)descForScriptID:(OSAID)scriptID
- component:(ComponentInstance)component;
-
-// Utility methods for converting between real and generic OSAIDs.
-- (OSAID)gtm_genericID:(OSAID)osaID forComponent:(ComponentInstance)component;
-- (OSAID)gtm_realIDAndComponent:(ComponentInstance*)component;
-
-- (void)gtm_internalExecuteAppleEvent:(NSMutableDictionary *)data;
-
-- (NSDictionary *)gtm_errorDictionaryFromOSStatus:(OSStatus)status
- component:(ComponentInstance)component;
-@end
-
-// Private methods for dealing with Scripts/Events and NSAppleEventDescriptors
-@interface NSAppleEventDescriptor (GTMAppleEventDescriptorScriptAdditions)
-
-// Return an NSAppleScript for a desc of typeScript. This will create a new
-// Applescript that is a copy of the script that you want.
-// Returns nil on failure.
-- (NSAppleScript*)gtm_scriptValue;
-
-// Return an NSAppleScript for a desc of typeGTMOSAID. This will not copy the
-// script, but will create an NSAppleScript wrapping the script represented
-// by the OSAID.
-// Returns nil on failure.
-- (NSAppleScript*)gtm_osaIDValue;
-
-// Return a NSString with [eventClass][eventID] for typeEvent 'evnt'
-- (NSString*)gtm_eventValue;
-@end
-
-@implementation NSAppleScript(GTMAppleScriptHandlerAdditions)
-GTM_METHOD_CHECK(NSAppleEventDescriptor, gtm_descriptorWithPositionalHandler:parametersArray:);
-GTM_METHOD_CHECK(NSAppleEventDescriptor, gtm_descriptorWithLabeledHandler:labels:parameters:count:);
-GTM_METHOD_CHECK(NSAppleEventDescriptor, gtm_registerSelector:forTypes:count:);
-
-+ (void)load {
- DescType types[] = {
- typeScript
- };
-
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_scriptValue)
- forTypes:types
- count:sizeof(types)/sizeof(DescType)];
-
- DescType types2[] = {
- 'evnt' // No type code for this one
- };
-
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_eventValue)
- forTypes:types2
- count:sizeof(types2)/sizeof(DescType)];
-
- DescType types3[] = {
- typeGTMOSAID
- };
-
- [NSAppleEventDescriptor gtm_registerSelector:@selector(gtm_osaIDValue)
- forTypes:types3
- count:sizeof(types3)/sizeof(DescType)];
- [pool drain];
-}
-
-- (NSAppleEventDescriptor *)gtm_executeAppleEvent:(NSAppleEventDescriptor *)event
- error:(NSDictionary **)error {
- NSMutableDictionary *data = [NSMutableDictionary dictionaryWithObjectsAndKeys:
- event, GTMNSAppleScriptEventKey, nil];
- [self performSelectorOnMainThread:@selector(gtm_internalExecuteAppleEvent:)
- withObject:data
- waitUntilDone:YES];
- if (error) {
- *error = [data objectForKey:GTMNSAppleScriptErrorKey];
- }
- return [data objectForKey:GTMNSAppleScriptResultKey];
-}
-
-- (NSAppleEventDescriptor*)gtm_executePositionalHandler:(NSString*)handler
- parameters:(NSArray*)params
- error:(NSDictionary**)error {
- NSAppleEventDescriptor *event
- = [NSAppleEventDescriptor gtm_descriptorWithPositionalHandler:handler
- parametersArray:params];
- return [self gtm_executeAppleEvent:event error:error];
-}
-
-- (NSAppleEventDescriptor*)gtm_executeLabeledHandler:(NSString*)handler
- labels:(AEKeyword*)labels
- parameters:(id*)params
- count:(NSUInteger)count
- error:(NSDictionary **)error {
- NSAppleEventDescriptor *event
- = [NSAppleEventDescriptor gtm_descriptorWithLabeledHandler:handler
- labels:labels
- parameters:params
- count:count];
- return [self gtm_executeAppleEvent:event error:error];
-}
-
-- (NSSet*)gtm_handlers {
- return [self gtm_allValuesUsingSelector:@selector(gtm_scriptHandlers)];
-}
-
-- (NSSet*)gtm_properties {
- return [self gtm_allValuesUsingSelector:@selector(gtm_scriptProperties)];
-}
-
-// Set a value for a property by type (eg pASTopLevelScript)
-- (BOOL)gtm_setValue:(id)value
- forPropertyEnum:(DescType)property
- addingDefinition:(BOOL)adding {
- GTMFourCharCode *fcc
- = [GTMFourCharCode fourCharCodeWithFourCharCode:property];
- return [self gtm_setValue:value forProperty:fcc addingDefinition:adding];
-}
-
-- (BOOL)gtm_setValue:(id)value
- forProperty:(id)property
- addingDefinition:(BOOL)adding{
- OSAError error = paramErr;
- BOOL wasGood = NO;
- NSAppleEventDescriptor *propertyName
- = [self gtm_descriptorForPropertyValue:property];
- NSAppleEventDescriptor *desc = [value gtm_appleEventDescriptor];
- if (propertyName && desc) {
- NSAppleScript *script = self;
- OSAID valueID = kOSANullScript;
- ComponentInstance component = NULL;
- OSAID scriptID = [script gtm_realIDAndComponent:&component];
- error = OSACoerceFromDesc(component,
- [desc aeDesc],
- kOSAModeNull,
- &valueID);
- if (error == noErr) {
- error = OSASetProperty(component,
- adding ? kOSAModeNull : kOSAModeDontDefine,
- scriptID,
- [propertyName aeDesc],
- valueID);
- if (error == noErr) {
- wasGood = YES;
- }
- }
- }
- if (!wasGood) {
- _GTMDevLog(@"Unable to setValue:%@ forProperty:%@ from %@ (%d)",
- value, property, self, (int)error);
- }
- return wasGood;
-}
-
-- (id)gtm_valueForProperty:(id)property {
- return [[self gtm_valueDescriptorForProperty:property] gtm_objectValue];
-}
-
-- (id)gtm_valueForPropertyEnum:(DescType)property {
- GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:property];
- return [self gtm_valueForProperty:fcc];
-}
-
-- (NSAppleEventDescriptor*)gtm_appleEventDescriptor {
- ComponentInstance component;
- OSAID osaID = [self gtm_realIDAndComponent:&component];
- AEDesc result = { typeNull, NULL };
- NSAppleEventDescriptor *desc = nil;
- OSAError error = OSACoerceToDesc(component,
- osaID,
- typeScript,
- kOSAModeNull,
- &result);
- if (error == noErr) {
- desc = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&result]
- autorelease];
- } else {
- _GTMDevLog(@"Unable to coerce script %ld", (long)error);
- }
- return desc;
-}
-
-- (BOOL)gtm_hasOpenDocumentsHandler {
- ComponentInstance component = NULL;
- OSAID osaID = [self gtm_realIDAndComponent:&component];
- long value = 0;
- OSAError error = OSAGetScriptInfo(component,
- osaID,
- kASHasOpenHandler,
- &value);
- if (error) {
- _GTMDevLog(@"Unable to get script info about open handler %ld", (long)error);
- value = 0;
- }
- return value != 0;
-}
-
-- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
- NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
- if (!signature) {
- NSMutableString *types = [NSMutableString stringWithString:@"@@:"];
- NSString *selName = NSStringFromSelector(aSelector);
- NSArray *selArray = [selName componentsSeparatedByString:@":"];
- NSUInteger count = [selArray count];
- for (NSUInteger i = 1; i < count; i++) {
- [types appendString:@"@"];
- }
- signature = [NSMethodSignature signatureWithObjCTypes:[types UTF8String]];
- }
- return signature;
-}
-
-- (void)forwardInvocation:(NSInvocation *)invocation {
- SEL sel = [invocation selector];
- NSMutableString *handlerName
- = [NSMutableString stringWithString:NSStringFromSelector(sel)];
- NSUInteger handlerOrigLength = [handlerName length];
- [handlerName replaceOccurrencesOfString:@":"
- withString:@""
- options:0
- range:NSMakeRange(0,handlerOrigLength)];
- NSUInteger argCount = handlerOrigLength - [handlerName length];
- NSMutableArray *args = [NSMutableArray arrayWithCapacity:argCount];
- for (NSUInteger i = 0; i < argCount; ++i) {
- id arg;
- // +2 to ignore _sel and _cmd
- [invocation getArgument:&arg atIndex:i + 2];
- [args addObject:arg];
- }
- NSDictionary *error = nil;
- NSAppleEventDescriptor *desc = [self gtm_executePositionalHandler:handlerName
- parameters:args
- error:&error];
- if ([[invocation methodSignature] methodReturnLength] > 0) {
- id returnValue = [desc gtm_objectValue];
- [invocation setReturnValue:&returnValue];
- }
-}
-@end
-
-@implementation NSAppleScript (GTMAppleScriptHandlerAdditionsPrivate)
-
-- (NSAppleEventDescriptor*)gtm_descriptorForPropertyValue:(id)property {
- NSAppleEventDescriptor *propDesc = nil;
- if ([property isKindOfClass:[GTMFourCharCode class]]) {
- propDesc = [property gtm_appleEventDescriptorOfType:typeProperty];
- } else if ([property isKindOfClass:[NSString class]]) {
- propDesc = [property gtm_appleEventDescriptor];
- }
- return propDesc;
-}
-
-- (NSAppleEventDescriptor*)gtm_valueDescriptorForProperty:(id)property {
- _GTMDevAssert([NSThread isMainThread], @"Requires main thread.");
- OSAError error = paramErr;
- NSAppleEventDescriptor *desc = nil;
- NSAppleEventDescriptor *propertyName
- = [self gtm_descriptorForPropertyValue:property];
- if (propertyName) {
- ComponentInstance component = NULL;
- OSAID scriptID = [self gtm_realIDAndComponent:&component];
- OSAID valueID = kOSANullScript;
- error = OSAGetProperty(component,
- kOSAModeNull,
- scriptID,
- [propertyName aeDesc],
- &valueID);
- if (error == noErr) {
- desc = [self descForScriptID:valueID component:component];
- }
- }
- if (error) {
- _GTMDevLog(@"Unable to get valueForProperty:%@ from %@ (%d)",
- property, self, (int)error);
- }
- return desc;
-}
-
-- (NSSet*)gtm_allValuesUsingSelector:(SEL)selector {
- NSMutableSet *resultSet = [NSMutableSet set];
- NSAppleEventDescriptor *scriptDesc = [self gtm_appleEventDescriptor];
- NSMutableSet *scriptDescsWeveSeen = [NSMutableSet set];
- GTMFourCharCode *fcc = [GTMFourCharCode fourCharCodeWithFourCharCode:pASParent];
- Class appleScriptClass = [NSAppleScript class];
- while (scriptDesc) {
- NSAppleScript *script = [scriptDesc gtm_objectValue];
- if ([script isKindOfClass:appleScriptClass]) {
- NSData *data = [scriptDesc data];
- if (!data || [scriptDescsWeveSeen containsObject:data]) {
- break;
- } else {
- [scriptDescsWeveSeen addObject:data];
- }
- NSSet *newSet = [script performSelector:selector];
- [resultSet unionSet:newSet];
- scriptDesc = [script gtm_valueDescriptorForProperty:fcc];
- } else {
- break;
- }
- }
- return resultSet;
-}
-
-- (NSSet*)gtm_scriptHandlers {
- _GTMDevAssert([NSThread isMainThread], @"Requires main thread.");
- AEDescList names = { typeNull, NULL };
- NSArray *array = nil;
- ComponentInstance component = NULL;
- OSAID osaID = [self gtm_realIDAndComponent:&component];
- OSAError error = OSAGetHandlerNames(component, kOSAModeNull, osaID, &names);
- if (error == noErr) {
- NSAppleEventDescriptor *desc
- = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&names]
- autorelease];
- array = [desc gtm_objectValue];
- }
- if (error != noErr) {
- _GTMDevLog(@"Error getting handlers: %d", (int)error); // COV_NF_LINE
- }
- return [NSSet setWithArray:array];
-}
-
-- (NSSet*)gtm_scriptProperties {
- _GTMDevAssert([NSThread isMainThread], @"Requires main thread.");
- AEDescList names = { typeNull, NULL };
- NSArray *array = nil;
- ComponentInstance component = NULL;
- OSAID osaID = [self gtm_realIDAndComponent:&component];
- OSAError error = OSAGetPropertyNames(component, kOSAModeNull, osaID, &names);
- if (error == noErr) {
- NSAppleEventDescriptor *desc
- = [[[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&names]
- autorelease];
- array = [desc gtm_objectValue];
- }
- if (error != noErr) {
- _GTMDevLog(@"Error getting properties: %d", (int)error); // COV_NF_LINE
- }
- return [NSSet setWithArray:array];
-}
-
-- (OSAID)gtm_genericID:(OSAID)osaID forComponent:(ComponentInstance)component {
- _GTMDevAssert([NSThread isMainThread], @"Requires main thread.");
- ComponentInstance genericComponent = [NSAppleScript _defaultScriptingComponent];
- OSAID exactID = osaID;
- OSAError error = OSARealToGenericID(genericComponent, &exactID, component);
- if (error != noErr) {
- _GTMDevLog(@"Unable to get real id script: %@ %d", self, (int)error); // COV_NF_LINE
- exactID = kOSANullScript; // COV_NF_LINE
- }
- return exactID;
-}
-
-- (NSAppleEventDescriptor*)descForScriptID:(OSAID)osaID
- component:(ComponentInstance)component {
- _GTMDevAssert([NSThread isMainThread], @"Requires main thread.");
- NSAppleEventDescriptor *desc = nil;
- // If we have a script, return a typeGTMOSAID, otherwise convert it to
- // it's default AEDesc using OSACoerceToDesc with typeWildCard.
- long value = 0;
- OSAError err = noErr;
- if (osaID == 0) {
- desc = [NSAppleEventDescriptor nullDescriptor];
- } else {
- err = OSAGetScriptInfo(component,
- osaID,
- kOSAScriptBestType,
- &value);
- if (err == noErr) {
- if (value == typeScript) {
- osaID = [self gtm_genericID:osaID forComponent:component];
- desc = [NSAppleEventDescriptor descriptorWithDescriptorType:typeGTMOSAID
- bytes:&osaID
- length:sizeof(osaID)];
- } else {
- AEDesc aeDesc;
- err = OSACoerceToDesc(component,
- osaID,
- typeWildCard,
- kOSAModeNull,
- &aeDesc);
- if (err == noErr) {
- desc = [[[NSAppleEventDescriptor alloc]
- initWithAEDescNoCopy:&aeDesc] autorelease];
- }
- }
- }
- }
- if (err != noErr) {
- _GTMDevLog(@"Unable to create desc for id:%lu (%ld)", (unsigned long)osaID, (long)err); // COV_NF_LINE
- }
- return desc;
-}
-
-- (OSAID)gtm_realIDAndComponent:(ComponentInstance*)component {
- _GTMDevAssert([NSThread isMainThread], @"Requires main thread.");
- if (![self isCompiled]) {
- NSDictionary *error;
- if (![self compileAndReturnError:&error]) {
- _GTMDevLog(@"Unable to compile script: %@ %@", self, error);
- return kOSANullScript;
- }
- }
- OSAID genericID = [self _compiledScriptID];
- ComponentInstance genericComponent = [NSAppleScript _defaultScriptingComponent];
- OSAError error = OSAGenericToRealID(genericComponent, &genericID, component);
- if (error != noErr) {
- _GTMDevLog(@"Unable to get real id script: %@ %d", self, (int)error); // COV_NF_LINE
- genericID = kOSANullScript; // COV_NF_LINE
- }
- return genericID;
-}
-
-- (void)gtm_internalExecuteAppleEvent:(NSMutableDictionary *)data {
- _GTMDevAssert([NSThread isMainThread], @"Requires main thread.");
- NSDictionary *error = nil;
- if (![self isCompiled]) {
- [self compileAndReturnError:&error];
- }
- if (!error) {
- NSAppleEventDescriptor *desc = nil;
- NSAppleEventDescriptor *event = [data objectForKey:GTMNSAppleScriptEventKey];
- ComponentInstance component = NULL;
- OSAID scriptID = [self gtm_realIDAndComponent:&component];
- OSAID valueID;
- OSAError err = OSAExecuteEvent(component, [event aeDesc], scriptID,
- kOSAModeNull, &valueID);
- if (err == noErr) {
- // descForScriptID:component: is what sets this apart from the
- // standard executeAppleEvent:error: in that it handles
- // taking script results and turning them into AEDescs of typeGTMOSAID
- // instead of typeScript.
- desc = [self descForScriptID:valueID component:component];
- if (desc) {
- [data setObject:desc forKey:GTMNSAppleScriptResultKey];
- }
- } else {
- error = [self gtm_errorDictionaryFromOSStatus:err component:component];
- }
- }
- if (error) {
- [data setObject:error forKey:GTMNSAppleScriptErrorKey];
- }
-}
-
-- (NSDictionary *)gtm_errorDictionaryFromOSStatus:(OSStatus)status
- component:(ComponentInstance)component {
- NSMutableDictionary *error = nil;
- if (status == errOSAScriptError) {
- error = [NSMutableDictionary dictionary];
- struct {
- OSType selector;
- DescType desiredType;
- SEL extractor;
- id key;
- } errMap[] = {
- {
- kOSAErrorNumber,
- typeSInt16,
- @selector(gtm_numberValue),
- NSAppleScriptErrorNumber
- },
- {
- kOSAErrorMessage,
- typeText,
- @selector(stringValue),
- NSAppleScriptErrorMessage
- },
- {
- kOSAErrorBriefMessage,
- typeText,
- @selector(stringValue),
- NSAppleScriptErrorBriefMessage
- },
- { kOSAErrorApp,
- typeText,
- @selector(stringValue),
- NSAppleScriptErrorAppName
- },
- { kOSAErrorRange,
- typeOSAErrorRange,
- @selector(gtm_OSAErrorRangeValue),
- NSAppleScriptErrorRange
- },
- {
- kOSAErrorPartialResult,
- typeBest,
- @selector(gtm_objectValue),
- GTMNSAppleScriptErrorPartialResult
- },
- {
- kOSAErrorOffendingObject,
- typeBest,
- @selector(gtm_objectValue),
- GTMNSAppleScriptErrorOffendingObject
- },
- {
- kOSAErrorExpectedType,
- typeType,
- @selector(gtm_fourCharCodeValue),
- GTMNSAppleScriptErrorExpectedType
- },
- };
- for (size_t i = 0; i < sizeof(errMap) / sizeof(errMap[0]); ++i) {
- AEDesc errorResult = { typeNull, NULL };
- OSStatus err = OSAScriptError(component,
- errMap[i].selector,
- errMap[i].desiredType,
- &errorResult);
- if (err == noErr) {
- NSAppleEventDescriptor *desc = [[[NSAppleEventDescriptor alloc]
- initWithAEDescNoCopy:&errorResult] autorelease];
- id value = [desc performSelector:errMap[i].extractor];
- if (value) {
- [error setObject:value forKey:errMap[i].key];
- }
- }
- }
- } else if (status != noErr) {
- // Unknown error. Do our best to give the user something good.
- NSNumber *errNum = [NSNumber numberWithInt:status];
- error
- = [NSMutableDictionary dictionaryWithObject:errNum
- forKey:NSAppleScriptErrorNumber];
- NSString *briefMessage
- = [NSString stringWithUTF8String:GetMacOSStatusErrorString(status)];
- if (briefMessage) {
- [error setValue:briefMessage forKey:NSAppleScriptErrorBriefMessage];
- }
- NSString *message
- = [NSString stringWithUTF8String:GetMacOSStatusCommentString(status)];
- if (message) {
- [error setValue:message forKey:NSAppleScriptErrorMessage];
- }
- }
- return error;
-}
-@end
-
-@implementation NSAppleEventDescriptor (GMAppleEventDescriptorScriptAdditions)
-
-- (NSAppleScript*)gtm_scriptValue {
- NSDictionary *error;
- NSAppleScript *script = [[[NSAppleScript alloc] _initWithData:[self data]
- error:&error] autorelease];
- if (!script) {
- _GTMDevLog(@"Unable to create script: %@", error); // COV_NF_LINE
- }
- return script;
-}
-
-- (NSAppleScript*)gtm_osaIDValue {
- _GTMDevAssert([[self data] length] == sizeof(OSAID), nil);
- OSAID osaID = *(const OSAID*)[[self data] bytes];
- return [[[NSAppleScript alloc] _initWithScriptIDNoCopy:osaID] autorelease];
-}
-
-- (NSString*)gtm_eventValue {
- struct AEEventRecordStruct {
- AEEventClass eventClass;
- AEEventID eventID;
- };
- NSData *data = [self data];
- const struct AEEventRecordStruct *record
- = (const struct AEEventRecordStruct*)[data bytes];
- NSString *eClass = [GTMFourCharCode stringWithFourCharCode:record->eventClass];
- NSString *eID = [GTMFourCharCode stringWithFourCharCode:record->eventID];
- return [eClass stringByAppendingString:eID];
-}
-@end
-
-@implementation NSAppleEventDescriptor (GTMAppleEventDescriptorOSAAdditions)
-
-- (id)gtm_OSAErrorRangeValue {
- id value = nil;
- NSAppleEventDescriptor *start = [self descriptorForKeyword:keyOSASourceStart];
- if (start) {
- NSAppleEventDescriptor *end = [self descriptorForKeyword:keyOSASourceEnd];
- if (end) {
- NSRange range = NSMakeRange([start int32Value], [end int32Value]);
- value = [NSValue valueWithRange:range];
- }
- }
- return value;
-}
-
-@end
-
diff --git a/Foundation/GTMNSAppleScript+HandlerTest.m b/Foundation/GTMNSAppleScript+HandlerTest.m
deleted file mode 100644
index 6a064dd..0000000
--- a/Foundation/GTMNSAppleScript+HandlerTest.m
+++ /dev/null
@@ -1,504 +0,0 @@
-//
-// GTMNSAppleScript+HandlerTest.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import <Carbon/Carbon.h>
-#import "GTMNSAppleScript+Handler.h"
-#import "GTMNSAppleEventDescriptor+Foundation.h"
-#import "GTMUnitTestDevLog.h"
-#import "GTMSystemVersion.h"
-#import "GTMFourCharCode.h"
-
-@protocol ScriptInterface
-- (id)test;
-- (id)testReturnParam:(id)param;
-- (id)testAddParams:(id)param1 :(id)param2;
-@end
-
-@interface GTMNSAppleScript_HandlerTest : GTMTestCase {
- NSAppleScript *script_;
-}
-@end
-
-@implementation GTMNSAppleScript_HandlerTest
-
-- (void)setUp {
- NSBundle *bundle
- = [NSBundle bundleForClass:[GTMNSAppleScript_HandlerTest class]];
- STAssertNotNil(bundle, nil);
- NSString *path = [bundle pathForResource:@"GTMNSAppleEvent+HandlerTest"
- ofType:@"scpt"
- inDirectory:@"Scripts"];
- STAssertNotNil(path, [bundle description]);
- NSDictionary *error = nil;
- script_
- = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]
- error:&error];
- STAssertNotNil(script_, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
-}
-
-- (void)tearDown {
- [script_ release];
- script_ = nil;
-}
-
-- (void)testExecuteAppleEvent {
- NSString *source = @"on test()\nreturn 1\nend test";
- NSAppleScript *script
- = [[[NSAppleScript alloc] initWithSource:source] autorelease];
- STAssertNotNil(script, nil);
- NSDictionary *error = nil;
- NSAppleEventDescriptor *desc = [script gtm_executePositionalHandler:@"test"
- parameters:nil
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc gtm_objectValue], [NSNumber numberWithInt:1], nil);
-
- // bogus script
- source = @"adf872345ba asdf asdf gr";
- script = [[[NSAppleScript alloc] initWithSource:source] autorelease];
- STAssertNotNil(script, nil);
- desc = [script gtm_executePositionalHandler:@"test"
- parameters:nil
- error:&error];
- STAssertNil(desc, nil);
- STAssertNotNil(error, @"Error should not be nil");
-}
-
-- (void)testHandlerNoParamsNoReturn {
- NSDictionary *error = nil;
- NSAppleEventDescriptor *desc = [script_ gtm_executePositionalHandler:@"test"
- parameters:nil
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeNull, nil);
- desc = [script_ gtm_executePositionalHandler:@"test"
- parameters:[NSArray array]
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeNull, nil);
-
- //Applescript doesn't appear to get upset about extra params
- desc = [script_ gtm_executePositionalHandler:@"test"
- parameters:[NSArray arrayWithObject:@"foo"]
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeNull, nil);
-}
-
-- (void)testHandlerNoParamsWithReturn {
- NSDictionary *error = nil;
- NSAppleEventDescriptor *desc
- = [script_ gtm_executePositionalHandler:@"testReturnOne"
- parameters:nil
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil);
- STAssertEquals([desc int32Value], (SInt32)1, nil);
- desc = [script_ gtm_executePositionalHandler:@"testReturnOne"
- parameters:[NSArray array]
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil);
- STAssertEquals([desc int32Value], (SInt32)1, nil);
-
- //Applescript doesn't appear to get upset about extra params
- desc = [script_ gtm_executePositionalHandler:@"testReturnOne"
- parameters:[NSArray arrayWithObject:@"foo"]
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil);
- STAssertEquals([desc int32Value], (SInt32)1, nil);
-}
-
-- (void)testHandlerOneParamWithReturn {
- NSDictionary *error = nil;
- // Note case change in executeHandler call
- NSAppleEventDescriptor *desc
- = [script_ gtm_executePositionalHandler:@"testreturnParam"
- parameters:nil
- error:&error];
- STAssertNil(desc, @"Desc should by nil %@", desc);
- STAssertNotNil(error, nil);
- error = nil;
-
- desc = [script_ gtm_executePositionalHandler:@"testReturnParam"
- parameters:[NSArray array]
- error:&error];
- STAssertNil(desc, @"Desc should by nil %@", desc);
-
- // Verify that our error handling is working correctly.
- STAssertEquals([[error allKeys] count], (NSUInteger)6, @"%@", error);
- STAssertNotNil([error objectForKey:GTMNSAppleScriptErrorOffendingObject],
- @"%@", error);
- STAssertNotNil([error objectForKey:GTMNSAppleScriptErrorPartialResult],
- @"%@", error);
-
- error = nil;
-
- desc = [script_ gtm_executePositionalHandler:@"testReturnParam"
- parameters:[NSArray arrayWithObject:@"foo"]
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeUnicodeText, nil);
- STAssertEqualObjects([desc gtm_objectValue], @"foo", nil);
-}
-
-- (void)testHandlerTwoParamsWithReturn {
- NSDictionary *error = nil;
- // Note case change in executeHandler call
- // Test case and empty params
- NSAppleEventDescriptor *desc
- = [script_ gtm_executePositionalHandler:@"testADDPArams"
- parameters:nil
- error:&error];
- STAssertNil(desc, @"Desc should by nil %@", desc);
- STAssertNotNil(error, nil);
-
- // Test empty params
- error = nil;
- desc = [script_ gtm_executePositionalHandler:@"testAddParams"
- parameters:[NSArray array]
- error:&error];
- STAssertNil(desc, @"Desc should by nil %@", desc);
- STAssertNotNil(error, nil);
-
- error = nil;
- NSArray *args = [NSArray arrayWithObjects:
- [NSNumber numberWithInt:1],
- [NSNumber numberWithInt:2],
- nil];
- desc = [script_ gtm_executePositionalHandler:@"testAddParams"
- parameters:args
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil);
- STAssertEquals([desc int32Value], (SInt32)3, nil);
-
- // Test bad params
- error = nil;
- args = [NSArray arrayWithObjects:
- @"foo",
- @"bar",
- nil];
- desc = [script_ gtm_executePositionalHandler:@"testAddParams"
- parameters:args
- error:&error];
- STAssertNil(desc, @"Desc should by nil %@", desc);
- STAssertNotNil(error, nil);
-
- // Test too many params. Currently Applescript allows this so it should pass
- error = nil;
- args = [NSArray arrayWithObjects:
- [NSNumber numberWithInt:1],
- [NSNumber numberWithInt:2],
- [NSNumber numberWithInt:3],
- nil];
- desc = [script_ gtm_executePositionalHandler:@"testAddParams"
- parameters:args
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil);
- STAssertEquals([desc int32Value], (SInt32)3, nil);}
-
-- (void)testLabeledHandler {
- NSDictionary *error = nil;
- AEKeyword labels[] = { keyDirectObject,
- keyASPrepositionOnto,
- keyASPrepositionGiven };
- id params[3];
- params[0] = [NSNumber numberWithInt:1];
- params[1] = [NSNumber numberWithInt:3];
- params[2] = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:4]
- forKey:@"othervalue"];
-
- NSAppleEventDescriptor *desc
- = [script_ gtm_executeLabeledHandler:@"testAdd"
- labels:labels
- parameters:params
- count:sizeof(params) / sizeof(id)
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil);
- STAssertEquals([desc int32Value], (SInt32)8, nil);
-
- // Test too many params. Currently Applescript allows this so it should pass
- AEKeyword labels2[] = { keyDirectObject,
- keyASPrepositionOnto,
- keyASPrepositionBetween,
- keyASPrepositionGiven };
- id params2[4];
- params2[0] = [NSNumber numberWithInt:1];
- params2[1] = [NSNumber numberWithInt:3];
- params2[2] = [NSNumber numberWithInt:5];
- params2[3] = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:4]
- forKey:@"othervalue"];
-
- error = nil;
- desc = [script_ gtm_executeLabeledHandler:@"testAdd"
- labels:labels2
- parameters:params2
- count:sizeof(params2) / sizeof(id)
- error:&error];
- STAssertNotNil(desc, [error description]);
- STAssertNil(error, @"Error should be nil. Error = %@", [error description]);
- STAssertEquals([desc descriptorType], (DescType)typeSInt32, nil);
- STAssertEquals([desc int32Value], (SInt32)8, nil);}
-
-- (void)testHandlers {
- NSSet *handlers = [script_ gtm_handlers];
- NSSet *expected = [NSSet setWithObjects:
- @"aevtpdoc",
- @"test",
- @"testreturnone",
- @"testreturnparam",
- @"testaddparams",
- @"testadd",
- @"testgetscript",
- nil];
- if ([GTMSystemVersion isSnowLeopardOrGreater]) {
- // Workaround for bug in SnowLeopard
- // rdar://66688601 OSAGetHandlersNames returns names in camelcase instead
- // of smallcaps.
- handlers = [handlers valueForKey:@"lowercaseString"];
- }
- STAssertEqualObjects(handlers, expected, @"Unexpected handlers?");
-}
-
-- (void)testInheritedHandlers {
- NSDictionary *error = nil;
- NSAppleEventDescriptor *desc
- = [script_ gtm_executePositionalHandler:@"testGetScript"
- parameters:nil
- error:&error];
- STAssertNil(error, nil);
- STAssertNotNil(desc, nil);
- NSAppleScript *script = [desc gtm_objectValue];
- STAssertTrue([script isKindOfClass:[NSAppleScript class]], nil);
- error = nil;
- desc = [script gtm_executePositionalHandler:@"parentTestScriptFunc"
- parameters:nil error:&error];
- STAssertNil(error, nil);
- STAssertNotNil(desc, nil);
- NSString *value = [desc gtm_objectValue];
- STAssertEqualObjects(value, @"parent", nil);
-}
-
-- (void)testProperties {
- NSDictionary *error = nil;
- NSAppleEventDescriptor *desc
- = [script_ gtm_executePositionalHandler:@"testGetScript"
- parameters:nil
- error:&error];
- STAssertNil(error, nil);
- STAssertNotNil(desc, nil);
- NSAppleScript *script = [desc gtm_objectValue];
- STAssertTrue([script isKindOfClass:[NSAppleScript class]], nil);
-
- NSSet *properties = [script gtm_properties];
- NSSet *expected
- = [NSSet setWithObjects:
- @"testscriptproperty",
- @"parenttestscriptproperty",
- @"foo",
- @"testscript",
- @"parenttestscript",
- @"asdscriptuniqueidentifier",
- [GTMFourCharCode fourCharCodeWithFourCharCode:pVersion],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASPrintDepth],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASTopLevelScript],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASResult],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASMinutes],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASDays],
- // No constant for linefeed in the 10.5 sdk
- // Radar 6132775 Need a constant for the Applescript Property 'lnfd'
- [GTMFourCharCode fourCharCodeWithFourCharCode:'lnfd'],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASPi],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASReturn],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASSpace],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASPrintLength],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASQuote],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASWeeks],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pTextItemDelimiters],
- // Applescript properties should be pASSeconds, but
- // on 10.5.4/10.5.5 it is actually using cSeconds.
- // Radar 6132696 Applescript root level property is cSeconds
- // instead of pASSeconds
- [GTMFourCharCode fourCharCodeWithFourCharCode:cSeconds],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASHours],
- [GTMFourCharCode fourCharCodeWithFourCharCode:pASTab],
- nil];
- if ([GTMSystemVersion isSnowLeopardOrGreater]) {
- // Workaround for bug in SnowLeopard
- // rdar://6289077 OSAGetPropertyNames returns names in camelcase instead
- // of lowercase.
- id obj;
- NSMutableSet *properties2 = [NSMutableSet set];
- GTM_FOREACH_OBJECT(obj, properties) {
- if ([obj isKindOfClass:[NSString class]]) {
- obj = [obj lowercaseString];
- }
- [properties2 addObject:obj];
- }
- properties = properties2;
- }
- STAssertEqualObjects(properties, expected, @"Unexpected properties?");
- id value = [script gtm_valueForProperty:@"testScriptProperty"];
- STAssertEqualObjects(value, [NSNumber numberWithInt:5], @"bad property?");
- BOOL goodSet = [script gtm_setValue:@"bar"
- forProperty:@"foo"
- addingDefinition:NO];
- STAssertTrue(goodSet, @"Couldn't set property");
-
- // Test local set
- value = [script gtm_valueForProperty:@"foo"];
- STAssertEqualObjects(value, @"bar", @"bad property?");
-
- // Test inherited set
- value = [script_ gtm_valueForProperty:@"foo"];
- STAssertEqualObjects(value, @"bar", @"bad property?");
-
- [GTMUnitTestDevLog expectPattern:@"Unable to setValue:bar forProperty:"
- "\\(null\\) from <NSAppleScript: 0x[0-9a-f]+> \\(-50\\)"];
- goodSet = [script gtm_setValue:@"bar"
- forProperty:nil
- addingDefinition:NO];
- STAssertFalse(goodSet, @"Set property?");
-
- [GTMUnitTestDevLog expectPattern:@"Unable to setValue:bar forProperty:3"
- " from <NSAppleScript: 0x[0-9a-f]+> \\(-50\\)"];
- goodSet = [script gtm_setValue:@"bar"
- forProperty:[NSNumber numberWithInt:3]
- addingDefinition:YES];
- STAssertFalse(goodSet, @"Set property?");
-
-
- [GTMUnitTestDevLog expectPattern:@"Unable to get valueForProperty:gargle "
- "from <NSAppleScript: 0x[0-9a-f]+> \\(-1753\\)"];
- value = [script gtm_valueForProperty:@"gargle"];
- STAssertNil(value, @"Property named gargle?");
-
- goodSet = [script_ gtm_setValue:@"wow"
- forProperty:@"addedProperty"
- addingDefinition:YES];
- STAssertTrue(goodSet, @"Unable to addProperty");
-
- value = [script gtm_valueForProperty:@"addedProperty"];
- STAssertNotNil(value, nil);
- STAssertEqualObjects(value, @"wow", nil);
-
- // http://www.straightdope.com/classics/a3_341.html
- NSNumber *newPI = [NSNumber numberWithInt:3];
- goodSet = [script gtm_setValue:newPI
- forPropertyEnum:pASPi
- addingDefinition:NO];
- STAssertTrue(goodSet, @"Unable to set property");
- value = [script_ gtm_valueForPropertyEnum:pASPi];
- STAssertNotNil(value, nil);
- STAssertEqualObjects(value, newPI, @"bad property");
-}
-
-- (void)testFailures {
- NSDictionary *error = nil;
- NSAppleEventDescriptor *desc
- = [script_ gtm_executePositionalHandler:@"noSuchTest"
- parameters:nil
- error:&error];
- STAssertNil(desc, nil);
- STAssertNotNil(error, nil);
-
- // Test with empty handler name
- error = nil;
- desc = [script_ gtm_executePositionalHandler:@""
- parameters:[NSArray array]
- error:&error];
- STAssertNil(desc, nil);
- STAssertNotNil(error, nil);
-
- // Test with nil handler
- error = nil;
- desc = [script_ gtm_executePositionalHandler:nil
- parameters:[NSArray array]
- error:&error];
- STAssertNil(desc, nil);
- STAssertNotNil(error, nil);
-
- // Test with nil handler and nil error
- desc = [script_ gtm_executePositionalHandler:nil
- parameters:nil
- error:nil];
- STAssertNil(desc, nil);
-
- // Test with a bad script
- NSAppleScript *script
- = [[[NSAppleScript alloc] initWithSource:@"david hasselhoff"] autorelease];
- [GTMUnitTestDevLog expectPattern:@"Unable to compile script: .*"];
- [GTMUnitTestDevLog expectString:@"Unable to coerce script -2147450879"];
- NSSet *handlers = [script gtm_handlers];
- STAssertEquals([handlers count], (NSUInteger)0, @"Should have no handlers");
- [GTMUnitTestDevLog expectPattern:@"Unable to compile script: .*"];
- [GTMUnitTestDevLog expectString:@"Unable to coerce script -2147450879"];
- NSSet *properties = [script gtm_properties];
- STAssertEquals([properties count],
- (NSUInteger)0,
- @"Should have no properties");
- [GTMUnitTestDevLog expectPattern:@"Unable to compile script: .*"];
- [GTMUnitTestDevLog expectString:@"Unable to get script info about "
- @"open handler -2147450879"];
- STAssertFalse([script gtm_hasOpenDocumentsHandler],
- @"Has an opendoc handler?");
-}
-
-- (void)testScriptDescriptors {
- NSAppleEventDescriptor *desc = [script_ gtm_appleEventDescriptor];
- STAssertNotNil(desc, @"Couldn't make a script desc");
- NSAppleScript *script = [desc gtm_objectValue];
- STAssertNotNil(script, @"Couldn't get a script back");
- NSSet *handlers = [script gtm_handlers];
- STAssertNotNil(handlers, @"Couldn't get handlers");
-}
-
-- (void)testOpenHandler {
- STAssertFalse([script_ gtm_hasOpenDocumentsHandler], nil);
- id script = [script_ gtm_valueForProperty:@"testscript"];
- STAssertNotNil(script, nil);
- STAssertTrue([script gtm_hasOpenDocumentsHandler], nil);
-}
-
-- (void)testForwarding {
- id<ScriptInterface> foo = (id<ScriptInterface>)script_;
- [foo test];
- NSNumber *val = [foo testReturnParam:[NSNumber numberWithInt:2]];
- STAssertEquals([val intValue], 2, @"should be 2");
- val = [foo testAddParams:[NSNumber numberWithInt:2]
- :[NSNumber numberWithInt:3]];
- STAssertEquals([val intValue], 5, @"should be 5");
-}
-@end
diff --git a/Foundation/GTMNSArray+Merge.m b/Foundation/GTMNSArray+Merge.m
index 5bf07c8..4b67853 100644
--- a/Foundation/GTMNSArray+Merge.m
+++ b/Foundation/GTMNSArray+Merge.m
@@ -6,13 +6,13 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations
+// License for the specific language governing permissions and limitations
// under the License.
//
@@ -48,20 +48,20 @@
[mergingArray sortUsingSelector:comparer];
NSArray *sortedNewArray
= [newArray sortedArrayUsingSelector:comparer];
-
+
NSUInteger oldIndex = 0;
NSUInteger oldCount = [mergingArray count];
id oldItem = (oldIndex < oldCount)
? [mergingArray objectAtIndex:0]
: nil;
-
+
id newItem = nil;
- GTM_FOREACH_OBJECT(newItem, sortedNewArray) {
+ for (newItem in sortedNewArray) {
BOOL stillLooking = YES;
while (oldIndex < oldCount && stillLooking) {
// We must take care here, since Intel leaves junk in high bytes of
// return register for predicates that return BOOL.
- // For details see:
+ // For details see:
// http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_23.html
// and
// http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187
diff --git a/Foundation/GTMNSArray+MergeTest.m b/Foundation/GTMNSArray+MergeTest.m
index 9148ba7..535e0ce 100644
--- a/Foundation/GTMNSArray+MergeTest.m
+++ b/Foundation/GTMNSArray+MergeTest.m
@@ -37,8 +37,8 @@
NSArray *emptyArrayB = [NSArray array];
NSArray *mergedArray = [emptyArrayA gtm_mergeArray:emptyArrayB
mergeSelector:nil];
- STAssertNil(mergedArray,
- @"merge of two empty arrays with no merger should render nil");
+ XCTAssertNil(mergedArray,
+ @"merge of two empty arrays with no merger should render nil");
}
- (void)testMergingTwoEmptyArraysWithMerger {
@@ -47,8 +47,8 @@
NSArray *mergedArray
= [emptyArrayA gtm_mergeArray:emptyArrayB
mergeSelector:@selector(mergeString:)];
- STAssertNil(mergedArray,
- @"merge of two empty arrays with merger should render nil");
+ XCTAssertNil(mergedArray,
+ @"merge of two empty arrays with merger should render nil");
}
- (void)testMergingEmptyWithNilArray {
@@ -56,8 +56,8 @@
NSArray *nilArrayB = nil;
NSArray *mergedArray = [emptyArrayA gtm_mergeArray:nilArrayB
mergeSelector:nil];
- STAssertNil(mergedArray,
- @"merge of empty with nil array with no merger should render nil");
+ XCTAssertNil(mergedArray,
+ @"merge of empty with nil array with no merger should render nil");
}
- (void)testMergingEmptyWithNilArrayWithMerger {
@@ -66,8 +66,8 @@
NSArray *mergedArray
= [emptyArrayA gtm_mergeArray:nilArrayB
mergeSelector:@selector(mergeString:)];
- STAssertNil(mergedArray,
- @"merge of empty with nil array with merger should render nil");
+ XCTAssertNil(mergedArray,
+ @"merge of empty with nil array with merger should render nil");
}
- (void)testMergingTwoOneItemArraysThatDontMatch {
@@ -75,13 +75,13 @@
NSArray *arrayB = [NSArray arrayWithObject:@"abc.ghi"];
NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:nil];
- STAssertNotNil(mergedArray,
- @"merge of two non empty arrays with no merger should render "
- @"an array");
- STAssertEquals([mergedArray count], (NSUInteger)2,
+ XCTAssertNotNil(mergedArray,
+ @"merge of two non empty arrays with no merger should render "
+ @"an array");
+ XCTAssertEqual([mergedArray count], (NSUInteger)2,
@"merged array should have two items");
- STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil);
- STAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.ghi", nil);
+ XCTAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def");
+ XCTAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.ghi");
}
- (void)testMergingTwoOneItemArraysThatDontMatchWithMerger {
@@ -89,13 +89,13 @@
NSArray *arrayB = [NSArray arrayWithObject:@"abc.ghi"];
NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:@selector(mergeString:)];
- STAssertNotNil(mergedArray,
- @"merge of two non empty arrays with merger should render "
- @"an array");
- STAssertEquals([mergedArray count], (NSUInteger)2,
+ XCTAssertNotNil(mergedArray,
+ @"merge of two non empty arrays with merger should render "
+ @"an array");
+ XCTAssertEqual([mergedArray count], (NSUInteger)2,
@"merged array should have two items");
- STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil);
- STAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.ghi", nil);
+ XCTAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def");
+ XCTAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.ghi");
}
- (void)testMergingTwoOneItemArraysThatMatch {
@@ -103,13 +103,13 @@
NSArray *arrayB = [NSArray arrayWithObject:@"abc.def"];
NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:nil];
- STAssertNotNil(mergedArray,
- @"merge of two matching arrays with no merger should render "
- @"an array");
- STAssertEquals([mergedArray count], (NSUInteger)2,
+ XCTAssertNotNil(mergedArray,
+ @"merge of two matching arrays with no merger should render "
+ @"an array");
+ XCTAssertEqual([mergedArray count], (NSUInteger)2,
@"merged array with no merger should have two items");
- STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil);
- STAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.def", nil);
+ XCTAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def");
+ XCTAssertEqualObjects([mergedArray objectAtIndex:1], @"abc.def");
}
- (void)testMergingTwoOneItemArraysThatMatchWithMerger {
@@ -117,12 +117,12 @@
NSArray *arrayB = [NSArray arrayWithObject:@"abc.def"];
NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:@selector(mergeString:)];
- STAssertNotNil(mergedArray,
- @"merge of two matching arrays with merger should render "
- @"an array");
- STAssertEquals([mergedArray count], (NSUInteger)1,
+ XCTAssertNotNil(mergedArray,
+ @"merge of two matching arrays with merger should render "
+ @"an array");
+ XCTAssertEqual([mergedArray count], (NSUInteger)1,
@"merged array with merger should have one items");
- STAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def", nil);
+ XCTAssertEqualObjects([mergedArray objectAtIndex:0], @"abc.def");
}
- (void)testMergingMultipleItemArray {
@@ -141,10 +141,10 @@
nil];
NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:nil];
- STAssertNotNil(mergedArray,
- @"merge of two non empty arrays with no merger should render "
- @"an array");
- STAssertEquals([mergedArray count], (NSUInteger)9,
+ XCTAssertNotNil(mergedArray,
+ @"merge of two non empty arrays with no merger should render "
+ @"an array");
+ XCTAssertEqual([mergedArray count], (NSUInteger)9,
@"merged array should have 9 items");
}
@@ -164,10 +164,10 @@
nil];
NSArray *mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:@selector(mergeString:)];
- STAssertNotNil(mergedArray,
- @"merge of two non empty arrays with merger should render "
- @"an array");
- STAssertEquals([mergedArray count], (NSUInteger)7,
+ XCTAssertNotNil(mergedArray,
+ @"merge of two non empty arrays with merger should render "
+ @"an array");
+ XCTAssertEqual([mergedArray count], (NSUInteger)7,
@"merged array should have 7 items");
}
@@ -175,35 +175,34 @@
NSArray *arrayA = [NSArray arrayWithObjects:@"xyz", @"abc", @"mno", nil];
NSArray *arrayB = [NSArray array];
NSArray *expected = [NSArray arrayWithObjects:@"abc", @"mno", @"xyz", nil];
- STAssertNotNil(arrayA, nil);
- STAssertNotNil(arrayB, nil);
- STAssertNotNil(expected, nil);
+ XCTAssertNotNil(arrayA);
+ XCTAssertNotNil(arrayB);
+ XCTAssertNotNil(expected);
NSArray *mergedArray;
// no merger
mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:nil];
- STAssertNotNil(mergedArray, nil);
- STAssertEqualObjects(mergedArray, expected, nil);
+ XCTAssertNotNil(mergedArray);
+ XCTAssertEqualObjects(mergedArray, expected);
// w/ merger
mergedArray = [arrayA gtm_mergeArray:arrayB
mergeSelector:@selector(mergeString:)];
- STAssertNotNil(mergedArray, nil);
- STAssertEqualObjects(mergedArray, expected, nil);
+ XCTAssertNotNil(mergedArray);
+ XCTAssertEqualObjects(mergedArray, expected);
// no merger and array args reversed
mergedArray = [arrayB gtm_mergeArray:arrayA
mergeSelector:nil];
- STAssertNotNil(mergedArray, nil);
- STAssertEqualObjects(mergedArray, expected, nil);
+ XCTAssertNotNil(mergedArray);
+ XCTAssertEqualObjects(mergedArray, expected);
// w/ merger and array args reversed
mergedArray = [arrayB gtm_mergeArray:arrayA
mergeSelector:@selector(mergeString:)];
- STAssertNotNil(mergedArray, nil);
- STAssertEqualObjects(mergedArray, expected, nil);
-
+ XCTAssertNotNil(mergedArray);
+ XCTAssertEqualObjects(mergedArray, expected);
}
@end
diff --git a/Foundation/GTMNSData+zlib.h b/Foundation/GTMNSData+zlib.h
index 08fbb9a..dceadc4 100644
--- a/Foundation/GTMNSData+zlib.h
+++ b/Foundation/GTMNSData+zlib.h
@@ -33,22 +33,34 @@
// Uses the default compression level.
+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
length:(NSUInteger)length;
++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of gzipping the payload of |data|.
//
// Uses the default compression level.
-+ (NSData *)gtm_dataByGzippingData:(NSData *)data;
++ (NSData *)gtm_dataByGzippingData:(NSData *)data __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByGzippingData:(NSData *)data
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of gzipping the bytes using |level| compression level.
//
// |level| can be 1-9, any other values will be clipped to that range.
+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
length:(NSUInteger)length
- compressionLevel:(int)level;
+ compressionLevel:(int)level __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ compressionLevel:(int)level
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of gzipping the payload of |data| using |level| compression level.
+ (NSData *)gtm_dataByGzippingData:(NSData *)data
- compressionLevel:(int)level;
+ compressionLevel:(int)level __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByGzippingData:(NSData *)data
+ compressionLevel:(int)level
+ error:(NSError **)error;
#pragma mark Zlib "Stream" Compression
@@ -59,23 +71,35 @@
//
// Uses the default compression level.
+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
- length:(NSUInteger)length;
+ length:(NSUInteger)length __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of deflating the payload of |data|.
//
// Uses the default compression level.
-+ (NSData *)gtm_dataByDeflatingData:(NSData *)data;
++ (NSData *)gtm_dataByDeflatingData:(NSData *)data __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByDeflatingData:(NSData *)data
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of deflating the bytes using |level| compression level.
//
// |level| can be 1-9, any other values will be clipped to that range.
+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
length:(NSUInteger)length
- compressionLevel:(int)level;
+ compressionLevel:(int)level __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ compressionLevel:(int)level
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of deflating the payload of |data| using |level| compression level.
+ (NSData *)gtm_dataByDeflatingData:(NSData *)data
- compressionLevel:(int)level;
+ compressionLevel:(int)level __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByDeflatingData:(NSData *)data
+ compressionLevel:(int)level
+ error:(NSError **)error;
#pragma mark Uncompress of Gzip or Zlib
@@ -83,13 +107,17 @@
//
// The bytes to decompress can be zlib or gzip payloads.
+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes
- length:(NSUInteger)length;
+ length:(NSUInteger)length __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of decompressing the payload of |data|.
//
// The data to decompress can be zlib or gzip payloads.
-+ (NSData *)gtm_dataByInflatingData:(NSData *)data;
-
++ (NSData *)gtm_dataByInflatingData:(NSData *)data __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByInflatingData:(NSData *)data
+ error:(NSError **)error;
#pragma mark "Raw" Compression Support
@@ -103,13 +131,18 @@
// Uses the default compression level.
// *No* header is added to the resulting data.
+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
- length:(NSUInteger)length;
+ length:(NSUInteger)length __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of *raw* deflating the payload of |data|.
//
// Uses the default compression level.
// *No* header is added to the resulting data.
-+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data;
++ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of *raw* deflating the bytes using |level| compression level.
//
@@ -117,22 +150,50 @@
// *No* header is added to the resulting data.
+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
length:(NSUInteger)length
- compressionLevel:(int)level;
+ compressionLevel:(int)level __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ compressionLevel:(int)level
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of *raw* deflating the payload of |data| using |level| compression level.
// *No* header is added to the resulting data.
+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data
- compressionLevel:(int)level;
+ compressionLevel:(int)level __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data
+ compressionLevel:(int)level
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of *raw* decompressing the bytes.
//
// The data to decompress, it should *not* have any header (zlib nor gzip).
+ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes
- length:(NSUInteger)length;
+ length:(NSUInteger)length __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error;
/// Return an autoreleased NSData w/ the result of *raw* decompressing the payload of |data|.
//
// The data to decompress, it should *not* have any header (zlib nor gzip).
-+ (NSData *)gtm_dataByRawInflatingData:(NSData *)data;
++ (NSData *)gtm_dataByRawInflatingData:(NSData *)data __attribute__((deprecated("Use error variant")));
++ (NSData *)gtm_dataByRawInflatingData:(NSData *)data
+ error:(NSError **)error;
@end
+
+FOUNDATION_EXPORT NSString *const GTMNSDataZlibErrorDomain;
+FOUNDATION_EXPORT NSString *const GTMNSDataZlibErrorKey; // NSNumber
+FOUNDATION_EXPORT NSString *const GTMNSDataZlibRemainingBytesKey; // NSNumber
+
+typedef NS_ENUM(NSInteger, GTMNSDataZlibError) {
+ GTMNSDataZlibErrorGreaterThan32BitsToCompress = 1024,
+ // An internal zlib error.
+ // GTMNSDataZlibErrorKey will contain the error value.
+ // NSLocalizedDescriptionKey may contain an error string from zlib.
+ // Look in zlib.h for list of errors.
+ GTMNSDataZlibErrorInternal,
+ // There was left over data in the buffer that was not used.
+ // GTMNSDataZlibRemainingBytesKey will contain number of remaining bytes.
+ GTMNSDataZlibErrorDataRemaining
+};
diff --git a/Foundation/GTMNSData+zlib.m b/Foundation/GTMNSData+zlib.m
index 4f8df8c..bf74b2d 100644
--- a/Foundation/GTMNSData+zlib.m
+++ b/Foundation/GTMNSData+zlib.m
@@ -20,12 +20,12 @@
#import <zlib.h>
#import "GTMDefines.h"
-// Export a nonsense symbol to suppress a libtool warning when this is linked alone in a static lib.
-__attribute__((visibility("default"))) char GTMNSDataZLibExportToSuppressLibToolWarning = 0;
-
-
#define kChunkSize 1024
+NSString *const GTMNSDataZlibErrorDomain = @"com.google.GTMNSDataZlibErrorDomain";
+NSString *const GTMNSDataZlibErrorKey = @"GTMNSDataZlibErrorKey";
+NSString *const GTMNSDataZlibRemainingBytesKey = @"GTMNSDataZlibRemainingBytesKey";
+
typedef enum {
CompressionModeZlib,
CompressionModeGzip,
@@ -36,10 +36,12 @@ typedef enum {
+ (NSData *)gtm_dataByCompressingBytes:(const void *)bytes
length:(NSUInteger)length
compressionLevel:(int)level
- mode:(CompressionMode)mode;
+ mode:(CompressionMode)mode
+ error:(NSError **)error;
+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes
length:(NSUInteger)length
- isRawData:(BOOL)isRawData;
+ isRawData:(BOOL)isRawData
+ error:(NSError **)error;
@end
@implementation NSData (GTMZlibAdditionsPrivate)
@@ -47,7 +49,8 @@ typedef enum {
+ (NSData *)gtm_dataByCompressingBytes:(const void *)bytes
length:(NSUInteger)length
compressionLevel:(int)level
- mode:(CompressionMode)mode {
+ mode:(CompressionMode)mode
+ error:(NSError **)error {
if (!bytes || !length) {
return nil;
}
@@ -55,6 +58,11 @@ typedef enum {
#if defined(__LP64__) && __LP64__
// Don't support > 32bit length for 64 bit, see note in header.
if (length > UINT_MAX) {
+ if (error) {
+ *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain
+ code:GTMNSDataZlibErrorGreaterThan32BitsToCompress
+ userInfo:nil];
+ }
return nil;
}
#endif
@@ -90,8 +98,13 @@ typedef enum {
if ((retCode = deflateInit2(&strm, level, Z_DEFLATED, windowBits,
memLevel, Z_DEFAULT_STRATEGY)) != Z_OK) {
// COV_NF_START - no real way to force this in a unittest (we guard all args)
- _GTMDevLog(@"Failed to init for deflate w/ level %d, error %d",
- level, retCode);
+ if (error) {
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode]
+ forKey:GTMNSDataZlibErrorKey];
+ *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain
+ code:GTMNSDataZlibErrorInternal
+ userInfo:userInfo];
+ }
return nil;
// COV_NF_END
}
@@ -115,8 +128,13 @@ typedef enum {
// (in inflate, we can feed bogus/truncated data to test, but an error
// here would be some internal issue w/in zlib, and there isn't any real
// way to test it)
- _GTMDevLog(@"Error trying to deflate some of the payload, error %d",
- retCode);
+ if (error) {
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode]
+ forKey:GTMNSDataZlibErrorKey];
+ *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain
+ code:GTMNSDataZlibErrorInternal
+ userInfo:userInfo];
+ }
deflateEnd(&strm);
return nil;
// COV_NF_END
@@ -145,7 +163,8 @@ typedef enum {
+ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes
length:(NSUInteger)length
- isRawData:(BOOL)isRawData {
+ isRawData:(BOOL)isRawData
+ error:(NSError **)error {
if (!bytes || !length) {
return nil;
}
@@ -174,7 +193,13 @@ typedef enum {
int retCode;
if ((retCode = inflateInit2(&strm, windowBits)) != Z_OK) {
// COV_NF_START - no real way to force this in a unittest (we guard all args)
- _GTMDevLog(@"Failed to init for inflate, error %d", retCode);
+ if (error) {
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode]
+ forKey:GTMNSDataZlibErrorKey];
+ *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain
+ code:GTMNSDataZlibErrorInternal
+ userInfo:userInfo];
+ }
return nil;
// COV_NF_END
}
@@ -190,8 +215,20 @@ typedef enum {
strm.next_out = output;
retCode = inflate(&strm, Z_NO_FLUSH);
if ((retCode != Z_OK) && (retCode != Z_STREAM_END)) {
- _GTMDevLog(@"Error trying to inflate some of the payload, error %d: %s",
- retCode, strm.msg);
+ if (error) {
+ NSMutableDictionary *userInfo =
+ [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:retCode]
+ forKey:GTMNSDataZlibErrorKey];
+ if (strm.msg) {
+ NSString *message = [NSString stringWithUTF8String:strm.msg];
+ if (message) {
+ [userInfo setObject:message forKey:NSLocalizedDescriptionKey];
+ }
+ }
+ *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain
+ code:GTMNSDataZlibErrorInternal
+ userInfo:userInfo];
+ }
inflateEnd(&strm);
return nil;
}
@@ -206,8 +243,14 @@ typedef enum {
// make sure there wasn't more data tacked onto the end of a valid compressed
// stream.
if (strm.avail_in != 0) {
- _GTMDevLog(@"thought we finished inflate w/o using all input, %u bytes left",
- strm.avail_in);
+ if (error) {
+ NSDictionary *userInfo =
+ [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInt:strm.avail_in]
+ forKey:GTMNSDataZlibRemainingBytesKey];
+ *error = [NSError errorWithDomain:GTMNSDataZlibErrorDomain
+ code:GTMNSDataZlibErrorDataRemaining
+ userInfo:userInfo];
+ }
result = nil;
}
// the only way out of the loop was by hitting the end of the stream
@@ -228,69 +271,135 @@ typedef enum {
+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
length:(NSUInteger)length {
+ return [self gtm_dataByGzippingBytes:bytes length:length error:NULL];
+} // gtm_dataByGzippingBytes:length:
+
++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error {
return [self gtm_dataByCompressingBytes:bytes
length:length
compressionLevel:Z_DEFAULT_COMPRESSION
- mode:CompressionModeGzip];
-} // gtm_dataByGzippingBytes:length:
+ mode:CompressionModeGzip
+ error:error];
+} // gtm_dataByGzippingBytes:length:error:
+ (NSData *)gtm_dataByGzippingData:(NSData *)data {
+ return [self gtm_dataByGzippingData:data error:NULL];
+} // gtm_dataByGzippingData:
+
++ (NSData *)gtm_dataByGzippingData:(NSData *)data error:(NSError **)error {
return [self gtm_dataByCompressingBytes:[data bytes]
length:[data length]
compressionLevel:Z_DEFAULT_COMPRESSION
- mode:CompressionModeGzip];
-} // gtm_dataByGzippingData:
+ mode:CompressionModeGzip
+ error:error];
+} // gtm_dataByGzippingData:error:
+ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
length:(NSUInteger)length
compressionLevel:(int)level {
+ return [self gtm_dataByGzippingBytes:bytes
+ length:length
+ compressionLevel:level
+ error:NULL];
+} // gtm_dataByGzippingBytes:length:level:
+
++ (NSData *)gtm_dataByGzippingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ compressionLevel:(int)level
+ error:(NSError **)error{
return [self gtm_dataByCompressingBytes:bytes
length:length
compressionLevel:level
- mode:CompressionModeGzip];
-} // gtm_dataByGzippingBytes:length:level:
+ mode:CompressionModeGzip
+ error:error];
+} // gtm_dataByGzippingBytes:length:level:error
+ (NSData *)gtm_dataByGzippingData:(NSData *)data
compressionLevel:(int)level {
+ return [self gtm_dataByGzippingData:data
+ compressionLevel:level
+ error:NULL];
+} // gtm_dataByGzippingData:level:
+
++ (NSData *)gtm_dataByGzippingData:(NSData *)data
+ compressionLevel:(int)level
+ error:(NSError **)error{
return [self gtm_dataByCompressingBytes:[data bytes]
length:[data length]
compressionLevel:level
- mode:CompressionModeGzip];
-} // gtm_dataByGzippingData:level:
+ mode:CompressionModeGzip
+ error:error];
+} // gtm_dataByGzippingData:level:error
#pragma mark -
+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
length:(NSUInteger)length {
+ return [self gtm_dataByDeflatingBytes:bytes
+ length:length
+ error:NULL];
+} // gtm_dataByDeflatingBytes:length:
+
++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error{
return [self gtm_dataByCompressingBytes:bytes
length:length
compressionLevel:Z_DEFAULT_COMPRESSION
- mode:CompressionModeZlib];
-} // gtm_dataByDeflatingBytes:length:
+ mode:CompressionModeZlib
+ error:error];
+} // gtm_dataByDeflatingBytes:length:error
+ (NSData *)gtm_dataByDeflatingData:(NSData *)data {
+ return [self gtm_dataByDeflatingData:data error:NULL];
+} // gtm_dataByDeflatingData:
+
++ (NSData *)gtm_dataByDeflatingData:(NSData *)data error:(NSError **)error {
return [self gtm_dataByCompressingBytes:[data bytes]
length:[data length]
compressionLevel:Z_DEFAULT_COMPRESSION
- mode:CompressionModeZlib];
+ mode:CompressionModeZlib
+ error:error];
} // gtm_dataByDeflatingData:
+ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
length:(NSUInteger)length
compressionLevel:(int)level {
+ return [self gtm_dataByDeflatingBytes:bytes
+ length:length
+ compressionLevel:level
+ error:NULL];
+} // gtm_dataByDeflatingBytes:length:level:
+
++ (NSData *)gtm_dataByDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ compressionLevel:(int)level
+ error:(NSError **)error {
return [self gtm_dataByCompressingBytes:bytes
length:length
compressionLevel:level
- mode:CompressionModeZlib];
-} // gtm_dataByDeflatingBytes:length:level:
+ mode:CompressionModeZlib
+ error:error];
+} // gtm_dataByDeflatingBytes:length:level:error:
+ (NSData *)gtm_dataByDeflatingData:(NSData *)data
compressionLevel:(int)level {
+ return [self gtm_dataByDeflatingData:data
+ compressionLevel:level
+ error:NULL];
+} // gtm_dataByDeflatingData:level:
+
++ (NSData *)gtm_dataByDeflatingData:(NSData *)data
+ compressionLevel:(int)level
+ error:(NSError **)error {
return [self gtm_dataByCompressingBytes:[data bytes]
length:[data length]
compressionLevel:level
- mode:CompressionModeZlib];
-} // gtm_dataByDeflatingData:level:
+ mode:CompressionModeZlib
+ error:error];
+} // gtm_dataByDeflatingData:level:error:
#pragma mark -
@@ -298,60 +407,125 @@ typedef enum {
length:(NSUInteger)length {
return [self gtm_dataByInflatingBytes:bytes
length:length
- isRawData:NO];
+ error:NULL];
} // gtm_dataByInflatingBytes:length:
++ (NSData *)gtm_dataByInflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error {
+ return [self gtm_dataByInflatingBytes:bytes
+ length:length
+ isRawData:NO
+ error:error];
+} // gtm_dataByInflatingBytes:length:error:
+
+ (NSData *)gtm_dataByInflatingData:(NSData *)data {
+ return [self gtm_dataByInflatingData:data error:NULL];
+} // gtm_dataByInflatingData:
+
++ (NSData *)gtm_dataByInflatingData:(NSData *)data
+ error:(NSError **)error {
return [self gtm_dataByInflatingBytes:[data bytes]
length:[data length]
- isRawData:NO];
+ isRawData:NO
+ error:error];
} // gtm_dataByInflatingData:
#pragma mark -
+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
length:(NSUInteger)length {
+ return [self gtm_dataByRawDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:NULL];
+} // gtm_dataByRawDeflatingBytes:length:
+
++ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error {
return [self gtm_dataByCompressingBytes:bytes
length:length
compressionLevel:Z_DEFAULT_COMPRESSION
- mode:CompressionModeRaw];
-} // gtm_dataByRawDeflatingBytes:length:
+ mode:CompressionModeRaw
+ error:error];
+} // gtm_dataByRawDeflatingBytes:length:error:
+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data {
+ return [self gtm_dataByRawDeflatingData:data error:NULL];
+} // gtm_dataByRawDeflatingData:
+
++ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data error:(NSError **)error {
return [self gtm_dataByCompressingBytes:[data bytes]
length:[data length]
compressionLevel:Z_DEFAULT_COMPRESSION
- mode:CompressionModeRaw];
-} // gtm_dataByRawDeflatingData:
+ mode:CompressionModeRaw
+ error:error];
+} // gtm_dataByRawDeflatingData:error:
+ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
length:(NSUInteger)length
compressionLevel:(int)level {
+ return [self gtm_dataByRawDeflatingBytes:bytes
+ length:length
+ compressionLevel:level
+ error:NULL];
+} // gtm_dataByRawDeflatingBytes:length:compressionLevel:
+
++ (NSData *)gtm_dataByRawDeflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ compressionLevel:(int)level
+ error:(NSError **)error{
return [self gtm_dataByCompressingBytes:bytes
length:length
compressionLevel:level
- mode:CompressionModeRaw];
-} // gtm_dataByRawDeflatingBytes:length:compressionLevel:
+ mode:CompressionModeRaw
+ error:error];
+} // gtm_dataByRawDeflatingBytes:length:compressionLevel:error:
+ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data
compressionLevel:(int)level {
+ return [self gtm_dataByRawDeflatingData:data
+ compressionLevel:level
+ error:NULL];
+} // gtm_dataByRawDeflatingData:compressionLevel:
+
++ (NSData *)gtm_dataByRawDeflatingData:(NSData *)data
+ compressionLevel:(int)level
+ error:(NSError **)error {
return [self gtm_dataByCompressingBytes:[data bytes]
length:[data length]
compressionLevel:level
- mode:CompressionModeRaw];
-} // gtm_dataByRawDeflatingData:compressionLevel:
+ mode:CompressionModeRaw
+ error:error];
+} // gtm_dataByRawDeflatingData:compressionLevel:error:
+ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes
length:(NSUInteger)length {
return [self gtm_dataByInflatingBytes:bytes
length:length
- isRawData:YES];
+ error:NULL];
} // gtm_dataByRawInflatingBytes:length:
++ (NSData *)gtm_dataByRawInflatingBytes:(const void *)bytes
+ length:(NSUInteger)length
+ error:(NSError **)error{
+ return [self gtm_dataByInflatingBytes:bytes
+ length:length
+ isRawData:YES
+ error:error];
+} // gtm_dataByRawInflatingBytes:length:error:
+
+ (NSData *)gtm_dataByRawInflatingData:(NSData *)data {
+ return [self gtm_dataByRawInflatingData:data
+ error:NULL];
+} // gtm_dataByRawInflatingData:
+
++ (NSData *)gtm_dataByRawInflatingData:(NSData *)data
+ error:(NSError **)error {
return [self gtm_dataByInflatingBytes:[data bytes]
length:[data length]
- isRawData:YES];
-} // gtm_dataByRawInflatingData:
+ isRawData:YES
+ error:error];
+} // gtm_dataByRawInflatingData:error:
@end
diff --git a/Foundation/GTMNSData+zlibTest.m b/Foundation/GTMNSData+zlibTest.m
index 8a14919..4f3acc1 100644
--- a/Foundation/GTMNSData+zlibTest.m
+++ b/Foundation/GTMNSData+zlibTest.m
@@ -17,9 +17,8 @@
//
#import "GTMSenTestCase.h"
-#import "GTMUnitTestDevLog.h"
#import "GTMNSData+zlib.h"
-#import <stdlib.h> // for randiom/srandomdev
+#import <stdlib.h> // for random/srandomdev
#import <zlib.h>
@interface GTMNSData_zlibTest : GTMTestCase
@@ -91,405 +90,526 @@ static BOOL HasGzipHeader(NSData *data) {
((bytes[0] == 0x1f) && (bytes[1] == 0x8b));
}
+#define GTMCheckZLibError(error, errorCode) \
+ XCTAssertEqual([error code], GTMNSDataZlibErrorInternal); \
+ XCTAssertEqualObjects([error domain], GTMNSDataZlibErrorDomain); \
+ XCTAssertEqualObjects([[error userInfo] objectForKey:GTMNSDataZlibErrorKey], \
+ [NSNumber numberWithInt:errorCode]); \
+ error = nil
+
+#define GTMCheckRemainingError(error, bytes) \
+ XCTAssertEqual([error code], GTMNSDataZlibErrorDataRemaining); \
+ XCTAssertEqualObjects([error domain], GTMNSDataZlibErrorDomain); \
+ XCTAssertEqualObjects([[error userInfo] objectForKey:GTMNSDataZlibRemainingBytesKey], \
+ [NSNumber numberWithInt:bytes]); \
+ error = nil
@implementation GTMNSData_zlibTest
-- (void)testBoundryValues {
+- (void)testBoundaryValues {
// build some test data
NSData *data = [NSData dataWithBytes:randomDataLarge
length:sizeof(randomDataLarge)];
- STAssertNotNil(data, @"failed to alloc data block");
+ XCTAssertNotNil(data, @"failed to alloc data block");
// bogus args to start
- STAssertNil([NSData gtm_dataByDeflatingData:nil], nil);
- STAssertNil([NSData gtm_dataByDeflatingBytes:nil length:666], nil);
- STAssertNil([NSData gtm_dataByDeflatingBytes:[data bytes] length:0], nil);
- STAssertNil([NSData gtm_dataByGzippingData:nil], nil);
- STAssertNil([NSData gtm_dataByGzippingBytes:nil length:666], nil);
- STAssertNil([NSData gtm_dataByGzippingBytes:[data bytes] length:0], nil);
- STAssertNil([NSData gtm_dataByInflatingData:nil], nil);
- STAssertNil([NSData gtm_dataByInflatingBytes:nil length:666], nil);
- STAssertNil([NSData gtm_dataByInflatingBytes:[data bytes] length:0], nil);
- STAssertNil([NSData gtm_dataByRawDeflatingData:nil], nil);
- STAssertNil([NSData gtm_dataByRawDeflatingBytes:nil length:666], nil);
- STAssertNil([NSData gtm_dataByRawDeflatingBytes:[data bytes] length:0], nil);
- STAssertNil([NSData gtm_dataByRawInflatingData:nil], nil);
- STAssertNil([NSData gtm_dataByRawInflatingBytes:nil length:666], nil);
- STAssertNil([NSData gtm_dataByRawInflatingBytes:[data bytes] length:0], nil);
+ NSError *error = nil;
+ XCTAssertNil([NSData gtm_dataByDeflatingData:nil error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByDeflatingBytes:nil length:666 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByDeflatingBytes:[data bytes] length:0 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByGzippingData:nil error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByGzippingBytes:nil length:666 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByGzippingBytes:[data bytes] length:0 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByInflatingData:nil error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:nil length:666 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[data bytes] length:0 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByRawDeflatingData:nil error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByRawDeflatingBytes:nil length:666 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByRawDeflatingBytes:[data bytes] length:0 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByRawInflatingData:nil error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByRawInflatingBytes:nil length:666 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertNil([NSData gtm_dataByRawInflatingBytes:[data bytes] length:0 error:&error]);
+ XCTAssertNil(error);
+ error = nil;
// test deflate w/ compression levels out of range
NSData *deflated = [NSData gtm_dataByDeflatingData:data
- compressionLevel:-4];
- STAssertNotNil(deflated, nil);
- STAssertFalse(HasGzipHeader(deflated), nil);
- NSData *dataPrime = [NSData gtm_dataByInflatingData:deflated];
- STAssertNotNil(dataPrime, nil);
- STAssertEqualObjects(data, dataPrime, nil);
+ compressionLevel:-4
+ error:&error];
+ XCTAssertNotNil(deflated);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertFalse(HasGzipHeader(deflated));
+ NSData *dataPrime = [NSData gtm_dataByInflatingData:deflated error:&error];
+ XCTAssertNotNil(dataPrime);
+ XCTAssertEqualObjects(data, dataPrime);
+ XCTAssertNil(error);
+ error = nil;
deflated = [NSData gtm_dataByDeflatingData:data
- compressionLevel:20];
- STAssertNotNil(deflated, nil);
- STAssertFalse(HasGzipHeader(deflated), nil);
- dataPrime = [NSData gtm_dataByInflatingData:deflated];
- STAssertNotNil(dataPrime, nil);
- STAssertEqualObjects(data, dataPrime, nil);
+ compressionLevel:20
+ error:&error];
+ XCTAssertNotNil(deflated);
+ XCTAssertFalse(HasGzipHeader(deflated));
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByInflatingData:deflated error:&error];
+ XCTAssertNotNil(dataPrime);
+ XCTAssertEqualObjects(data, dataPrime);
+ XCTAssertNil(error);
+ error = nil;
// test gzip w/ compression levels out of range
NSData *gzipped = [NSData gtm_dataByGzippingData:data
- compressionLevel:-4];
- STAssertNotNil(gzipped, nil);
- STAssertTrue(HasGzipHeader(gzipped), nil);
- dataPrime = [NSData gtm_dataByInflatingData:gzipped];
- STAssertNotNil(dataPrime, nil);
- STAssertEqualObjects(data, dataPrime, nil);
+ compressionLevel:-4
+ error:&error];
+ XCTAssertNotNil(gzipped);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertTrue(HasGzipHeader(gzipped));
+ dataPrime = [NSData gtm_dataByInflatingData:gzipped error:&error];
+ XCTAssertNotNil(dataPrime);
+ XCTAssertEqualObjects(data, dataPrime);
+ XCTAssertNil(error);
+ error = nil;
gzipped = [NSData gtm_dataByGzippingData:data
- compressionLevel:20];
- STAssertNotNil(gzipped, nil);
- STAssertTrue(HasGzipHeader(gzipped), nil);
- dataPrime = [NSData gtm_dataByInflatingData:gzipped];
- STAssertNotNil(dataPrime, nil);
- STAssertEqualObjects(data, dataPrime, nil);
+ compressionLevel:20
+ error:&error];
+ XCTAssertNotNil(gzipped);
+ XCTAssertTrue(HasGzipHeader(gzipped));
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByInflatingData:gzipped error:&error];
+ XCTAssertNotNil(dataPrime);
+ XCTAssertEqualObjects(data, dataPrime);
+ XCTAssertNil(error);
+ error = nil;
// test raw deflate w/ compression levels out of range
NSData *rawDeflated = [NSData gtm_dataByRawDeflatingData:data
- compressionLevel:-4];
- STAssertNotNil(rawDeflated, nil);
- STAssertFalse(HasGzipHeader(rawDeflated), nil);
- dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated];
- STAssertNotNil(dataPrime, nil);
- STAssertEqualObjects(data, dataPrime, nil);
+ compressionLevel:-4
+ error:&error];
+ XCTAssertNotNil(rawDeflated);
+ XCTAssertFalse(HasGzipHeader(rawDeflated));
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated error:&error];
+ XCTAssertNotNil(dataPrime);
+ XCTAssertEqualObjects(data, dataPrime);
+ XCTAssertNil(error);
+ error = nil;
rawDeflated = [NSData gtm_dataByRawDeflatingData:data
- compressionLevel:20];
- STAssertNotNil(rawDeflated, nil);
- STAssertFalse(HasGzipHeader(rawDeflated), nil);
- dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated];
- STAssertNotNil(dataPrime, nil);
- STAssertEqualObjects(data, dataPrime, nil);
+ compressionLevel:20
+ error:&error];
+ XCTAssertNotNil(rawDeflated);
+ XCTAssertFalse(HasGzipHeader(rawDeflated));
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated error:&error];
+ XCTAssertNotNil(dataPrime);
+ XCTAssertEqualObjects(data, dataPrime);
+ XCTAssertNil(error);
+ error = nil;
// test non-compressed data data itself
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -3: incorrect header check"];
- STAssertNil([NSData gtm_dataByInflatingData:data], nil);
-
+ XCTAssertNil([NSData gtm_dataByInflatingData:data error:&error]);
+ GTMCheckZLibError(error, -3);
// test deflated data runs that end before they are done
- [GTMUnitTestDevLog expect:([deflated length] / 11) + 1
- casesOfString:@"Error trying to inflate some of the payload, "
- @"error -5: (null)"];
for (NSUInteger x = 1 ; x < [deflated length] ; x += 11) {
- STAssertNil([NSData gtm_dataByInflatingBytes:[deflated bytes]
- length:x], nil);
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[deflated bytes]
+ length:x
+ error:&error]);
+ GTMCheckZLibError(error, -5);
}
// test gzipped data runs that end before they are done
- [GTMUnitTestDevLog expect:([gzipped length] / 11) + 1
- casesOfString:@"Error trying to inflate some of the payload, "
- @"error -5: (null)"];
for (NSUInteger x = 1 ; x < [gzipped length] ; x += 11) {
- STAssertNil([NSData gtm_dataByInflatingBytes:[gzipped bytes]
- length:x], nil);
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[gzipped bytes]
+ length:x
+ error:&error]);
+ GTMCheckZLibError(error, -5);
}
// test raw deflated data runs that end before they are done
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -5: (null)"];
- [GTMUnitTestDevLog expect:([rawDeflated length] / 11) - 1
- casesOfString:@"Error trying to inflate some of the payload, "
- @"error -3: incorrect header check"];
for (NSUInteger x = 1 ; x < [rawDeflated length] ; x += 11) {
- STAssertNil([NSData gtm_dataByInflatingBytes:[rawDeflated bytes]
- length:x], nil);
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[rawDeflated bytes]
+ length:x
+ error:&error]);
+ int expectedError = (x == 1) ? -5 : -3;
+ GTMCheckZLibError(error, expectedError);
}
// test extra data before the deflated/gzipped data (just to make sure we
// don't seek to the "real" data)
NSMutableData *prefixedDeflated =
[NSMutableData dataWithBytes:randomDataSmall length:sizeof(randomDataSmall)];
- STAssertNotNil(prefixedDeflated, @"failed to alloc data block");
+ XCTAssertNotNil(prefixedDeflated, @"failed to alloc data block");
[prefixedDeflated appendData:deflated];
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -3: incorrect header check"];
- STAssertNil([NSData gtm_dataByInflatingData:prefixedDeflated], nil);
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -3: incorrect header check"];
- STAssertNil([NSData gtm_dataByInflatingBytes:[prefixedDeflated bytes]
- length:[prefixedDeflated length]],
- nil);
+ XCTAssertNil([NSData gtm_dataByInflatingData:prefixedDeflated error:&error]);
+ GTMCheckZLibError(error, -3);
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[prefixedDeflated bytes]
+ length:[prefixedDeflated length]
+ error:&error]);
+ GTMCheckZLibError(error, -3);
NSMutableData *prefixedGzipped =
[NSMutableData dataWithBytes:randomDataSmall length:sizeof(randomDataSmall)];
- STAssertNotNil(prefixedDeflated, @"failed to alloc data block");
+ XCTAssertNotNil(prefixedDeflated, @"failed to alloc data block");
[prefixedGzipped appendData:gzipped];
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -3: incorrect header check"];
- STAssertNil([NSData gtm_dataByInflatingData:prefixedGzipped], nil);
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -3: incorrect header check"];
- STAssertNil([NSData gtm_dataByInflatingBytes:[prefixedGzipped bytes]
- length:[prefixedGzipped length]],
- nil);
+ XCTAssertNil([NSData gtm_dataByInflatingData:prefixedGzipped error:&error]);
+ GTMCheckZLibError(error, -3);
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[prefixedGzipped bytes]
+ length:[prefixedGzipped length]
+ error:&error]);
+ GTMCheckZLibError(error, -3);
NSMutableData *prefixedRawDeflated =
[NSMutableData dataWithBytes:randomDataSmall length:sizeof(randomDataSmall)];
- STAssertNotNil(prefixedRawDeflated, @"failed to alloc data block");
+ XCTAssertNotNil(prefixedRawDeflated, @"failed to alloc data block");
[prefixedRawDeflated appendData:rawDeflated];
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -3: invalid stored block lengths"];
- STAssertNil([NSData gtm_dataByRawInflatingData:prefixedRawDeflated], nil);
- [GTMUnitTestDevLog expectString:@"Error trying to inflate some of the "
- @"payload, error -3: invalid stored block lengths"];
- STAssertNil([NSData gtm_dataByRawInflatingBytes:[prefixedRawDeflated bytes]
- length:[prefixedRawDeflated length]],
- nil);
+ XCTAssertNil([NSData gtm_dataByRawInflatingData:prefixedRawDeflated error:&error]);
+ GTMCheckZLibError(error, -3);
+ XCTAssertNil([NSData gtm_dataByRawInflatingBytes:[prefixedRawDeflated bytes]
+ length:[prefixedRawDeflated length]
+ error:&error]);
+ GTMCheckZLibError(error, -3);
// test extra data after the deflated/gzipped data (just to make sure we
// don't ignore some of the data)
NSMutableData *suffixedDeflated = [NSMutableData data];
- STAssertNotNil(suffixedDeflated, @"failed to alloc data block");
+ XCTAssertNotNil(suffixedDeflated, @"failed to alloc data block");
[suffixedDeflated appendData:deflated];
[suffixedDeflated appendBytes:[data bytes] length:20];
- [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using "
- @"all input, 20 bytes left"];
- STAssertNil([NSData gtm_dataByInflatingData:suffixedDeflated], nil);
- [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using "
- @"all input, 20 bytes left"];
- STAssertNil([NSData gtm_dataByInflatingBytes:[suffixedDeflated bytes]
- length:[suffixedDeflated length]],
- nil);
+ XCTAssertNil([NSData gtm_dataByInflatingData:suffixedDeflated
+ error:&error]);
+ GTMCheckRemainingError(error, 20);
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[suffixedDeflated bytes]
+ length:[suffixedDeflated length]
+ error:&error]);
+ GTMCheckRemainingError(error, 20);
NSMutableData *suffixedGZipped = [NSMutableData data];
- STAssertNotNil(suffixedGZipped, @"failed to alloc data block");
+ XCTAssertNotNil(suffixedGZipped, @"failed to alloc data block");
[suffixedGZipped appendData:gzipped];
[suffixedGZipped appendBytes:[data bytes] length:20];
- [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using "
- @"all input, 20 bytes left"];
- STAssertNil([NSData gtm_dataByInflatingData:suffixedGZipped], nil);
- [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using "
- @"all input, 20 bytes left"];
- STAssertNil([NSData gtm_dataByInflatingBytes:[suffixedGZipped bytes]
- length:[suffixedGZipped length]],
- nil);
+ XCTAssertNil([NSData gtm_dataByInflatingData:suffixedGZipped error:&error]);
+ GTMCheckRemainingError(error, 20);
+ XCTAssertNil([NSData gtm_dataByInflatingBytes:[suffixedGZipped bytes]
+ length:[suffixedGZipped length]
+ error:&error]);
+ GTMCheckRemainingError(error, 20);
NSMutableData *suffixedRawDeflated = [NSMutableData data];
- STAssertNotNil(suffixedRawDeflated, @"failed to alloc data block");
+ XCTAssertNotNil(suffixedRawDeflated, @"failed to alloc data block");
[suffixedRawDeflated appendData:rawDeflated];
[suffixedRawDeflated appendBytes:[data bytes] length:20];
- [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using "
- @"all input, 20 bytes left"];
- STAssertNil([NSData gtm_dataByRawInflatingData:suffixedRawDeflated], nil);
- [GTMUnitTestDevLog expectString:@"thought we finished inflate w/o using "
- @"all input, 20 bytes left"];
- STAssertNil([NSData gtm_dataByRawInflatingBytes:[suffixedRawDeflated bytes]
- length:[suffixedRawDeflated length]],
- nil);
+ XCTAssertNil([NSData gtm_dataByRawInflatingData:suffixedRawDeflated error:&error]);
+ GTMCheckRemainingError(error, 20);
+ XCTAssertNil([NSData gtm_dataByRawInflatingBytes:[suffixedRawDeflated bytes]
+ length:[suffixedRawDeflated length]
+ error:&error]);
+ GTMCheckRemainingError(error, 20);
}
- (void)testInflateDeflate {
NSData *data = [NSData dataWithBytes:randomDataLarge
length:sizeof(randomDataLarge)];
- STAssertNotNil(data, @"failed to alloc data block");
+ XCTAssertNotNil(data, @"failed to alloc data block");
// w/ *Bytes apis, default level
+ NSError *error = nil;
NSData *deflated = [NSData gtm_dataByDeflatingBytes:[data bytes]
- length:[data length]];
- STAssertNotNil(deflated, @"failed to deflate data block");
- STAssertGreaterThan([deflated length],
- (NSUInteger)0, @"failed to deflate data block");
- STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ length:[data length]
+ error:&error];
+ XCTAssertNotNil(deflated, @"failed to deflate data block");
+ XCTAssertGreaterThan([deflated length], (NSUInteger)0,
+ @"failed to deflate data block");
+ XCTAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ XCTAssertNil(error);
+ error = nil;
+
NSData *dataPrime = [NSData gtm_dataByInflatingBytes:[deflated bytes]
- length:[deflated length]];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Bytes apis");
+ length:[deflated length]
+ error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length], (NSUInteger)0,
+ @"failed to inflate data block");
+ XCTAssertEqualObjects(data, dataPrime,
+ @"failed to round trip via *Bytes apis");
+ XCTAssertNil(error);
+ error = nil;
// w/ *Data apis, default level
- deflated = [NSData gtm_dataByDeflatingData:data];
- STAssertNotNil(deflated, @"failed to deflate data block");
- STAssertGreaterThan([deflated length],
- (NSUInteger)0, @"failed to deflate data block");
- STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
- dataPrime = [NSData gtm_dataByInflatingData:deflated];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Data apis");
+ deflated = [NSData gtm_dataByDeflatingData:data error:&error];
+ XCTAssertNotNil(deflated, @"failed to deflate data block");
+ XCTAssertGreaterThan([deflated length], (NSUInteger)0,
+ @"failed to deflate data block");
+ XCTAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByInflatingData:deflated error:&error];
+
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length], (NSUInteger)0,
+ @"failed to inflate data block");
+ XCTAssertEqualObjects(data, dataPrime,
+ @"failed to round trip via *Data apis");
+ XCTAssertNil(error);
+ error = nil;
// loop over the compression levels
for (int level = 1 ; level <= 9 ; ++level) {
// w/ *Bytes apis, using our level
deflated = [NSData gtm_dataByDeflatingBytes:[data bytes]
length:[data length]
- compressionLevel:level];
- STAssertNotNil(deflated, @"failed to deflate data block");
- STAssertGreaterThan([deflated length],
- (NSUInteger)0, @"failed to deflate data block");
- STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ compressionLevel:level
+ error:&error];
+ XCTAssertNotNil(deflated, @"failed to deflate data block");
+ XCTAssertGreaterThan([deflated length],
+ (NSUInteger)0, @"failed to deflate data block");
+ XCTAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ XCTAssertNil(error);
+ error = nil;
dataPrime = [NSData gtm_dataByInflatingBytes:[deflated bytes]
- length:[deflated length]];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Bytes apis");
+ length:[deflated length]
+ error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Bytes apis");
+ XCTAssertNil(error);
+ error = nil;
// w/ *Data apis, using our level
- deflated = [NSData gtm_dataByDeflatingData:data compressionLevel:level];
- STAssertNotNil(deflated, @"failed to deflate data block");
- STAssertGreaterThan([deflated length],
- (NSUInteger)0, @"failed to deflate data block");
- STAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
- dataPrime = [NSData gtm_dataByInflatingData:deflated];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Data apis");
+ deflated = [NSData gtm_dataByDeflatingData:data compressionLevel:level error:&error];
+ XCTAssertNotNil(deflated, @"failed to deflate data block");
+ XCTAssertGreaterThan([deflated length],
+ (NSUInteger)0, @"failed to deflate data block");
+ XCTAssertFalse(HasGzipHeader(deflated), @"has gzip header on zlib data");
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByInflatingData:deflated error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Data apis");
+ XCTAssertNil(error);
+ error = nil;
}
}
- (void)testInflateGzip {
NSData *data = [NSData dataWithBytes:randomDataLarge
length:sizeof(randomDataLarge)];
- STAssertNotNil(data, @"failed to alloc data block");
+ XCTAssertNotNil(data, @"failed to alloc data block");
// w/ *Bytes apis, default level
+ NSError *error = nil;
NSData *gzipped = [NSData gtm_dataByGzippingBytes:[data bytes]
length:[data length]];
- STAssertNotNil(gzipped, @"failed to gzip data block");
- STAssertGreaterThan([gzipped length],
- (NSUInteger)0, @"failed to gzip data block");
- STAssertTrue(HasGzipHeader(gzipped),
- @"doesn't have gzip header on gzipped data");
+ XCTAssertNotNil(gzipped, @"failed to gzip data block");
+ XCTAssertGreaterThan([gzipped length],
+ (NSUInteger)0, @"failed to gzip data block");
+ XCTAssertTrue(HasGzipHeader(gzipped),
+ @"doesn't have gzip header on gzipped data");
NSData *dataPrime = [NSData gtm_dataByInflatingBytes:[gzipped bytes]
- length:[gzipped length]];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Bytes apis");
+ length:[gzipped length]
+ error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Bytes apis");
+ XCTAssertNil(error);
+ error = nil;
// w/ *Data apis, default level
- gzipped = [NSData gtm_dataByGzippingData:data];
- STAssertNotNil(gzipped, @"failed to gzip data block");
- STAssertGreaterThan([gzipped length],
+ gzipped = [NSData gtm_dataByGzippingData:data error:&error];
+ XCTAssertNotNil(gzipped, @"failed to gzip data block");
+ XCTAssertGreaterThan([gzipped length],
(NSUInteger)0, @"failed to gzip data block");
- STAssertTrue(HasGzipHeader(gzipped),
- @"doesn't have gzip header on gzipped data");
- dataPrime = [NSData gtm_dataByInflatingData:gzipped];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data, dataPrime,
- @"failed to round trip via *Data apis");
+ XCTAssertTrue(HasGzipHeader(gzipped),
+ @"doesn't have gzip header on gzipped data");
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByInflatingData:gzipped error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to inflate data block");
+ XCTAssertEqualObjects(data, dataPrime,
+ @"failed to round trip via *Data apis");
+ XCTAssertNil(error);
+ error = nil;
// loop over the compression levels
for (int level = 1 ; level <= 9 ; ++level) {
// w/ *Bytes apis, using our level
gzipped = [NSData gtm_dataByGzippingBytes:[data bytes]
length:[data length]
- compressionLevel:level];
- STAssertNotNil(gzipped, @"failed to gzip data block");
- STAssertGreaterThan([gzipped length],
- (NSUInteger)0, @"failed to gzip data block");
- STAssertTrue(HasGzipHeader(gzipped),
- @"doesn't have gzip header on gzipped data");
+ compressionLevel:level
+ error:&error];
+ XCTAssertNotNil(gzipped, @"failed to gzip data block");
+ XCTAssertGreaterThan([gzipped length],
+ (NSUInteger)0, @"failed to gzip data block");
+ XCTAssertTrue(HasGzipHeader(gzipped),
+ @"doesn't have gzip header on gzipped data");
+ XCTAssertNil(error);
+ error = nil;
dataPrime = [NSData gtm_dataByInflatingBytes:[gzipped bytes]
- length:[gzipped length]];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data, dataPrime,
- @"failed to round trip via *Bytes apis");
+ length:[gzipped length]
+ error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to inflate data block");
+ XCTAssertEqualObjects(data, dataPrime,
+ @"failed to round trip via *Bytes apis");
+ XCTAssertNil(error);
+ error = nil;
// w/ *Data apis, using our level
- gzipped = [NSData gtm_dataByGzippingData:data compressionLevel:level];
- STAssertNotNil(gzipped, @"failed to gzip data block");
- STAssertGreaterThan([gzipped length],
- (NSUInteger)0, @"failed to gzip data block");
- STAssertTrue(HasGzipHeader(gzipped),
- @"doesn't have gzip header on gzipped data");
- dataPrime = [NSData gtm_dataByInflatingData:gzipped];
- STAssertNotNil(dataPrime, @"failed to inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Data apis");
+ gzipped = [NSData gtm_dataByGzippingData:data compressionLevel:level error:&error];
+ XCTAssertNotNil(gzipped, @"failed to gzip data block");
+ XCTAssertGreaterThan([gzipped length],
+ (NSUInteger)0, @"failed to gzip data block");
+ XCTAssertTrue(HasGzipHeader(gzipped),
+ @"doesn't have gzip header on gzipped data");
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByInflatingData:gzipped error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Data apis");
+ XCTAssertNil(error);
+ error = nil;
}
}
- (void)testRawtInflateRawDeflate {
+ NSError *error = nil;
NSData *data = [NSData dataWithBytes:randomDataLarge
length:sizeof(randomDataLarge)];
- STAssertNotNil(data, @"failed to alloc data block");
+ XCTAssertNotNil(data, @"failed to alloc data block");
// w/ *Bytes apis, default level
NSData *rawDeflated = [NSData gtm_dataByRawDeflatingBytes:[data bytes]
- length:[data length]];
- STAssertNotNil(rawDeflated, @"failed to raw deflate data block");
- STAssertGreaterThan([rawDeflated length],
- (NSUInteger)0, @"failed to raw deflate data block");
- STAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
+ length:[data length]
+ error:&error];
+ XCTAssertNotNil(rawDeflated, @"failed to raw deflate data block");
+ XCTAssertGreaterThan([rawDeflated length],
+ (NSUInteger)0, @"failed to raw deflate data block");
+ XCTAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
+ XCTAssertNil(error);
+ error = nil;
NSData *dataPrime = [NSData gtm_dataByRawInflatingBytes:[rawDeflated bytes]
- length:[rawDeflated length]];
- STAssertNotNil(dataPrime, @"failed to raw inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to raw inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Bytes apis");
+ length:[rawDeflated length]
+ error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to raw inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to raw inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Bytes apis");
+ XCTAssertNil(error);
+ error = nil;
// w/ *Data apis, default level
- rawDeflated = [NSData gtm_dataByRawDeflatingData:data];
- STAssertNotNil(rawDeflated, @"failed to raw deflate data block");
- STAssertGreaterThan([rawDeflated length],
- (NSUInteger)0, @"failed to raw deflate data block");
- STAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
- dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated];
- STAssertNotNil(dataPrime, @"failed to raw inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to raw inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Data apis");
+ rawDeflated = [NSData gtm_dataByRawDeflatingData:data error:&error];
+ XCTAssertNotNil(rawDeflated, @"failed to raw deflate data block");
+ XCTAssertGreaterThan([rawDeflated length],
+ (NSUInteger)0, @"failed to raw deflate data block");
+ XCTAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to raw inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to raw inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Data apis");
+ XCTAssertNil(error);
+ error = nil;
// loop over the compression levels
for (int level = 1 ; level <= 9 ; ++level) {
// w/ *Bytes apis, using our level
rawDeflated = [NSData gtm_dataByRawDeflatingBytes:[data bytes]
length:[data length]
- compressionLevel:level];
- STAssertNotNil(rawDeflated, @"failed to rawDeflate data block");
- STAssertGreaterThan([rawDeflated length],
- (NSUInteger)0, @"failed to raw deflate data block");
- STAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
+ compressionLevel:level
+ error:&error];
+ XCTAssertNotNil(rawDeflated, @"failed to rawDeflate data block");
+ XCTAssertGreaterThan([rawDeflated length],
+ (NSUInteger)0, @"failed to raw deflate data block");
+ XCTAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
+ XCTAssertNil(error);
+ error = nil;
dataPrime = [NSData gtm_dataByRawInflatingBytes:[rawDeflated bytes]
- length:[rawDeflated length]];
- STAssertNotNil(dataPrime, @"failed to raw inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to raw inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Bytes apis");
+ length:[rawDeflated length]
+ error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to raw inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to raw inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Bytes apis");
+ XCTAssertNil(error);
+ error = nil;
// w/ *Data apis, using our level
rawDeflated = [NSData gtm_dataByRawDeflatingData:data
- compressionLevel:level];
- STAssertNotNil(rawDeflated, @"failed to deflate data block");
- STAssertGreaterThan([rawDeflated length],
- (NSUInteger)0, @"failed to raw deflate data block");
- STAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
- dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated];
- STAssertNotNil(dataPrime, @"failed to raw inflate data block");
- STAssertGreaterThan([dataPrime length],
- (NSUInteger)0, @"failed to raw inflate data block");
- STAssertEqualObjects(data,
- dataPrime, @"failed to round trip via *Data apis");
+ compressionLevel:level
+ error:&error];
+ XCTAssertNotNil(rawDeflated, @"failed to deflate data block");
+ XCTAssertGreaterThan([rawDeflated length],
+ (NSUInteger)0, @"failed to raw deflate data block");
+ XCTAssertFalse(HasGzipHeader(rawDeflated), @"has gzip header on raw data");
+ XCTAssertNil(error);
+ error = nil;
+ dataPrime = [NSData gtm_dataByRawInflatingData:rawDeflated error:&error];
+ XCTAssertNotNil(dataPrime, @"failed to raw inflate data block");
+ XCTAssertGreaterThan([dataPrime length],
+ (NSUInteger)0, @"failed to raw inflate data block");
+ XCTAssertEqualObjects(data,
+ dataPrime, @"failed to round trip via *Data apis");
+ XCTAssertNil(error);
+ error = nil;
}
}
- (void)testLargeData {
// Generate some large data out of the random chunk by xoring over it
// to make sure it changes and isn't too repeated.
+ NSError *error = nil;
NSData *data = [NSData dataWithBytes:randomDataLarge
length:sizeof(randomDataLarge)];
- STAssertNotNil(data, @"failed to alloc data block");
+ XCTAssertNotNil(data, @"failed to alloc data block");
const uint8_t *dataBytes = [data bytes];
NSMutableData *scratch = [NSMutableData dataWithLength:[data length]];
- STAssertNotNil(scratch, @"failed to alloc data block");
+ XCTAssertNotNil(scratch, @"failed to alloc data block");
uint8_t *scratchBytes = [scratch mutableBytes];
NSMutableData *input = [NSMutableData dataWithCapacity:200 * [data length]];
for (NSUInteger i = 0; i < 200; ++i) {
@@ -505,22 +625,27 @@ static BOOL HasGzipHeader(NSData *data) {
// Should deflate to more then one buffer size to make sure the internal loop
// is working.
NSData *compressed = [NSData gtm_dataByDeflatingData:input
- compressionLevel:9];
- STAssertNotNil(compressed, @"failed to deflate");
- STAssertGreaterThan([compressed length], internalBufferSize,
- @"should have been more then %d bytes",
- (int)internalBufferSize);
+ compressionLevel:9
+ error:&error];
+ XCTAssertNotNil(compressed, @"failed to deflate");
+ XCTAssertGreaterThan([compressed length], internalBufferSize,
+ @"should have been more then %d bytes",
+ (int)internalBufferSize);
+ XCTAssertNil(error);
+ error = nil;
// Should inflate to more then one buffer size to make sure the internal loop
// is working.
- NSData *uncompressed = [NSData gtm_dataByInflatingData:compressed];
- STAssertNotNil(uncompressed, @"fail to inflate");
- STAssertGreaterThan([uncompressed length], internalBufferSize,
- @"should have been more then %d bytes",
- (int)internalBufferSize);
-
- STAssertEqualObjects(uncompressed, input,
- @"didn't get the same thing back");
+ NSData *uncompressed = [NSData gtm_dataByInflatingData:compressed error:&error];
+ XCTAssertNotNil(uncompressed, @"fail to inflate");
+ XCTAssertGreaterThan([uncompressed length], internalBufferSize,
+ @"should have been more then %d bytes",
+ (int)internalBufferSize);
+
+ XCTAssertEqualObjects(uncompressed, input,
+ @"didn't get the same thing back");
+ XCTAssertNil(error);
+ error = nil;
}
@end
diff --git a/Foundation/GTMNSDictionary+CaseInsensitive.h b/Foundation/GTMNSDictionary+CaseInsensitive.h
deleted file mode 100644
index 890af4b..0000000
--- a/Foundation/GTMNSDictionary+CaseInsensitive.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// GTMNSDictionary+CaseInsensitive.h
-//
-// Copyright 2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-
-/// Utility for building case-insensitive NSDictionary objects.
-@interface NSDictionary (GTMNSDictionaryCaseInsensitiveAdditions)
-
-/// Initializes an NSDictionary with a case-insensitive comparison function
-/// for NSString keys, while non-NSString keys are treated normally.
-///
-/// The case for NSString keys is preserved, though duplicate keys (when
-/// compared in a case-insensitive fashion) have one of their values dropped
-/// arbitrarily.
-///
-/// An example of use with HTTP headers in an NSHTTPURLResponse object:
-///
-/// NSDictionary *headers =
-/// [NSDictionary gtm_dictionaryWithDictionaryCaseInsensitive:
-/// [response allHeaderFields]];
-/// NSString *contentType = [headers objectForKey:@"Content-Type"];
-- (id)gtm_initWithDictionaryCaseInsensitive:(NSDictionary *)dictionary
- NS_RETURNS_RETAINED NS_CONSUMES_SELF;
-
-/// Returns a newly created and autoreleased NSDictionary object as above.
-+ (id)gtm_dictionaryWithDictionaryCaseInsensitive:(NSDictionary *)dictionary;
-
-@end
diff --git a/Foundation/GTMNSDictionary+CaseInsensitive.m b/Foundation/GTMNSDictionary+CaseInsensitive.m
deleted file mode 100644
index 96494c2..0000000
--- a/Foundation/GTMNSDictionary+CaseInsensitive.m
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// GTMNSDictionary+CaseInsensitive.m
-//
-// Copyright 2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMNSDictionary+CaseInsensitive.h"
-#import "GTMDefines.h"
-#import <CoreFoundation/CoreFoundation.h>
-
-@interface NSMutableDictionary (GTMNSMutableDictionaryCaseInsensitiveAdditions)
-
-// Returns a mutable equivalent to GTMNSDictionaryCaseInsensitiveAdditions.
-- (id)gtm_initWithDictionaryCaseInsensitive:(NSDictionary *)dictionary;
-
-@end
-
-static Boolean CaseInsensitiveEqualCallback(const void *a, const void *b) {
- id idA = (id)a;
- id idB = (id)b;
- Boolean ret = FALSE;
- if ([idA isKindOfClass:[NSString class]] &&
- [idB isKindOfClass:[NSString class]]) {
- ret = ([idA compare:idB options:NSCaseInsensitiveSearch|NSLiteralSearch]
- == NSOrderedSame);
- } else {
- ret = [idA isEqual:idB];
- }
- return ret;
-}
-
-static CFHashCode CaseInsensitiveHashCallback(const void *value) {
- id idValue = (id)value;
- CFHashCode ret = 0;
- if ([idValue isKindOfClass:[NSString class]]) {
- ret = [[idValue lowercaseString] hash];
- } else {
- ret = [idValue hash];
- }
- return ret;
-}
-
-@implementation NSDictionary (GTMNSDictionaryCaseInsensitiveAdditions)
-
-- (id)gtm_initWithDictionaryCaseInsensitive:(NSDictionary *)dictionary {
- [self release];
- self = nil;
-
- CFIndex count = 0;
- void *keys = NULL;
- void *values = NULL;
-
- if (dictionary) {
- count = CFDictionaryGetCount((CFDictionaryRef)dictionary);
-
- if (count) {
- keys = malloc(count * sizeof(void *));
- values = malloc(count * sizeof(void *));
- if (!keys || !values) {
- free(keys);
- free(values);
- return self;
- }
-
- CFDictionaryGetKeysAndValues((CFDictionaryRef)dictionary, keys, values);
- }
- }
-
- CFDictionaryKeyCallBacks keyCallbacks = kCFCopyStringDictionaryKeyCallBacks;
- _GTMDevAssert(keyCallbacks.version == 0,
- @"CFDictionaryKeyCallBacks structure updated");
- keyCallbacks.equal = CaseInsensitiveEqualCallback;
- keyCallbacks.hash = CaseInsensitiveHashCallback;
-
- self = (id)CFDictionaryCreate(kCFAllocatorDefault,
- keys, values, count, &keyCallbacks,
- &kCFTypeDictionaryValueCallBacks);
-
- free(keys);
- free(values);
-
- return self;
-}
-
-+ (id)gtm_dictionaryWithDictionaryCaseInsensitive:(NSDictionary *)dictionary {
- return [[[self alloc]
- gtm_initWithDictionaryCaseInsensitive:dictionary] autorelease];
-}
-
-@end
-
-@implementation NSMutableDictionary (GTMNSMutableDictionaryCaseInsensitiveAdditions)
-
-- (id)gtm_initWithDictionaryCaseInsensitive:(NSDictionary *)dictionary {
- if ((self = [super gtm_initWithDictionaryCaseInsensitive:dictionary])) {
- id copy = (id)CFDictionaryCreateMutableCopy(kCFAllocatorDefault, 0,
- (CFDictionaryRef)self);
- [self release];
- self = copy;
- }
- return self;
-}
-
-@end
diff --git a/Foundation/GTMNSDictionary+CaseInsensitiveTest.m b/Foundation/GTMNSDictionary+CaseInsensitiveTest.m
deleted file mode 100644
index 67584ff..0000000
--- a/Foundation/GTMNSDictionary+CaseInsensitiveTest.m
+++ /dev/null
@@ -1,119 +0,0 @@
-//
-// GTMNSDictionary+CaseInsensitiveTest.m
-//
-// Copyright 2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMNSDictionary+CaseInsensitive.h"
-
-@interface GTMNSDictionary_CaseInsensitiveTest : GTMTestCase
-@end
-
-@implementation GTMNSDictionary_CaseInsensitiveTest
-
-- (void)testNSDictionaryCaseInsensitiveAdditions {
- NSURL *objKey = [NSURL URLWithString:@"http://WWW.Google.COM/"];
- NSURL *lcObjKey = [NSURL URLWithString:[[objKey absoluteString]
- lowercaseString]];
-
- NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
- @"value", @"key",
- @"value", @"KEY",
- @"bar", @"FOO",
- @"yes", objKey,
- nil];
-
- NSDictionary *ciDict =
- [NSDictionary gtm_dictionaryWithDictionaryCaseInsensitive:dict];
-
- STAssertNotNil(ciDict, @"gtm_dictionaryWithDictionaryCaseInsensitive failed");
-
- STAssertTrue([ciDict count] == 3,
- @"wrong count, multiple 'key' entries should be folded.");
-
- STAssertEqualStrings([ciDict objectForKey:@"foo"], @"bar",
- @"case insensitive key lookup failed");
-
- STAssertEqualStrings([ciDict objectForKey:@"kEy"], @"value",
- @"case insensitive key lookup failed");
-
- STAssertNotNil([ciDict objectForKey:objKey],
- @"exact matches on non-NSString objects should still work.");
-
- STAssertNil([ciDict objectForKey:lcObjKey],
- @"only NSString and subclasses are case-insensitive.");
-
- STAssertNotNil([NSDictionary gtm_dictionaryWithDictionaryCaseInsensitive:
- [NSDictionary dictionary]],
- @"empty dictionary should not return nil");
-
- STAssertNotNil([NSDictionary gtm_dictionaryWithDictionaryCaseInsensitive:
- nil],
- @"nil dictionary should return empty dictionary");
-
- STAssertNotNil([[[NSDictionary alloc] gtm_initWithDictionaryCaseInsensitive:
- nil] autorelease],
- @"nil dictionary should return empty dictionary");
-}
-
-- (void)testNSMutableDictionaryCaseInsensitiveAdditions {
- NSURL *objKey = [NSURL URLWithString:@"http://WWW.Google.COM/"];
- NSURL *lcObjKey = [NSURL URLWithString:[[objKey absoluteString]
- lowercaseString]];
-
- NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
- @"value", @"key",
- @"value", @"KEY",
- @"bar", @"FOO",
- @"yes", objKey,
- nil];
-
- NSMutableDictionary *ciDict =
- [NSMutableDictionary gtm_dictionaryWithDictionaryCaseInsensitive:dict];
-
- STAssertNotNil(ciDict, @"gtm_dictionaryWithDictionaryCaseInsensitive failed");
-
- STAssertTrue([ciDict count] == 3,
- @"wrong count, multiple 'key' entries should be folded.");
-
- STAssertEqualStrings([ciDict objectForKey:@"foo"], @"bar",
- @"case insensitive key lookup failed");
-
- STAssertEqualStrings([ciDict objectForKey:@"kEy"], @"value",
- @"case insensitive key lookup failed");
-
- STAssertNotNil([ciDict objectForKey:objKey],
- @"exact matches on non-NSString objects should still work.");
-
- STAssertNil([ciDict objectForKey:lcObjKey],
- @"only NSString and subclasses are case-insensitive.");
-
- NSObject *obj = [[[NSObject alloc] init] autorelease];
- [ciDict setObject:obj forKey:@"kEy"];
- STAssertEquals([ciDict objectForKey:@"key"], obj,
- @"mutable dictionary value not overwritten");
-
- STAssertNotNil(
- [NSMutableDictionary gtm_dictionaryWithDictionaryCaseInsensitive:
- [NSDictionary dictionary]],
- @"empty dictionary should not return nil");
-
- STAssertNotNil(
- [NSMutableDictionary gtm_dictionaryWithDictionaryCaseInsensitive:nil],
- @"nil dictionary should return empty dictionary");
-}
-
-@end
diff --git a/Foundation/GTMNSDictionary+URLArguments.m b/Foundation/GTMNSDictionary+URLArguments.m
index 5a7aa5f..e9fa766 100644
--- a/Foundation/GTMNSDictionary+URLArguments.m
+++ b/Foundation/GTMNSDictionary+URLArguments.m
@@ -38,7 +38,7 @@ GTM_METHOD_CHECK(NSString, gtm_stringByUnescapingFromURLArgument);
NSString* component;
// Use reverse order so that the first occurrence of a key replaces
// those subsequent.
- GTM_FOREACH_ENUMEREE(component, [components reverseObjectEnumerator]) {
+ for (component in [components reverseObjectEnumerator]) {
if ([component length] == 0)
continue;
NSRange pos = [component rangeOfString:@"="];
@@ -65,7 +65,7 @@ GTM_METHOD_CHECK(NSString, gtm_stringByUnescapingFromURLArgument);
- (NSString *)gtm_httpArgumentsString {
NSMutableArray* arguments = [NSMutableArray arrayWithCapacity:[self count]];
NSString* key;
- GTM_FOREACH_KEY(key, self) {
+ for (key in self) {
[arguments addObject:[NSString stringWithFormat:@"%@=%@",
[key gtm_stringByEscapingForURLArgument],
[[[self objectForKey:key] description] gtm_stringByEscapingForURLArgument]]];
diff --git a/Foundation/GTMNSDictionary+URLArgumentsTest.m b/Foundation/GTMNSDictionary+URLArgumentsTest.m
index 8ec9520..11ceb8a 100644
--- a/Foundation/GTMNSDictionary+URLArgumentsTest.m
+++ b/Foundation/GTMNSDictionary+URLArgumentsTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -26,42 +26,42 @@
@implementation GTMNSDictionary_URLArgumentsTest
- (void)testFromArgumentsString {
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@""],
- [NSDictionary dictionary],
- @"- empty arguments string should give an empty dictionary");
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a"],
- [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
- @"- missing '=' should result in an empty string value");
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a="],
- [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
- @"- no value");
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"&a=1"],
- [NSDictionary dictionaryWithObject:@"1" forKey:@"a"],
- @"- empty segment should be skipped");
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"abc=123"],
- [NSDictionary dictionaryWithObject:@"123" forKey:@"abc"],
- @"- simple one-pair dictionary should work");
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=1&a=2&a=3"],
- [NSDictionary dictionaryWithObject:@"1" forKey:@"a"],
- @"- only first occurrence of a key is returned");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@""],
+ [NSDictionary dictionary],
+ @"- empty arguments string should give an empty dictionary");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a"],
+ [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
+ @"- missing '=' should result in an empty string value");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a="],
+ [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
+ @"- no value");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"&a=1"],
+ [NSDictionary dictionaryWithObject:@"1" forKey:@"a"],
+ @"- empty segment should be skipped");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"abc=123"],
+ [NSDictionary dictionaryWithObject:@"123" forKey:@"abc"],
+ @"- simple one-pair dictionary should work");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=1&a=2&a=3"],
+ [NSDictionary dictionaryWithObject:@"1" forKey:@"a"],
+ @"- only first occurrence of a key is returned");
NSString* complex = @"a%2Bb=specialkey&complex=1%2B1%21%3D3%20%26%202%2A6%2F3%3D4&c";
NSDictionary* result = [NSDictionary dictionaryWithObjectsAndKeys:
@"1+1!=3 & 2*6/3=4", @"complex",
@"specialkey", @"a+b",
@"", @"c",
nil];
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:complex],
- result,
- @"- keys and values should be unescaped correctly");
- STAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=%FC"],
- [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
- @"- invalid UTF8 characters result in an empty value, not a crash");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:complex],
+ result,
+ @"- keys and values should be unescaped correctly");
+ XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=%FC"],
+ [NSDictionary dictionaryWithObject:@"" forKey:@"a"],
+ @"- invalid UTF8 characters result in an empty value, not a crash");
}
- (void)testArgumentsString {
- STAssertEqualObjects([[NSDictionary dictionary] gtm_httpArgumentsString], @"",
- @"- empty dictionary should give an empty string");
- STAssertEqualObjects([[NSDictionary dictionaryWithObject:@"123" forKey:@"abc"] gtm_httpArgumentsString],
+ XCTAssertEqualObjects([[NSDictionary dictionary] gtm_httpArgumentsString], @"",
+ @"- empty dictionary should give an empty string");
+ XCTAssertEqualObjects([[NSDictionary dictionaryWithObject:@"123" forKey:@"abc"] gtm_httpArgumentsString],
@"abc=123",
@"- simple one-pair dictionary should work");
NSDictionary* arguments = [NSDictionary dictionaryWithObjectsAndKeys:
@@ -72,15 +72,15 @@
// check for individual pieces since order is not guaranteed
NSString* component1 = @"a%2Bb=specialkey";
NSString* component2 = @"complex=1%2B1%21%3D3%20%26%202%2A6%2F3%3D4";
- STAssertNotEquals([argumentString rangeOfString:component1].location, (NSUInteger)NSNotFound,
+ XCTAssertNotEqual([argumentString rangeOfString:component1].location, (NSUInteger)NSNotFound,
@"- '%@' not found in '%@'", component1, argumentString);
- STAssertNotEquals([argumentString rangeOfString:component2].location, (NSUInteger)NSNotFound,
+ XCTAssertNotEqual([argumentString rangeOfString:component2].location, (NSUInteger)NSNotFound,
@"- '%@' not found in '%@'", component2, argumentString);
- STAssertNotEquals([argumentString rangeOfString:@"&"].location, (NSUInteger)NSNotFound,
+ XCTAssertNotEqual([argumentString rangeOfString:@"&"].location, (NSUInteger)NSNotFound,
@"- special characters should be escaped");
- STAssertNotEquals([argumentString characterAtIndex:0], (unichar)'&',
+ XCTAssertNotEqual([argumentString characterAtIndex:0], (unichar)'&',
@"- there should be no & at the beginning of the string");
- STAssertNotEquals([argumentString characterAtIndex:([argumentString length] - 1)], (unichar)'&',
+ XCTAssertNotEqual([argumentString characterAtIndex:([argumentString length] - 1)], (unichar)'&',
@"- there should be no & at the end of the string");
}
diff --git a/Foundation/GTMNSEnumerator+Filter.h b/Foundation/GTMNSEnumerator+Filter.h
deleted file mode 100644
index 8e4a6b7..0000000
--- a/Foundation/GTMNSEnumerator+Filter.h
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// GTMNSEnumerator+Filter.h
-//
-// Copyright 2007-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-
-// A generic category for methods that allow us to filter enumeratable
-// containers, inspired by C++ Standard Library's use of iterators.
-// Like in C++, these assume the underlying container is not modified during
-// the lifetime of the iterator.
-//
-@interface NSEnumerator (GTMEnumeratorFilterAdditions)
-
-// Performs -[element predicate:argument] on each object in self.
-// Returns an enumerator where -[element predicate:argument] returned YES.
-// Predicate must be of form -(BOOL)predicate:(id)argument.
-- (NSEnumerator *)gtm_filteredEnumeratorByMakingEachObjectPerformSelector:(SEL)predicate
- withObject:(id)argument;
-
-// Performs -[element selector:argument] on each object in self.
-// Returns an enumerator of the return values of -[element selector:argument].
-// Selector must be of form -(id)selector:(id)argument.
-- (NSEnumerator *)gtm_enumeratorByMakingEachObjectPerformSelector:(SEL)selector
- withObject:(id)argument;
-
-// Performs -[target predicate:element] on each object in self.
-// Returns an enumerator where -[target predicate:element] returned YES.
-// Predicate must be of form -(BOOL)predicate:(id)element.
-- (NSEnumerator *)gtm_filteredEnumeratorByTarget:(id)target
- performOnEachSelector:(SEL)predicate;
-
-// Performs -[target predicate:element withObject:object] on each object in self.
-// Returns an enumerator where -[target predicate:element withObject:object]
-// returned YES.
-// Predicate must be of form -(BOOL)predicate:(id)element withObject:(id)object.
-- (NSEnumerator *)gtm_filteredEnumeratorByTarget:(id)target
- performOnEachSelector:(SEL)predicate
- withObject:(id)object;
-
-// Performs -[target selector:element] on each object in self.
-// Returns an enumerator of the return values of -[target selector:element].
-// Selector must be of form -(id)selector:(id)element.
-- (NSEnumerator *)gtm_enumeratorByTarget:(id)target
- performOnEachSelector:(SEL)selector;
-
-// Performs -[target selector:element withObject:object] on each object in self.
-// Returns an enumerator of the return values of
-// -[target selector:element withObject:object].
-// Selector must be of form -(id)selector:(id)element withObject:(id)object.
-- (NSEnumerator *)gtm_enumeratorByTarget:(id)target
- performOnEachSelector:(SEL)selector
- withObject:(id)object;
-
-@end
-
diff --git a/Foundation/GTMNSEnumerator+Filter.m b/Foundation/GTMNSEnumerator+Filter.m
deleted file mode 100644
index cc1cb41..0000000
--- a/Foundation/GTMNSEnumerator+Filter.m
+++ /dev/null
@@ -1,221 +0,0 @@
-//
-// GTMNSEnumerator+Filter.m
-//
-// Copyright 2007-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMNSEnumerator+Filter.h"
-#import "GTMDebugSelectorValidation.h"
-#import "GTMDefines.h"
-#if GTM_IPHONE_SDK
-#import <objc/message.h>
-#import <objc/runtime.h>
-#else
-#import <objc/objc-runtime.h>
-#endif
-
-// a private subclass of NSEnumerator that does all the work.
-// public interface just returns one of these.
-// This top level class contains all the additional boilerplate. Specific
-// behavior is in the subclasses.
-@interface GTMEnumeratorPrivateBase : NSEnumerator {
- @protected
- NSEnumerator *base_;
- SEL operation_; // either a predicate or a transform depending on context.
- id target_; // may be nil
- id object_; // may be nil
-}
-@end
-
-@interface GTMEnumeratorPrivateBase (SubclassesMustProvide)
-- (BOOL)filterObject:(id)obj returning:(id *)resultp;
-@end
-
-@implementation GTMEnumeratorPrivateBase
-- (id)initWithBase:(NSEnumerator *)base
- sel:(SEL)filter
- target:(id)optionalTarget
- object:(id)optionalOther {
- self = [super init];
- if (self) {
-
- // someone would have to subclass or directly create an object of this
- // class, and this class is private to this impl.
- _GTMDevAssert(base, @"can't initWithBase: a nil base enumerator");
- base_ = [base retain];
- operation_ = filter;
- target_ = [optionalTarget retain];
- object_ = [optionalOther retain];
- }
- return self;
-}
-
-// we don't provide an init because this base class is private to this
-// impl, and no one would be able to create it (if they do, they get whatever
-// they happens...).
-
-- (void)dealloc {
- [base_ release];
- [target_ release];
- [object_ release];
- [super dealloc];
-}
-
-- (id)nextObject {
- for (id obj = [base_ nextObject]; obj; obj = [base_ nextObject]) {
- id result = nil;
- if ([self filterObject:obj returning:&result]) {
- return result;
- }
- }
- return nil;
-}
-@end
-
-// a transformer, for each item in the enumerator, returns a f(item).
-@interface GTMEnumeratorTransformer : GTMEnumeratorPrivateBase
-@end
-@implementation GTMEnumeratorTransformer
-- (BOOL)filterObject:(id)obj returning:(id *)resultp {
- *resultp = [obj performSelector:operation_ withObject:object_];
- return nil != *resultp;
-}
-@end
-
-// a transformer, for each item in the enumerator, returns a f(item).
-// a target transformer swaps the target and the argument.
-@interface GTMEnumeratorTargetTransformer : GTMEnumeratorPrivateBase
-@end
-@implementation GTMEnumeratorTargetTransformer
-- (BOOL)filterObject:(id)obj returning:(id *)resultp {
- *resultp = [target_ performSelector:operation_
- withObject:obj
- withObject:object_];
- return nil != *resultp;
-}
-@end
-
-// a filter, for each item in the enumerator, if(f(item)) { returns item. }
-@interface GTMEnumeratorFilter : GTMEnumeratorPrivateBase
-@end
-@implementation GTMEnumeratorFilter
-// We must take care here, since Intel leaves junk in high bytes of return
-// register for predicates that return BOOL.
-// For details see:
-// http://developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/universal_binary_tips.html#//apple_ref/doc/uid/TP40002217-CH239-280661
-// and
-// http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187
-- (BOOL)filterObject:(id)obj returning:(id *)resultp {
- *resultp = obj;
- return ((BOOL (*)(id, SEL, id))objc_msgSend)(obj, operation_, object_);
-}
-@end
-
-// a target filter, for each item in the enumerator, if(f(item)) { returns item. }
-// a target transformer swaps the target and the argument.
-@interface GTMEnumeratorTargetFilter : GTMEnumeratorPrivateBase
-@end
-@implementation GTMEnumeratorTargetFilter
-// We must take care here, since Intel leaves junk in high bytes of return
-// register for predicates that return BOOL.
-// For details see:
-// http://developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/universal_binary_tips.html#//apple_ref/doc/uid/TP40002217-CH239-280661
-// and
-// http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187
-- (BOOL)filterObject:(id)obj returning:(id *)resultp {
- *resultp = obj;
- return ((BOOL (*)(id, SEL, id, id))objc_msgSend)(target_, operation_, obj, object_);
-}
-@end
-
-@implementation NSEnumerator (GTMEnumeratorFilterAdditions)
-
-- (NSEnumerator *)gtm_filteredEnumeratorByMakingEachObjectPerformSelector:(SEL)selector
- withObject:(id)argument {
- return [[[GTMEnumeratorFilter alloc] initWithBase:self
- sel:selector
- target:nil
- object:argument] autorelease];
-}
-
-- (NSEnumerator *)gtm_enumeratorByMakingEachObjectPerformSelector:(SEL)selector
- withObject:(id)argument {
- return [[[GTMEnumeratorTransformer alloc] initWithBase:self
- sel:selector
- target:nil
- object:argument] autorelease];
-}
-
-
-- (NSEnumerator *)gtm_filteredEnumeratorByTarget:(id)target
- performOnEachSelector:(SEL)predicate {
- // make sure the object impls this selector taking an object as an arg.
- GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, predicate,
- @encode(BOOL),
- @encode(id),
- NULL);
- return [[[GTMEnumeratorTargetFilter alloc] initWithBase:self
- sel:predicate
- target:target
- object:nil] autorelease];
-}
-
-- (NSEnumerator *)gtm_filteredEnumeratorByTarget:(id)target
- performOnEachSelector:(SEL)predicate
- withObject:(id)object {
- // make sure the object impls this selector taking an object as an arg.
- GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, predicate,
- @encode(BOOL),
- @encode(id),
- @encode(id),
- NULL);
- return [[[GTMEnumeratorTargetFilter alloc] initWithBase:self
- sel:predicate
- target:target
- object:object] autorelease];
-}
-
-- (NSEnumerator *)gtm_enumeratorByTarget:(id)target
- performOnEachSelector:(SEL)selector {
- // make sure the object impls this selector taking an object as an arg.
- GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, selector,
- @encode(id),
- @encode(id),
- NULL);
- return [[[GTMEnumeratorTargetTransformer alloc] initWithBase:self
- sel:selector
- target:target
- object:nil]
- autorelease];
-}
-
-- (NSEnumerator *)gtm_enumeratorByTarget:(id)target
- performOnEachSelector:(SEL)selector
- withObject:(id)object {
- // make sure the object impls this selector taking an object as an arg.
- GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target, selector,
- @encode(id),
- @encode(id),
- @encode(id),
- NULL);
- return [[[GTMEnumeratorTargetTransformer alloc] initWithBase:self
- sel:selector
- target:target
- object:object]
- autorelease];
-}
-
-@end
-
diff --git a/Foundation/GTMNSEnumerator+FilterTest.m b/Foundation/GTMNSEnumerator+FilterTest.m
deleted file mode 100644
index 969a5a5..0000000
--- a/Foundation/GTMNSEnumerator+FilterTest.m
+++ /dev/null
@@ -1,208 +0,0 @@
-//
-// GTMNSEnumerator+FilterTest.m
-//
-// Copyright 2007-2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMNSEnumerator+Filter.h"
-
-@interface GTMNSEnumerator_FilterTest : GTMTestCase
-@end
-
-@implementation GTMNSEnumerator_FilterTest
-
-- (void)testEnumeratorByMakingEachObjectPerformSelector {
- // test w/ a set of strings
- NSSet *numbers = [NSSet setWithObjects: @"1", @"2", @"3", nil];
- NSEnumerator *e = [[numbers objectEnumerator]
- gtm_enumeratorByMakingEachObjectPerformSelector:@selector(stringByAppendingString:)
- withObject:@" "];
- NSMutableSet *trailingSpaces = [NSMutableSet set];
- id obj;
- while (nil != (obj = [e nextObject])) {
- [trailingSpaces addObject:obj];
- }
- NSSet *trailingSpacesGood = [NSSet setWithObjects: @"1 ", @"2 ", @"3 ", nil];
- STAssertEqualObjects(trailingSpaces, trailingSpacesGood, @"");
-
- // test an empty set
- NSSet *empty = [NSSet set];
- e = [[empty objectEnumerator]
- gtm_enumeratorByMakingEachObjectPerformSelector:@selector(stringByAppendingString:)
- withObject:@" "];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-}
-
-- (void)testFilteredEnumeratorByMakingEachObjectPerformSelector {
- // test with a dict of strings
- NSDictionary *testDict = [NSDictionary dictionaryWithObjectsAndKeys:
- @"foo", @"1",
- @"bar", @"2",
- @"foobar", @"3",
- nil];
- // test those that have prefixes
- NSEnumerator *e = [[testDict objectEnumerator]
- gtm_filteredEnumeratorByMakingEachObjectPerformSelector:@selector(hasPrefix:)
- withObject:@"foo"];
- // since the dictionary iterates in any order, compare as sets
- NSSet *filteredValues = [NSSet setWithArray:[e allObjects]];
- NSSet *expectedValues = [NSSet setWithObjects:@"foo", @"foobar", nil];
- STAssertEqualObjects(filteredValues, expectedValues, @"");
-
- // test an empty set
- NSSet *empty = [NSSet set];
- e = [[empty objectEnumerator]
- gtm_filteredEnumeratorByMakingEachObjectPerformSelector:@selector(hasPrefix:)
- withObject:@"foo"];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-
- // test an set that will filter out
- NSSet *filterAway = [NSSet setWithObjects:@"bar", @"baz", nil];
- e = [[filterAway objectEnumerator]
- gtm_filteredEnumeratorByMakingEachObjectPerformSelector:@selector(hasPrefix:)
- withObject:@"foo"];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-}
-
-- (void)testEnumeratorByTargetPerformOnEachSelector {
- // test w/ a set of strings
- NSSet *numbers = [NSSet setWithObjects: @"1", @"2", @"3", nil];
- NSString *target = @"foo";
- NSEnumerator *e = [[numbers objectEnumerator]
- gtm_enumeratorByTarget:target
- performOnEachSelector:@selector(stringByAppendingString:)];
- // since the set iterates in any order, compare as sets
- NSSet *collectedValues = [NSSet setWithArray:[e allObjects]];
- NSSet *expectedValues = [NSSet setWithObjects:@"foo1", @"foo2", @"foo3", nil];
- STAssertEqualObjects(collectedValues, expectedValues, @"");
-
- // test an empty set
- NSSet *empty = [NSSet set];
- e = [[empty objectEnumerator]
- gtm_enumeratorByTarget:target
- performOnEachSelector:@selector(stringByAppendingString:)];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-}
-
-- (id)prependString:(NSString*)pre toString:(NSString *)post {
- return [pre stringByAppendingString:post];
-}
-
-- (void)testEnumeratorByTargetPerformOnEachSelectorWithObject {
- // test w/ a set of strings
- NSSet *numbers = [NSSet setWithObjects: @"1", @"2", @"3", nil];
- NSEnumerator *e = [[numbers objectEnumerator]
- gtm_enumeratorByTarget:self
- performOnEachSelector:@selector(prependString:toString:)
- withObject:@"bar"];
- // since the set iterates in any order, compare as sets
- NSSet *collectedValues = [NSSet setWithArray:[e allObjects]];
- NSSet *expectedValues = [NSSet setWithObjects:@"1bar",
- @"2bar",
- @"3bar",
- nil];
- STAssertEqualObjects(collectedValues, expectedValues, @"");
-
- // test an empty set
- NSSet *empty = [NSSet set];
- e = [[empty objectEnumerator]
- gtm_enumeratorByTarget:self
- performOnEachSelector:@selector(prependString:toString:)
- withObject:@"bar"];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-}
-
-
-- (void)testFilteredEnumeratorByTargetPerformOnEachSelector {
- // test w/ a set of strings
- NSSet *numbers = [NSSet setWithObjects:@"1", @"2", @"3", @"4", nil];
- NSSet *target = [NSSet setWithObjects:@"2", @"4", @"6", nil];
- NSEnumerator *e = [[numbers objectEnumerator]
- gtm_filteredEnumeratorByTarget:target
- performOnEachSelector:@selector(containsObject:)];
- // since the set iterates in any order, compare as sets
- NSSet *filteredValues = [NSSet setWithArray:[e allObjects]];
- NSSet *expectedValues = [NSSet setWithObjects:@"2", @"4", nil];
- STAssertEqualObjects(filteredValues, expectedValues, @"");
-
- // test an empty set
- NSSet *empty = [NSSet set];
- e = [[empty objectEnumerator]
- gtm_filteredEnumeratorByTarget:target
- performOnEachSelector:@selector(containsObject:)];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-
- // test a set that will filter out
- NSSet *filterAway = [NSSet setWithObjects:@"bar", @"baz", nil];
- e = [[filterAway objectEnumerator]
- gtm_filteredEnumeratorByTarget:target
- performOnEachSelector:@selector(containsObject:)];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-}
-
-- (BOOL)is:(id)a equalTo:(id)b {
- return [a isEqual:b];
-}
-
-- (void)testFilteredEnumeratorByTargetPerformOnEachSelectorWithObject {
- // test w/ a set of strings
- NSSet *numbers = [NSSet setWithObjects:@"1", @"2", @"3", @"4", nil];
- NSEnumerator *e = [[numbers objectEnumerator]
- gtm_filteredEnumeratorByTarget:self
- performOnEachSelector:@selector(is:equalTo:)
- withObject:@"2"];
- // since the set iterates in any order, compare as sets
- NSSet *filteredValues = [NSSet setWithArray:[e allObjects]];
- NSSet *expectedValues = [NSSet setWithObjects:@"2", nil];
- STAssertEqualObjects(filteredValues, expectedValues, @"");
-
- // test an empty set
- NSSet *empty = [NSSet set];
- e = [[empty objectEnumerator]
- gtm_filteredEnumeratorByTarget:self
- performOnEachSelector:@selector(is:equalTo:)
- withObject:@"2"];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-
- // test a set that will filter out
- NSSet *filterAway = [NSSet setWithObjects:@"bar", @"baz", nil];
- e = [[filterAway objectEnumerator]
- gtm_filteredEnumeratorByTarget:self
- performOnEachSelector:@selector(is:equalTo:)
- withObject:@"2"];
- STAssertNil([e nextObject],
- @"shouldn't have gotten anything from first advance of "
- @"enumerator");
-}
-
-
-@end
diff --git a/Foundation/GTMNSFileHandle+UniqueNameTest.m b/Foundation/GTMNSFileHandle+UniqueNameTest.m
index 45cd8c7..0f0dc49 100644
--- a/Foundation/GTMNSFileHandle+UniqueNameTest.m
+++ b/Foundation/GTMNSFileHandle+UniqueNameTest.m
@@ -28,69 +28,63 @@
NSFileHandle *handle
= [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:nil
finalPath:nil];
- STAssertNil(handle, nil);
+ XCTAssertNil(handle);
// Try and create a file where we shouldn't be able to.
NSString *path = nil;
handle = [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:@"/System/HappyXXX.txt"
finalPath:&path];
- STAssertNil(handle, nil);
- STAssertNil(path, nil);
+ XCTAssertNil(handle);
+ XCTAssertNil(path);
NSFileManager *fm = [NSFileManager defaultManager];
NSString *tempDir
= [fm gtm_createTemporaryDirectoryBasedOn:@"GTMNSFileHandle_UniqueNameTestXXXXXX"];
- STAssertNotNil(tempDir, nil);
+ XCTAssertNotNil(tempDir);
BOOL isDirectory = NO;
- STAssertTrue([fm fileExistsAtPath:tempDir isDirectory:&isDirectory]
- && isDirectory, nil);
+ XCTAssertTrue([fm fileExistsAtPath:tempDir isDirectory:&isDirectory] && isDirectory);
// Test with extension
handle = [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:@"HappyXXX.txt"
inDirectory:tempDir
finalPath:&path];
- STAssertNotNil(handle, nil);
- STAssertEqualObjects([path pathExtension], @"txt", nil);
- STAssertTrue([fm fileExistsAtPath:path], nil);
+ XCTAssertNotNil(handle);
+ XCTAssertEqualObjects([path pathExtension], @"txt");
+ XCTAssertTrue([fm fileExistsAtPath:path]);
// Test without extension
handle = [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:@"HappyXXX"
inDirectory:tempDir
finalPath:&path];
- STAssertNotNil(handle, nil);
- STAssertEqualObjects([path pathExtension], @"", nil);
- STAssertTrue([fm fileExistsAtPath:path], nil);
+ XCTAssertNotNil(handle);
+ XCTAssertEqualObjects([path pathExtension], @"");
+ XCTAssertTrue([fm fileExistsAtPath:path]);
// Test passing in same name twice
NSString *fullPath = [tempDir stringByAppendingPathComponent:@"HappyXXX"];
NSString *newPath = nil;
handle = [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:fullPath
finalPath:&newPath];
- STAssertNotNil(handle, nil);
- STAssertNotNil(newPath, nil);
- STAssertNotEqualObjects(path, newPath, nil);
- STAssertTrue([fm fileExistsAtPath:newPath], nil);
+ XCTAssertNotNil(handle);
+ XCTAssertNotNil(newPath);
+ XCTAssertNotEqualObjects(path, newPath);
+ XCTAssertTrue([fm fileExistsAtPath:newPath]);
// Test passing in same name twice with no template
fullPath = [tempDir stringByAppendingPathComponent:@"Sad"];
newPath = nil;
handle = [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:fullPath
finalPath:&newPath];
- STAssertNotNil(handle, nil);
- STAssertNotNil(newPath, nil);
+ XCTAssertNotNil(handle);
+ XCTAssertNotNil(newPath);
newPath = nil;
handle = [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:fullPath
finalPath:&newPath];
- STAssertNil(handle, nil);
- STAssertNil(newPath, nil);
+ XCTAssertNil(handle);
+ XCTAssertNil(newPath);
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
- [fm removeFileAtPath:tempDir handler:nil];
-#else // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
[fm removeItemAtPath:tempDir error:nil];
-#endif
-
}
- (void)testFileHandleWithUniqueNameBasedOnInDirectorySearchMaskFinalPath {
@@ -101,21 +95,17 @@
inDirectory:NSCachesDirectory
domainMask:NSUserDomainMask
finalPath:&path];
- STAssertNil(handle, nil);
- STAssertNil(path, nil);
+ XCTAssertNil(handle);
+ XCTAssertNil(path);
handle = [NSFileHandle gtm_fileHandleWithUniqueNameBasedOn:@"HappyXXX.txt"
inDirectory:NSCachesDirectory
domainMask:NSUserDomainMask
finalPath:&path];
- STAssertNotNil(handle, nil);
- STAssertNotNil(path, nil);
- STAssertTrue([fm fileExistsAtPath:path], nil);
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
- [fm removeFileAtPath:path handler:nil];
-#else // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+ XCTAssertNotNil(handle);
+ XCTAssertNotNil(path);
+ XCTAssertTrue([fm fileExistsAtPath:path]);
[fm removeItemAtPath:path error:nil];
-#endif
}
@end
@@ -129,7 +119,7 @@
NSFileManager *fm = [NSFileManager defaultManager];
NSString *path
= [fm gtm_createDirectoryWithUniqueNameBasedOn:@"/System/HappyXXX.txt"];
- STAssertNil(path, nil);
+ XCTAssertNil(path);
}
- (void)testCreateDirectoryWithUniqueNameBasedOnInDirectorySearchMask {
@@ -137,20 +127,16 @@
NSString *path = [fm gtm_createDirectoryWithUniqueNameBasedOn:nil
inDirectory:NSCachesDirectory
domainMask:NSUserDomainMask];
- STAssertNil(path, nil);
+ XCTAssertNil(path);
path = [fm gtm_createDirectoryWithUniqueNameBasedOn:@"HappyXXX.txt"
inDirectory:NSCachesDirectory
domainMask:NSUserDomainMask];
- STAssertNotNil(path, nil);
+ XCTAssertNotNil(path);
BOOL isDirectory = NO;
- STAssertTrue([fm fileExistsAtPath:path isDirectory:&isDirectory]
- && isDirectory, nil);
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
- [fm removeFileAtPath:path handler:nil];
-#else // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
- [fm removeItemAtPath:path error:nil];
-#endif
+ XCTAssertTrue([fm fileExistsAtPath:path isDirectory:&isDirectory] && isDirectory);
+ NSError *error;
+ XCTAssertTrue([fm removeItemAtPath:path error:&error], "%@", error);
}
@end
diff --git a/Foundation/GTMNSFileManager+CarbonTest.m b/Foundation/GTMNSFileManager+CarbonTest.m
index 95f8814..f42ece4 100644
--- a/Foundation/GTMNSFileManager+CarbonTest.m
+++ b/Foundation/GTMNSFileManager+CarbonTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -18,62 +18,56 @@
#import "GTMSenTestCase.h"
#import "GTMNSFileManager+Carbon.h"
-#import "GTMUnitTestDevLog.h"
#import <CoreServices/CoreServices.h>
@interface GTMNSFileManager_CarbonTest : GTMTestCase
@end
-
+
@implementation GTMNSFileManager_CarbonTest
- (void)testAliasPathFSRefConversion {
NSString *path = NSHomeDirectory();
- STAssertNotNil(path, nil);
+ XCTAssertNotNil(path);
NSFileManager *fileManager = [NSFileManager defaultManager];
FSRef *fsRef = [fileManager gtm_FSRefForPath:path];
- STAssertNotNULL(fsRef, nil);
+ XCTAssertNotNULL(fsRef);
AliasHandle alias;
- STAssertNoErr(FSNewAlias(nil, fsRef, &alias), nil);
- STAssertNotNULL(alias, nil);
- NSData *aliasData = [NSData dataWithBytes:*alias
+ XCTAssertNoErr(FSNewAlias(nil, fsRef, &alias));
+ XCTAssertNotNULL(alias);
+ NSData *aliasData = [NSData dataWithBytes:*alias
length:GetAliasSize(alias)];
- STAssertNotNil(aliasData, nil);
+ XCTAssertNotNil(aliasData);
NSString *path2 = [fileManager gtm_pathFromAliasData:aliasData];
- STAssertEqualObjects(path, path2, nil);
+ XCTAssertEqualObjects(path, path2);
path2 = [fileManager gtm_pathFromAliasData:aliasData
resolve:YES
withUI:NO];
- STAssertEqualObjects(path, path2, nil);
-
+ XCTAssertEqualObjects(path, path2);
+
path2 = [fileManager gtm_pathFromAliasData:aliasData
resolve:NO
withUI:NO];
- STAssertEqualObjects(path, path2, nil);
+ XCTAssertEqualObjects(path, path2);
NSData *aliasData2 = [fileManager gtm_aliasDataForPath:path2];
- STAssertNotNil(aliasData2, nil);
+ XCTAssertNotNil(aliasData2);
NSString *path3 = [fileManager gtm_pathFromAliasData:aliasData2];
- STAssertEqualObjects(path2, path3, nil);
+ XCTAssertEqualObjects(path2, path3);
NSString *path4 = [fileManager gtm_pathFromFSRef:fsRef];
- STAssertEqualObjects(path, path4, nil);
-
+ XCTAssertEqualObjects(path, path4);
+
// Failure cases
- [GTMUnitTestDevLogDebug expectPattern:@"DebugAssert: "
- @"GoogleToolboxForMac: FSPathMakeRef.*"];
- STAssertNULL([fileManager gtm_FSRefForPath:@"/ptah/taht/dosent/esixt/"],
- nil);
+ XCTAssertNULL([fileManager gtm_FSRefForPath:@"/ptah/taht/dosent/esixt/"]);
+
+ XCTAssertNULL([fileManager gtm_FSRefForPath:@""]);
+ XCTAssertNULL([fileManager gtm_FSRefForPath:nil]);
+ XCTAssertNil([fileManager gtm_pathFromFSRef:nil]);
+ XCTAssertNil([fileManager gtm_pathFromAliasData:nil]);
+ XCTAssertNil([fileManager gtm_pathFromAliasData:[NSData data]]);
- STAssertNULL([fileManager gtm_FSRefForPath:@""], nil);
- STAssertNULL([fileManager gtm_FSRefForPath:nil], nil);
- STAssertNil([fileManager gtm_pathFromFSRef:nil], nil);
- STAssertNil([fileManager gtm_pathFromAliasData:nil], nil);
- STAssertNil([fileManager gtm_pathFromAliasData:[NSData data]], nil);
-
- [GTMUnitTestDevLogDebug expectPattern:@"DebugAssert: "
- @"GoogleToolboxForMac: FSPathMakeRef.*"];
- STAssertNil([fileManager gtm_aliasDataForPath:@"/ptah/taht/dosent/esixt/"], nil);
- STAssertNil([fileManager gtm_aliasDataForPath:@""], nil);
- STAssertNil([fileManager gtm_aliasDataForPath:nil], nil);
+ XCTAssertNil([fileManager gtm_aliasDataForPath:@"/ptah/taht/dosent/esixt/"]);
+ XCTAssertNil([fileManager gtm_aliasDataForPath:@""]);
+ XCTAssertNil([fileManager gtm_aliasDataForPath:nil]);
}
@end
diff --git a/Foundation/GTMNSFileManager+Path.h b/Foundation/GTMNSFileManager+Path.h
index 80977b3..eea55df 100644
--- a/Foundation/GTMNSFileManager+Path.h
+++ b/Foundation/GTMNSFileManager+Path.h
@@ -22,33 +22,6 @@
/// A few useful methods for dealing with paths.
@interface NSFileManager (GMFileManagerPathAdditions)
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-
-/// For the Unix-y at heart, this is "mkdir -p". It tries to create
-/// the directory specified by |path|, and any intervening directories that
-/// are needed. Each directory that is created is created with |attributes|
-/// (see other NSFileManager doco for the details on |attributes|).
-///
-/// If you are building for 10.5 or later, you should just use the new api:
-/// createDirectoryAtPath:withIntermediateDirectories:attributes:error:
-///
-/// Also if you need more control over the creation of paths and their
-/// attributes, look into using GTMPath.
-///
-/// Args:
-/// path - the path of the directory to create.
-/// attributes - these are defined in the "Constants" section of Apple's
-/// NSFileManager doco
-///
-/// Returns:
-/// YES if |path| exists or was able to be created successfully
-/// NO otherwise
-///
-- (BOOL)gtm_createFullPathToDirectory:(NSString *)path
- attributes:(NSDictionary *)attributes;
-
-#endif // GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-
/// Return an the paths for all resources in |directoryPath| that have the
/// |extension| file extension.
///
diff --git a/Foundation/GTMNSFileManager+Path.m b/Foundation/GTMNSFileManager+Path.m
index c29697b..165cee1 100644
--- a/Foundation/GTMNSFileManager+Path.m
+++ b/Foundation/GTMNSFileManager+Path.m
@@ -21,39 +21,6 @@
@implementation NSFileManager (GMFileManagerPathAdditions)
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-
-- (BOOL)gtm_createFullPathToDirectory:(NSString *)path
- attributes:(NSDictionary *)attributes {
- if (!path) return NO;
-
- BOOL isDir;
- BOOL exists = [self fileExistsAtPath:path isDirectory:&isDir];
-
- // Quick check for the case where we have nothing to do.
- if (exists && isDir)
- return YES;
-
- NSString *actualPath = @"/";
- NSString *directory;
-
- GTM_FOREACH_OBJECT(directory, [path pathComponents]) {
- actualPath = [actualPath stringByAppendingPathComponent:directory];
-
- if ([self fileExistsAtPath:actualPath isDirectory:&isDir] && isDir) {
- continue;
- } else if ([self createDirectoryAtPath:actualPath attributes:attributes]) {
- continue;
- } else {
- return NO;
- }
- }
-
- return YES;
-}
-
-#endif // GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-
- (NSArray *)gtm_filePathsWithExtension:(NSString *)extension
inDirectory:(NSString *)directoryPath {
NSArray *extensions = nil;
@@ -73,12 +40,9 @@
}
// |basenames| will contain only the matching file names, not their full paths.
-#if GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
NSArray *basenames = [self contentsOfDirectoryAtPath:directoryPath
error:nil];
-#else
- NSArray *basenames = [self directoryContentsAtPath:directoryPath];
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+
// Check if dir doesn't exist or couldn't be opened.
if (!basenames) {
@@ -94,7 +58,7 @@
NSString *basename;
// Convert all the |basenames| to full paths.
- GTM_FOREACH_OBJECT(basename, basenames) {
+ for (basename in basenames) {
NSString *fullPath = [directoryPath stringByAppendingPathComponent:basename];
[paths addObject:fullPath];
}
diff --git a/Foundation/GTMNSFileManager+PathTest.m b/Foundation/GTMNSFileManager+PathTest.m
index 749c151..a0f61fb 100644
--- a/Foundation/GTMNSFileManager+PathTest.m
+++ b/Foundation/GTMNSFileManager+PathTest.m
@@ -39,53 +39,17 @@
if (baseDir_) {
// clean up our directory
NSFileManager *fm = [NSFileManager defaultManager];
-#if GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
NSError *error = nil;
[fm removeItemAtPath:baseDir_ error:&error];
- STAssertNil(error,
- @"Unable to delete %@: %@", baseDir_, error);
-#else
- [fm removeFileAtPath:baseDir_ handler:nil];
-#endif
+ XCTAssertNil(error, @"Unable to delete %@: %@", baseDir_, error);
[baseDir_ release];
baseDir_ = nil;
}
}
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-
-- (void)testCreateFullPathToDirectoryAttributes {
- STAssertNotNil(baseDir_, @"setUp failed");
-
- NSString *testPath =
- [baseDir_ stringByAppendingPathComponent:@"/foo/bar/baz"];
- STAssertNotNil(testPath, nil);
- NSFileManager *fm = [NSFileManager defaultManager];
-
- STAssertFalse([fm fileExistsAtPath:testPath],
- @"You must delete '%@' before running this test", testPath);
-
- STAssertFalse([fm gtm_createFullPathToDirectory:nil attributes:nil],
- @"didn't fail on nil input");
-
- STAssertTrue([fm gtm_createFullPathToDirectory:testPath attributes:nil],
- @"Failed to create nested testPath");
- STAssertTrue([fm gtm_createFullPathToDirectory:testPath attributes:nil],
- @"Failed to succeed on second create of testPath");
-
- NSString *pathToFail = [@"/etc" stringByAppendingPathComponent:testPath];
- STAssertFalse([fm gtm_createFullPathToDirectory:pathToFail attributes:nil],
- @"We were allowed to create a dir in '/etc'?!");
-
- STAssertFalse([fm gtm_createFullPathToDirectory:nil attributes:nil],
- @"Should have failed when passed (nil)");
-}
-
-#endif // GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-
- (void)testfilePathsWithExtensionsInDirectory {
- STAssertNotNil(baseDir_, @"setUp failed");
+ XCTAssertNotNil(baseDir_, @"setUp failed");
NSFileManager *fm = [NSFileManager defaultManager];
NSString *bogusPath = @"/some/place/that/does/not/exist";
@@ -94,23 +58,23 @@
// test fail cases first
// single
- STAssertNil([fm gtm_filePathsWithExtension:nil inDirectory:nil],
- @"shouldn't have gotten anything for nil dir");
- STAssertNil([fm gtm_filePathsWithExtension:@"txt" inDirectory:nil],
- @"shouldn't have gotten anything for nil dir");
- STAssertNil([fm gtm_filePathsWithExtension:@"txt" inDirectory:bogusPath],
- @"shouldn't have gotten anything for a bogus dir");
+ XCTAssertNil([fm gtm_filePathsWithExtension:nil inDirectory:nil],
+ @"shouldn't have gotten anything for nil dir");
+ XCTAssertNil([fm gtm_filePathsWithExtension:@"txt" inDirectory:nil],
+ @"shouldn't have gotten anything for nil dir");
+ XCTAssertNil([fm gtm_filePathsWithExtension:@"txt" inDirectory:bogusPath],
+ @"shouldn't have gotten anything for a bogus dir");
// array
- STAssertNil([fm gtm_filePathsWithExtensions:nil inDirectory:nil],
- @"shouldn't have gotten anything for nil dir");
- STAssertNil([fm gtm_filePathsWithExtensions:[NSArray array] inDirectory:nil],
- @"shouldn't have gotten anything for nil dir");
- STAssertNil([fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"]
- inDirectory:nil],
- @"shouldn't have gotten anything for nil dir");
- STAssertNil([fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"]
- inDirectory:bogusPath],
- @"shouldn't have gotten anything for a bogus dir");
+ XCTAssertNil([fm gtm_filePathsWithExtensions:nil inDirectory:nil],
+ @"shouldn't have gotten anything for nil dir");
+ XCTAssertNil([fm gtm_filePathsWithExtensions:[NSArray array] inDirectory:nil],
+ @"shouldn't have gotten anything for nil dir");
+ XCTAssertNil([fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"]
+ inDirectory:nil],
+ @"shouldn't have gotten anything for nil dir");
+ XCTAssertNil([fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"]
+ inDirectory:bogusPath],
+ @"shouldn't have gotten anything for a bogus dir");
// --------------------------------------------------------------------------
// create some test data
@@ -126,26 +90,22 @@
NSString *testDir = nil;
if ([testDirs[i] length]) {
testDir = [baseDir_ stringByAppendingPathComponent:testDirs[i]];
-#if GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
NSError *error = nil;
- STAssertTrue([fm createDirectoryAtPath:testDir
- withIntermediateDirectories:YES
- attributes:nil
- error:&error],
- @"Can't create %@ (%@)", testDir, error);
-#else
- STAssertTrue([fm createDirectoryAtPath:testDir attributes:nil], nil);
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+ XCTAssertTrue([fm createDirectoryAtPath:testDir
+ withIntermediateDirectories:YES
+ attributes:nil
+ error:&error],
+ @"Can't create %@ (%@)", testDir, error);
} else {
testDir = baseDir_;
}
for (size_t j = 0; j < sizeof(testFiles) / sizeof(NSString*); j++) {
NSString *testFile = [testDir stringByAppendingPathComponent:testFiles[j]];
NSError *err = nil;
- STAssertTrue([@"test" writeToFile:testFile
- atomically:YES
- encoding:NSUTF8StringEncoding
- error:&err], @"Error: %@", err);
+ XCTAssertTrue([@"test" writeToFile:testFile
+ atomically:YES
+ encoding:NSUTF8StringEncoding
+ error:&err], @"Error: %@", err);
}
}
@@ -173,23 +133,23 @@
// single
matches = [fm gtm_filePathsWithExtension:nil inDirectory:baseDir_];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:allFiles],
- @"didn't get all files for nil extension");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:allFiles],
+ @"didn't get all files for nil extension");
matches = [fm gtm_filePathsWithExtension:@"" inDirectory:baseDir_];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:allFiles],
- @"didn't get all files for nil extension");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:allFiles],
+ @"didn't get all files for nil extension");
// array
matches = [fm gtm_filePathsWithExtensions:nil inDirectory:baseDir_];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:allFiles],
- @"didn't get all files for nil extension");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:allFiles],
+ @"didn't get all files for nil extension");
matches = [fm gtm_filePathsWithExtensions:[NSArray array]
inDirectory:baseDir_];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:allFiles],
- @"didn't get all files for nil extension");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:allFiles],
+ @"didn't get all files for nil extension");
// --------------------------------------------------------------------------
// test match something
@@ -198,21 +158,21 @@
extensions = [NSArray arrayWithObject:@"txt"];
matches = [fm gtm_filePathsWithExtension:@"txt" inDirectory:baseDir_];
expectedMatches = [allFiles pathsMatchingExtensions:extensions];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:expectedMatches],
- @"didn't get expected files");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:expectedMatches],
+ @"didn't get expected files");
// array
matches = [fm gtm_filePathsWithExtensions:extensions inDirectory:baseDir_];
expectedMatches = [allFiles pathsMatchingExtensions:extensions];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:expectedMatches],
- @"didn't get expected files");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:expectedMatches],
+ @"didn't get expected files");
extensions = [NSArray arrayWithObjects:@"txt", @"rtf", @"xyz", nil];
matches = [fm gtm_filePathsWithExtensions:extensions inDirectory:baseDir_];
expectedMatches = [allFiles pathsMatchingExtensions:extensions];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:expectedMatches],
- @"didn't get expected files");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:expectedMatches],
+ @"didn't get expected files");
// --------------------------------------------------------------------------
// test match nothing
@@ -221,43 +181,37 @@
extensions = [NSArray arrayWithObject:@"xyz"];
matches = [fm gtm_filePathsWithExtension:@"xyz" inDirectory:baseDir_];
expectedMatches = [allFiles pathsMatchingExtensions:extensions];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:expectedMatches],
- @"didn't get expected files");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:expectedMatches],
+ @"didn't get expected files");
// array
matches = [fm gtm_filePathsWithExtensions:extensions inDirectory:baseDir_];
expectedMatches = [allFiles pathsMatchingExtensions:extensions];
- STAssertEqualObjects([NSSet setWithArray:matches],
- [NSSet setWithArray:expectedMatches],
- @"didn't get expected files");
+ XCTAssertEqualObjects([NSSet setWithArray:matches],
+ [NSSet setWithArray:expectedMatches],
+ @"didn't get expected files");
// --------------------------------------------------------------------------
// test match an empty dir
// create the empty dir
NSString *emptyDir = [baseDir_ stringByAppendingPathComponent:@"emptyDir"];
-#if GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
NSError *error = nil;
- STAssertTrue([fm createDirectoryAtPath:emptyDir
- withIntermediateDirectories:YES
- attributes:nil
- error:&error],
- @"Can't create %@ (%@)", emptyDir, error);
-#else
- STAssertTrue([fm createDirectoryAtPath:emptyDir attributes:nil], nil);
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
-
+ XCTAssertTrue([fm createDirectoryAtPath:emptyDir
+ withIntermediateDirectories:YES
+ attributes:nil
+ error:&error],
+ @"Can't create %@ (%@)", emptyDir, error);
// single
matches = [fm gtm_filePathsWithExtension:@"txt" inDirectory:emptyDir];
- STAssertEqualObjects([NSSet setWithArray:matches], [NSSet set],
- @"expected empty dir");
+ XCTAssertEqualObjects([NSSet setWithArray:matches], [NSSet set],
+ @"expected empty dir");
// array
matches = [fm gtm_filePathsWithExtensions:[NSArray arrayWithObject:@"txt"]
inDirectory:emptyDir];
- STAssertEqualObjects([NSSet setWithArray:matches], [NSSet set],
- @"expected empty dir");
-
+ XCTAssertEqualObjects([NSSet setWithArray:matches], [NSSet set],
+ @"expected empty dir");
}
@end
diff --git a/Foundation/GTMNSObject+KeyValueObserving.m b/Foundation/GTMNSObject+KeyValueObserving.m
index c4a589d..45eb6fe 100644
--- a/Foundation/GTMNSObject+KeyValueObserving.m
+++ b/Foundation/GTMNSObject+KeyValueObserving.m
@@ -25,11 +25,13 @@
// This code is based on code by Michael Ash.
// See comment in header.
-#import "GTMDefines.h"
#import "GTMNSObject+KeyValueObserving.h"
+
+#import <libkern/OSAtomic.h>
+#include <objc/runtime.h>
+
#import "GTMDefines.h"
#import "GTMDebugSelectorValidation.h"
-#import "GTMObjC2Runtime.h"
#import "GTMMethodCheck.h"
// A singleton that works as a dispatch center for KVO
@@ -172,9 +174,9 @@ static char* GTMKeyValueObservingHelperContext
// and the other will set things up so that the failing thread
// gets the shared center
GTMKeyValueObservingCenter *newCenter = [[self alloc] init];
- if(!objc_atomicCompareAndSwapGlobalBarrier(nil,
- newCenter,
- (void *)&center)) {
+ if(!OSAtomicCompareAndSwapPtrBarrier(NULL,
+ newCenter,
+ (void *)&center)) {
[newCenter release]; // COV_NF_LINE no guarantee we'll hit this line
}
}
@@ -252,7 +254,7 @@ static char* GTMKeyValueObservingHelperContext
@synchronized(self) {
NSString *helperKey;
- GTM_FOREACH_OBJECT(helperKey, [observerHelpers_ allKeys]) {
+ for (helperKey in [observerHelpers_ allKeys]) {
if ([helperKey hasPrefix:key]) {
[allValidHelperKeys addObject:helperKey];
}
diff --git a/Foundation/GTMNSObject+KeyValueObservingTest.m b/Foundation/GTMNSObject+KeyValueObservingTest.m
index 43a1bba..66ae799 100644
--- a/Foundation/GTMNSObject+KeyValueObservingTest.m
+++ b/Foundation/GTMNSObject+KeyValueObservingTest.m
@@ -29,7 +29,6 @@
#import "GTMSenTestCase.h"
#import "GTMNSObject+KeyValueObserving.h"
#import "GTMDefines.h"
-#import "GTMUnitTestDevLog.h"
@interface GTMNSObject_KeyValueObservingTest : GTMTestCase {
int32_t count_;
@@ -61,12 +60,12 @@
options:NSKeyValueObservingOptionNew];
expectedValue_ = @"bar";
[dict_ setObject:expectedValue_ forKey:@"key"];
- STAssertEquals(count_, (int32_t)1, nil);
+ XCTAssertEqual(count_, (int32_t)1);
[dict_ gtm_removeObserver:self
forKeyPath:@"key"
selector:@selector(observeValueChange:)];
[dict_ setObject:@"foo" forKey:@"key"];
- STAssertEquals(count_, (int32_t)1, nil);
+ XCTAssertEqual(count_, (int32_t)1);
}
- (void)testStopObservingAllKeyPaths {
@@ -78,17 +77,14 @@
options:NSKeyValueObservingOptionNew];
expectedValue_ = @"bar";
[dict_ setObject:expectedValue_ forKey:@"key"];
- STAssertEquals(count_, (int32_t)1, nil);
+ XCTAssertEqual(count_, (int32_t)1);
[self gtm_stopObservingAllKeyPaths];
[dict_ setObject:@"foo" forKey:@"key"];
- STAssertEquals(count_, (int32_t)1, nil);
+ XCTAssertEqual(count_, (int32_t)1);
}
- (void)testRemoving {
- [GTMUnitTestDevLogDebug expectPattern:@"-\\[GTMNSObject_KeyValueObservingTest"
- @" testRemoving\\] was not observing.*"];
-
[dict_ gtm_removeObserver:self
forKeyPath:@"key"
selector:@selector(observeValueChange:)];
@@ -100,8 +96,6 @@
selector:@selector(observeValueChange:)
userInfo:@"userInfo"
options:NSKeyValueObservingOptionNew];
- [GTMUnitTestDevLog expectPattern:@"-\\[GTMNSObject_KeyValueObservingTest"
- @" testAdding\\] already observing.*"];
[dict_ gtm_addObserver:self
forKeyPath:@"key"
selector:@selector(observeValueChange:)
@@ -113,17 +107,17 @@
}
- (void)observeValueChange:(GTMKeyValueChangeNotification *)notification {
- STAssertEqualObjects([notification userInfo], @"userInfo", nil);
- STAssertEqualObjects([notification keyPath], @"key", nil);
- STAssertEqualObjects([notification object], dict_, nil);
+ XCTAssertEqualObjects([notification userInfo], @"userInfo");
+ XCTAssertEqualObjects([notification keyPath], @"key");
+ XCTAssertEqualObjects([notification object], dict_);
NSDictionary *change = [notification change];
NSString *value = [change objectForKey:NSKeyValueChangeNewKey];
- STAssertEqualObjects(value, expectedValue_, nil);
+ XCTAssertEqualObjects(value, expectedValue_);
++count_;
GTMKeyValueChangeNotification *copy = [[notification copy] autorelease];
- STAssertEqualObjects(notification, copy, nil);
- STAssertEquals([notification hash], [copy hash], nil);
+ XCTAssertEqualObjects(notification, copy);
+ XCTAssertEqual([notification hash], [copy hash]);
}
@end
diff --git a/Foundation/GTMNSScanner+JSON.m b/Foundation/GTMNSScanner+JSON.m
index 1216698..308eae2 100644
--- a/Foundation/GTMNSScanner+JSON.m
+++ b/Foundation/GTMNSScanner+JSON.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,10 +19,15 @@
#import "GTMDefines.h"
#import "GTMNSScanner+JSON.h"
+// Export a nonsense symbol to suppress a libtool warning when this is linked
+// alone in a static lib.
+__attribute__((visibility("default")))
+ char NSScanner_GTMNSScannerJSONAdditionsExportToSuppressLibToolWarning = 0;
+
@implementation NSScanner (GTMNSScannerJSONAdditions)
-- (BOOL)gtm_scanJSONString:(NSString **)jsonString
- startChar:(unichar)startChar
+- (BOOL)gtm_scanJSONString:(NSString **)jsonString
+ startChar:(unichar)startChar
endChar:(unichar)endChar {
BOOL isGood = NO;
NSRange jsonRange = { NSNotFound, 0 };
@@ -73,11 +78,11 @@
}
- (BOOL)gtm_scanJSONObjectString:(NSString **)jsonString {
- return [self gtm_scanJSONString:jsonString startChar:'{' endChar:'}'];
+ return [self gtm_scanJSONString:jsonString startChar:'{' endChar:'}'];
}
- (BOOL)gtm_scanJSONArrayString:(NSString**)jsonString {
- return [self gtm_scanJSONString:jsonString startChar:'[' endChar:']'];
+ return [self gtm_scanJSONString:jsonString startChar:'[' endChar:']'];
}
@end
diff --git a/Foundation/GTMNSScanner+JSONTest.m b/Foundation/GTMNSScanner+JSONTest.m
index 8085148..d78f41d 100644
--- a/Foundation/GTMNSScanner+JSONTest.m
+++ b/Foundation/GTMNSScanner+JSONTest.m
@@ -86,27 +86,27 @@ struct {
BOOL goodObject = [scanner gtm_scanJSONObjectString:&object];
if (testStrings[i].resultString_) {
if (testStrings[i].isObject_) {
- STAssertEqualStrings(testStrings[i].resultString_,
- object, @"Test String: %@",
- testStrings[i].testString_);
- STAssertNil(array, @"Test String: %@", testStrings[i].testString_);
- STAssertTrue(goodObject, @"Test String: %@",
- testStrings[i].testString_);
- STAssertFalse(goodArray, @"Test String: %@",
+ XCTAssertEqualStrings(testStrings[i].resultString_,
+ object, @"Test String: %@",
+ testStrings[i].testString_);
+ XCTAssertNil(array, @"Test String: %@", testStrings[i].testString_);
+ XCTAssertTrue(goodObject, @"Test String: %@",
testStrings[i].testString_);
+ XCTAssertFalse(goodArray, @"Test String: %@",
+ testStrings[i].testString_);
} else {
- STAssertEqualStrings(testStrings[i].resultString_, array,
- @"Test String: %@", testStrings[i].testString_);
- STAssertNil(object, @"Test String: %@", testStrings[i].testString_);
- STAssertTrue(goodArray, @"Test String: %@", testStrings[i].testString_);
- STAssertFalse(goodObject, @"Test String: %@",
- testStrings[i].testString_);
+ XCTAssertEqualStrings(testStrings[i].resultString_, array,
+ @"Test String: %@", testStrings[i].testString_);
+ XCTAssertNil(object, @"Test String: %@", testStrings[i].testString_);
+ XCTAssertTrue(goodArray, @"Test String: %@", testStrings[i].testString_);
+ XCTAssertFalse(goodObject, @"Test String: %@",
+ testStrings[i].testString_);
}
} else {
- STAssertNil(object, @"Test String: %@", testStrings[i].testString_);
- STAssertNil(array, @"Test String: %@", testStrings[i].testString_);
- STAssertFalse(goodArray, @"Test String: %@", testStrings[i].testString_);
- STAssertFalse(goodObject, @"Test String: %@", testStrings[i].testString_);
+ XCTAssertNil(object, @"Test String: %@", testStrings[i].testString_);
+ XCTAssertNil(array, @"Test String: %@", testStrings[i].testString_);
+ XCTAssertFalse(goodArray, @"Test String: %@", testStrings[i].testString_);
+ XCTAssertFalse(goodObject, @"Test String: %@", testStrings[i].testString_);
}
}
}
@@ -117,13 +117,13 @@ struct {
NSScanner *scanner = [NSScanner scannerWithString:testString];
[scanner setCharactersToBeSkipped:alphaSet];
NSString *array = nil;
- STAssertTrue([scanner gtm_scanJSONArrayString:&array], nil);
- STAssertEqualStrings(array, @"[]", nil);
+ XCTAssertTrue([scanner gtm_scanJSONArrayString:&array]);
+ XCTAssertEqualStrings(array, @"[]");
NSString *nextValue = nil;
- STAssertTrue([scanner scanString:@":," intoString:&nextValue], nil);
- STAssertEqualStrings(@":,", nextValue, nil);
+ XCTAssertTrue([scanner scanString:@":," intoString:&nextValue]);
+ XCTAssertEqualStrings(@":,", nextValue);
scanner = [NSScanner scannerWithString:testString];
- STAssertFalse([scanner gtm_scanJSONArrayString:&array], nil);
+ XCTAssertFalse([scanner gtm_scanJSONArrayString:&array]);
}
@end
diff --git a/Foundation/GTMNSScanner+Unsigned.h b/Foundation/GTMNSScanner+Unsigned.h
deleted file mode 100644
index 80fdcc4..0000000
--- a/Foundation/GTMNSScanner+Unsigned.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// GTMNSScanner+Unsigned.h
-//
-// Copyright 2010 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-
-#import "GTMDefines.h"
-
-// Adds support for working with unsigned values. Unsigned values are digits
-// only [0-9]. There is no support for "+" or "-" signs. Overflow is handled
-// by returning "YES" and the maximum value allowed for the type.
-@interface NSScanner (GTMUnsignedAdditions)
-
-- (BOOL)gtm_scanUnsignedInt:(unsigned int *)value;
-- (BOOL)gtm_scanUInteger:(NSUInteger *)value;
-- (BOOL)gtm_scanUnsignedLongLong:(unsigned long long *)value;
-
-@end
diff --git a/Foundation/GTMNSScanner+Unsigned.m b/Foundation/GTMNSScanner+Unsigned.m
deleted file mode 100644
index 9228ba2..0000000
--- a/Foundation/GTMNSScanner+Unsigned.m
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// GTMNSScanner+Unsigned.m
-//
-// Copyright 2010 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMNSScanner+Unsigned.h"
-#include <stdlib.h>
-#include <limits.h>
-
-@implementation NSScanner (GTMUnsignedAdditions)
-
-- (BOOL)gtm_scanUnsignedInt:(unsigned int *)value {
- unsigned long long uLongLongValue = 0;
- BOOL wasGood = [self gtm_scanUnsignedLongLong:&uLongLongValue];
- if (wasGood && value) {
- if (uLongLongValue > UINT_MAX) {
- *value = UINT_MAX;
- } else {
- *value = (unsigned int)uLongLongValue;
- }
- }
- return wasGood;
-}
-
-- (BOOL)gtm_scanUInteger:(NSUInteger *)value {
-#if defined(__LP64__) && __LP64__
- return [self gtm_scanUnsignedLongLong:(unsigned long long*)value];
-#else
- return [self gtm_scanUnsignedInt:value];
-#endif // defined(__LP64__) && __LP64__
-}
-
-- (BOOL)gtm_scanUnsignedLongLong:(unsigned long long *)value {
- // Slow path
- NSCharacterSet *decimalSet = [NSCharacterSet decimalDigitCharacterSet];
- NSString *digitString = nil;
- BOOL wasGood = [self scanCharactersFromSet:decimalSet intoString:&digitString];
- if (wasGood) {
- const char *digitChars = [digitString UTF8String];
- if (value) {
- *value = strtoull(digitChars, NULL, 10);
- }
- }
- return wasGood;
-}
-
-@end
diff --git a/Foundation/GTMNSScanner+UnsignedTest.m b/Foundation/GTMNSScanner+UnsignedTest.m
deleted file mode 100644
index aab92f3..0000000
--- a/Foundation/GTMNSScanner+UnsignedTest.m
+++ /dev/null
@@ -1,116 +0,0 @@
-//
-// GTMNSScanner+UnsignedTest.m
-//
-// Copyright 2010 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMNSScanner+Unsigned.h"
-
-@interface GTMNSScanner_UnsignedTest : GTMTestCase
-@end
-
-@implementation GTMNSScanner_UnsignedTest
-
-#define TEST_BLOCK(A_MAX_VALUE) \
- { @"-1", 0, NO, 0 }, \
- { @"- 1", 0, NO, 0 }, \
- { @" - 1", 0, NO, 0 }, \
- { @"+ 1", 1, NO, 0 }, \
- { @" + 1", 1, NO, 0 }, \
- { @"0", 0, YES, 1 }, \
- { @"a", 0, NO, 0 }, \
- { @" ", 0, NO, 0 }, \
- { @"-1a", 0, NO, 0 }, \
- { @"a1", 0, NO, 0 }, \
- { @"1 ", 1, YES, 1 }, \
- { @"2 1 ", 2, YES, 1 }, \
- { @" 2 1 ", 2, YES, 2 }, \
- { @"99999999999999999999999999999999999", A_MAX_VALUE, YES, 35 }
-
-- (void)testScanUnsignedInt {
- struct {
- NSString *string;
- unsigned int val;
- BOOL goodScan;
- NSUInteger location;
- } testStruct[] = {
- TEST_BLOCK(UINT_MAX),
- };
- for (size_t i = 0; i < sizeof(testStruct) / sizeof(testStruct[0]); ++i) {
- NSScanner *scanner = [NSScanner scannerWithString:testStruct[i].string];
- STAssertNotNil(scanner, nil);
- unsigned int value;
- BOOL isGood = [scanner gtm_scanUnsignedInt:&value];
- STAssertEquals((int)isGood, (int)testStruct[i].goodScan,
- @"%@", testStruct[i].string);
- if (isGood && testStruct[i].goodScan) {
- STAssertEquals(value, testStruct[i].val, @"%@", testStruct[i].string);
- }
- STAssertEquals(testStruct[i].location, [scanner scanLocation],
- @"%@", testStruct[i].string);
- }
-}
-
-- (void)testScanUInteger {
- struct {
- NSString *string;
- NSUInteger val;
- BOOL goodScan;
- NSUInteger location;
- } testStruct[] = {
- TEST_BLOCK(NSUIntegerMax),
- };
- for (size_t i = 0; i < sizeof(testStruct) / sizeof(testStruct[0]); ++i) {
- NSScanner *scanner = [NSScanner scannerWithString:testStruct[i].string];
- STAssertNotNil(scanner, nil);
- NSUInteger value;
- BOOL isGood = [scanner gtm_scanUInteger:&value];
- STAssertEquals((int)isGood, (int)testStruct[i].goodScan,
- @"%@", testStruct[i].string);
- if (isGood && testStruct[i].goodScan) {
- STAssertEquals(value, testStruct[i].val, @"%@", testStruct[i].string);
- }
- STAssertEquals(testStruct[i].location, [scanner scanLocation],
- @"%@", testStruct[i].string);
- }
-}
-
-- (void)testScanUnsignedLongLong {
- struct {
- NSString *string;
- unsigned long long val;
- BOOL goodScan;
- NSUInteger location;
- } testStruct[] = {
- TEST_BLOCK(ULLONG_MAX),
- { @"4294967296", ((unsigned long long)UINT_MAX) + 1, YES, 10 }
- };
- for (size_t i = 0; i < sizeof(testStruct) / sizeof(testStruct[0]); ++i) {
- NSScanner *scanner = [NSScanner scannerWithString:testStruct[i].string];
- STAssertNotNil(scanner, nil);
- unsigned long long value;
- BOOL isGood = [scanner gtm_scanUnsignedLongLong:&value];
- STAssertEquals((int)isGood, (int)testStruct[i].goodScan,
- @"%@", testStruct[i].string);
- if (isGood && testStruct[i].goodScan) {
- STAssertEquals(value, testStruct[i].val, @"%@", testStruct[i].string);
- }
- STAssertEquals(testStruct[i].location, [scanner scanLocation],
- @"%@", testStruct[i].string);
- }
-}
-
-@end
diff --git a/Foundation/GTMNSString+FindFolderTest.m b/Foundation/GTMNSString+FindFolderTest.m
index aae48cb..2f53d76 100644
--- a/Foundation/GTMNSString+FindFolderTest.m
+++ b/Foundation/GTMNSString+FindFolderTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -32,20 +32,20 @@
inDomain:kUserDomain
doCreate:NO];
NSString *realPrefsPath = [@"~/Library/Preferences" stringByExpandingTildeInPath];
- STAssertEqualObjects(realPrefsPath, prefsPath, @"Found incorrect prefs path");
+ XCTAssertEqualObjects(realPrefsPath, prefsPath, @"Found incorrect prefs path");
+
-
// test the subfolder method; it should return nil if we pass NO and the
// subfolder doesn't already exist
-
+
NSString *googCacheNoCreatePath = [NSString gtm_stringWithPathForFolder:kCachedDataFolderType
subfolderName:@"GTMUnitTestDuzntExist"
inDomain:kUserDomain
doCreate:NO];
- STAssertNil(googCacheNoCreatePath, @"Should not exist: %@", googCacheNoCreatePath);
+ XCTAssertNil(googCacheNoCreatePath, @"Should not exist: %@", googCacheNoCreatePath);
// test creating ~/Library/Cache/GTMUnitTestCreated
-
+
NSString *folderName = @"GTMUnitTestCreated";
NSString *gtmCachePath = [NSString gtm_stringWithPathForFolder:kCachedDataFolderType
subfolderName:folderName
@@ -55,28 +55,28 @@
inDomain:kUserDomain
doCreate:NO];
NSString *testPathAppended = [testPath stringByAppendingPathComponent:folderName];
- STAssertEqualObjects(gtmCachePath, testPathAppended, @"Unexpected path name");
-
+ XCTAssertEqualObjects(gtmCachePath, testPathAppended, @"Unexpected path name");
+
NSFileManager* fileMgr = [NSFileManager defaultManager];
BOOL isDir = NO;
BOOL pathExists = [fileMgr fileExistsAtPath:gtmCachePath isDirectory:&isDir] && isDir;
- STAssertTrue(pathExists, @"Path %@ is not existing like it should", gtmCachePath);
+ XCTAssertTrue(pathExists, @"Path %@ is not existing like it should", gtmCachePath);
// test finding it again w/o having to create it
NSString *gtmCachePath2 = [NSString gtm_stringWithPathForFolder:kCachedDataFolderType
subfolderName:folderName
inDomain:kUserDomain
doCreate:NO];
- STAssertEqualObjects(gtmCachePath2, gtmCachePath, nil);
-
+ XCTAssertEqualObjects(gtmCachePath2, gtmCachePath);
+
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
NSError *error = nil;
BOOL didRemove = [fileMgr removeItemAtPath:gtmCachePath error:&error];
- STAssertTrue(didRemove, @"Error removing %@ (%@)", gtmCachePath, error);
+ XCTAssertTrue(didRemove, @"Error removing %@ (%@)", gtmCachePath, error);
#else
BOOL didRemove = [fileMgr removeFileAtPath:gtmCachePath
handler:nil];
- STAssertTrue(didRemove, @"Error removing %@", gtmCachePath);
+ XCTAssertTrue(didRemove, @"Error removing %@", gtmCachePath);
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
}
diff --git a/Foundation/GTMNSString+HTML.m b/Foundation/GTMNSString+HTML.m
index d580b9e..04ec23a 100644
--- a/Foundation/GTMNSString+HTML.m
+++ b/Foundation/GTMNSString+HTML.m
@@ -7,9 +7,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,6 +20,11 @@
#import "GTMDefines.h"
#import "GTMNSString+HTML.h"
+// Export a nonsense symbol to suppress a libtool warning when this is linked
+// alone in a static lib.
+__attribute__((visibility("default")))
+ char GTMNSString_HTMLExportToSuppressLibToolWarning = 0;
+
typedef struct {
NSString *escapeSequence;
unichar uchar;
@@ -34,105 +39,105 @@ static HTMLEscapeMap gAsciiHTMLEscapeMap[] = {
{ @"&apos;", 39 },
{ @"&lt;", 60 },
{ @"&gt;", 62 },
-
+
// A.2.1. Latin-1 characters
- { @"&nbsp;", 160 },
- { @"&iexcl;", 161 },
- { @"&cent;", 162 },
- { @"&pound;", 163 },
- { @"&curren;", 164 },
- { @"&yen;", 165 },
- { @"&brvbar;", 166 },
- { @"&sect;", 167 },
- { @"&uml;", 168 },
- { @"&copy;", 169 },
- { @"&ordf;", 170 },
- { @"&laquo;", 171 },
- { @"&not;", 172 },
- { @"&shy;", 173 },
- { @"&reg;", 174 },
- { @"&macr;", 175 },
- { @"&deg;", 176 },
- { @"&plusmn;", 177 },
- { @"&sup2;", 178 },
- { @"&sup3;", 179 },
- { @"&acute;", 180 },
- { @"&micro;", 181 },
- { @"&para;", 182 },
- { @"&middot;", 183 },
- { @"&cedil;", 184 },
- { @"&sup1;", 185 },
- { @"&ordm;", 186 },
- { @"&raquo;", 187 },
- { @"&frac14;", 188 },
- { @"&frac12;", 189 },
- { @"&frac34;", 190 },
- { @"&iquest;", 191 },
- { @"&Agrave;", 192 },
- { @"&Aacute;", 193 },
- { @"&Acirc;", 194 },
- { @"&Atilde;", 195 },
- { @"&Auml;", 196 },
- { @"&Aring;", 197 },
- { @"&AElig;", 198 },
- { @"&Ccedil;", 199 },
- { @"&Egrave;", 200 },
- { @"&Eacute;", 201 },
- { @"&Ecirc;", 202 },
- { @"&Euml;", 203 },
- { @"&Igrave;", 204 },
- { @"&Iacute;", 205 },
- { @"&Icirc;", 206 },
- { @"&Iuml;", 207 },
- { @"&ETH;", 208 },
- { @"&Ntilde;", 209 },
- { @"&Ograve;", 210 },
- { @"&Oacute;", 211 },
- { @"&Ocirc;", 212 },
- { @"&Otilde;", 213 },
- { @"&Ouml;", 214 },
- { @"&times;", 215 },
- { @"&Oslash;", 216 },
- { @"&Ugrave;", 217 },
- { @"&Uacute;", 218 },
- { @"&Ucirc;", 219 },
- { @"&Uuml;", 220 },
- { @"&Yacute;", 221 },
- { @"&THORN;", 222 },
- { @"&szlig;", 223 },
- { @"&agrave;", 224 },
- { @"&aacute;", 225 },
- { @"&acirc;", 226 },
- { @"&atilde;", 227 },
- { @"&auml;", 228 },
- { @"&aring;", 229 },
- { @"&aelig;", 230 },
- { @"&ccedil;", 231 },
- { @"&egrave;", 232 },
- { @"&eacute;", 233 },
- { @"&ecirc;", 234 },
- { @"&euml;", 235 },
- { @"&igrave;", 236 },
- { @"&iacute;", 237 },
- { @"&icirc;", 238 },
- { @"&iuml;", 239 },
- { @"&eth;", 240 },
- { @"&ntilde;", 241 },
- { @"&ograve;", 242 },
- { @"&oacute;", 243 },
- { @"&ocirc;", 244 },
- { @"&otilde;", 245 },
- { @"&ouml;", 246 },
- { @"&divide;", 247 },
- { @"&oslash;", 248 },
- { @"&ugrave;", 249 },
- { @"&uacute;", 250 },
- { @"&ucirc;", 251 },
- { @"&uuml;", 252 },
- { @"&yacute;", 253 },
- { @"&thorn;", 254 },
+ { @"&nbsp;", 160 },
+ { @"&iexcl;", 161 },
+ { @"&cent;", 162 },
+ { @"&pound;", 163 },
+ { @"&curren;", 164 },
+ { @"&yen;", 165 },
+ { @"&brvbar;", 166 },
+ { @"&sect;", 167 },
+ { @"&uml;", 168 },
+ { @"&copy;", 169 },
+ { @"&ordf;", 170 },
+ { @"&laquo;", 171 },
+ { @"&not;", 172 },
+ { @"&shy;", 173 },
+ { @"&reg;", 174 },
+ { @"&macr;", 175 },
+ { @"&deg;", 176 },
+ { @"&plusmn;", 177 },
+ { @"&sup2;", 178 },
+ { @"&sup3;", 179 },
+ { @"&acute;", 180 },
+ { @"&micro;", 181 },
+ { @"&para;", 182 },
+ { @"&middot;", 183 },
+ { @"&cedil;", 184 },
+ { @"&sup1;", 185 },
+ { @"&ordm;", 186 },
+ { @"&raquo;", 187 },
+ { @"&frac14;", 188 },
+ { @"&frac12;", 189 },
+ { @"&frac34;", 190 },
+ { @"&iquest;", 191 },
+ { @"&Agrave;", 192 },
+ { @"&Aacute;", 193 },
+ { @"&Acirc;", 194 },
+ { @"&Atilde;", 195 },
+ { @"&Auml;", 196 },
+ { @"&Aring;", 197 },
+ { @"&AElig;", 198 },
+ { @"&Ccedil;", 199 },
+ { @"&Egrave;", 200 },
+ { @"&Eacute;", 201 },
+ { @"&Ecirc;", 202 },
+ { @"&Euml;", 203 },
+ { @"&Igrave;", 204 },
+ { @"&Iacute;", 205 },
+ { @"&Icirc;", 206 },
+ { @"&Iuml;", 207 },
+ { @"&ETH;", 208 },
+ { @"&Ntilde;", 209 },
+ { @"&Ograve;", 210 },
+ { @"&Oacute;", 211 },
+ { @"&Ocirc;", 212 },
+ { @"&Otilde;", 213 },
+ { @"&Ouml;", 214 },
+ { @"&times;", 215 },
+ { @"&Oslash;", 216 },
+ { @"&Ugrave;", 217 },
+ { @"&Uacute;", 218 },
+ { @"&Ucirc;", 219 },
+ { @"&Uuml;", 220 },
+ { @"&Yacute;", 221 },
+ { @"&THORN;", 222 },
+ { @"&szlig;", 223 },
+ { @"&agrave;", 224 },
+ { @"&aacute;", 225 },
+ { @"&acirc;", 226 },
+ { @"&atilde;", 227 },
+ { @"&auml;", 228 },
+ { @"&aring;", 229 },
+ { @"&aelig;", 230 },
+ { @"&ccedil;", 231 },
+ { @"&egrave;", 232 },
+ { @"&eacute;", 233 },
+ { @"&ecirc;", 234 },
+ { @"&euml;", 235 },
+ { @"&igrave;", 236 },
+ { @"&iacute;", 237 },
+ { @"&icirc;", 238 },
+ { @"&iuml;", 239 },
+ { @"&eth;", 240 },
+ { @"&ntilde;", 241 },
+ { @"&ograve;", 242 },
+ { @"&oacute;", 243 },
+ { @"&ocirc;", 244 },
+ { @"&otilde;", 245 },
+ { @"&ouml;", 246 },
+ { @"&divide;", 247 },
+ { @"&oslash;", 248 },
+ { @"&ugrave;", 249 },
+ { @"&uacute;", 250 },
+ { @"&ucirc;", 251 },
+ { @"&uuml;", 252 },
+ { @"&yacute;", 253 },
+ { @"&thorn;", 254 },
{ @"&yuml;", 255 },
-
+
// A.2.2. Special characters cont'd
{ @"&OElig;", 338 },
{ @"&oelig;", 339 },
@@ -141,66 +146,66 @@ static HTMLEscapeMap gAsciiHTMLEscapeMap[] = {
{ @"&Yuml;", 376 },
// A.2.3. Symbols
- { @"&fnof;", 402 },
+ { @"&fnof;", 402 },
// A.2.2. Special characters cont'd
{ @"&circ;", 710 },
{ @"&tilde;", 732 },
-
+
// A.2.3. Symbols cont'd
- { @"&Alpha;", 913 },
- { @"&Beta;", 914 },
- { @"&Gamma;", 915 },
- { @"&Delta;", 916 },
- { @"&Epsilon;", 917 },
- { @"&Zeta;", 918 },
- { @"&Eta;", 919 },
- { @"&Theta;", 920 },
- { @"&Iota;", 921 },
- { @"&Kappa;", 922 },
- { @"&Lambda;", 923 },
- { @"&Mu;", 924 },
- { @"&Nu;", 925 },
- { @"&Xi;", 926 },
- { @"&Omicron;", 927 },
- { @"&Pi;", 928 },
- { @"&Rho;", 929 },
- { @"&Sigma;", 931 },
- { @"&Tau;", 932 },
- { @"&Upsilon;", 933 },
- { @"&Phi;", 934 },
- { @"&Chi;", 935 },
- { @"&Psi;", 936 },
- { @"&Omega;", 937 },
- { @"&alpha;", 945 },
- { @"&beta;", 946 },
- { @"&gamma;", 947 },
- { @"&delta;", 948 },
- { @"&epsilon;", 949 },
- { @"&zeta;", 950 },
- { @"&eta;", 951 },
- { @"&theta;", 952 },
- { @"&iota;", 953 },
- { @"&kappa;", 954 },
- { @"&lambda;", 955 },
- { @"&mu;", 956 },
- { @"&nu;", 957 },
- { @"&xi;", 958 },
- { @"&omicron;", 959 },
- { @"&pi;", 960 },
- { @"&rho;", 961 },
- { @"&sigmaf;", 962 },
- { @"&sigma;", 963 },
- { @"&tau;", 964 },
- { @"&upsilon;", 965 },
- { @"&phi;", 966 },
- { @"&chi;", 967 },
- { @"&psi;", 968 },
- { @"&omega;", 969 },
- { @"&thetasym;", 977 },
- { @"&upsih;", 978 },
- { @"&piv;", 982 },
-
+ { @"&Alpha;", 913 },
+ { @"&Beta;", 914 },
+ { @"&Gamma;", 915 },
+ { @"&Delta;", 916 },
+ { @"&Epsilon;", 917 },
+ { @"&Zeta;", 918 },
+ { @"&Eta;", 919 },
+ { @"&Theta;", 920 },
+ { @"&Iota;", 921 },
+ { @"&Kappa;", 922 },
+ { @"&Lambda;", 923 },
+ { @"&Mu;", 924 },
+ { @"&Nu;", 925 },
+ { @"&Xi;", 926 },
+ { @"&Omicron;", 927 },
+ { @"&Pi;", 928 },
+ { @"&Rho;", 929 },
+ { @"&Sigma;", 931 },
+ { @"&Tau;", 932 },
+ { @"&Upsilon;", 933 },
+ { @"&Phi;", 934 },
+ { @"&Chi;", 935 },
+ { @"&Psi;", 936 },
+ { @"&Omega;", 937 },
+ { @"&alpha;", 945 },
+ { @"&beta;", 946 },
+ { @"&gamma;", 947 },
+ { @"&delta;", 948 },
+ { @"&epsilon;", 949 },
+ { @"&zeta;", 950 },
+ { @"&eta;", 951 },
+ { @"&theta;", 952 },
+ { @"&iota;", 953 },
+ { @"&kappa;", 954 },
+ { @"&lambda;", 955 },
+ { @"&mu;", 956 },
+ { @"&nu;", 957 },
+ { @"&xi;", 958 },
+ { @"&omicron;", 959 },
+ { @"&pi;", 960 },
+ { @"&rho;", 961 },
+ { @"&sigmaf;", 962 },
+ { @"&sigma;", 963 },
+ { @"&tau;", 964 },
+ { @"&upsilon;", 965 },
+ { @"&phi;", 966 },
+ { @"&chi;", 967 },
+ { @"&psi;", 968 },
+ { @"&omega;", 969 },
+ { @"&thetasym;", 977 },
+ { @"&upsih;", 978 },
+ { @"&piv;", 982 },
+
// A.2.2. Special characters cont'd
{ @"&ensp;", 8194 },
{ @"&emsp;", 8195 },
@@ -219,93 +224,93 @@ static HTMLEscapeMap gAsciiHTMLEscapeMap[] = {
{ @"&bdquo;", 8222 },
{ @"&dagger;", 8224 },
{ @"&Dagger;", 8225 },
- // A.2.3. Symbols cont'd
- { @"&bull;", 8226 },
- { @"&hellip;", 8230 },
-
+ // A.2.3. Symbols cont'd
+ { @"&bull;", 8226 },
+ { @"&hellip;", 8230 },
+
// A.2.2. Special characters cont'd
{ @"&permil;", 8240 },
-
- // A.2.3. Symbols cont'd
- { @"&prime;", 8242 },
- { @"&Prime;", 8243 },
+
+ // A.2.3. Symbols cont'd
+ { @"&prime;", 8242 },
+ { @"&Prime;", 8243 },
// A.2.2. Special characters cont'd
{ @"&lsaquo;", 8249 },
{ @"&rsaquo;", 8250 },
- // A.2.3. Symbols cont'd
- { @"&oline;", 8254 },
- { @"&frasl;", 8260 },
-
+ // A.2.3. Symbols cont'd
+ { @"&oline;", 8254 },
+ { @"&frasl;", 8260 },
+
// A.2.2. Special characters cont'd
{ @"&euro;", 8364 },
- // A.2.3. Symbols cont'd
+ // A.2.3. Symbols cont'd
{ @"&image;", 8465 },
- { @"&weierp;", 8472 },
- { @"&real;", 8476 },
- { @"&trade;", 8482 },
- { @"&alefsym;", 8501 },
- { @"&larr;", 8592 },
- { @"&uarr;", 8593 },
- { @"&rarr;", 8594 },
- { @"&darr;", 8595 },
- { @"&harr;", 8596 },
- { @"&crarr;", 8629 },
- { @"&lArr;", 8656 },
- { @"&uArr;", 8657 },
- { @"&rArr;", 8658 },
- { @"&dArr;", 8659 },
- { @"&hArr;", 8660 },
- { @"&forall;", 8704 },
- { @"&part;", 8706 },
- { @"&exist;", 8707 },
- { @"&empty;", 8709 },
- { @"&nabla;", 8711 },
- { @"&isin;", 8712 },
- { @"&notin;", 8713 },
- { @"&ni;", 8715 },
- { @"&prod;", 8719 },
- { @"&sum;", 8721 },
- { @"&minus;", 8722 },
- { @"&lowast;", 8727 },
- { @"&radic;", 8730 },
- { @"&prop;", 8733 },
- { @"&infin;", 8734 },
- { @"&ang;", 8736 },
- { @"&and;", 8743 },
- { @"&or;", 8744 },
- { @"&cap;", 8745 },
- { @"&cup;", 8746 },
- { @"&int;", 8747 },
- { @"&there4;", 8756 },
- { @"&sim;", 8764 },
- { @"&cong;", 8773 },
- { @"&asymp;", 8776 },
- { @"&ne;", 8800 },
- { @"&equiv;", 8801 },
- { @"&le;", 8804 },
- { @"&ge;", 8805 },
- { @"&sub;", 8834 },
- { @"&sup;", 8835 },
- { @"&nsub;", 8836 },
- { @"&sube;", 8838 },
- { @"&supe;", 8839 },
- { @"&oplus;", 8853 },
- { @"&otimes;", 8855 },
- { @"&perp;", 8869 },
- { @"&sdot;", 8901 },
- { @"&lceil;", 8968 },
- { @"&rceil;", 8969 },
- { @"&lfloor;", 8970 },
- { @"&rfloor;", 8971 },
- { @"&lang;", 9001 },
- { @"&rang;", 9002 },
- { @"&loz;", 9674 },
- { @"&spades;", 9824 },
- { @"&clubs;", 9827 },
- { @"&hearts;", 9829 },
+ { @"&weierp;", 8472 },
+ { @"&real;", 8476 },
+ { @"&trade;", 8482 },
+ { @"&alefsym;", 8501 },
+ { @"&larr;", 8592 },
+ { @"&uarr;", 8593 },
+ { @"&rarr;", 8594 },
+ { @"&darr;", 8595 },
+ { @"&harr;", 8596 },
+ { @"&crarr;", 8629 },
+ { @"&lArr;", 8656 },
+ { @"&uArr;", 8657 },
+ { @"&rArr;", 8658 },
+ { @"&dArr;", 8659 },
+ { @"&hArr;", 8660 },
+ { @"&forall;", 8704 },
+ { @"&part;", 8706 },
+ { @"&exist;", 8707 },
+ { @"&empty;", 8709 },
+ { @"&nabla;", 8711 },
+ { @"&isin;", 8712 },
+ { @"&notin;", 8713 },
+ { @"&ni;", 8715 },
+ { @"&prod;", 8719 },
+ { @"&sum;", 8721 },
+ { @"&minus;", 8722 },
+ { @"&lowast;", 8727 },
+ { @"&radic;", 8730 },
+ { @"&prop;", 8733 },
+ { @"&infin;", 8734 },
+ { @"&ang;", 8736 },
+ { @"&and;", 8743 },
+ { @"&or;", 8744 },
+ { @"&cap;", 8745 },
+ { @"&cup;", 8746 },
+ { @"&int;", 8747 },
+ { @"&there4;", 8756 },
+ { @"&sim;", 8764 },
+ { @"&cong;", 8773 },
+ { @"&asymp;", 8776 },
+ { @"&ne;", 8800 },
+ { @"&equiv;", 8801 },
+ { @"&le;", 8804 },
+ { @"&ge;", 8805 },
+ { @"&sub;", 8834 },
+ { @"&sup;", 8835 },
+ { @"&nsub;", 8836 },
+ { @"&sube;", 8838 },
+ { @"&supe;", 8839 },
+ { @"&oplus;", 8853 },
+ { @"&otimes;", 8855 },
+ { @"&perp;", 8869 },
+ { @"&sdot;", 8901 },
+ { @"&lceil;", 8968 },
+ { @"&rceil;", 8969 },
+ { @"&lfloor;", 8970 },
+ { @"&rfloor;", 8971 },
+ { @"&lang;", 9001 },
+ { @"&rang;", 9002 },
+ { @"&loz;", 9674 },
+ { @"&spades;", 9824 },
+ { @"&clubs;", 9827 },
+ { @"&hearts;", 9829 },
{ @"&diams;", 9830 }
};
@@ -325,11 +330,11 @@ static HTMLEscapeMap gUnicodeHTMLEscapeMap[] = {
{ @"&Scaron;", 352 },
{ @"&scaron;", 353 },
{ @"&Yuml;", 376 },
-
+
// Spacing Modifier Letters
{ @"&circ;", 710 },
{ @"&tilde;", 732 },
-
+
// General Punctuation
{ @"&ensp;", 8194 },
{ @"&emsp;", 8195 },
@@ -372,14 +377,14 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
@implementation NSString (GTMNSStringHTMLAdditions)
-- (NSString *)gtm_stringByEscapingHTMLUsingTable:(HTMLEscapeMap*)table
- ofSize:(NSUInteger)size
- escapingUnicode:(BOOL)escapeUnicode {
+- (NSString *)gtm_stringByEscapingHTMLUsingTable:(HTMLEscapeMap*)table
+ ofSize:(NSUInteger)size
+ escapingUnicode:(BOOL)escapeUnicode {
NSUInteger length = [self length];
if (!length) {
return self;
}
-
+
NSMutableString *finalString = [NSMutableString string];
NSMutableData *data2 = [NSMutableData dataWithCapacity:sizeof(unichar) * length];
@@ -405,19 +410,19 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
return nil;
// COV_NF_END
}
-
+
unichar *buffer2 = (unichar *)[data2 mutableBytes];
-
+
NSUInteger buffer2Length = 0;
-
+
for (NSUInteger i = 0; i < length; ++i) {
- HTMLEscapeMap *val = bsearch(&buffer[i], table,
- size / sizeof(HTMLEscapeMap),
+ HTMLEscapeMap *val = bsearch(&buffer[i], table,
+ size / sizeof(HTMLEscapeMap),
sizeof(HTMLEscapeMap), EscapeMapCompare);
if (val || (escapeUnicode && buffer[i] > 127)) {
if (buffer2Length) {
- CFStringAppendCharacters((CFMutableStringRef)finalString,
- buffer2,
+ CFStringAppendCharacters((CFMutableStringRef)finalString,
+ buffer2,
buffer2Length);
buffer2Length = 0;
}
@@ -434,29 +439,29 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
}
}
if (buffer2Length) {
- CFStringAppendCharacters((CFMutableStringRef)finalString,
- buffer2,
+ CFStringAppendCharacters((CFMutableStringRef)finalString,
+ buffer2,
buffer2Length);
}
return finalString;
}
- (NSString *)gtm_stringByEscapingForHTML {
- return [self gtm_stringByEscapingHTMLUsingTable:gUnicodeHTMLEscapeMap
- ofSize:sizeof(gUnicodeHTMLEscapeMap)
+ return [self gtm_stringByEscapingHTMLUsingTable:gUnicodeHTMLEscapeMap
+ ofSize:sizeof(gUnicodeHTMLEscapeMap)
escapingUnicode:NO];
} // gtm_stringByEscapingHTML
- (NSString *)gtm_stringByEscapingForAsciiHTML {
- return [self gtm_stringByEscapingHTMLUsingTable:gAsciiHTMLEscapeMap
- ofSize:sizeof(gAsciiHTMLEscapeMap)
+ return [self gtm_stringByEscapingHTMLUsingTable:gAsciiHTMLEscapeMap
+ ofSize:sizeof(gAsciiHTMLEscapeMap)
escapingUnicode:YES];
} // gtm_stringByEscapingAsciiHTML
- (NSString *)gtm_stringByUnescapingFromHTML {
NSRange range = NSMakeRange(0, [self length]);
NSRange subrange = [self rangeOfString:@"&" options:NSBackwardsSearch range:range];
-
+
// if no ampersands, we've got a quick way out
if (subrange.length == 0) return self;
NSMutableString *finalString = [NSMutableString stringWithString:self];
@@ -480,9 +485,9 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
NSString *hexSequence = [escapeString substringWithRange:NSMakeRange(3, length - 4)];
NSScanner *scanner = [NSScanner scannerWithString:hexSequence];
unsigned value;
- if ([scanner scanHexInt:&value] &&
+ if ([scanner scanHexInt:&value] &&
value < USHRT_MAX &&
- value > 0
+ value > 0
&& [scanner scanLocation] == length - 4) {
unichar uchar = (unichar)value;
NSString *charString = [NSString stringWithCharacters:&uchar length:1];
@@ -494,9 +499,9 @@ static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {
NSString *numberSequence = [escapeString substringWithRange:NSMakeRange(2, length - 3)];
NSScanner *scanner = [NSScanner scannerWithString:numberSequence];
int value;
- if ([scanner scanInt:&value] &&
+ if ([scanner scanInt:&value] &&
value < USHRT_MAX &&
- value > 0
+ value > 0
&& [scanner scanLocation] == length - 3) {
unichar uchar = (unichar)value;
NSString *charString = [NSString stringWithCharacters:&uchar length:1];
diff --git a/Foundation/GTMNSString+HTMLTest.m b/Foundation/GTMNSString+HTMLTest.m
index 1c7baf0..52c7b6a 100644
--- a/Foundation/GTMNSString+HTMLTest.m
+++ b/Foundation/GTMNSString+HTMLTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -25,65 +25,65 @@
@implementation GTMNSString_HTMLTest
- (void)testStringByEscapingHTML {
- unichar chars[] =
+ unichar chars[] =
{ 34, 38, 39, 60, 62, 338, 339, 352, 353, 376, 710, 732,
- 8194, 8195, 8201, 8204, 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218,
+ 8194, 8195, 8201, 8204, 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218,
8220, 8221, 8222, 8224, 8225, 8240, 8249, 8250, 8364, };
-
+
NSString *string1 = [NSString stringWithCharacters:chars
length:sizeof(chars) / sizeof(unichar)];
- NSString *string2 =
+ NSString *string2 =
@"&quot;&amp;&apos;&lt;&gt;&OElig;&oelig;&Scaron;&scaron;&Yuml;"
"&circ;&tilde;&ensp;&emsp;&thinsp;&zwnj;&zwj;&lrm;&rlm;&ndash;"
"&mdash;&lsquo;&rsquo;&sbquo;&ldquo;&rdquo;&bdquo;&dagger;&Dagger;"
"&permil;&lsaquo;&rsaquo;&euro;";
- STAssertEqualObjects([string1 gtm_stringByEscapingForHTML],
- string2,
- @"HTML escaping failed");
-
- STAssertEqualObjects([@"<this & that>" gtm_stringByEscapingForHTML],
- @"&lt;this &amp; that&gt;",
- @"HTML escaping failed");
+ XCTAssertEqualObjects([string1 gtm_stringByEscapingForHTML],
+ string2,
+ @"HTML escaping failed");
+
+ XCTAssertEqualObjects([@"<this & that>" gtm_stringByEscapingForHTML],
+ @"&lt;this &amp; that&gt;",
+ @"HTML escaping failed");
NSString *string = [NSString stringWithUTF8String:"パン・&ド・カンパーニュ"];
NSString *escapeStr = [NSString stringWithUTF8String:"パン・&amp;ド・カンパーニュ"];
- STAssertEqualObjects([string gtm_stringByEscapingForHTML],
- escapeStr,
- @"HTML escaping failed");
-
+ XCTAssertEqualObjects([string gtm_stringByEscapingForHTML],
+ escapeStr,
+ @"HTML escaping failed");
+
string = [NSString stringWithUTF8String:"abcا1ب<تdef&"];
- STAssertEqualObjects([string gtm_stringByEscapingForHTML],
- [NSString stringWithUTF8String:"abcا1ب&lt;تdef&amp;"],
- @"HTML escaping failed");
-
+ XCTAssertEqualObjects([string gtm_stringByEscapingForHTML],
+ [NSString stringWithUTF8String:"abcا1ب&lt;تdef&amp;"],
+ @"HTML escaping failed");
+
// test empty string
- STAssertEqualObjects([@"" gtm_stringByEscapingForHTML], @"", nil);
+ XCTAssertEqualObjects([@"" gtm_stringByEscapingForHTML], @"");
} // testStringByEscapingHTML
- (void)testStringByEscapingAsciiHTML {
- unichar chars[] =
+ unichar chars[] =
{ 34, 38, 39, 60, 62, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
- 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
- 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
- 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
- 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
- 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 338, 339, 352, 353, 376,
- 402, 710, 732, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924,
- 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 945, 946, 947,
- 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962,
- 963, 964, 965, 966, 967, 968, 969, 977, 978, 982, 8194, 8195, 8201, 8204,
- 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225,
- 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8254, 8260, 8364, 8472, 8465, 8476,
- 8482, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656, 8657, 8658, 8659, 8660,
- 8704, 8706, 8707, 8709, 8711, 8712, 8713, 8715, 8719, 8721, 8722, 8727, 8730,
- 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747, 8756, 8764, 8773, 8776, 8800,
- 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839, 8853, 8855, 8869, 8901, 8968,
+ 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+ 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
+ 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
+ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
+ 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 338, 339, 352, 353, 376,
+ 402, 710, 732, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924,
+ 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 945, 946, 947,
+ 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962,
+ 963, 964, 965, 966, 967, 968, 969, 977, 978, 982, 8194, 8195, 8201, 8204,
+ 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225,
+ 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8254, 8260, 8364, 8472, 8465, 8476,
+ 8482, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656, 8657, 8658, 8659, 8660,
+ 8704, 8706, 8707, 8709, 8711, 8712, 8713, 8715, 8719, 8721, 8722, 8727, 8730,
+ 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747, 8756, 8764, 8773, 8776, 8800,
+ 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839, 8853, 8855, 8869, 8901, 8968,
8969, 8970, 8971, 9001, 9002, 9674, 9824, 9827, 9829, 9830 };
-
+
NSString *string1 = [NSString stringWithCharacters:chars
length:sizeof(chars) / sizeof(unichar)];
- NSString *string2 =
+ NSString *string2 =
@"&quot;&amp;&apos;&lt;&gt;&nbsp;&iexcl;&cent;&pound;&curren;&yen;"
"&brvbar;&sect;&uml;&copy;&ordf;&laquo;&not;&shy;&reg;&macr;&deg;"
"&plusmn;&sup2;&sup3;&acute;&micro;&para;&middot;&cedil;&sup1;"
@@ -112,29 +112,29 @@
"&sub;&sup;&nsub;&sube;&supe;&oplus;&otimes;&perp;&sdot;&lceil;"
"&rceil;&lfloor;&rfloor;&lang;&rang;&loz;&spades;&clubs;&hearts;"
"&diams;";
-
- STAssertEqualObjects([string1 gtm_stringByEscapingForAsciiHTML],
- string2,
- @"HTML escaping failed");
-
- STAssertEqualObjects([@"<this & that>" gtm_stringByEscapingForAsciiHTML],
- @"&lt;this &amp; that&gt;",
- @"HTML escaping failed");
+
+ XCTAssertEqualObjects([string1 gtm_stringByEscapingForAsciiHTML],
+ string2,
+ @"HTML escaping failed");
+
+ XCTAssertEqualObjects([@"<this & that>" gtm_stringByEscapingForAsciiHTML],
+ @"&lt;this &amp; that&gt;",
+ @"HTML escaping failed");
NSString *string = [NSString stringWithUTF8String:"パン・ド・カンパーニュ"];
- STAssertEqualObjects([string gtm_stringByEscapingForAsciiHTML],
- @"&#12497;&#12531;&#12539;&#12489;&#12539;&#12459;"
- "&#12531;&#12497;&#12540;&#12491;&#12517;",
- @"HTML escaping failed");
-
+ XCTAssertEqualObjects([string gtm_stringByEscapingForAsciiHTML],
+ @"&#12497;&#12531;&#12539;&#12489;&#12539;&#12459;"
+ "&#12531;&#12497;&#12540;&#12491;&#12517;",
+ @"HTML escaping failed");
+
// Mix in some right - to left
string = [NSString stringWithUTF8String:"abcا1ب<تdef&"];
- STAssertEqualObjects([string gtm_stringByEscapingForAsciiHTML],
- @"abc&#1575;1&#1576;&lt;&#1578;def&amp;",
- @"HTML escaping failed");
+ XCTAssertEqualObjects([string gtm_stringByEscapingForAsciiHTML],
+ @"abc&#1575;1&#1576;&lt;&#1578;def&amp;",
+ @"HTML escaping failed");
} // stringByEscapingAsciiHTML
- (void)testStringByUnescapingHTML {
- NSString *string1 =
+ NSString *string1 =
@"&quot;&amp;&apos;&lt;&gt;&nbsp;&iexcl;&cent;&pound;&curren;&yen;"
"&brvbar;&sect;&uml;&copy;&ordf;&laquo;&not;&shy;&reg;&macr;&deg;"
"&plusmn;&sup2;&sup3;&acute;&micro;&para;&middot;&cedil;&sup1;"
@@ -163,80 +163,81 @@
"&sub;&sup;&nsub;&sube;&supe;&oplus;&otimes;&perp;&sdot;&lceil;"
"&rceil;&lfloor;&rfloor;&lang;&rang;&loz;&spades;&clubs;&hearts;"
"&diams;";
-
- unichar chars[] =
+
+ unichar chars[] =
{ 34, 38, 39, 60, 62, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170,
- 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
- 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
- 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
- 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
- 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 338, 339, 352, 353, 376,
- 402, 710, 732, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924,
- 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 945, 946, 947,
- 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962,
- 963, 964, 965, 966, 967, 968, 969, 977, 978, 982, 8194, 8195, 8201, 8204,
- 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225,
- 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8254, 8260, 8364, 8472, 8465, 8476,
- 8482, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656, 8657, 8658, 8659, 8660,
- 8704, 8706, 8707, 8709, 8711, 8712, 8713, 8715, 8719, 8721, 8722, 8727, 8730,
- 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747, 8756, 8764, 8773, 8776, 8800,
- 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839, 8853, 8855, 8869, 8901, 8968,
+ 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200,
+ 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
+ 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,
+ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
+ 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 338, 339, 352, 353, 376,
+ 402, 710, 732, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924,
+ 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 945, 946, 947,
+ 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962,
+ 963, 964, 965, 966, 967, 968, 969, 977, 978, 982, 8194, 8195, 8201, 8204,
+ 8205, 8206, 8207, 8211, 8212, 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225,
+ 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8254, 8260, 8364, 8472, 8465, 8476,
+ 8482, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656, 8657, 8658, 8659, 8660,
+ 8704, 8706, 8707, 8709, 8711, 8712, 8713, 8715, 8719, 8721, 8722, 8727, 8730,
+ 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747, 8756, 8764, 8773, 8776, 8800,
+ 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839, 8853, 8855, 8869, 8901, 8968,
8969, 8970, 8971, 9001, 9002, 9674, 9824, 9827, 9829, 9830 };
-
+
NSString *string2 = [NSString stringWithCharacters:chars
length:sizeof(chars) / sizeof(unichar)];
- STAssertEqualObjects([string1 gtm_stringByUnescapingFromHTML],
- string2,
- @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&#65;&#x42;&#X43;" gtm_stringByUnescapingFromHTML],
- @"ABC", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"" gtm_stringByUnescapingFromHTML],
- @"", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&#65;&Bang;&#X43;" gtm_stringByUnescapingFromHTML],
- @"A&Bang;C", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&#65&Bang;&#X43;" gtm_stringByUnescapingFromHTML],
- @"&#65&Bang;C", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&#65;&Bang;&#X43" gtm_stringByUnescapingFromHTML],
- @"A&Bang;&#X43", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&#65A;" gtm_stringByUnescapingFromHTML],
- @"&#65A;", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&" gtm_stringByUnescapingFromHTML],
- @"&", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&;" gtm_stringByUnescapingFromHTML],
- @"&;", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&x;" gtm_stringByUnescapingFromHTML],
- @"&x;", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&X;" gtm_stringByUnescapingFromHTML],
- @"&X;", @"HTML unescaping failed");
-
- STAssertEqualObjects([@";" gtm_stringByUnescapingFromHTML],
- @";", @"HTML unescaping failed");
-
- STAssertEqualObjects([@"&lt;this &amp; that&gt;" gtm_stringByUnescapingFromHTML],
- @"<this & that>", @"HTML unescaping failed");
-
-
+ XCTAssertEqualObjects([string1 gtm_stringByUnescapingFromHTML],
+ string2,
+ @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&#65;&#x42;&#X43;" gtm_stringByUnescapingFromHTML],
+ @"ABC", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"" gtm_stringByUnescapingFromHTML],
+ @"", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&#65;&Bang;&#X43;" gtm_stringByUnescapingFromHTML],
+ @"A&Bang;C", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&#65&Bang;&#X43;" gtm_stringByUnescapingFromHTML],
+ @"&#65&Bang;C", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&#65;&Bang;&#X43" gtm_stringByUnescapingFromHTML],
+ @"A&Bang;&#X43", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&#65A;" gtm_stringByUnescapingFromHTML],
+ @"&#65A;", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&" gtm_stringByUnescapingFromHTML],
+ @"&", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&;" gtm_stringByUnescapingFromHTML],
+ @"&;", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&x;" gtm_stringByUnescapingFromHTML],
+ @"&x;", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&X;" gtm_stringByUnescapingFromHTML],
+ @"&X;", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@";" gtm_stringByUnescapingFromHTML],
+ @";", @"HTML unescaping failed");
+
+ XCTAssertEqualObjects([@"&lt;this &amp; that&gt;" gtm_stringByUnescapingFromHTML],
+ @"<this & that>", @"HTML unescaping failed");
+
+
} // testStringByUnescapingHTML
- (void)testStringRoundtrippingEscapedHTML {
NSString *string = [NSString stringWithUTF8String:"This test ©™®๒०᠐٧"];
- STAssertEqualObjects(string,
- [[string gtm_stringByEscapingForHTML] gtm_stringByUnescapingFromHTML],
- @"HTML Roundtripping failed");
+ XCTAssertEqualObjects(string,
+ [[string gtm_stringByEscapingForHTML] gtm_stringByUnescapingFromHTML],
+ @"HTML Roundtripping failed");
string = [NSString stringWithUTF8String:"This test ©™®๒०᠐٧"];
- STAssertEqualObjects(string,
- [[string gtm_stringByEscapingForAsciiHTML] gtm_stringByUnescapingFromHTML],
- @"HTML Roundtripping failed");
+ XCTAssertEqualObjects(string,
+ [[string gtm_stringByEscapingForAsciiHTML] gtm_stringByUnescapingFromHTML],
+ @"HTML Roundtripping failed");
}
+
@end
diff --git a/Foundation/GTMNSString+URLArgumentsTest.m b/Foundation/GTMNSString+URLArgumentsTest.m
index 5555acf..308b5d6 100644
--- a/Foundation/GTMNSString+URLArgumentsTest.m
+++ b/Foundation/GTMNSString+URLArgumentsTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -27,68 +27,68 @@
- (void)testEscaping {
// should be done already by the basic code
- STAssertEqualObjects([@"this that" gtm_stringByEscapingForURLArgument], @"this%20that", @"- space should be escaped");
- STAssertEqualObjects([@"this\"that" gtm_stringByEscapingForURLArgument], @"this%22that", @"- double quote should be escaped");
+ XCTAssertEqualObjects([@"this that" gtm_stringByEscapingForURLArgument], @"this%20that", @"- space should be escaped");
+ XCTAssertEqualObjects([@"this\"that" gtm_stringByEscapingForURLArgument], @"this%22that", @"- double quote should be escaped");
// make sure our additions are handled
- STAssertEqualObjects([@"this!that" gtm_stringByEscapingForURLArgument], @"this%21that", @"- exclamation mark should be escaped");
- STAssertEqualObjects([@"this*that" gtm_stringByEscapingForURLArgument], @"this%2Athat", @"- asterisk should be escaped");
- STAssertEqualObjects([@"this'that" gtm_stringByEscapingForURLArgument], @"this%27that", @"- single quote should be escaped");
- STAssertEqualObjects([@"this(that" gtm_stringByEscapingForURLArgument], @"this%28that", @"- left paren should be escaped");
- STAssertEqualObjects([@"this)that" gtm_stringByEscapingForURLArgument], @"this%29that", @"- right paren should be escaped");
- STAssertEqualObjects([@"this;that" gtm_stringByEscapingForURLArgument], @"this%3Bthat", @"- semi-colon should be escaped");
- STAssertEqualObjects([@"this:that" gtm_stringByEscapingForURLArgument], @"this%3Athat", @"- colon should be escaped");
- STAssertEqualObjects([@"this@that" gtm_stringByEscapingForURLArgument], @"this%40that", @"- at sign should be escaped");
- STAssertEqualObjects([@"this&that" gtm_stringByEscapingForURLArgument], @"this%26that", @"- ampersand should be escaped");
- STAssertEqualObjects([@"this=that" gtm_stringByEscapingForURLArgument], @"this%3Dthat", @"- equals should be escaped");
- STAssertEqualObjects([@"this+that" gtm_stringByEscapingForURLArgument], @"this%2Bthat", @"- plus should be escaped");
- STAssertEqualObjects([@"this$that" gtm_stringByEscapingForURLArgument], @"this%24that", @"- dollar-sign should be escaped");
- STAssertEqualObjects([@"this,that" gtm_stringByEscapingForURLArgument], @"this%2Cthat", @"- comma should be escaped");
- STAssertEqualObjects([@"this/that" gtm_stringByEscapingForURLArgument], @"this%2Fthat", @"- slash should be escaped");
- STAssertEqualObjects([@"this?that" gtm_stringByEscapingForURLArgument], @"this%3Fthat", @"- question mark should be escaped");
- STAssertEqualObjects([@"this%that" gtm_stringByEscapingForURLArgument], @"this%25that", @"- percent should be escaped");
- STAssertEqualObjects([@"this#that" gtm_stringByEscapingForURLArgument], @"this%23that", @"- pound should be escaped");
- STAssertEqualObjects([@"this[that" gtm_stringByEscapingForURLArgument], @"this%5Bthat", @"- left bracket should be escaped");
- STAssertEqualObjects([@"this]that" gtm_stringByEscapingForURLArgument], @"this%5Dthat", @"- right bracket should be escaped");
+ XCTAssertEqualObjects([@"this!that" gtm_stringByEscapingForURLArgument], @"this%21that", @"- exclamation mark should be escaped");
+ XCTAssertEqualObjects([@"this*that" gtm_stringByEscapingForURLArgument], @"this%2Athat", @"- asterisk should be escaped");
+ XCTAssertEqualObjects([@"this'that" gtm_stringByEscapingForURLArgument], @"this%27that", @"- single quote should be escaped");
+ XCTAssertEqualObjects([@"this(that" gtm_stringByEscapingForURLArgument], @"this%28that", @"- left paren should be escaped");
+ XCTAssertEqualObjects([@"this)that" gtm_stringByEscapingForURLArgument], @"this%29that", @"- right paren should be escaped");
+ XCTAssertEqualObjects([@"this;that" gtm_stringByEscapingForURLArgument], @"this%3Bthat", @"- semi-colon should be escaped");
+ XCTAssertEqualObjects([@"this:that" gtm_stringByEscapingForURLArgument], @"this%3Athat", @"- colon should be escaped");
+ XCTAssertEqualObjects([@"this@that" gtm_stringByEscapingForURLArgument], @"this%40that", @"- at sign should be escaped");
+ XCTAssertEqualObjects([@"this&that" gtm_stringByEscapingForURLArgument], @"this%26that", @"- ampersand should be escaped");
+ XCTAssertEqualObjects([@"this=that" gtm_stringByEscapingForURLArgument], @"this%3Dthat", @"- equals should be escaped");
+ XCTAssertEqualObjects([@"this+that" gtm_stringByEscapingForURLArgument], @"this%2Bthat", @"- plus should be escaped");
+ XCTAssertEqualObjects([@"this$that" gtm_stringByEscapingForURLArgument], @"this%24that", @"- dollar-sign should be escaped");
+ XCTAssertEqualObjects([@"this,that" gtm_stringByEscapingForURLArgument], @"this%2Cthat", @"- comma should be escaped");
+ XCTAssertEqualObjects([@"this/that" gtm_stringByEscapingForURLArgument], @"this%2Fthat", @"- slash should be escaped");
+ XCTAssertEqualObjects([@"this?that" gtm_stringByEscapingForURLArgument], @"this%3Fthat", @"- question mark should be escaped");
+ XCTAssertEqualObjects([@"this%that" gtm_stringByEscapingForURLArgument], @"this%25that", @"- percent should be escaped");
+ XCTAssertEqualObjects([@"this#that" gtm_stringByEscapingForURLArgument], @"this%23that", @"- pound should be escaped");
+ XCTAssertEqualObjects([@"this[that" gtm_stringByEscapingForURLArgument], @"this%5Bthat", @"- left bracket should be escaped");
+ XCTAssertEqualObjects([@"this]that" gtm_stringByEscapingForURLArgument], @"this%5Dthat", @"- right bracket should be escaped");
// make sure plus and space are handled in the right order
- STAssertEqualObjects([@"this that+the other" gtm_stringByEscapingForURLArgument], @"this%20that%2Bthe%20other", @"- pluses and spaces should be different");
+ XCTAssertEqualObjects([@"this that+the other" gtm_stringByEscapingForURLArgument], @"this%20that%2Bthe%20other", @"- pluses and spaces should be different");
// high char test
NSString *tester = [NSString stringWithUTF8String:"caf\xC3\xA9"];
- STAssertNotNil(tester, @"failed to create from utf8 run");
- STAssertEqualObjects([tester gtm_stringByEscapingForURLArgument], @"caf%C3%A9", @"- high chars should work");
+ XCTAssertNotNil(tester, @"failed to create from utf8 run");
+ XCTAssertEqualObjects([tester gtm_stringByEscapingForURLArgument], @"caf%C3%A9", @"- high chars should work");
}
- (void)testUnescaping {
// should be done already by the basic code
- STAssertEqualObjects([@"this%20that" gtm_stringByUnescapingFromURLArgument], @"this that", @"- space should be unescaped");
- STAssertEqualObjects([@"this%22that" gtm_stringByUnescapingFromURLArgument], @"this\"that", @"- double quote should be unescaped");
+ XCTAssertEqualObjects([@"this%20that" gtm_stringByUnescapingFromURLArgument], @"this that", @"- space should be unescaped");
+ XCTAssertEqualObjects([@"this%22that" gtm_stringByUnescapingFromURLArgument], @"this\"that", @"- double quote should be unescaped");
// make sure our additions are handled
- STAssertEqualObjects([@"this%21that" gtm_stringByUnescapingFromURLArgument], @"this!that", @"- exclamation mark should be unescaped");
- STAssertEqualObjects([@"this%2Athat" gtm_stringByUnescapingFromURLArgument], @"this*that", @"- asterisk should be unescaped");
- STAssertEqualObjects([@"this%27that" gtm_stringByUnescapingFromURLArgument], @"this'that", @"- single quote should be unescaped");
- STAssertEqualObjects([@"this%28that" gtm_stringByUnescapingFromURLArgument], @"this(that", @"- left paren should be unescaped");
- STAssertEqualObjects([@"this%29that" gtm_stringByUnescapingFromURLArgument], @"this)that", @"- right paren should be unescaped");
- STAssertEqualObjects([@"this%3Bthat" gtm_stringByUnescapingFromURLArgument], @"this;that", @"- semi-colon should be unescaped");
- STAssertEqualObjects([@"this%3Athat" gtm_stringByUnescapingFromURLArgument], @"this:that", @"- colon should be unescaped");
- STAssertEqualObjects([@"this%40that" gtm_stringByUnescapingFromURLArgument], @"this@that", @"- at sign should be unescaped");
- STAssertEqualObjects([@"this%26that" gtm_stringByUnescapingFromURLArgument], @"this&that", @"- ampersand should be unescaped");
- STAssertEqualObjects([@"this%3Dthat" gtm_stringByUnescapingFromURLArgument], @"this=that", @"- equals should be unescaped");
- STAssertEqualObjects([@"this%2Bthat" gtm_stringByUnescapingFromURLArgument], @"this+that", @"- plus should be unescaped");
- STAssertEqualObjects([@"this%24that" gtm_stringByUnescapingFromURLArgument], @"this$that", @"- dollar-sign should be unescaped");
- STAssertEqualObjects([@"this%2Cthat" gtm_stringByUnescapingFromURLArgument], @"this,that", @"- comma should be unescaped");
- STAssertEqualObjects([@"this%2Fthat" gtm_stringByUnescapingFromURLArgument], @"this/that", @"- slash should be unescaped");
- STAssertEqualObjects([@"this%3Fthat" gtm_stringByUnescapingFromURLArgument], @"this?that", @"- question mark should be unescaped");
- STAssertEqualObjects([@"this%25that" gtm_stringByUnescapingFromURLArgument], @"this%that", @"- percent should be unescaped");
- STAssertEqualObjects([@"this%23that" gtm_stringByUnescapingFromURLArgument], @"this#that", @"- pound should be unescaped");
- STAssertEqualObjects([@"this%5Bthat" gtm_stringByUnescapingFromURLArgument], @"this[that", @"- left bracket should be unescaped");
- STAssertEqualObjects([@"this%5Dthat" gtm_stringByUnescapingFromURLArgument], @"this]that", @"- right bracket should be unescaped");
+ XCTAssertEqualObjects([@"this%21that" gtm_stringByUnescapingFromURLArgument], @"this!that", @"- exclamation mark should be unescaped");
+ XCTAssertEqualObjects([@"this%2Athat" gtm_stringByUnescapingFromURLArgument], @"this*that", @"- asterisk should be unescaped");
+ XCTAssertEqualObjects([@"this%27that" gtm_stringByUnescapingFromURLArgument], @"this'that", @"- single quote should be unescaped");
+ XCTAssertEqualObjects([@"this%28that" gtm_stringByUnescapingFromURLArgument], @"this(that", @"- left paren should be unescaped");
+ XCTAssertEqualObjects([@"this%29that" gtm_stringByUnescapingFromURLArgument], @"this)that", @"- right paren should be unescaped");
+ XCTAssertEqualObjects([@"this%3Bthat" gtm_stringByUnescapingFromURLArgument], @"this;that", @"- semi-colon should be unescaped");
+ XCTAssertEqualObjects([@"this%3Athat" gtm_stringByUnescapingFromURLArgument], @"this:that", @"- colon should be unescaped");
+ XCTAssertEqualObjects([@"this%40that" gtm_stringByUnescapingFromURLArgument], @"this@that", @"- at sign should be unescaped");
+ XCTAssertEqualObjects([@"this%26that" gtm_stringByUnescapingFromURLArgument], @"this&that", @"- ampersand should be unescaped");
+ XCTAssertEqualObjects([@"this%3Dthat" gtm_stringByUnescapingFromURLArgument], @"this=that", @"- equals should be unescaped");
+ XCTAssertEqualObjects([@"this%2Bthat" gtm_stringByUnescapingFromURLArgument], @"this+that", @"- plus should be unescaped");
+ XCTAssertEqualObjects([@"this%24that" gtm_stringByUnescapingFromURLArgument], @"this$that", @"- dollar-sign should be unescaped");
+ XCTAssertEqualObjects([@"this%2Cthat" gtm_stringByUnescapingFromURLArgument], @"this,that", @"- comma should be unescaped");
+ XCTAssertEqualObjects([@"this%2Fthat" gtm_stringByUnescapingFromURLArgument], @"this/that", @"- slash should be unescaped");
+ XCTAssertEqualObjects([@"this%3Fthat" gtm_stringByUnescapingFromURLArgument], @"this?that", @"- question mark should be unescaped");
+ XCTAssertEqualObjects([@"this%25that" gtm_stringByUnescapingFromURLArgument], @"this%that", @"- percent should be unescaped");
+ XCTAssertEqualObjects([@"this%23that" gtm_stringByUnescapingFromURLArgument], @"this#that", @"- pound should be unescaped");
+ XCTAssertEqualObjects([@"this%5Bthat" gtm_stringByUnescapingFromURLArgument], @"this[that", @"- left bracket should be unescaped");
+ XCTAssertEqualObjects([@"this%5Dthat" gtm_stringByUnescapingFromURLArgument], @"this]that", @"- right bracket should be unescaped");
// make sure a plus come back out as a space
- STAssertEqualObjects([@"this+that" gtm_stringByUnescapingFromURLArgument], @"this that", @"- plus should be unescaped");
+ XCTAssertEqualObjects([@"this+that" gtm_stringByUnescapingFromURLArgument], @"this that", @"- plus should be unescaped");
// make sure plus and %2B are handled in the right order
- STAssertEqualObjects([@"this+that%2Bthe%20other" gtm_stringByUnescapingFromURLArgument], @"this that+the other", @"- pluses and spaces should be different");
+ XCTAssertEqualObjects([@"this+that%2Bthe%20other" gtm_stringByUnescapingFromURLArgument], @"this that+the other", @"- pluses and spaces should be different");
// high char test
NSString *tester = [NSString stringWithUTF8String:"caf\xC3\xA9"];
- STAssertNotNil(tester, @"failed to create from utf8 run");
- STAssertEqualObjects([@"caf%C3%A9" gtm_stringByUnescapingFromURLArgument], tester, @"- high chars should work");
+ XCTAssertNotNil(tester, @"failed to create from utf8 run");
+ XCTAssertEqualObjects([@"caf%C3%A9" gtm_stringByUnescapingFromURLArgument], tester, @"- high chars should work");
}
@end
diff --git a/Foundation/GTMNSString+XML.m b/Foundation/GTMNSString+XML.m
index 2e165e6..a9021ad 100644
--- a/Foundation/GTMNSString+XML.m
+++ b/Foundation/GTMNSString+XML.m
@@ -19,6 +19,10 @@
#import "GTMDefines.h"
#import "GTMNSString+XML.h"
+// Export a nonsense symbol to suppress a libtool warning when this is linked alone in a static lib.
+__attribute__((visibility("default")))
+ char NSString_GTMNSStringXMLAdditionsExportToSuppressLibToolWarning = 0;
+
enum {
kGTMXMLCharModeEncodeQUOT = 0,
kGTMXMLCharModeEncodeAMP = 1,
diff --git a/Foundation/GTMNSString+XMLTest.m b/Foundation/GTMNSString+XMLTest.m
index 7e37e31..1832d90 100644
--- a/Foundation/GTMNSString+XMLTest.m
+++ b/Foundation/GTMNSString+XMLTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -39,10 +39,10 @@
[NSString stringWithFormat:@"zzzzz&quot;z&amp;z&apos;z&lt;z&gt;z zzz%Czzz\nz\rz\tz",
(unsigned short)0xE000];
- STAssertEqualObjects([string1 gtm_stringBySanitizingAndEscapingForXML],
- string2,
- @"Sanitize and Escape for XML failed");
-
+ XCTAssertEqualObjects([string1 gtm_stringBySanitizingAndEscapingForXML],
+ string2,
+ @"Sanitize and Escape for XML failed");
+
// force the backing store of the NSString to test extraction paths
char ascBuffer[] = "a\01bcde\nf";
NSString *ascString =
@@ -50,12 +50,12 @@
length:sizeof(ascBuffer) / sizeof(char)
encoding:NSASCIIStringEncoding
freeWhenDone:NO] autorelease];
- STAssertEqualObjects([ascString gtm_stringBySanitizingAndEscapingForXML],
- @"abcde\nf",
- @"Sanitize and Escape for XML from asc buffer failed");
+ XCTAssertEqualObjects([ascString gtm_stringBySanitizingAndEscapingForXML],
+ @"abcde\nf",
+ @"Sanitize and Escape for XML from asc buffer failed");
// test empty string
- STAssertEqualObjects([@"" gtm_stringBySanitizingAndEscapingForXML], @"", nil);
+ XCTAssertEqualObjects([@"" gtm_stringBySanitizingAndEscapingForXML], @"");
}
- (void)testStringBySanitizingToXMLSpec {
@@ -64,16 +64,16 @@
'z', 0, 'z', 1, 'z', 4, 'z', 5, 'z', 34, 'z', 38, 'z', 39, 'z',
60, 'z', 62, 'z', ' ', 'z', 0xd800, 'z', 0xDFFF, 'z', 0xE000,
'z', 0xFFFE, 'z', 0xFFFF, 'z', '\n', 'z', '\r', 'z', '\t', 'z' };
-
+
NSString *string1 = [NSString stringWithCharacters:chars
length:sizeof(chars) / sizeof(UniChar)];
NSString *string2 =
[NSString stringWithFormat:@"zzzzz\"z&z'z<z>z zzz%Czzz\nz\rz\tz",
(unsigned short)0xE000];
-
- STAssertEqualObjects([string1 gtm_stringBySanitizingToXMLSpec],
- string2,
- @"Sanitize for XML failed");
+
+ XCTAssertEqualObjects([string1 gtm_stringBySanitizingToXMLSpec],
+ string2,
+ @"Sanitize for XML failed");
// force the backing store of the NSString to test extraction paths
char ascBuffer[] = "a\01bcde\nf";
@@ -82,12 +82,12 @@
length:sizeof(ascBuffer) / sizeof(char)
encoding:NSASCIIStringEncoding
freeWhenDone:NO] autorelease];
- STAssertEqualObjects([ascString gtm_stringBySanitizingToXMLSpec],
- @"abcde\nf",
- @"Sanitize and Escape for XML from asc buffer failed");
+ XCTAssertEqualObjects([ascString gtm_stringBySanitizingToXMLSpec],
+ @"abcde\nf",
+ @"Sanitize and Escape for XML from asc buffer failed");
// test empty string
- STAssertEqualObjects([@"" gtm_stringBySanitizingToXMLSpec], @"", nil);
+ XCTAssertEqualObjects([@"" gtm_stringBySanitizingToXMLSpec], @"");
}
@end
diff --git a/Foundation/GTMNSThread+Blocks.h b/Foundation/GTMNSThread+Blocks.h
index 23e4e60..e3700bb 100644
--- a/Foundation/GTMNSThread+Blocks.h
+++ b/Foundation/GTMNSThread+Blocks.h
@@ -38,10 +38,6 @@
#endif // NS_BLOCKS_AVAILABLE
-// [NSObject performSelector:onThread:...] 10.5 and later, so this makes no
-// sense on any earlier SDK.
-#if GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
-
// A simple thread that does nothing but handle performBlock and
// performSelector calls.
@interface GTMSimpleWorkerThread : NSThread {
@@ -54,5 +50,3 @@
- (void)stop;
@end
-
-#endif // GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
diff --git a/Foundation/GTMNSThread+Blocks.m b/Foundation/GTMNSThread+Blocks.m
index 2476ad5..4ab3ee5 100644
--- a/Foundation/GTMNSThread+Blocks.m
+++ b/Foundation/GTMNSThread+Blocks.m
@@ -53,17 +53,6 @@
#endif // NS_BLOCKS_AVAILABLE
-#if GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
-
-// Only available 10.6 and later.
-typedef int (*PThreadSetNameNPPTr)(const char*);
-#if !GTM_IPHONE_SDK
-static PThreadSetNameNPPTr gPThreadSetNameNP = NULL;
-#else
-// Defined on iPhone since 3.2
-static PThreadSetNameNPPTr gPThreadSetNameNP = pthread_setname_np;
-#endif // !GTM_IPHONE_SDK
-
enum {
kGTMSimpleThreadInitialized = 0,
kGTMSimpleThreadStarting,
@@ -74,15 +63,6 @@ enum {
@implementation GTMSimpleWorkerThread
-#if !GTM_IPHONE_SDK
-+ (void)initialize {
- if (self == [GTMSimpleWorkerThread class]) {
- // Resolve pthread_setname_np() on 10.6 and later.
- gPThreadSetNameNP = dlsym(RTLD_DEFAULT, "pthread_setname_np");
- }
-}
-#endif // !GTM_IPHONE_SDK
-
- (id)init {
if ((self = [super init])) {
runLock_ =
@@ -100,12 +80,10 @@ enum {
}
- (void)setThreadDebuggerName:(NSString *)name {
- if (gPThreadSetNameNP) {
- if ([name length]) {
- gPThreadSetNameNP([name UTF8String]);
- } else {
- gPThreadSetNameNP("");
- }
+ if ([name length]) {
+ pthread_setname_np([name UTF8String]);
+ } else {
+ pthread_setname_np("");
}
}
@@ -292,5 +270,3 @@ enum {
}
@end
-
-#endif // GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
diff --git a/Foundation/GTMNSThread+BlocksTest.m b/Foundation/GTMNSThread+BlocksTest.m
index 606de6d..4b685fd 100644
--- a/Foundation/GTMNSThread+BlocksTest.m
+++ b/Foundation/GTMNSThread+BlocksTest.m
@@ -20,8 +20,6 @@
#import "GTMSenTestCase.h"
#import "GTMNSThread+Blocks.h"
-#if GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
-
#import "GTMFoundationUnitTestingUtilities.h"
@interface GTMNSThread_BlocksTest : GTMTestCase {
@@ -56,8 +54,8 @@
runThread = [NSThread currentThread];
[context setShouldStop:YES];
}];
- STAssertEqualObjects(runThread, currentThread, nil);
- STAssertTrue([context shouldStop], nil);
+ XCTAssertEqualObjects(runThread, currentThread);
+ XCTAssertTrue([context shouldStop]);
// Block with waiting runs immediately as well.
runThread = nil;
@@ -66,8 +64,8 @@
runThread = [NSThread currentThread];
[context setShouldStop:YES];
}];
- STAssertEqualObjects(runThread, currentThread, nil);
- STAssertTrue([context shouldStop], nil);
+ XCTAssertEqualObjects(runThread, currentThread);
+ XCTAssertTrue([context shouldStop]);
// Block without waiting requires a runloop spin.
runThread = nil;
@@ -76,10 +74,10 @@
runThread = [NSThread currentThread];
[context setShouldStop:YES];
}];
- STAssertTrue([[NSRunLoop currentRunLoop]
- gtm_runUpToSixtySecondsWithContext:context], nil);
- STAssertEqualObjects(runThread, currentThread, nil);
- STAssertTrue([context shouldStop], nil);
+ XCTAssertTrue([[NSRunLoop currentRunLoop]
+ gtm_runUpToSixtySecondsWithContext:context]);
+ XCTAssertEqualObjects(runThread, currentThread);
+ XCTAssertTrue([context shouldStop]);
}
- (void)testPerformBlockInBackground {
@@ -90,52 +88,52 @@
runThread = [NSThread currentThread];
[context setShouldStop:YES];
}];
- STAssertTrue([[NSRunLoop currentRunLoop]
- gtm_runUpToSixtySecondsWithContext:context], nil);
- STAssertNotNil(runThread, nil);
- STAssertNotEqualObjects(runThread, [NSThread currentThread], nil);
+ XCTAssertTrue([[NSRunLoop currentRunLoop]
+ gtm_runUpToSixtySecondsWithContext:context]);
+ XCTAssertNotNil(runThread);
+ XCTAssertNotEqualObjects(runThread, [NSThread currentThread]);
}
- (void)testWorkerThreadBasics {
// Unstarted worker isn't running.
GTMSimpleWorkerThread *worker = [[GTMSimpleWorkerThread alloc] init];
- STAssertFalse([worker isExecuting], nil);
- STAssertFalse([worker isFinished], nil);
+ XCTAssertFalse([worker isExecuting]);
+ XCTAssertFalse([worker isFinished]);
// Unstarted worker can be stopped without error.
[worker stop];
- STAssertFalse([worker isExecuting], nil);
- STAssertTrue([worker isFinished], nil);
+ XCTAssertFalse([worker isExecuting]);
+ XCTAssertTrue([worker isFinished]);
// And can be stopped again
[worker stop];
- STAssertFalse([worker isExecuting], nil);
- STAssertTrue([worker isFinished], nil);
+ XCTAssertFalse([worker isExecuting]);
+ XCTAssertTrue([worker isFinished]);
// A thread we start can be stopped with correct state.
worker = [[GTMSimpleWorkerThread alloc] init];
- STAssertFalse([worker isExecuting], nil);
- STAssertFalse([worker isFinished], nil);
+ XCTAssertFalse([worker isExecuting]);
+ XCTAssertFalse([worker isFinished]);
[worker start];
- STAssertTrue([worker isExecuting], nil);
- STAssertFalse([worker isFinished], nil);
+ XCTAssertTrue([worker isExecuting]);
+ XCTAssertFalse([worker isFinished]);
[worker stop];
- STAssertFalse([worker isExecuting], nil);
- STAssertTrue([worker isFinished], nil);
+ XCTAssertFalse([worker isExecuting]);
+ XCTAssertTrue([worker isFinished]);
// A cancel is also honored
worker = [[GTMSimpleWorkerThread alloc] init];
- STAssertFalse([worker isExecuting], nil);
- STAssertFalse([worker isFinished], nil);
+ XCTAssertFalse([worker isExecuting]);
+ XCTAssertFalse([worker isFinished]);
[worker start];
- STAssertTrue([worker isExecuting], nil);
- STAssertFalse([worker isFinished], nil);
+ XCTAssertTrue([worker isExecuting]);
+ XCTAssertFalse([worker isFinished]);
[worker cancel];
// And after some time we're done. We're generous here, this needs to
// exceed the worker thread's runloop timeout.
sleep(5);
- STAssertFalse([worker isExecuting], nil);
- STAssertTrue([worker isFinished], nil);
+ XCTAssertFalse([worker isExecuting]);
+ XCTAssertTrue([worker isFinished]);
}
- (void)testWorkerThreadStopTiming {
@@ -146,14 +144,14 @@
[workerThread_ gtm_performBlock:^{
[threadLock lock];
[threadLock unlockWithCondition:1];
- sleep(10);
+ [NSThread sleepForTimeInterval:.25];
}];
[threadLock lockWhenCondition:1];
[threadLock unlock];
[workerThread_ stop];
- STAssertFalse([workerThread_ isExecuting], nil);
- STAssertTrue([workerThread_ isFinished], nil);
- STAssertEqualsWithAccuracy(-[start timeIntervalSinceNow], 10.0, 2.0, nil);
+ XCTAssertFalse([workerThread_ isExecuting]);
+ XCTAssertTrue([workerThread_ isFinished]);
+ XCTAssertEqualWithAccuracy(-[start timeIntervalSinceNow], 0.25, 0.25);
}
- (void)testPerformBlockOnWorkerThread {
@@ -168,10 +166,10 @@
runThread = [NSThread currentThread];
[context setShouldStop:YES];
}];
- STAssertTrue([[NSRunLoop currentRunLoop]
- gtm_runUpToSixtySecondsWithContext:context], nil);
- STAssertNotNil(runThread, nil);
- STAssertEqualObjects(runThread, workerThread_, nil);
+ XCTAssertTrue([[NSRunLoop currentRunLoop]
+ gtm_runUpToSixtySecondsWithContext:context]);
+ XCTAssertNotNil(runThread);
+ XCTAssertEqualObjects(runThread, workerThread_);
// Other thread no wait.
runThread = nil;
@@ -180,10 +178,10 @@
runThread = [NSThread currentThread];
[context setShouldStop:YES];
}];
- STAssertTrue([[NSRunLoop currentRunLoop]
- gtm_runUpToSixtySecondsWithContext:context], nil);
- STAssertNotNil(runThread, nil);
- STAssertEqualObjects(runThread, workerThread_, nil);
+ XCTAssertTrue([[NSRunLoop currentRunLoop]
+ gtm_runUpToSixtySecondsWithContext:context]);
+ XCTAssertNotNil(runThread);
+ XCTAssertEqualObjects(runThread, workerThread_);
// Waiting requires no runloop spin
runThread = nil;
@@ -192,9 +190,9 @@
runThread = [NSThread currentThread];
[context setShouldStop:YES];
}];
- STAssertTrue([context shouldStop], nil);
- STAssertNotNil(runThread, nil);
- STAssertEqualObjects(runThread, workerThread_, nil);
+ XCTAssertTrue([context shouldStop]);
+ XCTAssertNotNil(runThread);
+ XCTAssertEqualObjects(runThread, workerThread_);
}
- (void)testExitingBlockIsExecuting {
@@ -208,10 +206,10 @@
[threadLock lockWhenCondition:1];
[threadLock unlock];
// Give the pthread_exit() a bit of time
- sleep(5);
+ [NSThread sleepForTimeInterval:.25];
// Did we notice the thread died? Does [... isExecuting] clean up?
- STAssertFalse([workerThread_ isExecuting], nil);
- STAssertTrue([workerThread_ isFinished], nil);
+ XCTAssertFalse([workerThread_ isExecuting]);
+ XCTAssertTrue([workerThread_ isFinished]);
}
- (void)testExitingBlockCancel {
@@ -225,12 +223,12 @@
[threadLock lockWhenCondition:1];
[threadLock unlock];
// Give the pthread_exit() a bit of time
- sleep(5);
+ [NSThread sleepForTimeInterval:.25];
// Cancel/stop the thread
[workerThread_ stop];
// Did we notice the thread died? Did we clean up?
- STAssertFalse([workerThread_ isExecuting], nil);
- STAssertTrue([workerThread_ isFinished], nil);
+ XCTAssertFalse([workerThread_ isExecuting]);
+ XCTAssertTrue([workerThread_ isFinished]);
}
- (void)testStopFromThread {
@@ -245,23 +243,20 @@
[threadLock lockWhenCondition:1];
[threadLock unlock];
// Still need to give the thread a moment to not be executing
- sleep(5);
- STAssertFalse([workerThread_ isExecuting], nil);
- STAssertTrue([workerThread_ isFinished], nil);
+ sleep(1);
+ XCTAssertFalse([workerThread_ isExecuting]);
+ XCTAssertTrue([workerThread_ isFinished]);
}
- (void)testPThreadName {
NSString *testName = @"InigoMontoya";
[workerThread_ setName:testName];
[workerThread_ gtm_performWaitingUntilDone:NO block:^{
- STAssertEqualObjects([workerThread_ name], testName, nil);
+ XCTAssertEqualObjects([workerThread_ name], testName);
char threadName[100];
pthread_getname_np(pthread_self(), threadName, 100);
- STAssertEqualObjects([NSString stringWithUTF8String:threadName],
- testName, nil);
+ XCTAssertEqualObjects([NSString stringWithUTF8String:threadName], testName);
}];
}
@end
-
-#endif // GTM_IPHONE_SDK || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
diff --git a/Foundation/GTMObjC2Runtime.h b/Foundation/GTMObjC2Runtime.h
index e4e2ac7..e14df70 100644
--- a/Foundation/GTMObjC2Runtime.h
+++ b/Foundation/GTMObjC2Runtime.h
@@ -16,98 +16,16 @@
// the License.
//
+// These headers only being pulled in to avoid breaking changes.
+
+#pragma GCC warning "GTMObjcRuntime.h is deprecated and should no longer be used."
+
#import <objc/objc-api.h>
#import <objc/objc-auto.h>
#import "GTMDefines.h"
-// These functions exist for code that we want to compile on both the < 10.5
-// sdks and on the >= 10.5 sdks without warnings. It basically reimplements
-// certain parts of the objc2 runtime in terms of the objc1 runtime. It is not
-// a complete implementation as I've only implemented the routines I know we
-// use. Feel free to add more as necessary.
-// These functions are not documented because they conform to the documentation
-// for the ObjC2 Runtime.
-
-#if OBJC_API_VERSION >= 2 // Only have optional and req'd keywords in ObjC2.
-#define AT_OPTIONAL @optional
-#define AT_REQUIRED @required
-#else
-#define AT_OPTIONAL
-#define AT_REQUIRED
-#endif
-
-// The file objc-runtime.h was moved to runtime.h and in Leopard, objc-runtime.h
-// was just a wrapper around runtime.h. For the iPhone SDK, this objc-runtime.h
-// is removed in the iPhoneOS2.0 SDK.
-//
-// The |Object| class was removed in the iPhone2.0 SDK too.
-#if GTM_IPHONE_SDK
#import <objc/message.h>
#import <objc/runtime.h>
-#else
-#import <objc/objc-runtime.h>
-#import <objc/Object.h>
-#endif
#import <libkern/OSAtomic.h>
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-#import "objc/Protocol.h"
-
-OBJC_EXPORT Class object_getClass(id obj);
-OBJC_EXPORT const char *class_getName(Class cls);
-OBJC_EXPORT BOOL class_conformsToProtocol(Class cls, Protocol *protocol);
-OBJC_EXPORT BOOL class_respondsToSelector(Class cls, SEL sel);
-OBJC_EXPORT Class class_getSuperclass(Class cls);
-OBJC_EXPORT Method *class_copyMethodList(Class cls, unsigned int *outCount);
-OBJC_EXPORT SEL method_getName(Method m);
-OBJC_EXPORT void method_exchangeImplementations(Method m1, Method m2);
-OBJC_EXPORT IMP method_getImplementation(Method method);
-OBJC_EXPORT IMP method_setImplementation(Method method, IMP imp);
-OBJC_EXPORT struct objc_method_description protocol_getMethodDescription(Protocol *p,
- SEL aSel,
- BOOL isRequiredMethod,
- BOOL isInstanceMethod);
-OBJC_EXPORT BOOL sel_isEqual(SEL lhs, SEL rhs);
-
-// If building for 10.4 but using the 10.5 SDK, don't include these.
-#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
-// atomics
-// On Leopard these are GC aware
-// Intentionally did not include the non-barrier versions, because I couldn't
-// come up with a case personally where you wouldn't want to use the
-// barrier versions.
-GTM_INLINE bool OSAtomicCompareAndSwapPtrBarrier(void *predicate,
- void *replacement,
- void * volatile *theValue) {
-#if defined(__LP64__) && __LP64__
- return OSAtomicCompareAndSwap64Barrier((int64_t)predicate,
- (int64_t)replacement,
- (int64_t *)theValue);
-#else // defined(__LP64__) && __LP64__
- return OSAtomicCompareAndSwap32Barrier((int32_t)predicate,
- (int32_t)replacement,
- (int32_t *)theValue);
-#endif // defined(__LP64__) && __LP64__
-}
-
-#endif // MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
-#endif // GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
-
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5)
-
-GTM_INLINE BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate,
- id replacement,
- volatile id *objectLocation) {
- return OSAtomicCompareAndSwapPtrBarrier(predicate,
- replacement,
- (void * volatile *)objectLocation);
-}
-GTM_INLINE BOOL objc_atomicCompareAndSwapInstanceVariableBarrier(id predicate,
- id replacement,
- volatile id *objectLocation) {
- return OSAtomicCompareAndSwapPtrBarrier(predicate,
- replacement,
- (void * volatile *)objectLocation);
-}
-#endif // GTM_MACOS_SDK && (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5)
diff --git a/Foundation/GTMObjC2Runtime.m b/Foundation/GTMObjC2Runtime.m
index 1475103..9bd937c 100644
--- a/Foundation/GTMObjC2Runtime.m
+++ b/Foundation/GTMObjC2Runtime.m
@@ -16,158 +16,6 @@
// the License.
//
-#import "GTMObjC2Runtime.h"
+// This source file is no longer necessary.
-// Export a nonsense symbol to suppress a libtool warning when this is linked alone in a static lib.
-__attribute__((visibility("default"))) char GTMObjC2RuntimeExportToSuppressLibToolWarning = 0;
-
-
-#if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) && !__OBJC2__
-#import <objc/objc-runtime.h>
-#import <stdlib.h>
-#import <string.h>
-
-Class object_getClass(id obj) {
- if (!obj) return NULL;
- return obj->isa;
-}
-
-const char *class_getName(Class cls) {
- if (!cls) return "nil";
- return cls->name;
-}
-
-BOOL class_conformsToProtocol(Class cls, Protocol *protocol) {
- // We intentionally don't check cls as it crashes on Leopard so we want
- // to crash on Tiger as well.
- // I logged
- // Radar 5572978 class_conformsToProtocol crashes when arg1 is passed as nil
- // because it seems odd that this API won't accept nil for cls considering
- // all the other apis will accept nil args.
- // If this does get fixed, remember to enable the unit tests.
- if (!protocol) return NO;
-
- struct objc_protocol_list *protos;
- for (protos = cls->protocols; protos != NULL; protos = protos->next) {
- for (long i = 0; i < protos->count; i++) {
- if ([protos->list[i] conformsTo:protocol]) {
- return YES;
- }
- }
- }
- return NO;
-}
-
-Class class_getSuperclass(Class cls) {
- if (!cls) return NULL;
- return cls->super_class;
-}
-
-BOOL class_respondsToSelector(Class cls, SEL sel) {
- return class_getInstanceMethod(cls, sel) != nil;
-}
-
-Method *class_copyMethodList(Class cls, unsigned int *outCount) {
- if (!cls) return NULL;
-
- unsigned int count = 0;
- void *iterator = NULL;
- struct objc_method_list *mlist;
- Method *methods = NULL;
- if (outCount) *outCount = 0;
-
- while ( (mlist = class_nextMethodList(cls, &iterator)) ) {
- if (mlist->method_count == 0) continue;
- Method *new_methods = (Method *)realloc(methods,
- sizeof(Method) * (count + mlist->method_count + 1));
- if (!new_methods) {
- // COV_NF_START
- //Memory alloc failed, so what can we do?
- free(methods);
- return NULL;
- // COV_NF_END
- } else {
- methods = new_methods;
- }
- for (int i = 0; i < mlist->method_count; i++) {
- methods[i + count] = &mlist->method_list[i];
- }
- count += mlist->method_count;
- }
-
- // List must be NULL terminated
- if (methods) {
- methods[count] = NULL;
- }
- if (outCount) *outCount = count;
- return methods;
-}
-
-SEL method_getName(Method method) {
- if (!method) return NULL;
- return method->method_name;
-}
-
-IMP method_getImplementation(Method method) {
- if (!method) return NULL;
- return method->method_imp;
-}
-
-IMP method_setImplementation(Method method, IMP imp) {
- // We intentionally don't test method for nil.
- // Leopard fails here, so should we.
- // I logged this as Radar:
- // 5572981 method_setImplementation crashes if you pass nil for the
- // method arg (arg 1)
- // because it seems odd that this API won't accept nil for method considering
- // all the other apis will accept nil args.
- // If this does get fixed, remember to enable the unit tests.
- // This method works differently on SnowLeopard than
- // on Leopard. If you pass in a nil for IMP on SnowLeopard
- // it doesn't change anything. On Leopard it will. Since
- // attempting to change a sel to nil is probably an error
- // we follow the SnowLeopard way of doing things.
- IMP oldImp = NULL;
- if (imp) {
- oldImp = method->method_imp;
- method->method_imp = imp;
- }
- return oldImp;
-}
-
-void method_exchangeImplementations(Method m1, Method m2) {
- if (m1 == m2) return;
- if (!m1 || !m2) return;
- IMP imp2 = method_getImplementation(m2);
- IMP imp1 = method_setImplementation(m1, imp2);
- method_setImplementation(m2, imp1);
-}
-
-struct objc_method_description protocol_getMethodDescription(Protocol *p,
- SEL aSel,
- BOOL isRequiredMethod,
- BOOL isInstanceMethod) {
- struct objc_method_description *descPtr = NULL;
- // No such thing as required in ObjC1.
- if (isInstanceMethod) {
- descPtr = [p descriptionForInstanceMethod:aSel];
- } else {
- descPtr = [p descriptionForClassMethod:aSel];
- }
-
- struct objc_method_description desc;
- if (descPtr) {
- desc = *descPtr;
- } else {
- bzero(&desc, sizeof(desc));
- }
- return desc;
-}
-
-BOOL sel_isEqual(SEL lhs, SEL rhs) {
- // Apple (informally) promises this will work in the future:
- // http://twitter.com/#!/gparker/status/2400099786
- return (lhs == rhs) ? YES : NO;
-}
-
-#endif // GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
+#pragma GCC warning "GTMObjc2Runtime.m is deprecated and should no longer be used."
diff --git a/Foundation/GTMObjC2RuntimeTest.m b/Foundation/GTMObjC2RuntimeTest.m
deleted file mode 100644
index 2e6362c..0000000
--- a/Foundation/GTMObjC2RuntimeTest.m
+++ /dev/null
@@ -1,445 +0,0 @@
-//
-// GTMObjC2RuntimeTest.m
-//
-// Copyright 2007-2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMObjC2Runtime.h"
-#import "GTMSenTestCase.h"
-#import "GTMSystemVersion.h"
-#import "GTMTypeCasting.h"
-
-#import <string.h>
-
-@protocol GTMObjC2Runtime_TestProtocol
-@end
-
-@protocol GTMObjC2Runtime_Test2Protocol
-AT_OPTIONAL
-- (NSString*)optional;
-AT_REQUIRED
-- (NSString*)required;
-AT_OPTIONAL
-+ (NSString*)class_optional;
-AT_REQUIRED
-+ (NSString*)class_required;
-@end
-
-@interface GTMObjC2RuntimeTest : GTMTestCase {
- Class cls_;
-}
-@end
-
-@interface GTMObjC2Runtime_TestClass : NSObject <GTMObjC2Runtime_TestProtocol>
-- (NSString*)kwyjibo;
-
-@end
-
-@interface GTMObjC2Runtime_TestClass (GMObjC2Runtime_TestClassCategory)
-- (NSString*)eatMyShorts;
-@end
-
-@implementation GTMObjC2Runtime_TestClass
-
-+ (NSString*)dontHaveACow {
- return @"dontHaveACow";
-}
-
-- (NSString*)kwyjibo {
- return @"kwyjibo";
-}
-@end
-
-@implementation GTMObjC2Runtime_TestClass (GMObjC2Runtime_TestClassCategory)
-- (NSString*)eatMyShorts {
- return @"eatMyShorts";
-}
-
-+ (NSString*)brokeHisBrain {
- return @"brokeHisBrain";
-}
-
-@end
-
-@interface GTMObjC2NotificationWatcher : NSObject
-- (void)startedTest:(NSNotification *)notification;
-@end
-
-@implementation GTMObjC2NotificationWatcher
-- (id)init {
- if ((self = [super init])) {
- NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
- // We release ourselves when we are notified.
- [self retain];
- [nc addObserver:self
- selector:@selector(startedTest:)
- name:SenTestSuiteDidStartNotification
- object:nil];
-
- }
- return self;
-}
-
-- (void)startedTest:(NSNotification *)notification {
- // Logs if we are testing on Tiger or Leopard runtime.
- SenTestSuiteRun *suiteRun = GTM_STATIC_CAST(SenTestSuiteRun,
- [notification object]);
- NSString *testName = [[suiteRun test] name];
- NSString *className = NSStringFromClass([GTMObjC2RuntimeTest class]);
- if ([testName isEqualToString:className]) {
- NSString *runtimeString;
-#ifndef OBJC2_UNAVAILABLE
- runtimeString = @"ObjC1";
-#else
- runtimeString = @"ObjC2";
-#endif
- NSLog(@"Running GTMObjC2RuntimeTests using %@ runtime.", runtimeString);
- NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
- [nc removeObserver:self];
- [self autorelease];
- }
-}
-@end
-
-@implementation GTMObjC2RuntimeTest
-
-+ (void)initialize {
- // This allows us to track which runtime we are actually testing.
- [[[GTMObjC2NotificationWatcher alloc] init] autorelease];
-}
-
-- (void)setUp {
- cls_ = [[GTMObjC2Runtime_TestClass class] retain];
-}
-
-- (void)tearDown {
- [cls_ release];
-}
-
-- (void)test_object_getClass {
- // Nil Checks
- STAssertNil(object_getClass(nil), nil);
-
- // Standard use check
- GTMObjC2Runtime_TestClass *test = [[[cls_ alloc] init] autorelease];
- Class cls = object_getClass(test);
- STAssertEqualObjects(cls, cls_, nil);
-}
-
-- (void)test_class_getName {
- // Nil Checks
- const char *name = class_getName(nil);
- STAssertEqualCStrings(name, "nil", nil);
-
- // Standard use check
- STAssertEqualCStrings(class_getName(cls_), "GTMObjC2Runtime_TestClass", nil);
-}
-
-- (void)test_class_conformsToProtocol {
- // Nil Checks
- STAssertFalse(class_conformsToProtocol(cls_, @protocol(NSObject)), nil);
- STAssertFalse(class_conformsToProtocol(cls_, nil), nil);
- // The following two tests intentionally commented out as they fail on
- // Leopard with a crash, so we fail on Tiger intentionally as well.
- // STAssertFalse(class_conformsToProtocol(nil, @protocol(NSObject)), nil);
- // STAssertFalse(class_conformsToProtocol(nil, nil), nil);
-
- // Standard use check
- STAssertTrue(class_conformsToProtocol(cls_,
- @protocol(GTMObjC2Runtime_TestProtocol)),
- nil);
-}
-
-- (void)test_class_respondsToSelector {
- // Nil Checks
- STAssertFalse(class_respondsToSelector(cls_, @selector(setUp)), nil);
- STAssertFalse(class_respondsToSelector(cls_, nil), nil);
-
- // Standard use check
- STAssertTrue(class_respondsToSelector(cls_, @selector(kwyjibo)), nil);
-}
-
-- (void)test_class_getSuperclass {
- // Nil Checks
- STAssertNil(class_getSuperclass(nil), nil);
-
- // Standard use check
- STAssertEqualObjects(class_getSuperclass(cls_), [NSObject class], nil);
-}
-
-- (void)test_class_copyMethodList {
- // Nil Checks
- Method *list = class_copyMethodList(nil, nil);
- STAssertNULL(list, nil);
-
- // Standard use check
- list = class_copyMethodList(cls_, nil);
- STAssertNotNULL(list, nil);
- free(list);
- unsigned int count = 0;
- list = class_copyMethodList(cls_, &count);
- STAssertNotNULL(list, nil);
- STAssertEquals(count, 2U, nil);
- STAssertNULL(list[count], nil);
- free(list);
-
- // Now test meta class
- count = 0;
- list = class_copyMethodList((Class)objc_getMetaClass(class_getName(cls_)),
- &count);
- STAssertNotNULL(list, nil);
- STAssertEquals(count, 2U, nil);
- STAssertNULL(list[count], nil);
- free(list);
-}
-
-- (void)test_method_getName {
- // Nil Checks
- STAssertNULL(method_getName(nil), nil);
-
- // Standard use check
- Method *list = class_copyMethodList(cls_, nil);
- STAssertNotNULL(list, nil);
- const char* selName1 = sel_getName(method_getName(list[0]));
- const char* selName2 = sel_getName(@selector(kwyjibo));
- const char* selName3 = sel_getName(@selector(eatMyShorts));
- BOOL isGood = ((strcmp(selName1, selName2)) == 0 || (strcmp(selName1, selName3) == 0));
- STAssertTrue(isGood, nil);
- free(list);
-}
-
-- (void)test_method_exchangeImplementations {
- // nil checks
- method_exchangeImplementations(nil, nil);
-
- // Standard use check
- GTMObjC2Runtime_TestClass *test = [[GTMObjC2Runtime_TestClass alloc] init];
- STAssertNotNil(test, nil);
-
- // Get initial values
- NSString *val1 = [test kwyjibo];
- STAssertNotNil(val1, nil);
- NSString *val2 = [test eatMyShorts];
- STAssertNotNil(val2, nil);
- NSString *val3 = [GTMObjC2Runtime_TestClass dontHaveACow];
- STAssertNotNil(val3, nil);
- NSString *val4 = [GTMObjC2Runtime_TestClass brokeHisBrain];
- STAssertNotNil(val4, nil);
-
- // exchange the imps
- Method *list = class_copyMethodList(cls_, nil);
- STAssertNotNULL(list, nil);
- method_exchangeImplementations(list[0], list[1]);
-
- // test against initial values
- NSString *val5 = [test kwyjibo];
- STAssertNotNil(val5, nil);
- NSString *val6 = [test eatMyShorts];
- STAssertNotNil(val6, nil);
- STAssertEqualStrings(val1, val6, nil);
- STAssertEqualStrings(val2, val5, nil);
-
- // Check that other methods not affected
- STAssertEqualStrings([GTMObjC2Runtime_TestClass dontHaveACow], val3, nil);
- STAssertEqualStrings([GTMObjC2Runtime_TestClass brokeHisBrain], val4, nil);
-
- // exchange the imps back
- method_exchangeImplementations(list[0], list[1]);
-
- // and test against initial values again
- NSString *val7 = [test kwyjibo];
- STAssertNotNil(val7, nil);
- NSString *val8 = [test eatMyShorts];
- STAssertNotNil(val8, nil);
- STAssertEqualStrings(val1, val7, nil);
- STAssertEqualStrings(val2, val8, nil);
-
- method_exchangeImplementations(list[0], nil);
- method_exchangeImplementations(nil, list[0]);
-
- val7 = [test kwyjibo];
- STAssertNotNil(val7, nil);
- val8 = [test eatMyShorts];
- STAssertNotNil(val8, nil);
- STAssertEqualStrings(val1, val7, nil);
- STAssertEqualStrings(val2, val8, nil);
-
- free(list);
- [test release];
-}
-
-- (void)test_method_getImplementation {
- // Nil Checks
- STAssertNULL(method_getImplementation(nil), nil);
-
- // Standard use check
- Method *list = class_copyMethodList(cls_, nil);
- STAssertNotNULL(list, nil);
- STAssertNotNULL(method_getImplementation(list[0]), nil);
- free(list);
-}
-
-- (void)test_method_setImplementation {
- // Standard use check
- GTMObjC2Runtime_TestClass *test = [[GTMObjC2Runtime_TestClass alloc] init];
- Method *list = class_copyMethodList(cls_, nil);
-
- // Get initial value
- NSString *str1 = objc_msgSend(test, method_getName(list[0]));
- STAssertNotNil(str1, nil);
-
- // set the imp to something else
- IMP oldImp = method_setImplementation(list[0], method_getImplementation(list[1]));
- STAssertNotNULL(oldImp, nil);
-
- // make sure they are different
- NSString *str2 = objc_msgSend(test,method_getName(list[0]));
- STAssertNotNil(str2, nil);
- STAssertNotEqualStrings(str1, str2, nil);
-
- // reset the imp
- IMP newImp = method_setImplementation(list[0], oldImp);
- STAssertNotEquals(oldImp, newImp, nil);
-
- // test nils
- // Apparently it was a bug that we could call setImplementation with a nil
- // so we now test to make sure that setting to nil works as expected on
- // all systems.
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
- // Built for less then leopard gives us the behaviors we defined...
- // (doesn't take nil)
- IMP nullImp = method_setImplementation(list[0], nil);
- STAssertNULL(nullImp, nil);
- IMP testImp = method_setImplementation(list[0], newImp);
- STAssertEquals(testImp, oldImp, nil);
-#else
- // Built for leopard or later means we get the os runtime behavior...
- if ([GTMSystemVersion isLeopard]) {
- // (takes nil)
- oldImp = method_setImplementation(list[0], nil);
- STAssertNotNULL(oldImp, nil);
- newImp = method_setImplementation(list[0], oldImp);
- STAssertNULL(newImp, nil);
- } else {
- // (doesn't take nil)
- IMP nullImp = method_setImplementation(list[0], nil);
- STAssertNULL(nullImp, nil);
- IMP testImp = method_setImplementation(list[0], newImp);
- STAssertEquals(testImp, oldImp, nil);
- }
-#endif
-
- // This case intentionally not tested. Passing nil to method_setImplementation
- // on Leopard crashes. It does on Tiger as well. Half works on SnowLeopard.
- // We made our Tiger implementation the same as the SnowLeopard
- // implementation.
- // Logged as radar 5572981.
- if (![GTMSystemVersion isLeopardOrGreater]) {
- STAssertNULL(method_setImplementation(nil, nil), nil);
- }
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- if ([GTMSystemVersion isSnowLeopardOrGreater]) {
- STAssertNULL(method_setImplementation(nil, newImp), nil);
- }
-#endif
-
- [test release];
- free(list);
-}
-
-- (void)test_protocol_getMethodDescription {
- // Check nil cases
- struct objc_method_description desc = protocol_getMethodDescription(nil, nil,
- YES, YES);
- STAssertNULL(desc.name, nil);
- desc = protocol_getMethodDescription(nil, @selector(optional), YES, YES);
- STAssertNULL(desc.name, nil);
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- nil, YES, YES);
- STAssertNULL(desc.name, nil);
-
- // Instance Methods
- // Check Required case. Only OBJC2 supports required.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(optional), YES, YES);
-#if OBJC_API_VERSION >= 2
- STAssertNULL(desc.name, nil);
-#else
- STAssertNotNULL(desc.name, nil);
-#endif
-
- // Check Required case. Only OBJC2 supports required.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(required), YES, YES);
-
- STAssertNotNULL(desc.name, nil);
-
- // Check Optional case. Only OBJC2 supports optional.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(optional), NO, YES);
-
- STAssertNotNULL(desc.name, nil);
-
- // Check Optional case. Only OBJC2 supports optional.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(required), NO, YES);
-#if OBJC_API_VERSION >= 2
- STAssertNULL(desc.name, nil);
-#else
- STAssertNotNULL(desc.name, nil);
-#endif
-
- // Class Methods
- // Check Required case. Only OBJC2 supports required.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(class_optional), YES, NO);
-#if OBJC_API_VERSION >= 2
- STAssertNULL(desc.name, nil);
-#else
- STAssertNotNULL(desc.name, nil);
-#endif
-
- // Check Required case. Only OBJC2 supports required.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(class_required), YES, NO);
-
- STAssertNotNULL(desc.name, nil);
-
- // Check Optional case. Only OBJC2 supports optional.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(class_optional), NO, NO);
-
- STAssertNotNULL(desc.name, nil);
-
- // Check Optional case. Only OBJC2 supports optional.
- desc = protocol_getMethodDescription(@protocol(GTMObjC2Runtime_Test2Protocol),
- @selector(class_required), NO, NO);
-#if OBJC_API_VERSION >= 2
- STAssertNULL(desc.name, nil);
-#else
- STAssertNotNULL(desc.name, nil);
-#endif
-
-}
-
-- (void)test_sel_isEqual {
- STAssertTrue(sel_isEqual(@selector(kwyjibo), @selector(kwyjibo)), nil);
- STAssertFalse(sel_isEqual(@selector(kwyjibo), @selector(dontHaveACow)), nil);
- STAssertTrue(sel_isEqual(_cmd, @selector(test_sel_isEqual)), nil);
- STAssertTrue(sel_isEqual(_cmd, _cmd), nil);
- STAssertFalse(sel_isEqual(_cmd, @selector(kwyjibo)), nil);
-}
-
-@end
diff --git a/Foundation/GTMPathTest.m b/Foundation/GTMPathTest.m
index 54fa83b..dff1f02 100644
--- a/Foundation/GTMPathTest.m
+++ b/Foundation/GTMPathTest.m
@@ -18,7 +18,6 @@
#import "GTMSenTestCase.h"
#import "GTMPath.h"
-#import "GTMUnitTestDevLog.h"
#import "GTMNSFileHandle+UniqueName.h"
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
diff --git a/Foundation/GTMRegex.m b/Foundation/GTMRegex.m
index 238ca48..7ac4665 100644
--- a/Foundation/GTMRegex.m
+++ b/Foundation/GTMRegex.m
@@ -133,7 +133,7 @@ static NSString *const kReplacementPattern =
- (id)initWithPattern:(NSString *)pattern
options:(GTMRegexOptions)options
withError:(NSError **)outErrorOrNULL {
-
+
self = [super init];
if (!self) return nil;
@@ -275,7 +275,7 @@ static NSString *const kReplacementPattern =
- (NSString *)firstSubStringMatchedInString:(NSString *)str {
NSString *result = nil;
-
+
regmatch_t regMatch;
const char *utf8Str = [str UTF8String];
if ([self runRegexOnUTF8:utf8Str
@@ -380,7 +380,7 @@ static NSString *const kReplacementPattern =
} else {
// spin over the split up replacement
GTMRegexStringSegment *replacementSegment = nil;
- GTM_FOREACH_OBJECT(replacementSegment, replacements) {
+ for (replacementSegment in replacements) {
if (![replacementSegment isMatch]) {
// not a match, raw text to put in
[result appendString:[replacementSegment string]];
@@ -687,14 +687,14 @@ static NSString *const kReplacementPattern =
return nil;
// pick off when it wasn't found
- if ((regMatches_[patternIndex].rm_so == -1) &&
+ if ((regMatches_[patternIndex].rm_so == -1) &&
(regMatches_[patternIndex].rm_eo == -1))
return nil;
// fetch the string
- const char *base = (const char*)[utf8StrBuf_ bytes]
+ const char *base = (const char*)[utf8StrBuf_ bytes]
+ regMatches_[patternIndex].rm_so;
- regoff_t len = regMatches_[patternIndex].rm_eo
+ regoff_t len = regMatches_[patternIndex].rm_eo
- regMatches_[patternIndex].rm_so;
return [[[NSString alloc] initWithBytes:base
length:(NSUInteger)len
@@ -707,7 +707,7 @@ static NSString *const kReplacementPattern =
[self class], self, (isMatch_ ? "YES" : "NO")];
for (NSUInteger x = 0; x <= numRegMatches_; ++x) {
int length = (int)(regMatches_[x].rm_eo - regMatches_[x].rm_so);
- const char* string
+ const char* string
= (((const char*)[utf8StrBuf_ bytes]) + regMatches_[x].rm_so);
if (x == 0) {
[result appendFormat:@" \"%.*s\"", length , string];
diff --git a/Foundation/GTMRegexTest.m b/Foundation/GTMRegexTest.m
index 6f41d60..65aadd5 100644
--- a/Foundation/GTMRegexTest.m
+++ b/Foundation/GTMRegexTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -18,7 +18,6 @@
#import "GTMSenTestCase.h"
#import "GTMRegex.h"
-#import "GTMUnitTestDevLog.h"
//
// NOTE:
@@ -36,104 +35,97 @@
@implementation GTMRegexTest
- (void)testEscapedPatternForString {
- STAssertEqualStrings([GTMRegex escapedPatternForString:@"abcdefghijklmnopqrstuvwxyz0123456789"],
- @"abcdefghijklmnopqrstuvwxyz0123456789",
- nil);
- STAssertEqualStrings([GTMRegex escapedPatternForString:@"^.[$()|*+?{\\"],
- @"\\^\\.\\[\\$\\(\\)\\|\\*\\+\\?\\{\\\\",
- nil);
- STAssertEqualStrings([GTMRegex escapedPatternForString:@"a^b.c[d$e(f)g|h*i+j?k{l\\m"],
- @"a\\^b\\.c\\[d\\$e\\(f\\)g\\|h\\*i\\+j\\?k\\{l\\\\m",
- nil);
-
- STAssertNil([GTMRegex escapedPatternForString:nil], nil);
- STAssertEqualStrings([GTMRegex escapedPatternForString:@""], @"", nil);
+ XCTAssertEqualStrings([GTMRegex escapedPatternForString:@"abcdefghijklmnopqrstuvwxyz0123456789"],
+ @"abcdefghijklmnopqrstuvwxyz0123456789");
+ XCTAssertEqualStrings([GTMRegex escapedPatternForString:@"^.[$()|*+?{\\"],
+ @"\\^\\.\\[\\$\\(\\)\\|\\*\\+\\?\\{\\\\");
+ XCTAssertEqualStrings([GTMRegex escapedPatternForString:@"a^b.c[d$e(f)g|h*i+j?k{l\\m"],
+ @"a\\^b\\.c\\[d\\$e\\(f\\)g\\|h\\*i\\+j\\?k\\{l\\\\m");
+
+ XCTAssertNil([GTMRegex escapedPatternForString:nil]);
+ XCTAssertEqualStrings([GTMRegex escapedPatternForString:@""], @"");
}
- (void)testInit {
// fail cases
- STAssertNil([[[GTMRegex alloc] init] autorelease], nil);
- STAssertNil([[[GTMRegex alloc] initWithPattern:nil] autorelease], nil);
- STAssertNil([[[GTMRegex alloc] initWithPattern:nil
- options:kGTMRegexOptionIgnoreCase] autorelease], nil);
- [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
- STAssertNil([[[GTMRegex alloc] initWithPattern:@"(."] autorelease], nil);
- [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
- STAssertNil([[[GTMRegex alloc] initWithPattern:@"(."
- options:kGTMRegexOptionIgnoreCase] autorelease], nil);
+ XCTAssertNil([[[GTMRegex alloc] init] autorelease]);
+ XCTAssertNil([[[GTMRegex alloc] initWithPattern:nil] autorelease]);
+ XCTAssertNil([[[GTMRegex alloc] initWithPattern:nil
+ options:kGTMRegexOptionIgnoreCase] autorelease]);
+ XCTAssertNil([[[GTMRegex alloc] initWithPattern:@"(."] autorelease]);
+ XCTAssertNil([[[GTMRegex alloc] initWithPattern:@"(."
+ options:kGTMRegexOptionIgnoreCase] autorelease]);
// fail cases w/ error param
NSError *error = nil;
- STAssertNil([[[GTMRegex alloc] initWithPattern:nil
- options:kGTMRegexOptionIgnoreCase
- withError:&error] autorelease], nil);
- STAssertNil(error, @"no pattern, shouldn't get error object");
- STAssertNil([[[GTMRegex alloc] initWithPattern:@"(."
- options:kGTMRegexOptionIgnoreCase
- withError:&error] autorelease], nil);
- STAssertNotNil(error, nil);
- STAssertEqualObjects([error domain], kGTMRegexErrorDomain, nil);
- STAssertEquals([error code], (NSInteger)kGTMRegexPatternParseFailedError, nil);
+ XCTAssertNil([[[GTMRegex alloc] initWithPattern:nil
+ options:kGTMRegexOptionIgnoreCase
+ withError:&error] autorelease]);
+ XCTAssertNil(error, @"no pattern, shouldn't get error object");
+ XCTAssertNil([[[GTMRegex alloc] initWithPattern:@"(."
+ options:kGTMRegexOptionIgnoreCase
+ withError:&error] autorelease]);
+ XCTAssertNotNil(error);
+ XCTAssertEqualObjects([error domain], kGTMRegexErrorDomain);
+ XCTAssertEqual([error code], (NSInteger)kGTMRegexPatternParseFailedError);
NSDictionary *userInfo = [error userInfo];
- STAssertNotNil(userInfo, @"failed to get userInfo from error");
- STAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.", nil);
- STAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString], nil);
+ XCTAssertNotNil(userInfo, @"failed to get userInfo from error");
+ XCTAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.");
+ XCTAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString]);
// basic pattern w/ options
- STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"] autorelease], nil);
- STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
- options:0] autorelease], nil);
- STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
- options:kGTMRegexOptionIgnoreCase] autorelease], nil);
+ XCTAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"] autorelease]);
+ XCTAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
+ options:0] autorelease]);
+ XCTAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
+ options:kGTMRegexOptionIgnoreCase] autorelease]);
error = nil;
- STAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
- options:kGTMRegexOptionIgnoreCase
- withError:&error] autorelease], nil);
- STAssertNil(error, @"shouldn't have been any error");
+ XCTAssertNotNil([[[GTMRegex alloc] initWithPattern:@"(.*)"
+ options:kGTMRegexOptionIgnoreCase
+ withError:&error] autorelease]);
+ XCTAssertNil(error, @"shouldn't have been any error");
// fail cases (helper)
- STAssertNil([GTMRegex regexWithPattern:nil], nil);
- STAssertNil([GTMRegex regexWithPattern:nil
- options:0], nil);
- [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
- STAssertNil([GTMRegex regexWithPattern:@"(."], nil);
- [GTMUnitTestDevLog expectString:@"Invalid pattern \"(.\", error: \"parentheses not balanced\""];
- STAssertNil([GTMRegex regexWithPattern:@"(."
- options:0], nil);
+ XCTAssertNil([GTMRegex regexWithPattern:nil]);
+ XCTAssertNil([GTMRegex regexWithPattern:nil
+ options:0]);
+ XCTAssertNil([GTMRegex regexWithPattern:@"(."]);
+ XCTAssertNil([GTMRegex regexWithPattern:@"(."
+ options:0]);
// fail cases (helper) w/ error param
- STAssertNil([GTMRegex regexWithPattern:nil
- options:kGTMRegexOptionIgnoreCase
- withError:&error], nil);
- STAssertNil(error, @"no pattern, shouldn't get error object");
- STAssertNil([GTMRegex regexWithPattern:@"(."
- options:kGTMRegexOptionIgnoreCase
- withError:&error], nil);
- STAssertNotNil(error, nil);
- STAssertEqualObjects([error domain], kGTMRegexErrorDomain, nil);
- STAssertEquals([error code], (NSInteger)kGTMRegexPatternParseFailedError, nil);
+ XCTAssertNil([GTMRegex regexWithPattern:nil
+ options:kGTMRegexOptionIgnoreCase
+ withError:&error]);
+ XCTAssertNil(error, @"no pattern, shouldn't get error object");
+ XCTAssertNil([GTMRegex regexWithPattern:@"(."
+ options:kGTMRegexOptionIgnoreCase
+ withError:&error]);
+ XCTAssertNotNil(error);
+ XCTAssertEqualObjects([error domain], kGTMRegexErrorDomain);
+ XCTAssertEqual([error code], (NSInteger)kGTMRegexPatternParseFailedError);
userInfo = [error userInfo];
- STAssertNotNil(userInfo, @"failed to get userInfo from error");
- STAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.", nil);
- STAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString], nil);
-
+ XCTAssertNotNil(userInfo, @"failed to get userInfo from error");
+ XCTAssertEqualObjects([userInfo objectForKey:kGTMRegexPatternErrorPattern], @"(.");
+ XCTAssertNotNil([userInfo objectForKey:kGTMRegexPatternErrorErrorString]);
+
// basic pattern w/ options (helper)
- STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"], nil);
- STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
- options:0], nil);
- STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
- options:kGTMRegexOptionIgnoreCase], nil);
+ XCTAssertNotNil([GTMRegex regexWithPattern:@"(.*)"]);
+ XCTAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
+ options:0]);
+ XCTAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
+ options:kGTMRegexOptionIgnoreCase]);
error = nil;
- STAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
- options:kGTMRegexOptionIgnoreCase
- withError:&error], nil);
- STAssertNil(error, @"shouldn't have been any error");
-
+ XCTAssertNotNil([GTMRegex regexWithPattern:@"(.*)"
+ options:kGTMRegexOptionIgnoreCase
+ withError:&error]);
+ XCTAssertNil(error, @"shouldn't have been any error");
+
// not really a test on GTMRegex, but make sure we block attempts to directly
// alloc/init a GTMRegexStringSegment.
- STAssertThrowsSpecificNamed([[[GTMRegexStringSegment alloc] init] autorelease],
- NSException, NSInvalidArgumentException,
- @"shouldn't have been able to alloc/init a GTMRegexStringSegment");
+ XCTAssertThrowsSpecificNamed([[[GTMRegexStringSegment alloc] init] autorelease],
+ NSException, NSInvalidArgumentException,
+ @"shouldn't have been able to alloc/init a GTMRegexStringSegment");
}
- (void)testOptions {
@@ -142,767 +134,759 @@
// default options
GTMRegex *regex = [GTMRegex regexWithPattern:@"a+"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
NSEnumerator *enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa"
GTMRegexStringSegment *seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
// " AAA\nbbb BBB\n "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @" AAA\nbbb BBB\n ");
// "aaa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
// " "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @" ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @" ");
// "a"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "A"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"A", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"A");
// "a"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "\n bbb BbB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"\n bbb BbB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"\n bbb BbB");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// kGTMRegexOptionIgnoreCase
regex = [GTMRegex regexWithPattern:@"a+" options:kGTMRegexOptionIgnoreCase];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
// " "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @" ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @" ");
// "AAA"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"AAA", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"AAA");
// "\nbbb BBB\n "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"\nbbb BBB\n ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"\nbbb BBB\n ");
// "aaa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
// " "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @" ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @" ");
// "aAa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aAa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aAa");
// "\n bbb BbB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"\n bbb BbB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"\n bbb BbB");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// defaults w/ '^'
regex = [GTMRegex regexWithPattern:@"^a+"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
// " AAA\nbbb BBB\n aaa aAa\n bbb BbB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// defaults w/ '$'
regex = [GTMRegex regexWithPattern:@"B+$"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa AAA\nbbb "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa AAA\nbbb ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa AAA\nbbb ");
// "BBB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"BBB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"BBB");
// "\n aaa aAa\n bbb Bb"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"\n aaa aAa\n bbb Bb", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"\n aaa aAa\n bbb Bb");
// "B"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"B", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"B");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// kGTMRegexOptionIgnoreCase w/ '$'
regex = [GTMRegex regexWithPattern:@"B+$"
- options:kGTMRegexOptionIgnoreCase];
- STAssertNotNil(regex, nil);
+ options:kGTMRegexOptionIgnoreCase];
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa AAA\nbbb "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa AAA\nbbb ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa AAA\nbbb ");
// "BBB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"BBB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"BBB");
// "\n aaa aAa\n bbb "
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"\n aaa aAa\n bbb ", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"\n aaa aAa\n bbb ");
// "BbB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"BbB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"BbB");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test w/ kGTMRegexOptionSupressNewlineSupport and \n in the string
regex = [GTMRegex regexWithPattern:@"a.*b" options:kGTMRegexOptionSupressNewlineSupport];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb");
// "B"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"B", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"B");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test w/o kGTMRegexOptionSupressNewlineSupport and \n in the string
// (this is no match since it '.' can't match the '\n')
regex = [GTMRegex regexWithPattern:@"a.*b"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb BbB");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
-
+ XCTAssertNil(seg);
+
// kGTMRegexOptionSupressNewlineSupport w/ '^'
regex = [GTMRegex regexWithPattern:@"^a+" options:kGTMRegexOptionSupressNewlineSupport];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
// " AAA\nbbb BBB\n aaa aAa\n bbb BbB"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @" AAA\nbbb BBB\n aaa aAa\n bbb BbB");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// kGTMRegexOptionSupressNewlineSupport w/ '$'
regex = [GTMRegex regexWithPattern:@"B+$" options:kGTMRegexOptionSupressNewlineSupport];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:testString];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa AAA\nbbb BBB\n aaa aAa\n bbb Bb");
// "B"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"B", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"B");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
}
- (void)testSubPatternCount {
- STAssertEquals((NSUInteger)0, [[GTMRegex regexWithPattern:@".*"] subPatternCount], nil);
- STAssertEquals((NSUInteger)1, [[GTMRegex regexWithPattern:@"(.*)"] subPatternCount], nil);
- STAssertEquals((NSUInteger)1, [[GTMRegex regexWithPattern:@"[fo]*(.*)[bar]*"] subPatternCount], nil);
- STAssertEquals((NSUInteger)3, [[GTMRegex regexWithPattern:@"([fo]*)(.*)([bar]*)"] subPatternCount], nil);
- STAssertEquals((NSUInteger)7, [[GTMRegex regexWithPattern:@"(([bar]*)|([fo]*))(.*)(([bar]*)|([fo]*))"] subPatternCount], nil);
+ XCTAssertEqual((NSUInteger)0, [[GTMRegex regexWithPattern:@".*"] subPatternCount]);
+ XCTAssertEqual((NSUInteger)1, [[GTMRegex regexWithPattern:@"(.*)"] subPatternCount]);
+ XCTAssertEqual((NSUInteger)1, [[GTMRegex regexWithPattern:@"[fo]*(.*)[bar]*"] subPatternCount]);
+ XCTAssertEqual((NSUInteger)3,
+ [[GTMRegex regexWithPattern:@"([fo]*)(.*)([bar]*)"] subPatternCount]);
+ XCTAssertEqual((NSUInteger)7,
+ [[GTMRegex regexWithPattern:@"(([bar]*)|([fo]*))(.*)(([bar]*)|([fo]*))"] subPatternCount]);
}
- (void)testMatchesString {
// simple pattern
GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"];
- STAssertNotNil(regex, nil);
- STAssertTrue([regex matchesString:@"foobar"], nil);
- STAssertTrue([regex matchesString:@"foobydoo spambar"], nil);
- STAssertFalse([regex matchesString:@"zzfoobarzz"], nil);
- STAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"], nil);
- STAssertFalse([regex matchesString:@"abcdef"], nil);
- STAssertFalse([regex matchesString:@""], nil);
- STAssertFalse([regex matchesString:nil], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertTrue([regex matchesString:@"foobar"]);
+ XCTAssertTrue([regex matchesString:@"foobydoo spambar"]);
+ XCTAssertFalse([regex matchesString:@"zzfoobarzz"]);
+ XCTAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"]);
+ XCTAssertFalse([regex matchesString:@"abcdef"]);
+ XCTAssertFalse([regex matchesString:@""]);
+ XCTAssertFalse([regex matchesString:nil]);
// pattern w/ sub patterns
regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
- STAssertNotNil(regex, nil);
- STAssertTrue([regex matchesString:@"foobar"], nil);
- STAssertTrue([regex matchesString:@"foobydoo spambar"], nil);
- STAssertFalse([regex matchesString:@"zzfoobarzz"], nil);
- STAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"], nil);
- STAssertFalse([regex matchesString:@"abcdef"], nil);
- STAssertFalse([regex matchesString:@""], nil);
- STAssertFalse([regex matchesString:nil], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertTrue([regex matchesString:@"foobar"]);
+ XCTAssertTrue([regex matchesString:@"foobydoo spambar"]);
+ XCTAssertFalse([regex matchesString:@"zzfoobarzz"]);
+ XCTAssertFalse([regex matchesString:@"zzfoobydoo spambarzz"]);
+ XCTAssertFalse([regex matchesString:@"abcdef"]);
+ XCTAssertFalse([regex matchesString:@""]);
+ XCTAssertFalse([regex matchesString:nil]);
}
- (void)testSubPatternsOfString {
GTMRegex *regex = [GTMRegex regexWithPattern:@"(fo(o+))((bar)|(baz))"];
- STAssertNotNil(regex, nil);
- STAssertEquals((NSUInteger)5, [regex subPatternCount], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertEqual((NSUInteger)5, [regex subPatternCount]);
NSArray *subPatterns = [regex subPatternsOfString:@"foooooobaz"];
- STAssertNotNil(subPatterns, nil);
- STAssertEquals((NSUInteger)6, [subPatterns count], nil);
- STAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0], nil);
- STAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1], nil);
- STAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2], nil);
- STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3], nil);
- STAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4], nil);
- STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5], nil);
+ XCTAssertNotNil(subPatterns);
+ XCTAssertEqual((NSUInteger)6, [subPatterns count]);
+ XCTAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0]);
+ XCTAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1]);
+ XCTAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2]);
+ XCTAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3]);
+ XCTAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4]);
+ XCTAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5]);
// not there
subPatterns = [regex subPatternsOfString:@"aaa"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
// not extra stuff on either end
subPatterns = [regex subPatternsOfString:@"ZZZfoooooobaz"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
subPatterns = [regex subPatternsOfString:@"foooooobazZZZ"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
subPatterns = [regex subPatternsOfString:@"ZZZfoooooobazZZZ"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
}
- (void)testFirstSubStringMatchedInString {
// simple pattern
GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"];
- STAssertNotNil(regex, nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"],
- @"foobar", nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"],
- @"foobydoo spambar", nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"],
- @"foobar", nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"],
- @"foobydoo spambar", nil);
- STAssertNil([regex firstSubStringMatchedInString:@"abcdef"], nil);
- STAssertNil([regex firstSubStringMatchedInString:@""], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"],
+ @"foobar");
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"],
+ @"foobydoo spambar");
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"],
+ @"foobar");
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"],
+ @"foobydoo spambar");
+ XCTAssertNil([regex firstSubStringMatchedInString:@"abcdef"]);
+ XCTAssertNil([regex firstSubStringMatchedInString:@""]);
// pattern w/ sub patterns
regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
- STAssertNotNil(regex, nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"],
- @"foobar", nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"],
- @"foobydoo spambar", nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"],
- @"foobar", nil);
- STAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"],
- @"foobydoo spambar", nil);
- STAssertNil([regex firstSubStringMatchedInString:@"abcdef"], nil);
- STAssertNil([regex firstSubStringMatchedInString:@""], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"foobar"],
+ @"foobar");
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"foobydoo spambar"],
+ @"foobydoo spambar");
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobarzz"],
+ @"foobar");
+ XCTAssertEqualStrings([regex firstSubStringMatchedInString:@"zzfoobydoo spambarzz"],
+ @"foobydoo spambar");
+ XCTAssertNil([regex firstSubStringMatchedInString:@"abcdef"]);
+ XCTAssertNil([regex firstSubStringMatchedInString:@""]);
}
- (void)testMatchesSubStringInString {
// simple pattern
GTMRegex *regex = [GTMRegex regexWithPattern:@"foo.*bar"];
- STAssertNotNil(regex, nil);
- STAssertTrue([regex matchesSubStringInString:@"foobar"], nil);
- STAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"], nil);
- STAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"], nil);
- STAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"], nil);
- STAssertFalse([regex matchesSubStringInString:@"abcdef"], nil);
- STAssertFalse([regex matchesSubStringInString:@""], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertTrue([regex matchesSubStringInString:@"foobar"]);
+ XCTAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"]);
+ XCTAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"]);
+ XCTAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"]);
+ XCTAssertFalse([regex matchesSubStringInString:@"abcdef"]);
+ XCTAssertFalse([regex matchesSubStringInString:@""]);
// pattern w/ sub patterns
regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
- STAssertNotNil(regex, nil);
- STAssertTrue([regex matchesSubStringInString:@"foobar"], nil);
- STAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"], nil);
- STAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"], nil);
- STAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"], nil);
- STAssertFalse([regex matchesSubStringInString:@"abcdef"], nil);
- STAssertFalse([regex matchesSubStringInString:@""], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertTrue([regex matchesSubStringInString:@"foobar"]);
+ XCTAssertTrue([regex matchesSubStringInString:@"foobydoo spambar"]);
+ XCTAssertTrue([regex matchesSubStringInString:@"zzfoobarzz"]);
+ XCTAssertTrue([regex matchesSubStringInString:@"zzfoobydoo spambarzz"]);
+ XCTAssertFalse([regex matchesSubStringInString:@"abcdef"]);
+ XCTAssertFalse([regex matchesSubStringInString:@""]);
}
- (void)testSegmentEnumeratorForString {
GTMRegex *regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
- STAssertNotNil(regex, nil);
-
+ XCTAssertNotNil(regex);
+
// test odd input
NSEnumerator *enumerator = [regex segmentEnumeratorForString:@""];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
enumerator = [regex segmentEnumeratorForString:nil];
- STAssertNil(enumerator, nil);
-
+ XCTAssertNil(enumerator);
+
// on w/ the normal tests
enumerator = [regex segmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "a"
GTMRegexStringSegment *seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "b"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"b", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"b");
// "fooobaar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"fooobaar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"fooobaar");
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "zz"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"zz", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"zz");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test no match
enumerator = [regex segmentEnumeratorForString:@"aaa"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test only match
enumerator = [regex segmentEnumeratorForString:@"foobar"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// now test the saved sub segments
regex = [GTMRegex regexWithPattern:@"(foo)((bar)|(baz))"];
- STAssertNotNil(regex, nil);
- STAssertEquals((NSUInteger)4, [regex subPatternCount], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertEqual((NSUInteger)4, [regex subPatternCount]);
enumerator = [regex segmentEnumeratorForString:@"foobarxxfoobaz"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
- STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
- STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"bar");
+ XCTAssertEqualStrings([seg subPatternString:3], @"bar");
+ XCTAssertNil([seg subPatternString:4]); // nothing matched "(baz)"
+ XCTAssertNil([seg subPatternString:5]);
// "xx"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"xx", nil);
- STAssertEqualStrings([seg subPatternString:0], @"xx", nil);
- STAssertNil([seg subPatternString:1], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"xx");
+ XCTAssertEqualStrings([seg subPatternString:0], @"xx");
+ XCTAssertNil([seg subPatternString:1]);
// "foobaz"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
- STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
- STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"baz");
+ XCTAssertNil([seg subPatternString:3]); // (nothing matched "(bar)"
+ XCTAssertEqualStrings([seg subPatternString:4], @"baz");
+ XCTAssertNil([seg subPatternString:5]);
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test all objects
regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
NSArray *allSegments = [enumerator allObjects];
- STAssertNotNil(allSegments, nil);
- STAssertEquals((NSUInteger)6, [allSegments count], nil);
+ XCTAssertNotNil(allSegments);
+ XCTAssertEqual((NSUInteger)6, [allSegments count]);
// test we are getting the flags right for newline
regex = [GTMRegex regexWithPattern:@"^a"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:@"aa\naa"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "a"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "a\n"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a\n", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a\n");
// "a"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "a"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test we are getting the flags right for newline, part 2
regex = [GTMRegex regexWithPattern:@"^a*$"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:@"aa\naa\nbb\naa"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aa");
// "\n"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"\n", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"\n");
// "aa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aa");
// "\nbb\n"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"\nbb\n", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"\nbb\n");
// "aa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aa");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// make sure the enum cleans up if not walked to the end
regex = [GTMRegex regexWithPattern:@"b+"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex segmentEnumeratorForString:@"aabbcc"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aa");
// and done w/o walking the rest
}
- (void)testMatchSegmentEnumeratorForString {
GTMRegex *regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
// test odd input
NSEnumerator *enumerator = [regex matchSegmentEnumeratorForString:@""];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
enumerator = [regex matchSegmentEnumeratorForString:nil];
- STAssertNil(enumerator, nil);
-
+ XCTAssertNil(enumerator);
+
// on w/ the normal tests
enumerator = [regex matchSegmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "a" - skipped
// "foobar"
GTMRegexStringSegment *seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "b" - skipped
// "fooobaar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"fooobaar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"fooobaar");
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "zz" - skipped
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test no match
enumerator = [regex matchSegmentEnumeratorForString:@"aaa"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNil(seg, nil); // should have gotten nothing
+ XCTAssertNil(seg); // should have gotten nothing
// test only match
enumerator = [regex matchSegmentEnumeratorForString:@"foobar"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// now test the saved sub segments
regex = [GTMRegex regexWithPattern:@"(foo)((bar)|(baz))"];
- STAssertNotNil(regex, nil);
- STAssertEquals((NSUInteger)4, [regex subPatternCount], nil);
+ XCTAssertNotNil(regex);
+ XCTAssertEqual((NSUInteger)4, [regex subPatternCount]);
enumerator = [regex matchSegmentEnumeratorForString:@"foobarxxfoobaz"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
- STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
- STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"bar");
+ XCTAssertEqualStrings([seg subPatternString:3], @"bar");
+ XCTAssertNil([seg subPatternString:4]); // nothing matched "(baz)"
+ XCTAssertNil([seg subPatternString:5]);
// "xx" - skipped
// "foobaz"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
- STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
- STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"baz");
+ XCTAssertNil([seg subPatternString:3]); // (nothing matched "(bar)"
+ XCTAssertEqualStrings([seg subPatternString:4], @"baz");
+ XCTAssertNil([seg subPatternString:5]);
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test all objects
regex = [GTMRegex regexWithPattern:@"foo+ba+r"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex matchSegmentEnumeratorForString:@"afoobarbfooobaarfoobarzz"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
NSArray *allSegments = [enumerator allObjects];
- STAssertNotNil(allSegments, nil);
- STAssertEquals((NSUInteger)3, [allSegments count], nil);
-
+ XCTAssertNotNil(allSegments);
+ XCTAssertEqual((NSUInteger)3, [allSegments count]);
+
// test we are getting the flags right for newline
regex = [GTMRegex regexWithPattern:@"^a"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex matchSegmentEnumeratorForString:@"aa\naa"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "a"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "a\n" - skipped
// "a"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "a" - skipped
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test we are getting the flags right for newline, part 2
regex = [GTMRegex regexWithPattern:@"^a*$"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
enumerator = [regex matchSegmentEnumeratorForString:@"aa\naa\nbb\naa"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "aa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aa");
// "\n" - skipped
// "aa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aa");
// "\nbb\n" - skipped
// "aa"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aa");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
}
- (void)testStringByReplacingMatchesInStringWithReplacement {
GTMRegex *regex = [GTMRegex regexWithPattern:@"(foo)(.*)(bar)"];
- STAssertNotNil(regex, nil);
+ XCTAssertNotNil(regex);
// the basics
- STAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies",
- [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
- withReplacement:@"Z\\3Z\\2Z\\1Z"],
- nil);
+ XCTAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies",
+ [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
+ withReplacement:@"Z\\3Z\\2Z\\1Z"]);
// nil/empty replacement
- STAssertEqualStrings(@"weedoggies",
- [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
- withReplacement:nil],
- nil);
- STAssertEqualStrings(@"weedoggies",
- [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
- withReplacement:@""],
- nil);
- STAssertEqualStrings(@"",
- [regex stringByReplacingMatchesInString:@""
- withReplacement:@"abc"],
- nil);
- STAssertNil([regex stringByReplacingMatchesInString:nil
- withReplacement:@"abc"],
- nil);
+ XCTAssertEqualStrings(@"weedoggies",
+ [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
+ withReplacement:nil]);
+ XCTAssertEqualStrings(@"weedoggies",
+ [regex stringByReplacingMatchesInString:@"weefoobydoo spambardoggies"
+ withReplacement:@""]);
+ XCTAssertEqualStrings(@"",
+ [regex stringByReplacingMatchesInString:@""
+ withReplacement:@"abc"]);
+ XCTAssertNil([regex stringByReplacingMatchesInString:nil
+ withReplacement:@"abc"]);
// use optional and invale subexpression parts to confirm that works
regex = [GTMRegex regexWithPattern:@"(fo(o+))((bar)|(baz))"];
- STAssertNotNil(regex, nil);
- STAssertEqualStrings(@"aaa baz bar bar foo baz aaa",
- [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa"
- withReplacement:@"\\4\\5"],
- nil);
- STAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa",
- [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa"
- withReplacement:@"Z\\10Z\\12Z"],
- nil);
+ XCTAssertNotNil(regex);
+ XCTAssertEqualStrings(@"aaa baz bar bar foo baz aaa",
+ [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa"
+ withReplacement:@"\\4\\5"]);
+ XCTAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa",
+ [regex stringByReplacingMatchesInString:@"aaa foooooobaz fooobar bar foo baz aaa"
+ withReplacement:@"Z\\10Z\\12Z"]);
// test slashes in replacement that aren't part of the subpattern reference
regex = [GTMRegex regexWithPattern:@"a+"];
- STAssertNotNil(regex, nil);
- STAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z",
- [regex stringByReplacingMatchesInString:@"zaz"
- withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"],
- nil);
- STAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az",
- [regex stringByReplacingMatchesInString:@"zaz"
- withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"],
- nil);
- STAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z",
- [regex stringByReplacingMatchesInString:@"zaz"
- withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"],
- nil);
+ XCTAssertNotNil(regex);
+ XCTAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z",
+ [regex stringByReplacingMatchesInString:@"zaz"
+ withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"]);
+ XCTAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az",
+ [regex stringByReplacingMatchesInString:@"zaz"
+ withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"]);
+ XCTAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z",
+ [regex stringByReplacingMatchesInString:@"zaz"
+ withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"]);
}
- (void)testDescriptions {
// default options
GTMRegex *regex = [GTMRegex regexWithPattern:@"a+"];
- STAssertNotNil(regex, nil);
- STAssertGreaterThan([[regex description] length], (NSUInteger)10,
- @"failed to get a reasonable description for regex");
+ XCTAssertNotNil(regex);
+ XCTAssertGreaterThan([[regex description] length], (NSUInteger)10,
+ @"failed to get a reasonable description for regex");
// enumerator
NSEnumerator *enumerator = [regex segmentEnumeratorForString:@"aaabbbccc"];
- STAssertNotNil(enumerator, nil);
- STAssertGreaterThan([[enumerator description] length], (NSUInteger)10,
- @"failed to get a reasonable description for regex enumerator");
+ XCTAssertNotNil(enumerator);
+ XCTAssertGreaterThan([[enumerator description] length], (NSUInteger)10,
+ @"failed to get a reasonable description for regex enumerator");
// string segment
GTMRegexStringSegment *seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertGreaterThan([[seg description] length], (NSUInteger)10,
- @"failed to get a reasonable description for regex string segment");
+ XCTAssertNotNil(seg);
+ XCTAssertGreaterThan([[seg description] length], (NSUInteger)10,
+ @"failed to get a reasonable description for regex string segment");
// regex w/ other options
regex = [GTMRegex regexWithPattern:@"a+"
options:(kGTMRegexOptionIgnoreCase | kGTMRegexOptionSupressNewlineSupport)];
- STAssertNotNil(regex, nil);
- STAssertGreaterThan([[regex description] length], (NSUInteger)10,
- @"failed to get a reasonable description for regex w/ options");
+ XCTAssertNotNil(regex);
+ XCTAssertGreaterThan([[regex description] length], (NSUInteger)10,
+ @"failed to get a reasonable description for regex w/ options");
}
@end
@@ -913,333 +897,324 @@
- (void)testMatchesPattern {
// simple pattern
- STAssertTrue([@"foobar" gtm_matchesPattern:@"foo.*bar"], nil);
- STAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"foo.*bar"], nil);
- STAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"foo.*bar"], nil);
- STAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"foo.*bar"], nil);
- STAssertFalse([@"abcdef" gtm_matchesPattern:@"foo.*bar"], nil);
- STAssertFalse([@"" gtm_matchesPattern:@"foo.*bar"], nil);
+ XCTAssertTrue([@"foobar" gtm_matchesPattern:@"foo.*bar"]);
+ XCTAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"foo.*bar"]);
+ XCTAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"foo.*bar"]);
+ XCTAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"foo.*bar"]);
+ XCTAssertFalse([@"abcdef" gtm_matchesPattern:@"foo.*bar"]);
+ XCTAssertFalse([@"" gtm_matchesPattern:@"foo.*bar"]);
// pattern w/ sub patterns
- STAssertTrue([@"foobar" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertFalse([@"abcdef" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertFalse([@"" gtm_matchesPattern:@"(foo)(.*)(bar)"], nil);
+ XCTAssertTrue([@"foobar" gtm_matchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertTrue([@"foobydoo spambar" gtm_matchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertFalse([@"zzfoobarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertFalse([@"zzfoobydoo spambarzz" gtm_matchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertFalse([@"abcdef" gtm_matchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertFalse([@"" gtm_matchesPattern:@"(foo)(.*)(bar)"]);
}
- (void)testSubPatternsOfPattern {
NSArray *subPatterns = [@"foooooobaz" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
- STAssertNotNil(subPatterns, nil);
- STAssertEquals((NSUInteger)6, [subPatterns count], nil);
- STAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0], nil);
- STAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1], nil);
- STAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2], nil);
- STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3], nil);
- STAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4], nil);
- STAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5], nil);
+ XCTAssertNotNil(subPatterns);
+ XCTAssertEqual((NSUInteger)6, [subPatterns count]);
+ XCTAssertEqualStrings(@"foooooobaz", [subPatterns objectAtIndex:0]);
+ XCTAssertEqualStrings(@"foooooo", [subPatterns objectAtIndex:1]);
+ XCTAssertEqualStrings(@"ooooo", [subPatterns objectAtIndex:2]);
+ XCTAssertEqualStrings(@"baz", [subPatterns objectAtIndex:3]);
+ XCTAssertEqualObjects([NSNull null], [subPatterns objectAtIndex:4]);
+ XCTAssertEqualStrings(@"baz", [subPatterns objectAtIndex:5]);
// not there
subPatterns = [@"aaa" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
// not extra stuff on either end
subPatterns = [@"ZZZfoooooobaz" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
subPatterns = [@"foooooobazZZZ" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
subPatterns = [@"ZZZfoooooobazZZZ" gtm_subPatternsOfPattern:@"(fo(o+))((bar)|(baz))"];
- STAssertNil(subPatterns, nil);
+ XCTAssertNil(subPatterns);
}
- (void)testFirstSubStringMatchedByPattern {
// simple pattern
- STAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
- @"foobar", nil);
- STAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
- @"foobydoo spambar", nil);
- STAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
- @"foobar", nil);
- STAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
- @"foobydoo spambar", nil);
- STAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], nil);
- STAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"foo.*bar"], nil);
+ XCTAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
+ @"foobar");
+ XCTAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
+ @"foobydoo spambar");
+ XCTAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
+ @"foobar");
+ XCTAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"foo.*bar"],
+ @"foobydoo spambar");
+ XCTAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"foo.*bar"]);
+ XCTAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"foo.*bar"]);
// pattern w/ sub patterns
- STAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
- @"foobar", nil);
- STAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
- @"foobydoo spambar", nil);
- STAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
- @"foobar", nil);
- STAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
- @"foobydoo spambar", nil);
- STAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], nil);
- STAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"], nil);
+ XCTAssertEqualStrings([@"foobar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
+ @"foobar");
+ XCTAssertEqualStrings([@"foobydoo spambar" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
+ @"foobydoo spambar");
+ XCTAssertEqualStrings([@"zzfoobarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
+ @"foobar");
+ XCTAssertEqualStrings([@"zzfoobydoo spambarzz" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"],
+ @"foobydoo spambar");
+ XCTAssertNil([@"abcdef" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertNil([@"" gtm_firstSubStringMatchedByPattern:@"(foo)(.*)(bar)"]);
}
- (void)testSubStringMatchesPattern {
// simple pattern
- STAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
- STAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
- STAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
- STAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
- STAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
- STAssertFalse([@"" gtm_subStringMatchesPattern:@"foo.*bar"], nil);
+ XCTAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"foo.*bar"]);
+ XCTAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"foo.*bar"]);
+ XCTAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"foo.*bar"]);
+ XCTAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"foo.*bar"]);
+ XCTAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"foo.*bar"]);
+ XCTAssertFalse([@"" gtm_subStringMatchesPattern:@"foo.*bar"]);
// pattern w/ sub patterns
- STAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
- STAssertFalse([@"" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"], nil);
+ XCTAssertTrue([@"foobar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertTrue([@"foobydoo spambar" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertTrue([@"zzfoobarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertTrue([@"zzfoobydoo spambarzz" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertFalse([@"abcdef" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"]);
+ XCTAssertFalse([@"" gtm_subStringMatchesPattern:@"(foo)(.*)(bar)"]);
}
- (void)testSegmentEnumeratorForPattern {
NSEnumerator *enumerator =
[@"afoobarbfooobaarfoobarzz" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "a"
GTMRegexStringSegment *seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"a", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"a");
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "b"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"b", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"b");
// "fooobaar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"fooobaar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"fooobaar");
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "zz"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"zz", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"zz");
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test no match
enumerator = [@"aaa" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"aaa", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"aaa");
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test only match
enumerator = [@"foobar" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// now test the saved sub segments
enumerator =
[@"foobarxxfoobaz" gtm_segmentEnumeratorForPattern:@"(foo)((bar)|(baz))"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
- STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
- STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"bar");
+ XCTAssertEqualStrings([seg subPatternString:3], @"bar");
+ XCTAssertNil([seg subPatternString:4]); // nothing matched "(baz)"
+ XCTAssertNil([seg subPatternString:5]);
// "xx"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertFalse([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"xx", nil);
- STAssertEqualStrings([seg subPatternString:0], @"xx", nil);
- STAssertNil([seg subPatternString:1], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertFalse([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"xx");
+ XCTAssertEqualStrings([seg subPatternString:0], @"xx");
+ XCTAssertNil([seg subPatternString:1]);
// "foobaz"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
- STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
- STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"baz");
+ XCTAssertNil([seg subPatternString:3]); // (nothing matched "(bar)"
+ XCTAssertEqualStrings([seg subPatternString:4], @"baz");
+ XCTAssertNil([seg subPatternString:5]);
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test all objects
enumerator = [@"afoobarbfooobaarfoobarzz" gtm_segmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
NSArray *allSegments = [enumerator allObjects];
- STAssertNotNil(allSegments, nil);
- STAssertEquals((NSUInteger)6, [allSegments count], nil);
+ XCTAssertNotNil(allSegments);
+ XCTAssertEqual((NSUInteger)6, [allSegments count]);
}
- (void)testMatchSegmentEnumeratorForPattern {
NSEnumerator *enumerator =
[@"afoobarbfooobaarfoobarzz" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "a" - skipped
// "foobar"
GTMRegexStringSegment *seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "b" - skipped
// "fooobaar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"fooobaar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"fooobaar");
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
// "zz" - skipped
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test no match
enumerator = [@"aaa" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test only match
enumerator = [@"foobar" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// now test the saved sub segments
enumerator =
[@"foobarxxfoobaz" gtm_matchSegmentEnumeratorForPattern:@"(foo)((bar)|(baz))"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
// "foobar"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobar", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"bar", nil);
- STAssertEqualStrings([seg subPatternString:3], @"bar", nil);
- STAssertNil([seg subPatternString:4], nil); // nothing matched "(baz)"
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobar");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"bar");
+ XCTAssertEqualStrings([seg subPatternString:3], @"bar");
+ XCTAssertNil([seg subPatternString:4]); // nothing matched "(baz)"
+ XCTAssertNil([seg subPatternString:5]);
// "xx" - skipped
// "foobaz"
seg = [enumerator nextObject];
- STAssertNotNil(seg, nil);
- STAssertTrue([seg isMatch], nil);
- STAssertEqualStrings([seg string], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:0], @"foobaz", nil);
- STAssertEqualStrings([seg subPatternString:1], @"foo", nil);
- STAssertEqualStrings([seg subPatternString:2], @"baz", nil);
- STAssertNil([seg subPatternString:3], nil); // (nothing matched "(bar)"
- STAssertEqualStrings([seg subPatternString:4], @"baz", nil);
- STAssertNil([seg subPatternString:5], nil);
+ XCTAssertNotNil(seg);
+ XCTAssertTrue([seg isMatch]);
+ XCTAssertEqualStrings([seg string], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:0], @"foobaz");
+ XCTAssertEqualStrings([seg subPatternString:1], @"foo");
+ XCTAssertEqualStrings([seg subPatternString:2], @"baz");
+ XCTAssertNil([seg subPatternString:3]); // (nothing matched "(bar)"
+ XCTAssertEqualStrings([seg subPatternString:4], @"baz");
+ XCTAssertNil([seg subPatternString:5]);
// (end)
seg = [enumerator nextObject];
- STAssertNil(seg, nil);
+ XCTAssertNil(seg);
// test all objects
enumerator = [@"afoobarbfooobaarfoobarzz" gtm_matchSegmentEnumeratorForPattern:@"foo+ba+r"];
- STAssertNotNil(enumerator, nil);
+ XCTAssertNotNil(enumerator);
NSArray *allSegments = [enumerator allObjects];
- STAssertNotNil(allSegments, nil);
- STAssertEquals((NSUInteger)3, [allSegments count], nil);
+ XCTAssertNotNil(allSegments);
+ XCTAssertEqual((NSUInteger)3, [allSegments count]);
}
- (void)testAllSubstringsMatchedByPattern {
NSArray *segments =
[@"afoobarbfooobaarfoobarzz" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"];
- STAssertNotNil(segments, nil);
- STAssertEquals((NSUInteger)3, [segments count], nil);
- STAssertEqualStrings([segments objectAtIndex:0], @"foobar", nil);
- STAssertEqualStrings([segments objectAtIndex:1], @"fooobaar", nil);
- STAssertEqualStrings([segments objectAtIndex:2], @"foobar", nil);
+ XCTAssertNotNil(segments);
+ XCTAssertEqual((NSUInteger)3, [segments count]);
+ XCTAssertEqualStrings([segments objectAtIndex:0], @"foobar");
+ XCTAssertEqualStrings([segments objectAtIndex:1], @"fooobaar");
+ XCTAssertEqualStrings([segments objectAtIndex:2], @"foobar");
// test no match
segments = [@"aaa" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"];
- STAssertNotNil(segments, nil);
- STAssertEquals((NSUInteger)0, [segments count], nil);
+ XCTAssertNotNil(segments);
+ XCTAssertEqual((NSUInteger)0, [segments count]);
// test only match
segments = [@"foobar" gtm_allSubstringsMatchedByPattern:@"foo+ba+r"];
- STAssertNotNil(segments, nil);
- STAssertEquals((NSUInteger)1, [segments count], nil);
- STAssertEqualStrings([segments objectAtIndex:0], @"foobar", nil);
+ XCTAssertNotNil(segments);
+ XCTAssertEqual((NSUInteger)1, [segments count]);
+ XCTAssertEqualStrings([segments objectAtIndex:0], @"foobar");
}
- (void)testStringByReplacingMatchesOfPatternWithReplacement {
// the basics
- STAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies",
- [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
- withReplacement:@"Z\\3Z\\2Z\\1Z"],
- nil);
+ XCTAssertEqualStrings(@"weeZbarZbydoo spamZfooZdoggies",
+ [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
+ withReplacement:@"Z\\3Z\\2Z\\1Z"]);
// nil/empty replacement
- STAssertEqualStrings(@"weedoggies",
- [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
- withReplacement:nil],
- nil);
- STAssertEqualStrings(@"weedoggies",
- [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
- withReplacement:@""],
- nil);
- STAssertEqualStrings(@"",
- [@"" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
- withReplacement:@"abc"],
- nil);
+ XCTAssertEqualStrings(@"weedoggies",
+ [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
+ withReplacement:nil]);
+ XCTAssertEqualStrings(@"weedoggies",
+ [@"weefoobydoo spambardoggies" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
+ withReplacement:@""]);
+ XCTAssertEqualStrings(@"",
+ [@"" gtm_stringByReplacingMatchesOfPattern:@"(foo)(.*)(bar)"
+ withReplacement:@"abc"]);
// use optional and invale subexpression parts to confirm that works
- STAssertEqualStrings(@"aaa baz bar bar foo baz aaa",
- [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))"
- withReplacement:@"\\4\\5"],
- nil);
- STAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa",
- [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))"
- withReplacement:@"Z\\10Z\\12Z"],
- nil);
+ XCTAssertEqualStrings(@"aaa baz bar bar foo baz aaa",
+ [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))"
+ withReplacement:@"\\4\\5"]);
+ XCTAssertEqualStrings(@"aaa ZZZ ZZZ bar foo baz aaa",
+ [@"aaa foooooobaz fooobar bar foo baz aaa" gtm_stringByReplacingMatchesOfPattern:@"(fo(o+))((bar)|(baz))"
+ withReplacement:@"Z\\10Z\\12Z"]);
// test slashes in replacement that aren't part of the subpattern reference
- STAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z",
- [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
- withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"],
- nil);
- STAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az",
- [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
- withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"],
- nil);
- STAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z",
- [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
- withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"],
- nil);
+ XCTAssertEqualStrings(@"z\\\\0 \\\\a \\\\\\\\0z",
+ [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
+ withReplacement:@"\\\\0 \\\\\\0 \\\\\\\\0"]);
+ XCTAssertEqualStrings(@"z\\\\a \\\\\\\\0 \\\\\\\\az",
+ [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
+ withReplacement:@"\\\\\\0 \\\\\\\\0 \\\\\\\\\\0"]);
+ XCTAssertEqualStrings(@"z\\\\\\\\0 \\\\\\\\a \\\\\\\\\\\\0z",
+ [@"zaz" gtm_stringByReplacingMatchesOfPattern:@"a+"
+ withReplacement:@"\\\\\\\\0 \\\\\\\\\\0 \\\\\\\\\\\\0"]);
}
@end
diff --git a/Foundation/GTMSQLite.h b/Foundation/GTMSQLite.h
index 0697d5a..0daa02c 100644
--- a/Foundation/GTMSQLite.h
+++ b/Foundation/GTMSQLite.h
@@ -92,12 +92,6 @@
// or ranges between single UniChars.
//
-// SQLite is preinstalled on 10.4 only. As long as we're using the OS version
-// of the library, limit ourself to Tiger+
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4
-#error SQLite support is Tiger or later
-#endif
-
#import <Foundation/Foundation.h>
#import <sqlite3.h>
diff --git a/Foundation/GTMSQLite.m b/Foundation/GTMSQLite.m
index 502a5cc..aa5d5f5 100644
--- a/Foundation/GTMSQLite.m
+++ b/Foundation/GTMSQLite.m
@@ -20,9 +20,6 @@
#import <Foundation/Foundation.h>
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-#import <dlfcn.h>
-#endif
#import "GTMSQLite.h"
#import "GTMMethodCheck.h"
#import "GTMDefines.h"
@@ -44,22 +41,6 @@ typedef struct {
int textRep;
} LikeGlobUserArgs;
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-// While we want to be compatible with Tiger, some operations are more
-// efficient when implemented with Leopard APIs. We look those up dynamically.
-// CFStringCreateWithBytesNoCopy
-static const char* const kCFStringCreateWithBytesNoCopySymbolName =
- "CFStringCreateWithBytesNoCopy";
-
-typedef CFStringRef (*CFStringCreateWithBytesNoCopyPtrType)(CFAllocatorRef,
- const UInt8 *,
- CFIndex,
- CFStringEncoding,
- Boolean,
- CFAllocatorRef);
-static CFStringCreateWithBytesNoCopyPtrType gCFStringCreateWithBytesNoCopySymbol = NULL;
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-
// Helper inline for SQLite text type to CF endcoding
GTM_INLINE CFStringEncoding SqliteTextEncodingToCFStringEncoding(int enc) {
// Default should never happen, but assume UTF 8
@@ -87,14 +68,12 @@ GTM_INLINE CFOptionFlags FilteredStringCompareFlags(CFOptionFlags inOptions) {
if (inOptions & kCFCompareNonliteral) outOptions |= kCFCompareNonliteral;
if (inOptions & kCFCompareLocalized) outOptions |= kCFCompareLocalized;
if (inOptions & kCFCompareNumerically) outOptions |= kCFCompareNumerically;
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
if (inOptions & kCFCompareDiacriticInsensitive) {
outOptions |= kCFCompareDiacriticInsensitive;
}
if (inOptions & kCFCompareWidthInsensitive) {
outOptions |= kCFCompareWidthInsensitive;
}
-#endif
return outOptions;
}
@@ -141,14 +120,6 @@ static CFLocaleRef gCurrentLocale = NULL;
+ (void)initialize {
// Need the locale for some CFString enhancements
gCurrentLocale = CFLocaleCopyCurrent();
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
- // Compiling pre-Leopard try to find some symbols dynamically
- gCFStringCreateWithBytesNoCopySymbol =
- (CFStringCreateWithBytesNoCopyPtrType)dlsym(
- RTLD_DEFAULT,
- kCFStringCreateWithBytesNoCopySymbolName);
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
}
+ (int)sqliteVersionNumber {
@@ -176,7 +147,7 @@ static CFLocaleRef gCurrentLocale = NULL;
#else
cfEncoding = kCFStringEncodingUTF16LE;
#endif
- NSStringEncoding nsEncoding
+ NSStringEncoding nsEncoding
= CFStringConvertEncodingToNSStringEncoding(cfEncoding);
NSData *data = [path dataUsingEncoding:nsEncoding];
// Using -[NSString cStringUsingEncoding] causes sqlite3_open16
@@ -420,7 +391,7 @@ static CFLocaleRef gCurrentLocale = NULL;
- (CFOptionFlags)likeComparisonOptions {
CFOptionFlags flags = 0;
- if (hasCFAdditions_)
+ if (hasCFAdditions_)
flags = likeOptions_;
return flags;
}
@@ -510,7 +481,7 @@ static CFLocaleRef gCurrentLocale = NULL;
}
- (NSString *)description {
- return [NSString stringWithFormat:@"<%@: %p - %@>",
+ return [NSString stringWithFormat:@"<%@: %p - %@>",
[self class], self, path_];
}
@end
@@ -787,7 +758,7 @@ static void CollateNeeded(void *userContext, sqlite3 *db, int textRep,
[collationName componentsSeparatedByString:@"_"];
NSString *collationFlag = nil;
BOOL atLeastOneValidFlag = NO;
- GTM_FOREACH_OBJECT(collationFlag, collationComponents) {
+ for (collationFlag in collationComponents) {
if ([collationFlag isEqualToString:@"reverse"]) {
userArgs->reverse = YES;
atLeastOneValidFlag = YES;
@@ -803,19 +774,12 @@ static void CollateNeeded(void *userContext, sqlite3 *db, int textRep,
} else if ([collationFlag isEqualToString:@"numeric"]) {
userArgs->compareOptions |= kCFCompareNumerically;
atLeastOneValidFlag = YES;
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
} else if ([collationFlag isEqualToString:@"nodiacritic"]) {
userArgs->compareOptions |= kCFCompareDiacriticInsensitive;
atLeastOneValidFlag = YES;
} else if ([collationFlag isEqualToString:@"widthinsensitive"]) {
userArgs->compareOptions |= kCFCompareWidthInsensitive;
atLeastOneValidFlag = YES;
-#else
- } else if (([collationFlag isEqualToString:@"nodiacritic"]) ||
- ([collationFlag isEqualToString:@"widthinsensitive"])) {
- _GTMDevLog(@"GTMSQLiteDatabase 10.5 collating not "
- @"available on 10.4 or earlier");
-#endif
}
}
@@ -874,34 +838,6 @@ static int Collate8(void *userContext, int length1, const void *str1,
// creation function, we'll use it when we can but we want to stay compatible
// with Tiger.
CFStringRef string1 = NULL, string2 = NULL;
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
- if (gCFStringCreateWithBytesNoCopySymbol) {
- string1 = gCFStringCreateWithBytesNoCopySymbol(kCFAllocatorDefault,
- str1,
- length1,
- kCFStringEncodingUTF8,
- false,
- kCFAllocatorNull);
- string2 = gCFStringCreateWithBytesNoCopySymbol(kCFAllocatorDefault,
- str2,
- length2,
- kCFStringEncodingUTF8,
- false,
- kCFAllocatorNull);
- } else {
- // Have to use the copy-based variants
- string1 = CFStringCreateWithBytes(kCFAllocatorDefault,
- str1,
- length1,
- kCFStringEncodingUTF8,
- false);
- string2 = CFStringCreateWithBytes(kCFAllocatorDefault,
- str2,
- length2,
- kCFStringEncodingUTF8,
- false);
- }
-#else // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
string1 = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault,
str1,
length1,
@@ -914,7 +850,6 @@ static int Collate8(void *userContext, int length1, const void *str1,
kCFStringEncodingUTF8,
false,
kCFAllocatorNull);
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
GTMCFAutorelease(string1);
GTMCFAutorelease(string2);
// Allocation failures can't really be sanely handled from a collator
@@ -937,7 +872,7 @@ static int Collate8(void *userContext, int length1, const void *str1,
if (userArgs->reverse && sqliteResult) {
sqliteResult = -sqliteResult;
}
-
+
}
return sqliteResult;
}
@@ -1025,7 +960,7 @@ static int Collate16(void *userContext, int length1, const void *str1,
string2,
userArgs->compareOptions);
- sqliteResult = (int)result;
+ sqliteResult = (int)result;
//Reverse
if (userArgs->reverse && sqliteResult) {
sqliteResult = -sqliteResult;
@@ -1052,8 +987,8 @@ static void LikeGlobCompare(sqlite3_context *context,
// Setup for pattern walk
CFIndex patternLength = CFStringGetLength(pattern);
CFStringInlineBuffer patternBuffer;
- CFStringInitInlineBuffer(pattern,
- &patternBuffer,
+ CFStringInitInlineBuffer(pattern,
+ &patternBuffer,
CFRangeMake(0, patternLength));
UniChar patternChar;
CFIndex patternIndex = 0;
@@ -1128,7 +1063,7 @@ static void LikeGlobCompare(sqlite3_context *context,
}
// There's at least one character, try to match the remainder of the
// string using a CFCharacterSet
- CFMutableCharacterSetRef charSet
+ CFMutableCharacterSetRef charSet
= CFCharacterSetCreateMutable(kCFAllocatorDefault);
GTMCFAutorelease(charSet);
if (!charSet) {
@@ -1776,8 +1711,8 @@ static void Glob16(sqlite3_context *context, int argc, sqlite3_value **argv) {
- (int)bindBlobAtPosition:(int)position data:(NSData *)data {
if (!statement_ || !data || !position) return SQLITE_MISUSE;
int blobLength = (int)[data length];
- _GTMDevAssert((blobLength < INT_MAX),
- @"sqlite methods do not support data lengths "
+ _GTMDevAssert((blobLength < INT_MAX),
+ @"sqlite methods do not support data lengths "
@"exceeding 32 bit sizes");
return [self bindBlobAtPosition:position
bytes:(void *)[data bytes]
@@ -1822,8 +1757,8 @@ static void Glob16(sqlite3_context *context, int argc, sqlite3_value **argv) {
}
return sqlite3_bind_text(statement_,
position,
- [string UTF8String],
- -1,
+ [string UTF8String],
+ -1,
SQLITE_TRANSIENT);
}
diff --git a/Foundation/GTMSQLiteTest.m b/Foundation/GTMSQLiteTest.m
index 8a5f18d..2537dd6 100644
--- a/Foundation/GTMSQLiteTest.m
+++ b/Foundation/GTMSQLiteTest.m
@@ -19,7 +19,6 @@
#import "GTMSQLite.h"
#import "GTMSenTestCase.h"
-#import "GTMUnitTestDevLog.h"
@interface GTMSQLiteTest : GTMTestCase
@end
@@ -48,66 +47,66 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
autorelease];
err = [db executeSQL:@"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL);"];
- STAssertEquals(err, SQLITE_OK, @"Failed to create table");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create table");
int changeCount = [db lastChangeCount];
- STAssertEquals(changeCount, 0,
+ XCTAssertEqual(changeCount, 0,
@"Change count was not 0 after creating database/table!");
err = [db executeSQL:@"insert into foo (bar) values ('blah!');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
changeCount = [db lastChangeCount];
- STAssertEquals(changeCount, 1, @"Change count was not 1!");
+ XCTAssertEqual(changeCount, 1, @"Change count was not 1!");
// Test last row id!
unsigned long long lastRowId;
lastRowId = [db lastInsertRowID];
- STAssertEquals(lastRowId, (unsigned long long)1L,
+ XCTAssertEqual(lastRowId, (unsigned long long)1L,
@"First row in database was not 1?");
// Test setting busy and retrieving it!
int busyTimeout = 10000;
err = [db setBusyTimeoutMS:busyTimeout];
- STAssertEquals(err, SQLITE_OK, @"Error setting busy timeout");
+ XCTAssertEqual(err, SQLITE_OK, @"Error setting busy timeout");
int retrievedBusyTimeout;
retrievedBusyTimeout = [db busyTimeoutMS];
- STAssertEquals(retrievedBusyTimeout, busyTimeout,
+ XCTAssertEqual(retrievedBusyTimeout, busyTimeout,
@"Retrieved busy time out was not equal to what we set it"
@" to!");
BOOL xactOpSucceeded;
xactOpSucceeded = [db beginDeferredTransaction];
- STAssertTrue(xactOpSucceeded, @"beginDeferredTransaction failed!");
+ XCTAssertTrue(xactOpSucceeded, @"beginDeferredTransaction failed!");
err = [db executeSQL:@"insert into foo (bar) values ('blah!');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
changeCount = [db lastChangeCount];
- STAssertEquals(changeCount, 1,
+ XCTAssertEqual(changeCount, 1,
@"Change count didn't stay the same"
@"when inserting during transaction");
xactOpSucceeded = [db rollback];
- STAssertTrue(xactOpSucceeded, @"could not rollback!");
+ XCTAssertTrue(xactOpSucceeded, @"could not rollback!");
changeCount = [db lastChangeCount];
- STAssertEquals(changeCount, 1, @"Change count isn't 1 after rollback :-(");
+ XCTAssertEqual(changeCount, 1, @"Change count isn't 1 after rollback :-(");
xactOpSucceeded = [db beginDeferredTransaction];
- STAssertTrue(xactOpSucceeded, @"beginDeferredTransaction failed!");
+ XCTAssertTrue(xactOpSucceeded, @"beginDeferredTransaction failed!");
for (unsigned int i = 0; i < 100; i++) {
err = [db executeSQL:@"insert into foo (bar) values ('blah!');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
}
xactOpSucceeded = [db commit];
- STAssertTrue(xactOpSucceeded, @"could not commit!");
+ XCTAssertTrue(xactOpSucceeded, @"could not commit!");
changeCount = [db totalChangeCount];
- STAssertEquals(changeCount, 102, @"Change count isn't 102 after commit :-(");
+ XCTAssertEqual(changeCount, 102, @"Change count isn't 102 after commit :-(");
}
- (void)testSQLiteWithoutCFAdditions {
@@ -118,14 +117,14 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
errorCode:&err]
autorelease];
- STAssertNotNil(dbNoCFAdditions, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(dbNoCFAdditions, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
err = [dbNoCFAdditions executeSQL:nil];
- STAssertEquals(err, SQLITE_MISUSE, @"Nil SQL did not return error");
+ XCTAssertEqual(err, SQLITE_MISUSE, @"Nil SQL did not return error");
err = [dbNoCFAdditions executeSQL:@"SELECT UPPER('Fred');"];
- STAssertEquals(err, SQLITE_OK, @"Nil SQL did not return error");
+ XCTAssertEqual(err, SQLITE_OK, @"Nil SQL did not return error");
}
- (void)testSynchronousAPI {
@@ -147,8 +146,8 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
errorCode:&err]
autorelease];
- STAssertNotNil(db8, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(db8, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
GTMSQLiteDatabase *db16 =
[[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES
@@ -156,27 +155,27 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
errorCode:&err]
autorelease];
- STAssertNotNil(db16, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(db16, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
NSArray *databases = [NSArray arrayWithObjects:db8, db16, nil];
GTMSQLiteDatabase *db;
- GTM_FOREACH_OBJECT(db, databases) {
+ for (db in databases) {
err = [db executeSQL:
@"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL,"
@" barrev text collate reverse);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for collation test");
// Create blank rows to test matching inside collation functions
err = [db executeSQL:@"insert into foo (bar, barrev) values ('','');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
// Insert one row we want to match
err = [db executeSQL:
@"INSERT INTO foo (bar, barrev) VALUES "
@"('teststring','teststring');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
NSString *matchString = @"foobar";
GTMSQLiteStatement *statement =
@@ -184,29 +183,29 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
@"SELECT bar FROM foo WHERE bar == '%@';", matchString]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
[statement stepRow];
[statement finalizeStatement];
-
+
statement =
[GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat:
@"SELECT bar FROM foo WHERE barrev == '%@' order by barrev;", matchString]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
[statement stepRow];
[statement finalizeStatement];
-
+
statement =
[GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat:
@"SELECT bar FROM foo WHERE bar == '';"]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
[statement stepRow];
[statement finalizeStatement];
@@ -215,8 +214,8 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
@"SELECT bar FROM foo WHERE barrev == '' order by barrev;"]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
[statement stepRow];
[statement finalizeStatement];
}
@@ -230,24 +229,24 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
errorCode:&err]
autorelease];
- STAssertNotNil(db, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(db, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
err = [db executeSQL:@"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL);"];
- STAssertEquals(err, SQLITE_OK, @"Failed to create table for collation test");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create table for collation test");
// Insert one row we want to match
err = [db executeSQL:[NSString stringWithFormat:
@"INSERT INTO foo (bar) VALUES ('%@');",
[NSString stringWithCString:"Frédéric" encoding:NSUTF8StringEncoding]]];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
// Create blank rows to test matching inside collation functions
err = [db executeSQL:@"insert into foo (bar) values ('');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
err = [db executeSQL:@"insert into foo (bar) values ('');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
// Loop over a few things all of which should match
NSArray *testArray = [NSArray arrayWithObjects:
@@ -259,19 +258,19 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
encoding:NSUTF8StringEncoding],
nil];
NSString *testString = nil;
- GTM_FOREACH_OBJECT(testString, testArray) {
+ for (testString in testArray) {
GTMSQLiteStatement *statement =
[GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat:
@"SELECT bar FROM foo WHERE bar == '%@';", testString]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
int count = 0;
while ([statement stepRow] == SQLITE_ROW) {
count++;
}
- STAssertEquals(count, 1, @"Wrong number of collated rows for \"%@\"",
+ XCTAssertEqual(count, 1, @"Wrong number of collated rows for \"%@\"",
testString);
[statement finalizeStatement];
}
@@ -281,8 +280,8 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
while ([statement stepRow] == SQLITE_ROW) ;
[statement finalizeStatement];
@@ -299,33 +298,33 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
utf8:YES
errorCode:&err]
autorelease];
- STAssertNotNil(db, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(db, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
GTMSQLiteStatement *statement = nil;
// Test simple ASCII
statement = [GTMSQLiteStatement statementWithSQL:@"SELECT LOWER('Fred');"
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"Failed to step row");
- STAssertEqualObjects([statement resultStringAtPosition:0],
- @"fred",
- @"LOWER failed for ASCII string");
+ XCTAssertEqual(err, SQLITE_ROW, @"Failed to step row");
+ XCTAssertEqualObjects([statement resultStringAtPosition:0],
+ @"fred",
+ @"LOWER failed for ASCII string");
[statement finalizeStatement];
statement = [GTMSQLiteStatement statementWithSQL:@"SELECT UPPER('Fred');"
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"Failed to step row");
- STAssertEqualObjects([statement resultStringAtPosition:0],
- @"FRED",
- @"UPPER failed for ASCII string");
+ XCTAssertEqual(err, SQLITE_ROW, @"Failed to step row");
+ XCTAssertEqualObjects([statement resultStringAtPosition:0],
+ @"FRED",
+ @"UPPER failed for ASCII string");
[statement finalizeStatement];
// Test UTF-8, have to do some dancing to make the compiler take
@@ -344,13 +343,13 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
[NSString stringWithFormat:@"SELECT LOWER('%@');", utfNormalString]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"Failed to step row");
- STAssertEqualObjects([statement resultStringAtPosition:0],
- utfLowerString,
- @"UPPER failed for UTF8 string");
+ XCTAssertEqual(err, SQLITE_ROW, @"Failed to step row");
+ XCTAssertEqualObjects([statement resultStringAtPosition:0],
+ utfLowerString,
+ @"UPPER failed for UTF8 string");
[statement finalizeStatement];
statement =
@@ -358,15 +357,15 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
[NSString stringWithFormat:@"SELECT UPPER('%@');", utfNormalString]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"Failed to step row");
- STAssertEqualObjects([statement resultStringAtPosition:0],
- utfUpperString,
- @"UPPER failed for UTF8 string");
+ XCTAssertEqual(err, SQLITE_ROW, @"Failed to step row");
+ XCTAssertEqualObjects([statement resultStringAtPosition:0],
+ utfUpperString,
+ @"UPPER failed for UTF8 string");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE, @"Should be done");
+ XCTAssertEqual(err, SQLITE_DONE, @"Should be done");
[statement finalizeStatement];
}
@@ -380,33 +379,33 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql);
utf8:NO
errorCode:&err]
autorelease];
- STAssertNotNil(db, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(db, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
GTMSQLiteStatement *statement = nil;
// Test simple ASCII
statement = [GTMSQLiteStatement statementWithSQL:@"SELECT LOWER('Fred');"
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"Failed to step row");
- STAssertEqualObjects([statement resultStringAtPosition:0],
- @"fred",
- @"LOWER failed for ASCII string");
+ XCTAssertEqual(err, SQLITE_ROW, @"Failed to step row");
+ XCTAssertEqualObjects([statement resultStringAtPosition:0],
+ @"fred",
+ @"LOWER failed for ASCII string");
[statement finalizeStatement];
statement = [GTMSQLiteStatement statementWithSQL:@"SELECT UPPER('Fred');"
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"Failed to step row");
- STAssertEqualObjects([statement resultStringAtPosition:0],
- @"FRED",
- @"UPPER failed for ASCII string");
+ XCTAssertEqual(err, SQLITE_ROW, @"Failed to step row");
+ XCTAssertEqualObjects([statement resultStringAtPosition:0],
+ @"FRED",
+ @"UPPER failed for ASCII string");
[statement finalizeStatement];
}
@@ -450,7 +449,7 @@ static void TestUpperLower16Impl(sqlite3_context *context,
customUpperLower[i].function,
NULL,
NULL);
- STAssertEquals(rc, SQLITE_OK,
+ XCTAssertEqual(rc, SQLITE_OK,
@"Failed to register upper function"
@"with SQLite db");
}
@@ -459,12 +458,12 @@ static void TestUpperLower16Impl(sqlite3_context *context,
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:@"SELECT UPPER('Fred');"
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"Failed to step row");
- STAssertTrue(customUpperFunctionCalled,
- @"Custom upper function was not called!");
+ XCTAssertEqual(err, SQLITE_ROW, @"Failed to step row");
+ XCTAssertTrue(customUpperFunctionCalled,
+ @"Custom upper function was not called!");
[statement finalizeStatement];
}
@@ -483,7 +482,7 @@ static void TestUpperLower16Impl(sqlite3_context *context,
NSArray *databases = [NSArray arrayWithObjects:db8, db16, nil];
GTMSQLiteDatabase *db;
- GTM_FOREACH_OBJECT(db, databases) {
+ for (db in databases) {
CFOptionFlags c = 0, oldFlags;
oldFlags = [db likeComparisonOptions];
@@ -492,22 +491,18 @@ static void TestUpperLower16Impl(sqlite3_context *context,
// case insensitive
[db setLikeComparisonOptions:c];
- STAssertTrue([db likeComparisonOptions] == 0,
- @"LIKE Comparison options setter/getter does not work!");
+ XCTAssertTrue([db likeComparisonOptions] == 0,
+ @"LIKE Comparison options setter/getter does not work!");
NSString *createString = nil;
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
createString = @"CREATE TABLE foo (bar NODIACRITIC_WIDTHINSENSITIVE TEXT);";
-#else
- createString = @"CREATE TABLE foo (bar TEXT);";
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
err = [db executeSQL:createString];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for like comparison options test");
err = [db executeSQL:@"insert into foo values('test like test');"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create row for like comparison options test");
GTMSQLiteStatement *statement =
@@ -515,22 +510,20 @@ static void TestUpperLower16Impl(sqlite3_context *context,
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"failed to create statement");
+ XCTAssertNotNil(statement, @"failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE, @"failed to retrieve row!");
+ XCTAssertEqual(err, SQLITE_DONE, @"failed to retrieve row!");
// Now change it back to case insensitive and rerun the same query
c |= kCFCompareCaseInsensitive;
[db setLikeComparisonOptions:c];
err = [statement reset];
- STAssertEquals(err, SQLITE_OK, @"failed to reset select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"failed to reset select statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to retrieve row!");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to retrieve row!");
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- // Now try adding in 10.5 only flags
c |= (kCFCompareDiacriticInsensitive | kCFCompareWidthInsensitive);
[db setLikeComparisonOptions:c];
// Make a new statement
@@ -539,14 +532,13 @@ static void TestUpperLower16Impl(sqlite3_context *context,
[GTMSQLiteStatement statementWithSQL:@"select * from foo where bar like '%LIKE%'"
inDatabase:db
errorCode:&err];
-
- STAssertNotNil(statement, @"failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"failed to create statement");
-
+
+ XCTAssertNotNil(statement, @"failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"failed to create statement");
+
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to retrieve row!");
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
-
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to retrieve row!");
+
// Now reset comparison options
[db setLikeComparisonOptions:oldFlags];
@@ -567,15 +559,15 @@ static void TestUpperLower16Impl(sqlite3_context *context,
[db setGlobComparisonOptions:c];
- STAssertTrue([db globComparisonOptions] == 0,
- @"GLOB Comparison options setter/getter does not work!");
+ XCTAssertTrue([db globComparisonOptions] == 0,
+ @"GLOB Comparison options setter/getter does not work!");
err = [db executeSQL:@"CREATE TABLE foo (bar TEXT);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for glob comparison options test");
err = [db executeSQL:@"insert into foo values('test like test');"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create row for glob comparison options test");
GTMSQLiteStatement *statement =
@@ -583,19 +575,19 @@ static void TestUpperLower16Impl(sqlite3_context *context,
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"failed to create statement");
+ XCTAssertNotNil(statement, @"failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE, @"failed to retrieve row!");
+ XCTAssertEqual(err, SQLITE_DONE, @"failed to retrieve row!");
// Now change it back to case insensitive and rerun the same query
c |= kCFCompareCaseInsensitive;
[db setGlobComparisonOptions:c];
err = [statement reset];
- STAssertEquals(err, SQLITE_OK, @"failed to reset select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"failed to reset select statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to retrieve row!");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to retrieve row!");
[statement finalizeStatement];
@@ -611,38 +603,38 @@ static void TestUpperLower16Impl(sqlite3_context *context,
errorCode:&err] autorelease];
err = [db executeSQL:@"CREATE table foo_reverse (bar TEXT COLLATE REVERSE);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for reverse collation test");
err = [db executeSQL:@"insert into foo_reverse values('a2');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
err = [db executeSQL:@"insert into foo_reverse values('b1');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
GTMSQLiteStatement *statement =
[GTMSQLiteStatement statementWithSQL:@"SELECT bar from foo_reverse order by bar"
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to advance row");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to advance row");
NSString *oneRow = [statement resultStringAtPosition:0];
- STAssertEqualStrings(oneRow, @"b1", @"b did not come first!");
+ XCTAssertEqualStrings(oneRow, @"b1", @"b did not come first!");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to advance row!");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to advance row!");
- STAssertEquals(err, [db lastErrorCode],
+ XCTAssertEqual(err, [db lastErrorCode],
@"lastErrorCode API did not match what last API returned!");
// Calling lastErrorCode resets API error, so the next string will not indicate any error
- STAssertEqualStrings(@"not an error", [db lastErrorString],
- @"lastErrorString API did not match expected string!");
+ XCTAssertEqualStrings(@"unknown error", [db lastErrorString],
+ @"lastErrorString API did not match expected string!");
oneRow = [statement resultStringAtPosition:0];
- STAssertEqualStrings(oneRow, @"a2", @"a did not come second!");
+ XCTAssertEqualStrings(oneRow, @"a2", @"a did not come second!");
[statement finalizeStatement];
}
@@ -657,32 +649,32 @@ static void TestUpperLower16Impl(sqlite3_context *context,
err = [db executeSQL:
@"CREATE table numeric_test_table "
@"(numeric_sort TEXT COLLATE NUMERIC, lexographic_sort TEXT);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for numeric collation test");
err = [db executeSQL:@"insert into numeric_test_table values('4','17');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
err = [db executeSQL:@"insert into numeric_test_table values('17','4');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
GTMSQLiteStatement *statement =
[GTMSQLiteStatement statementWithSQL:@"SELECT numeric_sort from numeric_test_table order by numeric_sort"
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to advance row");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to advance row");
NSString *oneRow = [statement resultStringAtPosition:0];
- STAssertEqualStrings(oneRow, @"4", @"4 did not come first!");
+ XCTAssertEqualStrings(oneRow, @"4", @"4 did not come first!");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to advance row!");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to advance row!");
oneRow = [statement resultStringAtPosition:0];
- STAssertEqualStrings(oneRow, @"17", @"17 did not come second!");
+ XCTAssertEqualStrings(oneRow, @"17", @"17 did not come second!");
[statement finalizeStatement];
@@ -693,18 +685,18 @@ static void TestUpperLower16Impl(sqlite3_context *context,
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"failed to create statement for lexographic sort");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"failed to create statement for lexographic sort");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to advance row");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to advance row");
oneRow = [statement resultStringAtPosition:0];
- STAssertEqualStrings(oneRow, @"17", @"17 did not come first!");
+ XCTAssertEqualStrings(oneRow, @"17", @"17 did not come first!");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW, @"failed to advance row!");
+ XCTAssertEqual(err, SQLITE_ROW, @"failed to advance row!");
oneRow = [statement resultStringAtPosition:0];
- STAssertEqualStrings(oneRow, @"4", @"4 did not come second!");
+ XCTAssertEqualStrings(oneRow, @"4", @"4 did not come second!");
[statement finalizeStatement];
}
@@ -718,18 +710,18 @@ static void TestUpperLower16Impl(sqlite3_context *context,
[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES
utf8:YES
errorCode:&err];
- STAssertNotNil(db, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(db, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
err = [db executeSQL:
@"CREATE TABLE foo (bar TEXT COLLATE NOCASE_NONLITERAL_LOCALIZED);"];
- STAssertEquals(err, SQLITE_OK, @"Failed to create table for collation test");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create table for collation test");
// Insert one row we want to match
err = [db executeSQL:[NSString stringWithFormat:
@"INSERT INTO foo (bar) VALUES ('%@');",
[NSString stringWithCString:"Frédéric" encoding:NSUTF8StringEncoding]]];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute SQL");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute SQL");
// Loop over a few things all of which should match
NSArray *testArray = [NSArray arrayWithObjects:
@@ -742,19 +734,19 @@ static void TestUpperLower16Impl(sqlite3_context *context,
nil];
NSString *testString = nil;
- GTM_FOREACH_OBJECT(testString, testArray) {
+ for (testString in testArray) {
GTMSQLiteStatement *statement =
[GTMSQLiteStatement statementWithSQL:[NSString stringWithFormat:
@"SELECT bar FROM foo WHERE bar == '%@';", testString]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
int count = 0;
while ([statement stepRow] == SQLITE_ROW) {
count++;
}
- STAssertEquals(count, 1, @"Wrong number of collated rows for \"%@\"",
+ XCTAssertEqual(count, 1, @"Wrong number of collated rows for \"%@\"",
testString);
[statement finalizeStatement];
}
@@ -765,23 +757,20 @@ static void TestUpperLower16Impl(sqlite3_context *context,
}
- (void)testDiacriticAndWidthInsensitiveCollations {
- // Diacritic & width insensitive collations are not supported
- // on Tiger, so most of the test is Leopard or later
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
int err;
GTMSQLiteDatabase *db =
[[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES
utf8:YES
errorCode:&err] autorelease];
- STAssertNotNil(db, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
+ XCTAssertNotNil(db, @"Failed to create DB");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create DB");
NSString *tableSQL =
@"CREATE TABLE FOOBAR (collated TEXT COLLATE NODIACRITIC_WIDTHINSENSITIVE, "
@" noncollated TEXT);";
err = [db executeSQL:tableSQL];
- STAssertEquals(err, SQLITE_OK, @"error creating table");
+ XCTAssertEqual(err, SQLITE_OK, @"error creating table");
NSString *testStringValue = [NSString stringWithCString:"Frédéric"
encoding:NSUTF8StringEncoding];
@@ -797,11 +786,11 @@ static void TestUpperLower16Impl(sqlite3_context *context,
@" WHERE noncollated == 'Frederic';"]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
// Make sure the comparison query didn't return a row because
// we're doing a comparison on the row without the collation
- STAssertEquals([statement stepRow], SQLITE_DONE,
+ XCTAssertEqual([statement stepRow], SQLITE_DONE,
@"Comparison with diacritics did not succeed");
[statement finalizeStatement];
@@ -812,34 +801,11 @@ static void TestUpperLower16Impl(sqlite3_context *context,
@" WHERE collated == 'Frederic';"]
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
- STAssertEquals([statement stepRow], SQLITE_ROW,
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertEqual([statement stepRow], SQLITE_ROW,
@"Comparison ignoring diacritics did not succeed");
[statement finalizeStatement];
-#else
- // On Tiger just make sure it causes the dev log.
- int err;
- GTMSQLiteDatabase *db =
- [[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES
- utf8:YES
- errorCode:&err] autorelease];
- STAssertNotNil(db, @"Failed to create DB");
- STAssertEquals(err, SQLITE_OK, @"Failed to create DB");
-
- NSString *tableSQL =
- @"CREATE TABLE FOOBAR (collated TEXT"
- @" COLLATE NODIACRITIC_WIDTHINSENSITIVE_NOCASE,"
- @" noncollated TEXT);";
-
- // Expect one log for each unsupported flag
- [GTMUnitTestDevLog expect:2
- casesOfString:@"GTMSQLiteDatabase 10.5 collating not available "
- @"on 10.4 or earlier"];
- err = [db executeSQL:tableSQL];
- STAssertEquals(err, SQLITE_OK, @"error creating table");
-
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
}
- (void)testCFStringLikeGlob {
@@ -852,8 +818,8 @@ static void TestUpperLower16Impl(sqlite3_context *context,
errorCode:&err]
autorelease];
- STAssertNotNil(db8, @"Failed to create database");
- STAssertEquals(err, SQLITE_OK, @"Failed to create database");
+ XCTAssertNotNil(db8, @"Failed to create database");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create database");
GTMSQLiteDatabase *db16 =
[[[GTMSQLiteDatabase alloc] initInMemoryWithCFAdditions:YES
@@ -861,164 +827,164 @@ static void TestUpperLower16Impl(sqlite3_context *context,
errorCode:&err]
autorelease];
- STAssertNotNil(db16, @"Failed to create database");
- STAssertEquals(err, SQLITE_OK, @"Failed to create database");
+ XCTAssertNotNil(db16, @"Failed to create database");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create database");
NSArray *databases = [NSArray arrayWithObjects:db8, db16, nil];
GTMSQLiteDatabase *db;
- GTM_FOREACH_OBJECT(db, databases) {
+ for (db in databases) {
err = [db executeSQL:@"CREATE TABLE t1 (x TEXT);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for LIKE/GLOB test");
// Insert data set
err = [db executeSQL:@"INSERT INTO t1 VALUES ('a');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('ab');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('abc');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('abcd');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('acd');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('abd');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('bc');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('bcd');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('xyz');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('ABC');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('CDE');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t1 VALUES ('ABC abc xyz');"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
// Section 1, case tests
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1;"),
([NSArray arrayWithObjects:@"ABC", @"abc", nil]),
@"Fail on LIKE test 1.1");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x GLOB 'abc' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", nil]),
@"Fail on LIKE test 1.2");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'ABC' ORDER BY 1;"),
([NSArray arrayWithObjects:@"ABC", @"abc", nil]),
@"Fail on LIKE test 1.3");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"ABC", @"ABC abc xyz", @"abc", @"abcd", nil]),
@"Fail on LIKE test 3.1");
[db setLikeComparisonOptions:(kCFCompareNonliteral)];
err = [db executeSQL:@"CREATE INDEX i1 ON t1(x);"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
- STAssertEqualObjects(
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 3.3");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'a_c' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", nil]),
@"Fail on LIKE test 3.5");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'ab%d' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abcd", @"abd", nil]),
@"Fail on LIKE test 3.7");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'a_c%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 3.9");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE '%bcd' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abcd", @"bcd", nil]),
@"Fail on LIKE test 3.11");
[db setLikeComparisonOptions:(kCFCompareNonliteral | kCFCompareCaseInsensitive)];
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"ABC", @"ABC abc xyz", @"abc", @"abcd", nil]),
@"Fail on LIKE test 3.13");
[db setLikeComparisonOptions:(kCFCompareNonliteral)];
err = [db executeSQL:@"DROP INDEX i1;"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
- STAssertEqualObjects(
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 3.15");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 3.17");
err = [db executeSQL:@"CREATE INDEX i1 ON t1(x);"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
- STAssertEqualObjects(
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 3.19");
[db setLikeComparisonOptions:(kCFCompareNonliteral)];
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 3.21");
[db setLikeComparisonOptions:(kCFCompareNonliteral |
kCFCompareCaseInsensitive)];
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x GLOB 'a[bc]d' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abd", @"acd", nil]),
@"Fail on LIKE test 3.23");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x GLOB 'a[^xyz]d' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abd", @"acd", nil]),
@"Fail on glob inverted character set test 3.24");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x GLOB 'a[^' ORDER BY 1;"),
([NSArray array]),
@"Fail on glob inverted character set test 3.25");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x GLOB 'a['"),
([NSArray array]),
@"Unclosed glob character set did not return empty result set 3.26");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x GLOB 'a[^]'"),
([NSArray array]),
@"Unclosed glob inverted character set did not return empty "
@"result set 3.27");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x GLOB 'a[^]c]d'"),
([NSArray arrayWithObjects:@"abd", nil]),
@"Glob character set with inverted set not matching ] did not "
@"return right rows 3.28");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x GLOB 'a[bcdefg'"),
([NSArray array]),
@@ -1026,36 +992,36 @@ static void TestUpperLower16Impl(sqlite3_context *context,
// Section 4
[db setLikeComparisonOptions:(kCFCompareNonliteral)];
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 4.1");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE +x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 4.2");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE ('ab' || 'c%') ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 4.3");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x LIKE 'a[xyz]\%' ESCAPE ''"),
([NSArray array]),
@"0-Character escape clause did not return empty set 4.4");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x LIKE "
@"'a[xyz]\%' ESCAPE NULL"),
([NSArray array]),
@"Null escape did not return empty set 4.5");
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x from t1 where x LIKE 'a[xyz]\\%' "
@"ESCAPE '\\'"),
@@ -1066,22 +1032,22 @@ static void TestUpperLower16Impl(sqlite3_context *context,
// Section 5
[db setLikeComparisonOptions:(kCFCompareNonliteral | kCFCompareCaseInsensitive)];
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"ABC", @"ABC abc xyz", @"abc", @"abcd", nil]),
@"Fail on LIKE test 5.1");
err = [db executeSQL:@"CREATE TABLE t2(x COLLATE NOCASE);"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"INSERT INTO t2 SELECT * FROM t1;"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
err = [db executeSQL:@"CREATE INDEX i2 ON t2(x COLLATE NOCASE);"];
- STAssertEquals(err, SQLITE_OK, @"Failed to execute sql");
- STAssertEqualObjects(
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to execute sql");
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t2 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"ABC", @"ABC abc xyz", @"abcd", nil]),
@@ -1089,7 +1055,7 @@ static void TestUpperLower16Impl(sqlite3_context *context,
[db setLikeComparisonOptions:(kCFCompareNonliteral)];
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t2 WHERE x LIKE 'abc%' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@@ -1097,14 +1063,14 @@ static void TestUpperLower16Impl(sqlite3_context *context,
[db setLikeComparisonOptions:(kCFCompareNonliteral | kCFCompareCaseInsensitive)];
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t2 WHERE x GLOB 'abc*' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abc", @"abcd", nil]),
@"Fail on LIKE test 5.5");
// Non standard tests not from the SQLite source
- STAssertEqualObjects(
+ XCTAssertEqualObjects(
LikeGlobTestHelper(db,
@"SELECT x FROM t1 WHERE x GLOB 'a[b-d]d' ORDER BY 1;"),
([NSArray arrayWithObjects:@"abd", @"acd", nil]),
@@ -1119,34 +1085,34 @@ static void TestUpperLower16Impl(sqlite3_context *context,
utf8:YES
errorCode:&err]
autorelease];
-
- STAssertNotNil(db8, @"Failed to create database");
- STAssertEquals(err, SQLITE_OK, @"Failed to create database");
- STAssertNotNil([db8 description], nil);
+
+ XCTAssertNotNil(db8, @"Failed to create database");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create database");
+ XCTAssertNotNil([db8 description]);
}
// // From GTMSQLite.m
// CFStringEncoding SqliteTextEncodingToCFStringEncoding(int enc);
// - (void)testEncodingMappingIsCorrect {
-// STAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF8) ==
-// kCFStringEncodingUTF8,
-// @"helper method didn't return right encoding for "
-// @"kCFStringEncodingUTF8");
-
-// STAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF16BE)
-// == kCFStringEncodingUTF16BE,
-// @"helper method didn't return right encoding for "
-// @"kCFStringEncodingUTF16BE");
-
-// STAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF16LE)
-// == kCFStringEncodingUTF16LE,
-// @"helper method didn't return right encoding for "
-// @"kCFStringEncodingUTF16LE");
-
-// STAssertTrue(SqliteTextEncodingToCFStringEncoding(9999)
-// == kCFStringEncodingUTF8, @"helper method didn't "
-// @"return default encoding for invalid input");
+// XCTAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF8) ==
+// kCFStringEncodingUTF8,
+// @"helper method didn't return right encoding for "
+// @"kCFStringEncodingUTF8");
+
+// XCTAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF16BE)
+// == kCFStringEncodingUTF16BE,
+// @"helper method didn't return right encoding for "
+// @"kCFStringEncodingUTF16BE");
+
+// XCTAssertTrue(SqliteTextEncodingToCFStringEncoding(SQLITE_UTF16LE)
+// == kCFStringEncodingUTF16LE,
+// @"helper method didn't return right encoding for "
+// @"kCFStringEncodingUTF16LE");
+
+// XCTAssertTrue(SqliteTextEncodingToCFStringEncoding(9999)
+// == kCFStringEncodingUTF8, @"helper method didn't "
+// @"return default encoding for invalid input");
// }
@end
@@ -1182,8 +1148,8 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:nil
inDatabase:nil
errorCode:&err];
- STAssertNil(statement, @"Create statement succeeded with nil SQL string");
- STAssertEquals(err, SQLITE_MISUSE, @"Err was not SQLITE_MISUSE on nil "
+ XCTAssertNil(statement, @"Create statement succeeded with nil SQL string");
+ XCTAssertEqual(err, SQLITE_MISUSE, @"Err was not SQLITE_MISUSE on nil "
@"SQL string");
GTMSQLiteDatabase *db =
@@ -1196,8 +1162,8 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
inDatabase:db
errorCode:&err];
- STAssertNil(statement, @"Select statement succeeded with invalid table");
- STAssertNotEquals(err, SQLITE_OK,
+ XCTAssertNil(statement, @"Select statement succeeded with invalid table");
+ XCTAssertNotEqual(err, SQLITE_OK,
@"Err was not SQLITE_MISUSE on invalid table");
[statement finalizeStatement];
@@ -1219,7 +1185,7 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
err = [db executeSQL:tableCreateSQL];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for collation test");
NSString *insert =
@"insert into foo (tc, ic, rc, bc) values (:tc, :ic, :rc, :bc);";
@@ -1227,9 +1193,9 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
- STAssertEquals([statement parameterCount], 4,
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertEqual([statement parameterCount], 4,
@"Bound parameter count was not 4");
[statement sqlite3Statement];
@@ -1253,7 +1219,7 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
NSArray *databases = [NSArray arrayWithObjects:dbWithCF, dbWithoutCF, nil];
GTMSQLiteDatabase *db;
- GTM_FOREACH_OBJECT(db, databases) {
+ for (db in databases) {
NSString *tableCreateSQL =
@"CREATE TABLE foo (tc TEXT,"
@"ic integer,"
@@ -1261,7 +1227,7 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
@"bc blob);";
err = [db executeSQL:tableCreateSQL];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for collation test");
NSString *insert =
@"insert into foo (tc, ic, rc, bc) "
@@ -1270,8 +1236,8 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create statement");
+ XCTAssertNotNil(statement, @"Failed to create statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create statement");
NSArray *parameterNames = [NSArray arrayWithObjects:@":tc",
@":ic",
@@ -1280,15 +1246,15 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
for (unsigned int i = 1; i <= [parameterNames count]; i++) {
NSString *paramName = [parameterNames objectAtIndex:i-1];
- // Cast to signed int to avoid type errors from STAssertEquals
- STAssertEquals((int)i,
+ // Cast to signed int to avoid type errors from XCTAssertEqual
+ XCTAssertEqual((int)i,
[statement positionOfParameterNamed:paramName],
@"positionOfParameterNamed API did not return correct "
@"results");
- STAssertEqualStrings(paramName,
- [statement nameOfParameterAtPosition:i],
- @"nameOfParameterAtPosition API did not return "
- @"correct name");
+ XCTAssertEqualStrings(paramName,
+ [statement nameOfParameterAtPosition:i],
+ @"nameOfParameterAtPosition API did not return "
+ @"correct name");
}
[statement finalizeStatement];
}
@@ -1311,21 +1277,21 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
NSArray *databases = [NSArray arrayWithObjects:dbWithCF, dbWithoutCF, nil];
GTMSQLiteDatabase *db;
- GTM_FOREACH_OBJECT(db, databases) {
+ for (db in databases) {
// Test strategy is to create a table with 3 columns
// Insert some values, and use the result collection APIs
// to make sure we get the same values back
err = [db executeSQL:
@"CREATE TABLE blobby (bc blob);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for BLOB binding test");
NSString *insert = @"insert into blobby (bc) values (:bc);";
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create insert statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement");
+ XCTAssertNotNil(statement, @"Failed to create insert statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create insert statement");
char bytes[] = "DEADBEEF";
NSUInteger bytesLen = strlen(bytes);
@@ -1333,10 +1299,10 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
err = [statement bindBlobAtPosition:1 data:originalBytes];
- STAssertEquals(err, SQLITE_OK, @"error binding BLOB at position 1");
+ XCTAssertEqual(err, SQLITE_OK, @"error binding BLOB at position 1");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE, @"failed to insert BLOB for BLOB test");
+ XCTAssertEqual(err, SQLITE_DONE, @"failed to insert BLOB for BLOB test");
[statement finalizeStatement];
@@ -1344,30 +1310,30 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
err = [statement stepRow];
// Check that we got at least one row back
- STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
- STAssertEquals([statement resultColumnCount], 1,
+ XCTAssertEqual(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
+ XCTAssertEqual([statement resultColumnCount], 1,
@"result had more columns than the table had?");
- STAssertEqualStrings([statement resultColumnNameAtPosition:BLOB_COLUMN],
- @"bc",
- @"column name dictionary was not correct");
+ XCTAssertEqualStrings([statement resultColumnNameAtPosition:BLOB_COLUMN],
+ @"bc",
+ @"column name dictionary was not correct");
- STAssertEquals([statement rowDataCount],
+ XCTAssertEqual([statement rowDataCount],
1,
@"More than one column returned?");
- STAssertEquals([statement resultColumnTypeAtPosition:BLOB_COLUMN],
+ XCTAssertEqual([statement resultColumnTypeAtPosition:BLOB_COLUMN],
SQLITE_BLOB,
@"Query for column 1 of test table was not BLOB!");
NSData *returnedbytes = [statement resultBlobDataAtPosition:BLOB_COLUMN];
- STAssertTrue([originalBytes isEqualToData:returnedbytes],
- @"Queried data was not equal :-(");
+ XCTAssertTrue([originalBytes isEqualToData:returnedbytes],
+ @"Queried data was not equal :-(");
[statement finalizeStatement];
}
}
@@ -1383,22 +1349,22 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
err = [db executeSQL:
@"CREATE TABLE foo (tc TEXT);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for NULL binding test");
NSString *insert = @"insert into foo (tc) values (:tc);";
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create insert statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement");
+ XCTAssertNotNil(statement, @"Failed to create insert statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create insert statement");
err = [statement bindSQLNullAtPosition:1];
- STAssertEquals(err, SQLITE_OK, @"error binding NULL at position 1");
+ XCTAssertEqual(err, SQLITE_OK, @"error binding NULL at position 1");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE, @"failed to insert NULL for Null Binding test");
+ XCTAssertEqual(err, SQLITE_DONE, @"failed to insert NULL for Null Binding test");
[statement finalizeStatement];
@@ -1406,12 +1372,12 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
err = [statement stepRow];
// Check that we got at least one row back
- STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
+ XCTAssertEqual(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
[statement finalizeStatement];
}
@@ -1434,26 +1400,26 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
err = [db executeSQL:
@"CREATE TABLE realTable (rc1 REAL, rc2 REAL);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for double binding test");
NSString *insert = @"insert into realTable (rc1, rc2) values (:rc1, :rc2);";
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create insert statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement");
+ XCTAssertNotNil(statement, @"Failed to create insert statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create insert statement");
err = [statement bindDoubleAtPosition:1 value:testVal];
- STAssertEquals(err, SQLITE_OK, @"error binding double at position 1");
+ XCTAssertEqual(err, SQLITE_OK, @"error binding double at position 1");
err = [statement bindNumberAsDoubleAtPosition:2 number:doubleValue];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"error binding number as double at "
@"position 2");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE,
+ XCTAssertEqual(err, SQLITE_DONE,
@"failed to insert doubles for double "
@"binding test");
@@ -1463,20 +1429,20 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
err = [statement stepRow];
// Check that we got at least one row back
- STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
+ XCTAssertEqual(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
double retrievedValue = [statement resultDoubleAtPosition:0];
- STAssertEquals(retrievedValue, testVal,
- @"Retrieved double did not equal "
- @"original");
+ XCTAssertEqualWithAccuracy(retrievedValue, testVal, 0.01,
+ @"Retrieved double did not equal "
+ @"original");
NSNumber *retrievedNumber = [statement resultNumberAtPosition:1];
- STAssertEqualObjects(retrievedNumber, doubleValue,
- @"Retrieved NSNumber object did not equal");
+ XCTAssertEqualObjects(retrievedNumber, doubleValue,
+ @"Retrieved NSNumber object did not equal");
[statement finalizeStatement];
}
@@ -1497,14 +1463,14 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
NSArray *databases = [NSArray arrayWithObjects:dbWithCF, dbWithoutCF, nil];
GTMSQLiteDatabase *db;
- GTM_FOREACH_OBJECT(db, databases) {
+ for (db in databases) {
// Test strategy is to create a table with 3 columns
// Insert some values, and use the result collection APIs
// to make sure we get the same values back
err = [db executeSQL:
@"CREATE TABLE test (a integer, b text, c blob, d text);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for result collection test");
NSString *insert =
@@ -1514,8 +1480,8 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create insert statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement");
+ XCTAssertNotNil(statement, @"Failed to create insert statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create insert statement");
char blobChars[] = "DEADBEEF";
@@ -1523,10 +1489,10 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
NSData *blobData = [NSData dataWithBytes:blobChars length:blobLength];
err = [statement bindBlobAtPosition:1 data:blobData];
- STAssertEquals(err, SQLITE_OK, @"error binding BLOB at position 1");
+ XCTAssertEqual(err, SQLITE_OK, @"error binding BLOB at position 1");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE,
+ XCTAssertEqual(err, SQLITE_DONE,
@"failed to insert doubles for double "
@"binding test");
@@ -1537,16 +1503,16 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
err = [statement stepRow];
// Check that we got at least one row back
- STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
- STAssertNotNil([statement resultRowArray],
- @"Failed to retrieve result array");
- STAssertNotNil([statement resultRowDictionary],
- @"Failed to retrieve result dictionary");
+ XCTAssertEqual(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
+ XCTAssertNotNil([statement resultRowArray],
+ @"Failed to retrieve result array");
+ XCTAssertNotNil([statement resultRowDictionary],
+ @"Failed to retrieve result dictionary");
[statement finalizeStatement];
}
}
@@ -1570,7 +1536,7 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
err = [db executeSQL:
@"CREATE TABLE integerTable (ic1 integer, ic2 integer);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for integer binding test");
NSString *insert =
@"insert into integerTable (ic1, ic2) values (:ic1, :ic2);";
@@ -1578,19 +1544,19 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create insert statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement");
+ XCTAssertNotNil(statement, @"Failed to create insert statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create insert statement");
err = [statement bindInt32AtPosition:1 value:testVal];
- STAssertEquals(err, SQLITE_OK, @"error binding integer at position 1");
+ XCTAssertEqual(err, SQLITE_OK, @"error binding integer at position 1");
err = [statement bindNumberAsInt32AtPosition:2 number:intValue];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"error binding number as integer at "
@"position 2");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE,
+ XCTAssertEqual(err, SQLITE_DONE,
@"failed to insert integers for integer "
@"binding test");
@@ -1600,20 +1566,20 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
err = [statement stepRow];
// Check that we got at least one row back
- STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
+ XCTAssertEqual(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
int retrievedValue = [statement resultInt32AtPosition:0];
- STAssertEquals(retrievedValue, testVal,
+ XCTAssertEqual(retrievedValue, testVal,
@"Retrieved integer did not equal "
@"original");
NSNumber *retrievedNumber = [statement resultNumberAtPosition:1];
- STAssertEqualObjects(retrievedNumber, intValue,
- @"Retrieved NSNumber object did not equal");
+ XCTAssertEqualObjects(retrievedNumber, intValue,
+ @"Retrieved NSNumber object did not equal");
[statement finalizeStatement];
}
@@ -1635,9 +1601,9 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
NSNumber *longlongValue = [NSNumber numberWithLongLong:testVal];
err = [db executeSQL:
- @"CREATE TABLE longlongTable (llc1 integer, llc2 integer);"];
+ @"CREATE TABLE longlongTable (llc1 integer, llc2 integer);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for long long binding test");
NSString *insert =
@"insert into longlongTable (llc1, llc2) "
@@ -1646,19 +1612,19 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create insert statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement");
+ XCTAssertNotNil(statement, @"Failed to create insert statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create insert statement");
err = [statement bindLongLongAtPosition:1 value:testVal];
- STAssertEquals(err, SQLITE_OK, @"error binding long long at position 1");
+ XCTAssertEqual(err, SQLITE_OK, @"error binding long long at position 1");
err = [statement bindNumberAsLongLongAtPosition:2 number:longlongValue];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"error binding number as long long at "
@"position 2");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE,
+ XCTAssertEqual(err, SQLITE_DONE,
@"failed to insert long longs for long long "
@"binding test");
@@ -1669,20 +1635,20 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
err = [statement stepRow];
// Check that we got at least one row back
- STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
+ XCTAssertEqual(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
long long retrievedValue = [statement resultLongLongAtPosition:0];
- STAssertEquals(retrievedValue, testVal,
+ XCTAssertEqual(retrievedValue, testVal,
@"Retrieved long long did not equal "
@"original");
NSNumber *retrievedNumber = [statement resultNumberAtPosition:1];
- STAssertEqualObjects(retrievedNumber, longlongValue,
- @"Retrieved NSNumber object did not equal");
+ XCTAssertEqualObjects(retrievedNumber, longlongValue,
+ @"Retrieved NSNumber object did not equal");
[statement finalizeStatement];
}
@@ -1701,7 +1667,7 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
err = [db executeSQL:
@"CREATE TABLE stringTable (sc1 text);"];
- STAssertEquals(err, SQLITE_OK,
+ XCTAssertEqual(err, SQLITE_OK,
@"Failed to create table for string binding test");
NSString *insert =
@@ -1711,15 +1677,15 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
GTMSQLiteStatement *statement = [GTMSQLiteStatement statementWithSQL:insert
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create insert statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create insert statement");
+ XCTAssertNotNil(statement, @"Failed to create insert statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create insert statement");
NSString *testVal = @"this is a test string";
err = [statement bindStringAtPosition:1 string:testVal];
- STAssertEquals(err, SQLITE_OK, @"error binding string at position 1");
+ XCTAssertEqual(err, SQLITE_OK, @"error binding string at position 1");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE,
+ XCTAssertEqual(err, SQLITE_DONE,
@"failed to insert string for string binding test");
[statement finalizeStatement];
@@ -1731,14 +1697,14 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
err = [statement stepRow];
// Check that we got at least one row back
- STAssertEquals(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
+ XCTAssertEqual(err, SQLITE_ROW, @"did not retrieve a row from db :-(");
err = [statement stepRow];
- STAssertEquals(err, SQLITE_DONE, @"retrieved more than 1 row from db :-(");
+ XCTAssertEqual(err, SQLITE_DONE, @"retrieved more than 1 row from db :-(");
[statement finalizeStatement];
}
@@ -1752,61 +1718,54 @@ static NSArray* LikeGlobTestHelper(GTMSQLiteDatabase *db, NSString *sql) {
errorCode:&err]
autorelease];
- STAssertNotNil(db, @"Failed to create database");
+ XCTAssertNotNil(db, @"Failed to create database");
sqlite3 *sqlite3DB = [db sqlite3DB];
-
+
NSString *selectSQL = @"select 1";
GTMSQLiteStatement *statement;
statement = [GTMSQLiteStatement statementWithSQL:selectSQL
inDatabase:db
errorCode:&err];
- STAssertNotNil(statement, @"Failed to create select statement");
- STAssertEquals(err, SQLITE_OK, @"Failed to create select statement");
+ XCTAssertNotNil(statement, @"Failed to create select statement");
+ XCTAssertEqual(err, SQLITE_OK, @"Failed to create select statement");
sqlite3_stmt *sqlite3Statment = [statement sqlite3Statement];
err = [statement stepRow];
- STAssertEquals(err, SQLITE_ROW,
+ XCTAssertEqual(err, SQLITE_ROW,
@"failed to step row for finalize test");
-
- NSString *expectedLog =
- @"-[GTMSQLiteStatement finalizeStatement] must be called "
- @"when statement is no longer needed";
-
- [GTMUnitTestDevLog expectString:@"%@", expectedLog];
- [GTMUnitTestDevLog expectPattern:@"Unable to close .*"];
[localPool drain];
-
+
// Clean up leaks. Since we hadn't finalized the statement above we
// were unable to clean up the sqlite databases. Since the pool is drained
// all of our objective-c objects are gone, so we have to call the
// sqlite3 api directly.
- STAssertEquals(sqlite3_finalize(sqlite3Statment), SQLITE_OK, nil);
- STAssertEquals(sqlite3_close(sqlite3DB), SQLITE_OK, nil);
+ XCTAssertEqual(sqlite3_finalize(sqlite3Statment), SQLITE_OK);
+ XCTAssertEqual(sqlite3_close(sqlite3DB), SQLITE_OK);
}
- (void)testCompleteSQLString {
NSString *str = @"CREATE TABLE longlongTable (llc1 integer, llc2 integer);";
BOOL isComplete = [GTMSQLiteStatement isCompleteStatement:str];
- STAssertTrue(isComplete, nil);
+ XCTAssertTrue(isComplete);
isComplete = [GTMSQLiteStatement isCompleteStatement:@""];
- STAssertTrue(isComplete, nil);
+ XCTAssertFalse(isComplete);
isComplete = [GTMSQLiteStatement isCompleteStatement:@"CR"];
- STAssertFalse(isComplete, nil);
+ XCTAssertFalse(isComplete);
}
- (void)testQuotingSQLString {
NSString *str = @"This is wild! It's fun!";
NSString *str2 = [GTMSQLiteStatement quoteAndEscapeString:str];
- STAssertEqualObjects(str2, @"'This is wild! It''s fun!'", nil);
+ XCTAssertEqualObjects(str2, @"'This is wild! It''s fun!'");
str2 = [GTMSQLiteStatement quoteAndEscapeString:@""];
- STAssertEqualObjects(str2, @"''", nil);
+ XCTAssertEqualObjects(str2, @"''");
}
- (void)testVersion {
- STAssertGreaterThan([GTMSQLiteDatabase sqliteVersionNumber], 0, nil);
- STAssertNotNil([GTMSQLiteDatabase sqliteVersionString], nil);
+ XCTAssertGreaterThan([GTMSQLiteDatabase sqliteVersionNumber], 0);
+ XCTAssertNotNil([GTMSQLiteDatabase sqliteVersionString]);
}
@end
diff --git a/Foundation/GTMScriptRunnerTest.m b/Foundation/GTMScriptRunnerTest.m
index 07928c2..c8050f5 100644
--- a/Foundation/GTMScriptRunnerTest.m
+++ b/Foundation/GTMScriptRunnerTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,10 +20,9 @@
#import <unistd.h>
#import "GTMSenTestCase.h"
#import "GTMScriptRunner.h"
-#import "GTMUnitTestDevLog.h"
@interface GTMScriptRunnerTest : GTMTestCase {
- @private
+ @private
NSString *shScript_;
NSString *perlScript_;
NSString *shOutputScript_;
@@ -45,7 +44,7 @@
@"fi\n"
@"echo $i\n"
writeToFile:shScript_ atomically:YES encoding:NSUTF8StringEncoding error:nil];
-
+
perlScript_ = [NSString stringWithFormat:@"/tmp/script_runner_unittest_%d_%d_pl", geteuid(), getpid()];
[@"#!/usr/bin/perl\n"
@"use strict;\n"
@@ -99,176 +98,179 @@
- (void)testBcCommands {
GTMScriptRunner *sr = [GTMScriptRunner runnerWithInterpreter:@"/usr/bin/bc"
withArgs:[NSArray arrayWithObject:@"-lq"]];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
-
+
// Simple expression (NOTE that bc requires that commands end with a newline)
output = [sr run:@"1 + 2\n"];
- STAssertEqualObjects(output, @"3", @"output should equal '3'");
-
+ XCTAssertEqualObjects(output, @"3", @"output should equal '3'");
+
// Simple expression with variables and multiple statements
output = [sr run:@"i=1; i+2\n"];
- STAssertEqualObjects(output, @"3", @"output should equal '3'");
-
+ XCTAssertEqualObjects(output, @"3", @"output should equal '3'");
+
// Simple expression with base conversion
output = [sr run:@"obase=2; 2^5\n"];
- STAssertEqualObjects(output, @"100000", @"output should equal '100000'");
-
+ XCTAssertEqualObjects(output, @"100000", @"output should equal '100000'");
+
// Simple expression with sine and cosine functions
output = [sr run:@"scale=3;s(0)+c(0)\n"];
- STAssertEqualObjects(output, @"1.000", @"output should equal '1.000'");
+ XCTAssertEqualObjects(output, @"1.000", @"output should equal '1.000'");
}
- (void)testPerlCommands {
GTMScriptRunner *sr = [GTMScriptRunner runnerWithPerl];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
-
+
// Simple print
output = [sr run:@"print 'hi'"];
- STAssertEqualObjects(output, @"hi", @"output should equal 'hi'");
-
+ XCTAssertEqualObjects(output, @"hi", @"output should equal 'hi'");
+
// Simple print x4
output = [sr run:@"print 'A'x4"];
- STAssertEqualObjects(output, @"AAAA", @"output should equal 'AAAA'");
-
+ XCTAssertEqualObjects(output, @"AAAA", @"output should equal 'AAAA'");
+
// Simple perl-y stuff
output = [sr run:@"my $i=0; until ($i++==41){} print $i"];
- STAssertEqualObjects(output, @"42", @"output should equal '42'");
+ XCTAssertEqualObjects(output, @"42", @"output should equal '42'");
}
- (void)testPythonCommands {
GTMScriptRunner *sr = [GTMScriptRunner runnerWithPython];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
-
+
// Simple print
output = [sr run:@"print 'hi'"];
- STAssertEqualObjects(output, @"hi", @"output should equal 'hi'");
-
+ XCTAssertEqualObjects(output, @"hi", @"output should equal 'hi'");
+
// Simple python expression
output = [sr run:@"print '-'.join(['a', 'b', 'c'])"];
- STAssertEqualObjects(output, @"a-b-c", @"output should equal 'a-b-c'");
+ XCTAssertEqualObjects(output, @"a-b-c", @"output should equal 'a-b-c'");
}
- (void)testBashScript {
GTMScriptRunner *sr = [GTMScriptRunner runnerWithBash];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
-
+
// Simple sh script
output = [sr runScript:shScript_];
- STAssertEqualObjects(output, @"1", @"output should equal '1'");
-
+ XCTAssertEqualObjects(output, @"1", @"output should equal '1'");
+
// Simple sh script with 1 command line argument
output = [sr runScript:shScript_ withArgs:[NSArray arrayWithObject:@"2"]];
- STAssertEqualObjects(output, @"2", @"output should equal '2'");
+ XCTAssertEqualObjects(output, @"2", @"output should equal '2'");
}
- (void)testPerlScript {
GTMScriptRunner *sr = [GTMScriptRunner runnerWithPerl];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
-
+
// Simple Perl script
output = [sr runScript:perlScript_];
- STAssertEqualObjects(output, @"1", @"output should equal '1'");
-
+ XCTAssertEqualObjects(output, @"1", @"output should equal '1'");
+
// Simple perl script with 1 command line argument
output = [sr runScript:perlScript_ withArgs:[NSArray arrayWithObject:@"2"]];
- STAssertEqualObjects(output, @"2", @"output should equal '2'");
+ XCTAssertEqualObjects(output, @"2", @"output should equal '2'");
}
- (void)testEnvironment {
GTMScriptRunner *sr = [GTMScriptRunner runner];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
NSString *error = nil;
- STAssertNil([sr environment], @"should start w/ empty env");
-
+ XCTAssertNil([sr environment], @"should start w/ empty env");
+
output = [sr run:@"/usr/bin/env | wc -l" standardError:&error];
int numVars = [output intValue];
- STAssertGreaterThan(numVars, 0,
- @"numVars should be positive. StdErr %@", error);
+ XCTAssertGreaterThan(numVars, 0,
+ @"numVars should be positive. StdErr %@", error);
// By default the environment is wiped clean, however shells often add a few
- // of their own env vars after things have been wiped. For example, sh will
+ // of their own env vars after things have been wiped. For example, sh will
// add about 3 env vars (PWD, _, and SHLVL).
- STAssertLessThan(numVars, 5, @"Our env should be almost empty");
-
+ XCTAssertLessThan(numVars, 5, @"Our env should be almost empty");
+
NSDictionary *newEnv = [NSDictionary dictionaryWithObject:@"bar"
forKey:@"foo"];
[sr setEnvironment:newEnv];
output = [sr run:@"/usr/bin/env | wc -l" standardError:&error];
- STAssertEquals([output intValue], numVars + 1,
- @"should have one more env var now. StdErr %@", error);
-
+ XCTAssertEqual([output intValue], numVars + 1,
+ @"should have one more env var now. StdErr %@", error);
+
[sr setEnvironment:nil];
output = [sr run:@"/usr/bin/env | wc -l" standardError:&error];
- STAssertEquals([output intValue], numVars,
- @"should be back down to %d vars. StdErr:%@", numVars, error);
-
- NSMutableDictionary *currVars
+ XCTAssertEqual([output intValue], numVars,
+ @"should be back down to %d vars. StdErr:%@", numVars, error);
+
+ NSMutableDictionary *currVars
= [[[[NSProcessInfo processInfo] environment] mutableCopy] autorelease];
-
+
// When debugging a release build _ was not in the processInfo environment
// causing the assert below to fail. Not sure why, but it appeared
// to be harmless, and easy to account for.
[currVars setObject:@"/usr/bin/env" forKey:@"_"];
[sr setEnvironment:currVars];
-
+
+ // Account for the shell level.
+ [currVars setObject:@"1" forKey:@"SHLVL"];
+
output = [sr run:@"/usr/bin/env | /usr/bin/sort" standardError:&error];
NSArray *lineArray = [output componentsSeparatedByString:@"\n"];
- STAssertEquals([lineArray count], [currVars count],
- @"StdErr:%@\nCurrentEnvironment:\n%@\nExpected environment:\n%@",
- error, output, currVars);
+ XCTAssertEqual([lineArray count], [currVars count],
+ @"StdErr:%@\nCurrentEnvironment:\n%@\nExpected environment:\n%@",
+ error, output, currVars);
}
- (void)testDescription {
// make sure description doesn't choke
GTMScriptRunner *sr = [GTMScriptRunner runner];
- STAssertNotNil(sr, @"Script runner must not be nil");
- STAssertGreaterThan([[sr description] length], (NSUInteger)10,
- @"expected a description of at least 10 chars");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertGreaterThan([[sr description] length], (NSUInteger)10,
+ @"expected a description of at least 10 chars");
}
- (void)testRunCommandOutputHandling {
// Test whitespace trimming & stdout vs. stderr w/ run command api
-
+
GTMScriptRunner *sr = [GTMScriptRunner runnerWithBash];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
NSString *err = nil;
-
+
// w/o whitespace trimming
{
[sr setTrimsWhitespace:NO];
- STAssertFalse([sr trimsWhitespace], @"setTrimsWhitespace to NO failed");
-
+ XCTAssertFalse([sr trimsWhitespace], @"setTrimsWhitespace to NO failed");
+
// test stdout
output = [sr run:@"echo \" on out \"" standardError:&err];
- STAssertEqualObjects(output, @" on out \n", @"failed to get stdout output");
- STAssertNil(err, @"stderr should have been empty");
-
+ XCTAssertEqualObjects(output, @" on out \n", @"failed to get stdout output");
+ XCTAssertNil(err, @"stderr should have been empty");
+
// test stderr
output = [sr run:@"echo \" on err \" > /dev/stderr" standardError:&err];
- STAssertNil(output, @"stdout should have been empty");
- STAssertEqualObjects(err, @" on err \n", nil);
+ XCTAssertNil(output, @"stdout should have been empty");
+ XCTAssertEqualObjects(err, @" on err \n");
}
-
+
// w/ whitespace trimming
{
[sr setTrimsWhitespace:YES];
- STAssertTrue([sr trimsWhitespace], @"setTrimsWhitespace to YES failed");
-
+ XCTAssertTrue([sr trimsWhitespace], @"setTrimsWhitespace to YES failed");
+
// test stdout
output = [sr run:@"echo \" on out \"" standardError:&err];
- STAssertEqualObjects(output, @"on out", @"failed to get stdout output");
- STAssertNil(err, @"stderr should have been empty");
-
+ XCTAssertEqualObjects(output, @"on out", @"failed to get stdout output");
+ XCTAssertNil(err, @"stderr should have been empty");
+
// test stderr
output = [sr run:@"echo \" on err \" > /dev/stderr" standardError:&err];
- STAssertNil(output, @"stdout should have been empty");
- STAssertEqualObjects(err, @"on err", nil);
+ XCTAssertNil(output, @"stdout should have been empty");
+ XCTAssertEqualObjects(err, @"on err");
}
}
@@ -276,102 +278,96 @@
// Test whitespace trimming & stdout vs. stderr w/ script api
GTMScriptRunner *sr = [GTMScriptRunner runner];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
NSString *err = nil;
// w/o whitespace trimming
{
[sr setTrimsWhitespace:NO];
- STAssertFalse([sr trimsWhitespace], @"setTrimsWhitespace to NO failed");
-
+ XCTAssertFalse([sr trimsWhitespace], @"setTrimsWhitespace to NO failed");
+
// test stdout
output = [sr runScript:shOutputScript_
withArgs:[NSArray arrayWithObject:@"out"]
standardError:&err];
- STAssertEqualObjects(output, @" on out \n", nil);
- STAssertNil(err, @"stderr should have been empty");
-
+ XCTAssertEqualObjects(output, @" on out \n");
+ XCTAssertNil(err, @"stderr should have been empty");
+
// test stderr
output = [sr runScript:shOutputScript_
withArgs:[NSArray arrayWithObject:@"err"]
standardError:&err];
- STAssertNil(output, @"stdout should have been empty");
- STAssertEqualObjects(err, @" on err \n", nil);
+ XCTAssertNil(output, @"stdout should have been empty");
+ XCTAssertEqualObjects(err, @" on err \n");
}
-
+
// w/ whitespace trimming
{
[sr setTrimsWhitespace:YES];
- STAssertTrue([sr trimsWhitespace], @"setTrimsWhitespace to YES failed");
-
+ XCTAssertTrue([sr trimsWhitespace], @"setTrimsWhitespace to YES failed");
+
// test stdout
output = [sr runScript:shOutputScript_
withArgs:[NSArray arrayWithObject:@"out"]
standardError:&err];
- STAssertEqualObjects(output, @"on out", nil);
- STAssertNil(err, @"stderr should have been empty");
-
+ XCTAssertEqualObjects(output, @"on out");
+ XCTAssertNil(err, @"stderr should have been empty");
+
// test stderr
output = [sr runScript:shOutputScript_
withArgs:[NSArray arrayWithObject:@"err"]
standardError:&err];
- STAssertNil(output, @"stdout should have been empty");
- STAssertEqualObjects(err, @"on err", nil);
+ XCTAssertNil(output, @"stdout should have been empty");
+ XCTAssertEqualObjects(err, @"on err");
}
}
- (void)testBadRunCommandInput {
GTMScriptRunner *sr = [GTMScriptRunner runner];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *err = nil;
-
- STAssertNil([sr run:nil standardError:&err], nil);
- STAssertNil(err, nil);
+
+ XCTAssertNil([sr run:nil standardError:&err]);
+ XCTAssertNil(err);
}
- (void)testBadScriptInput {
GTMScriptRunner *sr = [GTMScriptRunner runner];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *err = nil;
-
- STAssertNil([sr runScript:nil withArgs:nil standardError:&err], nil);
- STAssertNil(err, nil);
- STAssertNil([sr runScript:@"/path/that/does/not/exists/foo/bar/baz"
- withArgs:nil standardError:&err], nil);
- STAssertNotNil(err,
- @"should have gotten something about the path not existing");
+
+ XCTAssertNil([sr runScript:nil withArgs:nil standardError:&err]);
+ XCTAssertNil(err);
+ XCTAssertNil([sr runScript:@"/path/that/does/not/exists/foo/bar/baz"
+ withArgs:nil standardError:&err]);
+ XCTAssertNotNil(err,
+ @"should have gotten something about the path not existing");
}
- (void)testBadCmdInterpreter {
GTMScriptRunner *sr =
[GTMScriptRunner runnerWithInterpreter:@"/path/that/does/not/exists/interpreter"];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *err = nil;
-
- STAssertNil([sr run:nil standardError:&err], nil);
- STAssertNil(err, nil);
- [GTMUnitTestDevLog expectString:@"Failed to launch interpreter "
- "'/path/that/does/not/exists/interpreter' due to: launch path not accessible"];
- STAssertNil([sr run:@"ls /" standardError:&err], nil);
- STAssertNil(err, nil);
+
+ XCTAssertNil([sr run:nil standardError:&err]);
+ XCTAssertNil(err);
+ XCTAssertNil([sr run:@"ls /" standardError:&err]);
+ XCTAssertNil(err);
}
- (void)testBadScriptInterpreter {
GTMScriptRunner *sr =
[GTMScriptRunner runnerWithInterpreter:@"/path/that/does/not/exists/interpreter"];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *err = nil;
-
- [GTMUnitTestDevLog expectString:@"Failed to launch interpreter "
- "'/path/that/does/not/exists/interpreter' due to: launch path not accessible"];
- STAssertNil([sr runScript:shScript_ withArgs:nil standardError:&err], nil);
- STAssertNil(err, nil);
- [GTMUnitTestDevLog expectString:@"Failed to launch interpreter "
- "'/path/that/does/not/exists/interpreter' due to: launch path not accessible"];
- STAssertNil([sr runScript:@"/path/that/does/not/exists/foo/bar/baz"
- withArgs:nil standardError:&err], nil);
- STAssertNil(err, nil);
+
+ XCTAssertNil([sr runScript:shScript_ withArgs:nil standardError:&err]);
+ XCTAssertNil(err);
+ XCTAssertNil([sr runScript:@"/path/that/does/not/exists/foo/bar/baz"
+ withArgs:nil standardError:&err]);
+ XCTAssertNil(err);
}
- (void)testLargeOutput {
@@ -379,9 +375,9 @@
// http://code.google.com/p/google-toolbox-for-mac/issues/detail?id=25
GTMScriptRunner *sr = [GTMScriptRunner runnerWithPython];
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil, *err = nil, *cmd = nil;
-
+
#define GENERATOR_FORMAT_STR \
@"import sys\n" \
@"block = '.' * 512\n" \
@@ -393,33 +389,33 @@
@" sys.stdout.write(block)\n" \
@" if to_where in [ 'e', 'b' ]:\n" \
@" sys.stderr.write(block)\n"
-
+
// Make sure we get both blocks
cmd = [NSString stringWithFormat:GENERATOR_FORMAT_STR, @"'b1'"];
- STAssertNotNil(cmd, nil);
+ XCTAssertNotNil(cmd);
output = [sr run:cmd standardError:&err];
- STAssertEquals([output length], (NSUInteger)512, nil);
- STAssertEquals([err length], (NSUInteger)512, nil);
-
+ XCTAssertEqual([output length], (NSUInteger)512);
+ XCTAssertEqual([err length], (NSUInteger)512);
+
// Test a large amount of data on only one connections at a time.
cmd = [NSString stringWithFormat:GENERATOR_FORMAT_STR, @"'b1', 'o200'"];
- STAssertNotNil(cmd, nil);
+ XCTAssertNotNil(cmd);
output = [sr run:cmd standardError:&err];
- STAssertEquals([output length], (NSUInteger)(512 + 512*200), nil);
- STAssertEquals([err length], (NSUInteger)512, nil);
+ XCTAssertEqual([output length], (NSUInteger)(512 + 512*200));
+ XCTAssertEqual([err length], (NSUInteger)512);
cmd = [NSString stringWithFormat:GENERATOR_FORMAT_STR, @"'b1', 'e200'"];
- STAssertNotNil(cmd, nil);
+ XCTAssertNotNil(cmd);
output = [sr run:cmd standardError:&err];
- STAssertEquals([output length], (NSUInteger)512, nil);
- STAssertEquals([err length], (NSUInteger)(512 + 512*200), nil);
+ XCTAssertEqual([output length], (NSUInteger)512);
+ XCTAssertEqual([err length], (NSUInteger)(512 + 512*200));
// Now send a large amount down both to make sure we spool it all in.
cmd = [NSString stringWithFormat:GENERATOR_FORMAT_STR, @"'b200'"];
- STAssertNotNil(cmd, nil);
+ XCTAssertNotNil(cmd);
output = [sr run:cmd standardError:&err];
- STAssertEquals([output length], (NSUInteger)(512*200), nil);
- STAssertEquals([err length], (NSUInteger)(512*200), nil);
+ XCTAssertEqual([output length], (NSUInteger)(512*200));
+ XCTAssertEqual([err length], (NSUInteger)(512*200));
}
@@ -428,44 +424,44 @@
@implementation GTMScriptRunnerTest (PrivateMethods)
- (void)helperTestBourneShellUsingScriptRunner:(GTMScriptRunner *)sr {
- STAssertNotNil(sr, @"Script runner must not be nil");
+ XCTAssertNotNil(sr, @"Script runner must not be nil");
NSString *output = nil;
-
+
// Simple command
output = [sr run:@"ls /etc/passwd"];
- STAssertEqualObjects(output, @"/etc/passwd", @"output should equal '/etc/passwd'");
-
+ XCTAssertEqualObjects(output, @"/etc/passwd", @"output should equal '/etc/passwd'");
+
// Simple command pipe-line
- output = [sr run:@"ls /etc/ | grep passwd | tail -1"];
- STAssertEqualObjects(output, @"passwd", @"output should equal 'passwd'");
-
+ output = [sr run:@"ls /etc/ | grep cups | tail -1"];
+ XCTAssertEqualObjects(output, @"cups", @"output should equal 'cups'");
+
// Simple pipe-line with quotes and awk variables
output = [sr run:@"ps jaxww | awk '{print $2}' | sort -nr | tail -2 | head -1"];
- STAssertEqualObjects(output, @"1", @"output should equal '1'");
-
+ XCTAssertEqualObjects(output, @"1", @"output should equal '1'");
+
// Simple shell loop with variables
output = [sr run:@"i=0; while [ $i -lt 100 ]; do i=$((i+1)); done; echo $i"];
- STAssertEqualObjects(output, @"100", @"output should equal '100'");
-
+ XCTAssertEqualObjects(output, @"100", @"output should equal '100'");
+
// Simple command with newlines
output = [sr run:@"i=1\necho $i"];
- STAssertEqualObjects(output, @"1", @"output should equal '1'");
-
+ XCTAssertEqualObjects(output, @"1", @"output should equal '1'");
+
// Simple full shell script
output = [sr run:@"#!/bin/sh\ni=1\necho $i\n"];
- STAssertEqualObjects(output, @"1", @"output should equal '1'");
-
+ XCTAssertEqualObjects(output, @"1", @"output should equal '1'");
+
NSString *err = nil;
-
+
// Test getting standard error with no stdout
output = [sr run:@"ls /etc/does-not-exist" standardError:&err];
- STAssertNil(output, @"output should be nil due to expected error");
- STAssertEqualObjects(err, @"ls: /etc/does-not-exist: No such file or directory", @"");
-
+ XCTAssertNil(output, @"output should be nil due to expected error");
+ XCTAssertEqualObjects(err, @"ls: /etc/does-not-exist: No such file or directory", @"");
+
// Test getting standard output along with some standard error
output = [sr run:@"ls /etc/does-not-exist /etc/passwd" standardError:&err];
- STAssertEqualObjects(output, @"/etc/passwd", @"");
- STAssertEqualObjects(err, @"ls: /etc/does-not-exist: No such file or directory", @"");
+ XCTAssertEqualObjects(output, @"/etc/passwd", @"");
+ XCTAssertEqualObjects(err, @"ls: /etc/does-not-exist: No such file or directory", @"");
}
@end
diff --git a/Foundation/GTMServiceManagement.c b/Foundation/GTMServiceManagement.c
index 5e41ba0..dfd0dc6 100644
--- a/Foundation/GTMServiceManagement.c
+++ b/Foundation/GTMServiceManagement.c
@@ -382,8 +382,11 @@ CFTypeRef GTMCFTypeCreateFromLaunchData(launch_data_t ldata,
}
case LAUNCH_DATA_OPAQUE: {
- size_t size = launch_data_get_opaque_size(ldata);
+ // Must get the data before we get the size.
+ // Otherwise the size will come back faulty on macOS 10.11.6.
+ // Radar: 28509492 launch_data_get_opaque_size gives wrong size
void *data = launch_data_get_opaque(ldata);
+ size_t size = launch_data_get_opaque_size(ldata);
cf_type_ref = CFDataCreate(kCFAllocatorDefault, data, size);
break;
}
@@ -784,46 +787,4 @@ CFDictionaryRef GTMSMCopyAllJobDictionaries(void) {
return dict;
}
-// Some private SPIs defined by apple in the launchd sources
-// http://opensource.apple.com/source/launchd/launchd-258.25/launchd/src/
-// and
-// http://opensource.apple.com/source/launchd/launchd-329.3/launchd/src/
-// It turns out that they renamed the enum that I need to use between 10.5 and
-// 10.6. Luckily if we request the 10_5 value on 10_6 we get an error
-// so we just ask for the 10_5 value first, and then the 10_6 value second.
-
-typedef enum {
- VPROC_GSK_ENVIRONMENT_10_5 = 10,
- VPROC_GSK_ENVIRONMENT_10_6 = 11
-} vproc_gsk_t;
-
-extern vproc_err_t vproc_swap_complex(vproc_t vp,
- vproc_gsk_t key,
- launch_data_t inval,
- launch_data_t *outval);
-
-CFDictionaryRef GTMCopyLaunchdExports(void) {
- launch_data_t resp;
- CFDictionaryRef dict = NULL;
- vproc_err_t err = vproc_swap_complex(NULL,
- VPROC_GSK_ENVIRONMENT_10_5,
- NULL,
- &resp);
- if (err) {
- err = vproc_swap_complex(NULL, VPROC_GSK_ENVIRONMENT_10_6, NULL, &resp);
- }
- if (err == NULL) {
- CFErrorRef error = NULL;
- dict = GTMCFTypeCreateFromLaunchData(resp, false, &error);
- if (error) {
-#ifdef DEBUG
- CFShow(error);
-#endif // DEBUG
- CFRelease(error);
- }
- launch_data_free(resp);
- }
- return dict;
-}
-
#endif // if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4
diff --git a/Foundation/GTMServiceManagement.h b/Foundation/GTMServiceManagement.h
index 11fc4b5..aea0cbf 100644
--- a/Foundation/GTMServiceManagement.h
+++ b/Foundation/GTMServiceManagement.h
@@ -68,10 +68,6 @@ CFTypeRef GTMCFTypeCreateFromLaunchData(launch_data_t ldata,
bool convert_non_standard_objects,
CFErrorRef *error);
-// Returns the list of exports defined by launchd.
-// Caller is takes ownership of the returned type.
-CFDictionaryRef GTMCopyLaunchdExports();
-
GTM_EXTERN_C_END
#endif // if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4
diff --git a/Foundation/GTMServiceManagementTest.m b/Foundation/GTMServiceManagementTest.m
index 95ef0b4..79881f3 100644
--- a/Foundation/GTMServiceManagementTest.m
+++ b/Foundation/GTMServiceManagementTest.m
@@ -23,7 +23,6 @@
#import "GTMSenTestCase.h"
#import <servers/bootstrap.h>
-#define STANDARD_JOB_LABEL "com.apple.launchctl.Background"
#define OUR_JOB_LABEL "com.google.gtm.GTMServiceManagementTest.job"
#define BAD_JOB_LABEL "com.google.gtm.GTMServiceManagementTest.badjob"
#define TEST_HARNESS_LABEL "com.google.gtm.GTMServiceManagementTestHarness"
@@ -58,68 +57,87 @@ static NSString const *kGTMSocketName
nil];
CFErrorRef error = NULL;
launch_data_t launchDict = GTMLaunchDataCreateFromCFType(topDict, &error);
- STAssertNotNULL(launchDict, nil);
- STAssertNULL(error, @"Error: %@", error);
+ XCTAssertNotNULL(launchDict);
+ XCTAssertNULL(error, @"Error: %@", error);
NSDictionary *nsDict
= GTMCFAutorelease(GTMCFTypeCreateFromLaunchData(launchDict,
NO,
&error));
- STAssertNotNil(nsDict, nil);
- STAssertNULL(error, @"Error: %@", error);
- STAssertEqualObjects(nsDict, topDict, @"");
+ XCTAssertNotNil(nsDict);
+ XCTAssertNULL(error, @"Error: %@", error);
+ XCTAssertEqualObjects(nsDict, topDict, @"");
launch_data_free(launchDict);
// Test a bad type
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
- STAssertNotNil(url, nil);
+ XCTAssertNotNil(url);
launchDict = GTMLaunchDataCreateFromCFType(url, &error);
- STAssertNULL(launchDict, nil);
- STAssertNotNULL(error, nil);
- STAssertEqualObjects((id)CFErrorGetDomain(error),
- (id)kCFErrorDomainPOSIX, nil);
- STAssertEquals(CFErrorGetCode(error), (CFIndex)EINVAL, nil);
- CFRelease(error);
+ XCTAssertNULL(launchDict);
+ XCTAssertNotNULL(error);
+ XCTAssertEqualObjects((id)CFErrorGetDomain(error),
+ (id)kCFErrorDomainPOSIX);
+ XCTAssertEqual(CFErrorGetCode(error), (CFIndex)EINVAL);
+ if (error) {
+ CFRelease(error);
+ }
+
CFTypeRef cfType = GTMCFTypeCreateFromLaunchData(NULL, YES, &error);
- STAssertNULL(cfType, nil);
- STAssertNotNULL(error, nil);
- CFRelease(error);
+ XCTAssertNULL(cfType);
+ XCTAssertNotNULL(error);
+ if (error) {
+ CFRelease(error);
+ }
}
- (void)testJobDictionaries {
NSDictionary *jobs = GTMCFAutorelease(GTMSMCopyAllJobDictionaries());
- STAssertNotNil(jobs, nil);
- // A job that should always be around
+ XCTAssertNotNil(jobs);
+
+ // Grab an existing job
+ NSString *jobName = [[jobs allKeys] objectAtIndex:0];
NSDictionary *job
- = GTMCFAutorelease(GTMSMJobCopyDictionary(CFSTR(STANDARD_JOB_LABEL)));
- STAssertNotNil(job, nil);
+ = GTMCFAutorelease(GTMSMJobCopyDictionary((CFStringRef)jobName));
+ XCTAssertNotNil(job);
// A job that should never be around
CFTypeRef type = GTMSMJobCopyDictionary(CFSTR(BAD_JOB_LABEL));
- STAssertNULL(type, nil);
+ XCTAssertNULL(type);
}
- (void)testLaunching {
CFErrorRef error = NULL;
Boolean isGood = GTMSMJobSubmit(NULL, &error);
- STAssertFalse(isGood, nil);
- STAssertNotNULL(error, nil);
- CFRelease(error);
+ XCTAssertFalse(isGood);
+ XCTAssertNotNULL(error);
+ if (error) {
+ CFRelease(error);
+ }
+
NSDictionary *empty = [NSDictionary dictionary];
isGood = GTMSMJobSubmit((CFDictionaryRef)empty, &error);
- STAssertFalse(isGood, nil);
- STAssertNotNULL(error, nil);
- CFRelease(error);
+ XCTAssertFalse(isGood);
+ XCTAssertNotNULL(error);
+ if (error) {
+ CFRelease(error);
+ }
+
+ // Grab an existing job
+ NSDictionary *jobs = GTMCFAutorelease(GTMSMCopyAllJobDictionaries());
+ XCTAssertNotNil(jobs);
+ NSString *jobName = [[jobs allKeys] objectAtIndex:0];
NSDictionary *alreadyThere
- = [NSDictionary dictionaryWithObject:@STANDARD_JOB_LABEL
+ = [NSDictionary dictionaryWithObject:jobName
forKey:@LAUNCH_JOBKEY_LABEL];
isGood = GTMSMJobSubmit((CFDictionaryRef)alreadyThere, &error);
- STAssertFalse(isGood, nil);
- STAssertEquals([(NSError *)error code], (NSInteger)EEXIST, nil);
- CFRelease(error);
+ XCTAssertFalse(isGood);
+ XCTAssertEqual([(NSError *)error code], (NSInteger)EEXIST);
+ if (error) {
+ CFRelease(error);
+ }
NSDictionary *goodJob
= [NSDictionary dictionaryWithObjectsAndKeys:
@@ -127,26 +145,20 @@ static NSString const *kGTMSocketName
@"/bin/test", @LAUNCH_JOBKEY_PROGRAM,
nil];
isGood = GTMSMJobSubmit((CFDictionaryRef)goodJob, &error);
- STAssertTrue(isGood, nil);
- STAssertNULL(error, nil);
+ XCTAssertTrue(isGood);
+ XCTAssertNULL(error);
isGood = GTMSMJobRemove(CFSTR(OUR_JOB_LABEL), &error);
- STAssertTrue(isGood,
- @"You may need to run launchctl remove %s", OUR_JOB_LABEL);
- STAssertNULL(error, nil);
+ XCTAssertTrue(isGood,
+ @"You may need to run launchctl remove %s", OUR_JOB_LABEL);
+ XCTAssertNULL(error);
isGood = GTMSMJobRemove(CFSTR(OUR_JOB_LABEL), &error);
- STAssertFalse(isGood, nil);
- STAssertNotNULL(error, nil);
- CFRelease(error);
-}
-
-- (void)testCopyExports {
- CFDictionaryRef exports = GTMCopyLaunchdExports();
- STAssertNotNULL(exports, nil);
- NSString *user = [(NSDictionary *)exports objectForKey:@"USER"];
- STAssertEqualObjects(user, NSUserName(), nil);
- CFRelease(exports);
+ XCTAssertFalse(isGood);
+ XCTAssertNotNULL(error);
+ if (error) {
+ CFRelease(error);
+ }
}
- (void)testCheckin {
@@ -154,16 +166,19 @@ static NSString const *kGTMSocketName
// Can't check ourselves in
NSDictionary *badTest
= GTMCFAutorelease(GTMSMCopyJobCheckInDictionary(&error));
- STAssertNil(badTest, nil);
- STAssertNotNULL(error, nil);
- CFRelease(error);
+ XCTAssertNil(badTest);
+ XCTAssertNotNULL(error);
+ if (error) {
+ CFRelease(error);
+ }
+
NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
- STAssertNotNil(testBundle, nil);
+ XCTAssertNotNil(testBundle);
NSString *testHarnessPath
= [testBundle pathForResource:@"GTMServiceManagementTestingHarness"
ofType:nil];
- STAssertNotNil(testHarnessPath, nil);
+ XCTAssertNotNil(testHarnessPath);
NSDictionary *machServices
= [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], @GTM_MACH_PORT_NAME,
@@ -195,22 +210,7 @@ static NSString const *kGTMSocketName
GTMSMJobRemove(CFSTR(TEST_HARNESS_LABEL), NULL);
BOOL isGood = GTMSMJobSubmit((CFDictionaryRef)job, &error);
- STAssertTrue(isGood, @"Error %@", error);
-
- NSDictionary* exports = GTMCFAutorelease(GTMCopyLaunchdExports());
- STAssertNotNULL(exports, nil);
- NSString *socketPath = [exports objectForKey:kGTMSocketKey];
- STAssertNotNULL(socketPath, nil);
- STAssertEqualObjects([socketPath lastPathComponent], kGTMSocketName, nil);
-
- mach_port_t sp = 0;
- kern_return_t rt = bootstrap_look_up(bootstrap_port,
- (char*)GTM_MACH_PORT_NAME,
- &sp);
- STAssertNotEquals(sp, (mach_port_t)0, nil);
- STAssertEquals(rt, KERN_SUCCESS, nil);
- isGood = GTMSMJobRemove(CFSTR(TEST_HARNESS_LABEL), &error);
- STAssertTrue(isGood, @"Error %@", error);
+ XCTAssertTrue(isGood, @"Error %@", error);
}
@end
diff --git a/Foundation/GTMSignalHandlerTest.m b/Foundation/GTMSignalHandlerTest.m
index 5cddcb5..bd70ecf 100644
--- a/Foundation/GTMSignalHandlerTest.m
+++ b/Foundation/GTMSignalHandlerTest.m
@@ -18,7 +18,6 @@
#import "GTMSenTestCase.h"
#import "GTMSignalHandler.h"
-#import "GTMUnitTestDevLog.h"
#import "GTMFoundationUnitTestingUtilities.h"
@interface GTMSignalHandlerTest : GTMTestCase
@@ -66,56 +65,54 @@
@implementation GTMSignalHandlerTest
- (void)nomnomnom:(int)blah {
- STFail(@"Should never be called!");
+ XCTFail(@"Should never be called!");
}
- (void)testNillage {
GTMSignalHandler *handler;
// Just an init should return nil.
- [GTMUnitTestDevLog expectString:@"Don't call init, use "
- @"initWithSignal:target:action:"];
handler = [[[GTMSignalHandler alloc] init] autorelease];
- STAssertNil(handler, nil);
+ XCTAssertNil(handler);
// Zero signal should return nil as well.
handler = [[[GTMSignalHandler alloc]
initWithSignal:0
target:self
action:@selector(nomnomnom:)] autorelease];
- STAssertNil(handler, nil);
+ XCTAssertNil(handler);
}
- (void)testSingleHandler {
SignalCounter *counter = [SignalCounter signalCounter];
- STAssertNotNil(counter, nil);
+ XCTAssertNotNil(counter);
GTMSignalHandler *handler = [[[GTMSignalHandler alloc]
initWithSignal:SIGWINCH
target:counter
action:@selector(countSignal:)]
autorelease];
- STAssertNotNil(handler, nil);
+ XCTAssertNotNil(handler);
raise(SIGWINCH);
NSRunLoop *rl = [NSRunLoop currentRunLoop];
[rl gtm_runUpToSixtySecondsWithContext:counter];
- STAssertEquals([counter count], 1, nil);
- STAssertEquals([counter lastSeen], SIGWINCH, nil);
+ XCTAssertEqual([counter count], 1);
+ XCTAssertEqual([counter lastSeen], SIGWINCH);
[counter resetShouldStop];
raise(SIGWINCH);
[rl gtm_runUpToSixtySecondsWithContext:counter];
- STAssertEquals([counter count], 2, nil);
- STAssertEquals([counter lastSeen], SIGWINCH, nil);
+ XCTAssertEqual([counter count], 2);
+ XCTAssertEqual([counter lastSeen], SIGWINCH);
[counter resetShouldStop];
// create a second one to make sure we're seding data where we want
SignalCounter *counter2 = [SignalCounter signalCounter];
- STAssertNotNil(counter2, nil);
+ XCTAssertNotNil(counter2);
[[[GTMSignalHandler alloc] initWithSignal:SIGUSR1
target:counter2
action:@selector(countSignal:)] autorelease];
@@ -123,10 +120,10 @@
raise(SIGUSR1);
[rl gtm_runUpToSixtySecondsWithContext:counter2];
- STAssertEquals([counter count], 2, nil);
- STAssertEquals([counter lastSeen], SIGWINCH, nil);
- STAssertEquals([counter2 count], 1, nil);
- STAssertEquals([counter2 lastSeen], SIGUSR1, nil);
+ XCTAssertEqual([counter count], 2);
+ XCTAssertEqual([counter lastSeen], SIGWINCH);
+ XCTAssertEqual([counter2 count], 1);
+ XCTAssertEqual([counter2 lastSeen], SIGUSR1);
[handler invalidate];
@@ -135,16 +132,16 @@
raise(SIGWINCH);
[rl runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.2]];
- STAssertEquals([counter count], 2, nil);
- STAssertEquals([counter lastSeen], SIGWINCH, nil);
- STAssertEquals([counter2 count], 1, nil);
- STAssertEquals([counter2 lastSeen], SIGUSR1, nil);
+ XCTAssertEqual([counter count], 2);
+ XCTAssertEqual([counter lastSeen], SIGWINCH);
+ XCTAssertEqual([counter2 count], 1);
+ XCTAssertEqual([counter2 lastSeen], SIGUSR1);
}
- (void)testIgnore {
SignalCounter *counter = [SignalCounter signalCounter];
- STAssertNotNil(counter, nil);
+ XCTAssertNotNil(counter);
[[[GTMSignalHandler alloc] initWithSignal:SIGUSR1
target:counter
@@ -153,7 +150,7 @@
raise(SIGUSR1);
NSRunLoop *rl = [NSRunLoop currentRunLoop];
[rl runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.2]];
- STAssertEquals([counter count], 0, nil);
+ XCTAssertEqual([counter count], 0);
}
diff --git a/Foundation/GTMStackTrace.h b/Foundation/GTMStackTrace.h
index eb86a66..61398ab 100644
--- a/Foundation/GTMStackTrace.h
+++ b/Foundation/GTMStackTrace.h
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -32,10 +32,10 @@ struct GTMAddressDescriptor {
};
// Returns a string containing a nicely formatted stack trace.
-//
+//
// This function gets the stack trace for the current thread. It will
// be from the caller of GTMStackTrace upwards to the top the calling stack.
-// Typically this function will be used along with some logging,
+// Typically this function will be used along with some logging,
// as in the following:
//
// MyAppLogger(@"Should never get here:\n%@", GTMStackTrace());
@@ -53,41 +53,18 @@ struct GTMAddressDescriptor {
NSString *GTMStackTrace(void);
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 || \
- __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_2_0
// Returns a string containing a nicely formatted stack trace from the
-// exception. Only available on 10.5 or later, uses
+// exception. Only available on 10.5 or later, uses
// -[NSException callStackReturnAddresses].
//
NSString *GTMStackTraceFromException(NSException *e);
-#endif
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
-// Returns an array of program counters from the current thread's stack.
-// *** You should probably use GTMStackTrace() instead of this function ***
-// However, if you actually want all the PCs in "void *" form, then this
-// funtion is more convenient. This will include PCs of GTMStaceTrace and
-// its inner utility functions that you may want to strip out.
-//
-// You can use +[NSThread callStackReturnAddresses] in 10.5 or later.
-//
-// Args:
-// outPcs - an array of "void *" pointers to the program counters found on the
-// current thread's stack.
-// count - the number of entries in the outPcs array
-//
-// Returns:
-// The number of program counters actually added to outPcs.
-//
-NSUInteger GTMGetStackProgramCounters(void *outPcs[], NSUInteger count);
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
// Returns an array of GTMAddressDescriptors from the current thread's stack.
// *** You should probably use GTMStackTrace() instead of this function ***
// However, if you actually want all the PCs with symbols, this is the way
// to get them. There is no memory allocations done, so no clean up is required
// except for the caller to free outDescs if they allocated it themselves.
-// This will include PCs of GTMStaceTrace and its inner utility functions that
+// This will include PCs of GTMStaceTrace and its inner utility functions that
// you may want to strip out.
//
// Args:
@@ -98,7 +75,7 @@ NSUInteger GTMGetStackProgramCounters(void *outPcs[], NSUInteger count);
// Returns:
// The number of program counters actually added to outPcs.
//
-NSUInteger GTMGetStackAddressDescriptors(struct GTMAddressDescriptor outDescs[],
+NSUInteger GTMGetStackAddressDescriptors(struct GTMAddressDescriptor outDescs[],
NSUInteger count);
#ifdef __cplusplus
diff --git a/Foundation/GTMStackTrace.m b/Foundation/GTMStackTrace.m
index 3e34ed0..4470a11 100644
--- a/Foundation/GTMStackTrace.m
+++ b/Foundation/GTMStackTrace.m
@@ -19,8 +19,9 @@
#include <stdlib.h>
#include <dlfcn.h>
#include <mach-o/nlist.h>
+#include <objc/runtime.h>
+
#include "GTMStackTrace.h"
-#include "GTMObjC2Runtime.h"
struct GTMClassDescription {
const char *class_name;
@@ -202,73 +203,10 @@ static NSString *GTMStackTraceFromAddressDescriptors(struct GTMAddressDescriptor
#pragma mark Public functions
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
-// Before 10.5, we have to do this ourselves. 10.5 adds
-// +[NSThread callStackReturnAddresses].
-
-// Structure representing a small portion of a stack, starting from the saved
-// frame pointer, and continuing through the saved program counter.
-struct GTMStackFrame {
- void *saved_fp;
-#if defined (__ppc__) || defined(__ppc64__)
- void *padding;
-#endif
- void *saved_pc;
-};
-
-// __builtin_frame_address(0) is a gcc builtin that returns a pointer to the
-// current frame pointer. We then use the frame pointer to walk the stack
-// picking off program counters and other saved frame pointers. This works
-// great on i386, but PPC requires a little more work because the PC (or link
-// register) isn't always stored on the stack.
-//
-NSUInteger GTMGetStackProgramCounters(void *outPcs[], NSUInteger count) {
- if (!outPcs || (count < 1)) return 0;
-
- struct GTMStackFrame *fp;
-#if defined (__ppc__) || defined(__ppc64__)
- outPcs[0] = __builtin_return_address(0);
- fp = (struct GTMStackFrame *)__builtin_frame_address(1);
-#elif defined (__i386__) || defined(__x86_64__)
- fp = (struct GTMStackFrame *)__builtin_frame_address(0);
-#else
-#error architecture not supported
-#endif
-
- NSUInteger level = 0;
- while (level < count) {
- if (fp == NULL) {
- level--;
- break;
- }
- outPcs[level] = fp->saved_pc;
- level++;
- fp = (struct GTMStackFrame *)fp->saved_fp;
- }
-
- return level;
-}
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
-
NSUInteger GTMGetStackAddressDescriptors(struct GTMAddressDescriptor outDescs[],
NSUInteger count) {
if (count < 1 || !outDescs) return 0;
NSUInteger result = 0;
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
- // Before 10.5, we collect the stack ourselves.
-
- void **pcs = calloc(count, sizeof(void*));
- if (!pcs) return 0;
-
- NSUInteger newSize = GTMGetStackProgramCounters(pcs, count);
-
- result = GTMGetStackAddressDescriptorsForAddresses(pcs, outDescs, newSize);
- free(pcs);
-
-#else // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- // Use +[NSThread callStackReturnAddresses]
-
NSArray *addresses = [NSThread callStackReturnAddresses];
NSUInteger addrCount = [addresses count];
if (addrCount) {
@@ -288,7 +226,6 @@ NSUInteger GTMGetStackAddressDescriptors(struct GTMAddressDescriptor outDescs[],
}
free(pcs);
}
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
return result;
}
@@ -296,27 +233,6 @@ NSUInteger GTMGetStackAddressDescriptors(struct GTMAddressDescriptor outDescs[],
NSString *GTMStackTrace(void) {
// If we don't have enough frames, return an empty string
NSString *result = @"";
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
- // Before 10.5, we collect the stack ourselves.
-
- // The maximum number of stack frames that we will walk. We limit this so
- // that super-duper recursive functions (or bugs) don't send us for an
- // infinite loop.
- struct GTMAddressDescriptor descs[100];
- size_t depth = sizeof(descs) / sizeof(struct GTMAddressDescriptor);
- depth = GTMGetStackAddressDescriptors(descs, depth);
-
- // Start at the second item so that GTMStackTrace and it's utility calls (of
- // which there is currently 1) is not included in the output.
- const size_t kTracesToStrip = 2;
- if (depth > kTracesToStrip) {
- result = GTMStackTraceFromAddressDescriptors(&descs[kTracesToStrip],
- (depth - kTracesToStrip));
- }
-#else // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- // Use +[NSThread callStackReturnAddresses]
-
NSArray *addresses = [NSThread callStackReturnAddresses];
NSUInteger count = [addresses count];
if (count) {
@@ -344,14 +260,10 @@ NSString *GTMStackTrace(void) {
free(pcs);
free(descs);
}
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
return result;
}
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 || \
- (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && \
- (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_2_0))
NSString *GTMStackTraceFromException(NSException *e) {
NSString *trace = @"";
@@ -382,5 +294,3 @@ NSString *GTMStackTraceFromException(NSException *e) {
return trace;
}
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- //__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_2_0
diff --git a/Foundation/GTMStackTraceTest.m b/Foundation/GTMStackTraceTest.m
index a581c76..7b1c038 100644
--- a/Foundation/GTMStackTraceTest.m
+++ b/Foundation/GTMStackTraceTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -36,27 +36,27 @@
NSString *stacktrace = GTMStackTrace();
NSArray *stacklines = [stacktrace componentsSeparatedByString:@"\n"];
- STAssertGreaterThan([stacklines count], (NSUInteger)3,
- @"stack trace must have > 3 lines");
- STAssertLessThan([stacklines count], (NSUInteger)35,
- @"stack trace must have < 35 lines");
-
+ XCTAssertGreaterThan([stacklines count], (NSUInteger)3,
+ @"stack trace must have > 3 lines");
+ XCTAssertLessThan([stacklines count], (NSUInteger)35,
+ @"stack trace must have < 35 lines");
+
NSString *firstFrame = [stacklines objectAtIndex:0];
NSRange range = [firstFrame rangeOfString:@"testStackTraceBasic"];
- STAssertNotEquals(range.location, (NSUInteger)NSNotFound,
+ XCTAssertNotEqual(range.location, (NSUInteger)NSNotFound,
@"First frame should contain testStackTraceBasic,"
" stack trace: %@", stacktrace);
range = [firstFrame rangeOfString:@"#0"];
- STAssertNotEquals(range.location, (NSUInteger)NSNotFound,
- @"First frame should contain #0, stack trace: %@",
+ XCTAssertNotEqual(range.location, (NSUInteger)NSNotFound,
+ @"First frame should contain #0, stack trace: %@",
stacktrace);
-
+
range = [firstFrame rangeOfString:@"-"];
- STAssertNotEquals(range.location, (NSUInteger)NSNotFound,
+ XCTAssertNotEqual(range.location, (NSUInteger)NSNotFound,
@"First frame should contain - since it's "
@"an instance method: %@", stacktrace);
- STAssertTrue([[self class] classMethodTest], @"First frame should contain"
- @"+ since it's a class method");
+ XCTAssertTrue([[self class] classMethodTest], @"First frame should contain"
+ @"+ since it's a class method");
}
-(void)testGetStackAddressDescriptors {
@@ -64,28 +64,26 @@
size_t depth = sizeof(descs) / sizeof(struct GTMAddressDescriptor);
depth = GTMGetStackAddressDescriptors(descs, depth);
// Got atleast 4...
- STAssertGreaterThan(depth, (size_t)4, nil);
+ XCTAssertGreaterThan(depth, (size_t)4);
// All that we got have symbols
for (NSUInteger lp = 0 ; lp < depth ; ++lp) {
- STAssertNotNULL(descs[lp].symbol, @"didn't get a symbol at depth %lu",
- (unsigned long)lp);
+ XCTAssertNotNULL(descs[lp].symbol, @"didn't get a symbol at depth %lu",
+ (unsigned long)lp);
}
-
+
// Do it again, but don't give it enough space (to make sure it handles that)
size_t fullDepth = depth;
- STAssertGreaterThan(fullDepth, (size_t)4, nil);
+ XCTAssertGreaterThan(fullDepth, (size_t)4);
depth -= 2;
depth = GTMGetStackAddressDescriptors(descs, depth);
- STAssertLessThan(depth, fullDepth, nil);
+ XCTAssertLessThan(depth, fullDepth);
// All that we got have symbols
for (NSUInteger lp = 0 ; lp < depth ; ++lp) {
- STAssertNotNULL(descs[lp].symbol, @"didn't get a symbol at depth %lu",
- (unsigned long)lp);
+ XCTAssertNotNULL(descs[lp].symbol, @"didn't get a symbol at depth %lu",
+ (unsigned long)lp);
}
-
-}
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+}
- (void)helperThatThrows {
[NSException raise:@"TestException" format:@"TestExceptionDescription"];
@@ -99,67 +97,25 @@
@catch (NSException * e) {
exception = e;
}
- STAssertNotNil(exception, nil);
+ XCTAssertNotNil(exception);
NSString *stacktrace = GTMStackTraceFromException(exception);
NSArray *stacklines = [stacktrace componentsSeparatedByString:@"\n"];
-
- STAssertGreaterThan([stacklines count], (NSUInteger)4,
- @"stack trace must have > 4 lines");
- STAssertLessThan([stacklines count], (NSUInteger)35,
- @"stack trace must have < 35 lines");
- STAssertEquals([stacklines count],
+
+ XCTAssertGreaterThan([stacklines count], (NSUInteger)4,
+ @"stack trace must have > 4 lines\n%@", stacktrace);
+ XCTAssertLessThan([stacklines count], (NSUInteger)40,
+ @"stack trace must have < 40 lines\n%@", stacktrace);
+ XCTAssertEqual([stacklines count],
[[exception callStackReturnAddresses] count],
@"stack trace should have the same number of lines as the "
@" array of return addresses. stack trace: %@", stacktrace);
-
+
// we can't look for it on a specific frame because NSException doesn't
// really document how deep the stack will be
NSRange range = [stacktrace rangeOfString:@"testStackExceptionTrace"];
- STAssertNotEquals(range.location, (NSUInteger)NSNotFound,
+ XCTAssertNotEqual(range.location, (NSUInteger)NSNotFound,
@"Stack trace should contain testStackExceptionTrace,"
" stack trace: %@", stacktrace);
}
-#endif
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
-
-- (void)testProgramCountersBasic {
- void *pcs[10];
- NSUInteger depth = 10;
- depth = GTMGetStackProgramCounters(pcs, depth);
-
- STAssertGreaterThan(depth, (NSUInteger)3, @"stack trace must have > 3 lines");
- STAssertLessThanOrEqual(depth, (NSUInteger)10,
- @"stack trace must have < 10 lines");
-
- // pcs is an array of program counters from the stack. pcs[0] should match
- // the call into GTMGetStackProgramCounters, which is tough for us to check.
- // However, we can verify that pcs[1] is equal to our current return address
- // for our current function.
- void *current_pc = __builtin_return_address(0);
- STAssertEquals(pcs[1], current_pc, @"pcs[1] should equal the current PC");
-}
-
-- (void)testProgramCountersMore {
- void *pcs0[0];
- NSUInteger depth0 = 0;
- depth0 = GTMGetStackProgramCounters(pcs0, depth0);
- STAssertEquals(depth0, (NSUInteger)0, @"stack trace must have 0 lines");
-
- void *pcs1[1];
- NSUInteger depth1 = 1;
- depth1 = GTMGetStackProgramCounters(pcs1, depth1);
- STAssertEquals(depth1, (NSUInteger)1, @"stack trace must have 1 lines");
-
- void *pcs2[2];
- NSUInteger depth2 = 2;
- depth2 = GTMGetStackProgramCounters(pcs2, depth2);
- STAssertEquals(depth2, (NSUInteger)2, @"stack trace must have 2 lines");
- void *current_pc = __builtin_return_address(0);
- STAssertEquals(pcs2[1], current_pc, @"pcs[1] should equal the current PC");
-}
-
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
-
@end
diff --git a/Foundation/GTMStringEncoding.h b/Foundation/GTMStringEncoding.h
index b74f2d9..24fa0bc 100644
--- a/Foundation/GTMStringEncoding.h
+++ b/Foundation/GTMStringEncoding.h
@@ -78,11 +78,35 @@
- (void)setPaddingChar:(char)c;
// Encode a raw binary buffer to a 7-bit ASCII string.
-- (NSString *)encode:(NSData *)data;
-- (NSString *)encodeString:(NSString *)string;
+- (NSString *)encode:(NSData *)data __attribute__((deprecated("Use encode:error:")));
+- (NSString *)encodeString:(NSString *)string __attribute__((deprecated("Use encodeString:error:")));
+
+- (NSString *)encode:(NSData *)data error:(NSError **)error;
+- (NSString *)encodeString:(NSString *)string error:(NSError **)error;
// Decode a 7-bit ASCII string to a raw binary buffer.
-- (NSData *)decode:(NSString *)string;
-- (NSString *)stringByDecoding:(NSString *)string;
+- (NSData *)decode:(NSString *)string __attribute__((deprecated("Use decode:error:")));
+- (NSString *)stringByDecoding:(NSString *)string __attribute__((deprecated("Use stringByDecoding:error:")));
+
+- (NSData *)decode:(NSString *)string error:(NSError **)error;
+- (NSString *)stringByDecoding:(NSString *)string error:(NSError **)error;
@end
+
+FOUNDATION_EXPORT NSString *const GTMStringEncodingErrorDomain;
+FOUNDATION_EXPORT NSString *const GTMStringEncodingBadCharacterIndexKey; // NSNumber
+
+typedef NS_ENUM(NSInteger, GTMStringEncodingError) {
+ // Unable to convert a buffer to NSASCIIStringEncoding.
+ GTMStringEncodingErrorUnableToConverToAscii = 1024,
+ // Unable to convert a buffer to NSUTF8StringEncoding.
+ GTMStringEncodingErrorUnableToConverToUTF8,
+ // Encountered a bad character.
+ // GTMStringEncodingBadCharacterIndexKey will have the index of the character.
+ GTMStringEncodingErrorUnknownCharacter,
+ // The data had a padding character in the middle of the data. Padding characters
+ // can only be at the end.
+ GTMStringEncodingErrorExpectedPadding,
+ // There is unexpected data at the end of the data that could not be decoded.
+ GTMStringEncodingErrorIncompleteTrailingData,
+};
diff --git a/Foundation/GTMStringEncoding.m b/Foundation/GTMStringEncoding.m
index 1cd6352..7578e86 100644
--- a/Foundation/GTMStringEncoding.m
+++ b/Foundation/GTMStringEncoding.m
@@ -18,6 +18,9 @@
#import "GTMStringEncoding.h"
+NSString *const GTMStringEncodingErrorDomain = @"com.google.GTMStringEncodingErrorDomain";
+NSString *const GTMStringEncodingBadCharacterIndexKey = @"GTMStringEncodingBadCharacterIndexKey";
+
enum {
kUnknownChar = -1,
kPaddingChar = -2,
@@ -174,9 +177,12 @@ GTM_INLINE int lcm(int a, int b) {
}
- (NSString *)encode:(NSData *)inData {
+ return [self encode:inData error:NULL];
+}
+
+- (NSString *)encode:(NSData *)inData error:(NSError **)error {
NSUInteger inLen = [inData length];
if (inLen <= 0) {
- _GTMDevLog(@"Empty input");
return @"";
}
unsigned char *inBuf = (unsigned char *)[inData bytes];
@@ -214,21 +220,52 @@ GTM_INLINE int lcm(int a, int b) {
outBuf[outPos++] = paddingChar_;
}
- _GTMDevAssert(outPos == outLen, @"Underflowed output buffer");
[outData setLength:outPos];
- return [[[NSString alloc] initWithData:outData
- encoding:NSASCIIStringEncoding] autorelease];
+ NSString *value = [[[NSString alloc] initWithData:outData
+ encoding:NSASCIIStringEncoding] autorelease];
+ if (!value) {
+ if (error) {
+ *error = [NSError errorWithDomain:GTMStringEncodingErrorDomain
+ code:GTMStringEncodingErrorUnableToConverToAscii
+ userInfo:nil];
+
+ }
+ }
+ return value;
}
- (NSString *)encodeString:(NSString *)inString {
- return [self encode:[inString dataUsingEncoding:NSUTF8StringEncoding]];
+ return [self encodeString:inString error:NULL];
+}
+
+- (NSString *)encodeString:(NSString *)inString error:(NSError **)error {
+ NSData *data = [inString dataUsingEncoding:NSUTF8StringEncoding];
+ if (!data) {
+ if (error) {
+ *error = [NSError errorWithDomain:GTMStringEncodingErrorDomain
+ code:GTMStringEncodingErrorUnableToConverToUTF8
+ userInfo:nil];
+
+ }
+ return nil;
+ }
+ return [self encode:data error:error];
}
- (NSData *)decode:(NSString *)inString {
+ return [self decode:inString error:NULL];
+}
+
+- (NSData *)decode:(NSString *)inString error:(NSError **)error {
char *inBuf = (char *)[inString cStringUsingEncoding:NSASCIIStringEncoding];
if (!inBuf) {
- _GTMDevLog(@"unable to convert buffer to ASCII");
+ if (error) {
+ *error = [NSError errorWithDomain:GTMStringEncodingErrorDomain
+ code:GTMStringEncodingErrorUnableToConverToAscii
+ userInfo:nil];
+
+ }
return nil;
}
NSUInteger inLen = strlen(inBuf);
@@ -249,12 +286,27 @@ GTM_INLINE int lcm(int a, int b) {
case kPaddingChar:
expectPad = YES;
break;
- case kUnknownChar:
- _GTMDevLog(@"Unexpected data in input pos %lu", (unsigned long)i);
+ case kUnknownChar: {
+ if (error) {
+ NSDictionary *userInfo =
+ [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInteger:i]
+ forKey:GTMStringEncodingBadCharacterIndexKey];
+ *error = [NSError errorWithDomain:GTMStringEncodingErrorDomain
+ code:GTMStringEncodingErrorUnknownCharacter
+ userInfo:userInfo];
+ }
return nil;
+ }
default:
if (expectPad) {
- _GTMDevLog(@"Expected further padding characters");
+ if (error) {
+ NSDictionary *userInfo =
+ [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedInteger:i]
+ forKey:GTMStringEncodingBadCharacterIndexKey];
+ *error = [NSError errorWithDomain:GTMStringEncodingErrorDomain
+ code:GTMStringEncodingErrorExpectedPadding
+ userInfo:userInfo];
+ }
return nil;
}
buffer <<= shift_;
@@ -269,21 +321,33 @@ GTM_INLINE int lcm(int a, int b) {
}
if (bitsLeft && buffer & ((1 << bitsLeft) - 1)) {
- _GTMDevLog(@"Incomplete trailing data");
+ if (error) {
+ *error = [NSError errorWithDomain:GTMStringEncodingErrorDomain
+ code:GTMStringEncodingErrorIncompleteTrailingData
+ userInfo:nil];
+
+ }
return nil;
}
// Shorten buffer if needed due to padding chars
- _GTMDevAssert(outPos <= outLen, @"Overflowed buffer");
[outData setLength:outPos];
return outData;
}
- (NSString *)stringByDecoding:(NSString *)inString {
- NSData *ret = [self decode:inString];
- return [[[NSString alloc] initWithData:ret
- encoding:NSUTF8StringEncoding] autorelease];
+ return [self stringByDecoding:inString error:NULL];
+}
+
+- (NSString *)stringByDecoding:(NSString *)inString error:(NSError **)error {
+ NSData *ret = [self decode:inString error:error];
+ NSString *value = nil;
+ if (ret) {
+ value = [[[NSString alloc] initWithData:ret
+ encoding:NSUTF8StringEncoding] autorelease];
+ }
+ return value;
}
@end
diff --git a/Foundation/GTMStringEncodingTest.m b/Foundation/GTMStringEncodingTest.m
index e2cada7..2e843d6 100644
--- a/Foundation/GTMStringEncodingTest.m
+++ b/Foundation/GTMStringEncodingTest.m
@@ -18,7 +18,6 @@
#import "GTMSenTestCase.h"
#import "GTMStringEncoding.h"
-#import "GTMUnitTestDevLog.h"
@interface GTMStringEncodingTest : GTMTestCase
@end
@@ -29,22 +28,31 @@
- (void)testEmptyInputs {
GTMStringEncoding *coder = [GTMStringEncoding stringEncodingWithString:@"01"];
- [GTMUnitTestDevLog expectString:@"Empty input"];
- STAssertEqualStrings([coder encode:[NSData data]], @"", nil);
- [GTMUnitTestDevLog expectString:@"Empty input"];
- STAssertEqualObjects([coder encodeString:@""], @"", nil);
- STAssertEqualObjects([coder decode:@""], [NSData data], nil);
- STAssertEqualStrings([coder stringByDecoding:@""], @"", nil);
+ NSError *error = nil;
+ XCTAssertEqualStrings([coder encode:[NSData data] error:&error], @"");
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualObjects([coder encodeString:@"" error:&error], @"");
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualObjects([coder decode:@"" error:&error], [NSData data]);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualStrings([coder stringByDecoding:@"" error:&error], @"");
+ XCTAssertNil(error);
}
// Invalid inputs should result in nil outputs.
- (void)testInvalidInputs {
GTMStringEncoding *coder = [GTMStringEncoding stringEncodingWithString:@"01"];
-
- [GTMUnitTestDevLog expectString:@"unable to convert buffer to ASCII"];
- STAssertNil([coder decode:nil], nil);
- [GTMUnitTestDevLog expectString:@"Unexpected data in input pos 0"];
- STAssertNil([coder decode:@"banana"], nil);
+ NSError *error = nil;
+
+ XCTAssertNil([coder decode:nil error:&error]);
+ XCTAssertEqual([error code], GTMStringEncodingErrorUnableToConverToAscii);
+ XCTAssertNil([coder decode:@"banana" error:&error]);
+ XCTAssertEqual([error code], GTMStringEncodingErrorUnknownCharacter);
+ XCTAssertEqualObjects([[error userInfo] objectForKey:GTMStringEncodingBadCharacterIndexKey],
+ [NSNumber numberWithUnsignedInteger:0]);
}
// Ignored inputs should be silently ignored.
@@ -54,27 +62,42 @@
char aa = 0xaa;
NSData *aaData = [NSData dataWithBytes:&aa length:sizeof(aa)];
- STAssertEqualObjects([coder decode:@"10101010"], aaData, nil);
+ NSError *error = nil;
+ XCTAssertEqualObjects([coder decode:@"10101010" error:&error], aaData);
+ XCTAssertNil(error);
+ error = nil;
// Inputs with ignored characters
- STAssertEqualObjects([coder decode:@"1010 1010"], aaData, nil);
- STAssertEqualObjects([coder decode:@"1010-1010"], aaData, nil);
- STAssertEqualObjects([coder decode:@"1010\n1010"], aaData, nil);
+ XCTAssertEqualObjects([coder decode:@"1010 1010" error:&error], aaData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualObjects([coder decode:@"1010-1010" error:&error], aaData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualObjects([coder decode:@"1010\n1010" error:&error], aaData);
+ XCTAssertNil(error);
+ error = nil;
// Invalid inputs
- [GTMUnitTestDevLog expectString:@"Unexpected data in input pos 4"];
- STAssertNil([coder decode:@"1010+1010"], nil);
+ XCTAssertNil([coder decode:@"1010+1010" error:&error]);
+ XCTAssertEqual([error code], GTMStringEncodingErrorUnknownCharacter);
+ XCTAssertEqualObjects([[error userInfo] objectForKey:GTMStringEncodingBadCharacterIndexKey],
+ [NSNumber numberWithUnsignedInteger:4]);
}
#define ASSERT_ENCODE_DECODE_STRING(coder, decoded, encoded) do { \
- STAssertEqualStrings([coder encodeString:decoded], encoded, nil); \
- STAssertEqualStrings([coder stringByDecoding:encoded], decoded, nil); \
+ XCTAssertEqualStrings([coder encodeString:decoded error:&error], encoded); \
+ XCTAssertNil(error); \
+ error = nil; \
+ XCTAssertEqualStrings([coder stringByDecoding:encoded error:&error], decoded); \
+ XCTAssertNil(error); \
+ error = nil; \
} while (0)
- (void)testBinary {
GTMStringEncoding *coder = [GTMStringEncoding binaryStringEncoding];
+ NSError *error = nil;
- [GTMUnitTestDevLog expectString:@"Empty input"];
ASSERT_ENCODE_DECODE_STRING(coder, @"", @"");
ASSERT_ENCODE_DECODE_STRING(coder, @"f", @"01100110");
ASSERT_ENCODE_DECODE_STRING(coder, @"fo", @"0110011001101111");
@@ -122,15 +145,18 @@
NSData *allValuesData = [NSData dataWithBytes:&allValuesBytes
length:sizeof(allValuesBytes)];
- STAssertEqualObjects([coder decode:allValues], allValuesData, nil);
- STAssertEqualStrings([coder encode:allValuesData], allValues, nil);
+ XCTAssertEqualObjects([coder decode:allValues error:&error], allValuesData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualStrings([coder encode:allValuesData error:&error], allValues);
+ XCTAssertNil(error);
}
- (void)testBase64 {
// RFC4648 test vectors
GTMStringEncoding *coder = [GTMStringEncoding rfc4648Base64StringEncoding];
+ NSError *error = nil;
- [GTMUnitTestDevLog expectString:@"Empty input"];
ASSERT_ENCODE_DECODE_STRING(coder, @"", @"");
ASSERT_ENCODE_DECODE_STRING(coder, @"f", @"Zg==");
ASSERT_ENCODE_DECODE_STRING(coder, @"fo", @"Zm8=");
@@ -153,8 +179,11 @@
NSData *allValuesData = [NSData dataWithBytes:&allValuesBytes
length:sizeof(allValuesBytes)];
- STAssertEqualObjects([coder decode:allValues], allValuesData, nil);
- STAssertEqualStrings([coder encode:allValuesData], allValues, nil);
+ XCTAssertEqualObjects([coder decode:allValues error:&error], allValuesData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualStrings([coder encode:allValuesData error:&error], allValues);
+ XCTAssertNil(error);
}
- (void)testBase64Websafe {
@@ -162,7 +191,7 @@
GTMStringEncoding *coder =
[GTMStringEncoding rfc4648Base64WebsafeStringEncoding];
- [GTMUnitTestDevLog expectString:@"Empty input"];
+ NSError *error = nil;
ASSERT_ENCODE_DECODE_STRING(coder, @"", @"");
ASSERT_ENCODE_DECODE_STRING(coder, @"f", @"Zg==");
ASSERT_ENCODE_DECODE_STRING(coder, @"fo", @"Zm8=");
@@ -185,15 +214,18 @@
NSData *allValuesData = [NSData dataWithBytes:&allValuesBytes
length:sizeof(allValuesBytes)];
- STAssertEqualObjects([coder decode:allValues], allValuesData, nil);
- STAssertEqualStrings([coder encode:allValuesData], allValues, nil);
+ XCTAssertEqualObjects([coder decode:allValues error:&error], allValuesData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualStrings([coder encode:allValuesData error:&error], allValues);
+ XCTAssertNil(error);
}
- (void)testBase32 {
// RFC4648 test vectors
GTMStringEncoding *coder = [GTMStringEncoding rfc4648Base32StringEncoding];
- [GTMUnitTestDevLog expectString:@"Empty input"];
+ NSError *error = nil;
ASSERT_ENCODE_DECODE_STRING(coder, @"", @"");
ASSERT_ENCODE_DECODE_STRING(coder, @"f", @"MY======");
ASSERT_ENCODE_DECODE_STRING(coder, @"fo", @"MZXQ====");
@@ -217,15 +249,18 @@
NSData *allValuesData = [NSData dataWithBytes:&allValuesBytes
length:sizeof(allValuesBytes)];
- STAssertEqualObjects([coder decode:allValues], allValuesData, nil);
- STAssertEqualStrings([coder encode:allValuesData], allValues, nil);
+ XCTAssertEqualObjects([coder decode:allValues error:&error], allValuesData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualStrings([coder encode:allValuesData error:&error], allValues);
+ XCTAssertNil(error);
}
- (void)testBase32Hex {
// RFC4648 test vectors
GTMStringEncoding *coder = [GTMStringEncoding rfc4648Base32HexStringEncoding];
- [GTMUnitTestDevLog expectString:@"Empty input"];
+ NSError *error = nil;
ASSERT_ENCODE_DECODE_STRING(coder, @"", @"");
ASSERT_ENCODE_DECODE_STRING(coder, @"f", @"CO======");
ASSERT_ENCODE_DECODE_STRING(coder, @"fo", @"CPNG====");
@@ -249,15 +284,18 @@
NSData *allValuesData = [NSData dataWithBytes:&allValuesBytes
length:sizeof(allValuesBytes)];
- STAssertEqualObjects([coder decode:allValues], allValuesData, nil);
- STAssertEqualStrings([coder encode:allValuesData], allValues, nil);
+ XCTAssertEqualObjects([coder decode:allValues error:&error], allValuesData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualStrings([coder encode:allValuesData error:&error], allValues);
+ XCTAssertNil(error);
}
- (void)testHex {
// RFC4648 test vectors
GTMStringEncoding *coder = [GTMStringEncoding hexStringEncoding];
- [GTMUnitTestDevLog expectString:@"Empty input"];
+ NSError *error = nil;
ASSERT_ENCODE_DECODE_STRING(coder, @"", @"");
ASSERT_ENCODE_DECODE_STRING(coder, @"f", @"66");
ASSERT_ENCODE_DECODE_STRING(coder, @"fo", @"666F");
@@ -282,28 +320,39 @@
NSData *allValuesData = [NSData dataWithBytes:&allValuesBytes
length:sizeof(allValuesBytes)];
- STAssertEqualObjects([coder decode:allValues], allValuesData, nil);
- STAssertEqualStrings([coder encode:allValuesData], allValues, nil);
+ XCTAssertEqualObjects([coder decode:allValues error:&error], allValuesData);
+ XCTAssertNil(error);
+ error = nil;
+ XCTAssertEqualStrings([coder encode:allValuesData error:&error], allValues);
+ XCTAssertNil(error);
+ error = nil;
// Lower case
- STAssertEqualObjects([coder decode:[allValues lowercaseString]],
- allValuesData, nil);
+ XCTAssertEqualObjects([coder decode:[allValues lowercaseString] error:&error],
+ allValuesData);
+ XCTAssertNil(error);
+ error = nil;
// Extra tests from GTMNSData+HexTest.m
NSString *testString = @"1C2F0032F40123456789ABCDEF";
char testBytes[] = { 0x1c, 0x2f, 0x00, 0x32, 0xf4, 0x01, 0x23,
0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
NSData *testData = [NSData dataWithBytes:testBytes length:sizeof(testBytes)];
- STAssertEqualStrings([coder encode:testData], testString, nil);
- STAssertEqualObjects([coder decode:testString], testData, nil);
+ error = nil;
+ XCTAssertEqualStrings([coder encode:testData error:&error], testString);
+ XCTAssertEqualObjects([coder decode:testString error:&error], testData);
// Invalid inputs
- [GTMUnitTestDevLog expectString:@"Incomplete trailing data"];
- STAssertNil([coder decode:@"1c2f003"], nil);
- [GTMUnitTestDevLog expectString:@"Unexpected data in input pos 7"];
- STAssertNil([coder decode:@"1c2f00ft"], nil);
- [GTMUnitTestDevLog expectString:@"Unexpected data in input pos 4"];
- STAssertNil([coder decode:@"abcd<C3><A9>f"], nil);
+ XCTAssertNil([coder decode:@"1c2f003" error:&error]);
+ XCTAssertEqual([error code], GTMStringEncodingErrorIncompleteTrailingData);
+ XCTAssertNil([coder decode:@"1c2f00ft" error:&error]);
+ XCTAssertEqual([error code], GTMStringEncodingErrorUnknownCharacter);
+ XCTAssertEqualObjects([[error userInfo] objectForKey:GTMStringEncodingBadCharacterIndexKey],
+ [NSNumber numberWithUnsignedInteger:7]);
+ XCTAssertNil([coder decode:@"abcd<C3><A9>f" error:&error]);
+ XCTAssertEqual([error code], GTMStringEncodingErrorUnknownCharacter);
+ XCTAssertEqualObjects([[error userInfo] objectForKey:GTMStringEncodingBadCharacterIndexKey],
+ [NSNumber numberWithUnsignedInteger:4]);
}
@end
diff --git a/Foundation/GTMSystemVersion.m b/Foundation/GTMSystemVersion.m
index f3a8559..5738d78 100644
--- a/Foundation/GTMSystemVersion.m
+++ b/Foundation/GTMSystemVersion.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -17,7 +17,9 @@
//
#import "GTMSystemVersion.h"
-#import "GTMObjC2Runtime.h"
+
+#import <objc/message.h>
+
#if GTM_MACOS_SDK
#import <CoreServices/CoreServices.h>
#else
@@ -51,29 +53,11 @@ static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/
require_noerr(Gestalt(gestaltSystemVersionMajor, &sGTMSystemVersionMajor), failedGestalt);
require_noerr(Gestalt(gestaltSystemVersionMinor, &sGTMSystemVersionMinor), failedGestalt);
require_noerr(Gestalt(gestaltSystemVersionBugFix, &sGTMSystemVersionBugFix), failedGestalt);
-
+
return;
failedGestalt:
;
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_3
- // gestaltSystemVersionMajor et al are only on 10.4 and above, so they
- // could fail when running on 10.3.
- SInt32 binaryCodedDec;
- OSStatus err = err = Gestalt(gestaltSystemVersion, &binaryCodedDec);
- _GTMDevAssert(!err, @"Unable to get version from Gestalt");
-
- // Note that this code will return x.9.9 for any system rev parts that are
- // greater than 9 (i.e., 10.10.10 will be 10.9.9). This shouldn't ever be a
- // problem as the code above takes care of 10.4+.
- SInt32 msb = (binaryCodedDec & 0x0000F000L) >> 12;
- msb *= 10;
- SInt32 lsb = (binaryCodedDec & 0x00000F00L) >> 8;
- sGTMSystemVersionMajor = msb + lsb;
- sGTMSystemVersionMinor = (binaryCodedDec & 0x000000F0L) >> 4;
- sGTMSystemVersionBugFix = (binaryCodedDec & 0x0000000FL);
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_3
-
#else // GTM_MACOS_SDK
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *version = nil;
@@ -81,7 +65,7 @@ static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/
// The intent is for this file to be Foundation level, so don't directly
// call out to UIDevice, but try to get it at runtime before falling back
// to the plist. The problem with using the plist on the Simulator is that
- // the path will be on the host system, and give us a MacOS (10.x.y)
+ // the path will be on the host system, and give us a MacOS (10.x.y)
// version number instead of an iOS version number.
Class uideviceClass = NSClassFromString(@"UIDevice");
if (uideviceClass) {
@@ -98,10 +82,10 @@ static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/
NSArray *versionInfo = [version componentsSeparatedByString:@"."];
NSUInteger length = [versionInfo count];
- _GTMDevAssert(length > 1 && length < 4,
+ _GTMDevAssert(length > 1 && length < 4,
@"Unparseable version %@", version);
sGTMSystemVersionMajor = [[versionInfo objectAtIndex:0] intValue];
- _GTMDevAssert(sGTMSystemVersionMajor != 0,
+ _GTMDevAssert(sGTMSystemVersionMajor != 0,
@"Unknown version for %@", version);
sGTMSystemVersionMinor = [[versionInfo objectAtIndex:1] intValue];
if (length == 3) {
@@ -130,7 +114,7 @@ static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/
// software to want this, and it costs a bit to get at startup.
// This will mainly be for unit test cases.
if (!sBuild) {
- NSDictionary *systemVersionPlist
+ NSDictionary *systemVersionPlist
= [NSDictionary dictionaryWithContentsOfFile:kSystemVersionPlistPath];
sBuild = [[systemVersionPlist objectForKey:@"ProductBuildVersion"] retain];
_GTMDevAssert(sBuild, @"Unable to get build version");
@@ -140,63 +124,51 @@ static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/
}
+ (BOOL)isBuildLessThan:(NSString*)build {
- NSComparisonResult result
- = [[self build] compare:build
+ NSComparisonResult result
+ = [[self build] compare:build
options:NSNumericSearch | NSCaseInsensitiveSearch];
return result == NSOrderedAscending;
}
-
+
+ (BOOL)isBuildLessThanOrEqualTo:(NSString*)build {
- NSComparisonResult result
- = [[self build] compare:build
+ NSComparisonResult result
+ = [[self build] compare:build
options:NSNumericSearch | NSCaseInsensitiveSearch];
return result != NSOrderedDescending;
}
+ (BOOL)isBuildGreaterThan:(NSString*)build {
- NSComparisonResult result
- = [[self build] compare:build
+ NSComparisonResult result
+ = [[self build] compare:build
options:NSNumericSearch | NSCaseInsensitiveSearch];
return result == NSOrderedDescending;
}
+ (BOOL)isBuildGreaterThanOrEqualTo:(NSString*)build {
- NSComparisonResult result
- = [[self build] compare:build
+ NSComparisonResult result
+ = [[self build] compare:build
options:NSNumericSearch | NSCaseInsensitiveSearch];
return result != NSOrderedAscending;
}
+ (BOOL)isBuildEqualTo:(NSString *)build {
- NSComparisonResult result
- = [[self build] compare:build
+ NSComparisonResult result
+ = [[self build] compare:build
options:NSNumericSearch | NSCaseInsensitiveSearch];
return result == NSOrderedSame;
}
#if GTM_MACOS_SDK
+ (BOOL)isPanther {
-#if defined(__MAC_10_4) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_4
return NO;
-#else
- return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 3;
-#endif
}
+ (BOOL)isTiger {
-#if defined(__MAC_10_5) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5
return NO;
-#else
- return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 4;
-#endif
}
+ (BOOL)isLeopard {
-#if defined(__MAC_10_6) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6
return NO;
-#else
- return sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor == 5;
-#endif
}
+ (BOOL)isSnowLeopard {
@@ -208,39 +180,19 @@ static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/
}
+ (BOOL)isPantherOrGreater {
-#if defined(__MAC_10_3) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_3
return YES;
-#else
- return (sGTMSystemVersionMajor > 10) ||
- (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 3);
-#endif
}
+ (BOOL)isTigerOrGreater {
-#if defined(__MAC_10_4) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_4
return YES;
-#else
- return (sGTMSystemVersionMajor > 10) ||
- (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 4);
-#endif
}
+ (BOOL)isLeopardOrGreater {
-#if defined(__MAC_10_5) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_5
return YES;
-#else
- return (sGTMSystemVersionMajor > 10) ||
- (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 5);
-#endif
}
+ (BOOL)isSnowLeopardOrGreater {
-#if defined(__MAC_10_6) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6
return YES;
-#else
- return (sGTMSystemVersionMajor > 10) ||
- (sGTMSystemVersionMajor == 10 && sGTMSystemVersionMinor >= 6);
-#endif
}
#endif // GTM_MACOS_SDK
@@ -272,9 +224,9 @@ static NSString *const kSystemVersionPlistPath = @"/System/Library/CoreServices/
architecture = kGTMArch_i386;
#endif // __LP64__
#endif // !__POWERPC__
-
+
#endif // GTM_IPHONE_SDK
return architecture;
-}
+}
@end
diff --git a/Foundation/GTMSystemVersionTest.m b/Foundation/GTMSystemVersionTest.m
index 24e6aa5..b881233 100644
--- a/Foundation/GTMSystemVersionTest.m
+++ b/Foundation/GTMSystemVersionTest.m
@@ -6,9 +6,9 @@
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
-//
+//
// http://www.apache.org/licenses/LICENSE-2.0
-//
+//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -27,67 +27,67 @@
SInt32 major;
SInt32 minor;
SInt32 bugFix;
-
+
[GTMSystemVersion getMajor:NULL minor:NULL bugFix:NULL];
[GTMSystemVersion getMajor:&major minor:NULL bugFix:NULL];
[GTMSystemVersion getMajor:NULL minor:&minor bugFix:NULL];
[GTMSystemVersion getMajor:NULL minor:NULL bugFix:&bugFix];
[GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix];
#if GTM_IPHONE_SDK
- STAssertTrue(major >= 2 && minor >= 0 && bugFix >= 0, nil);
+ XCTAssertTrue(major >= 2 && minor >= 0 && bugFix >= 0);
#else
- STAssertTrue(major >= 10 && minor >= 3 && bugFix >= 0, nil);
+ XCTAssertTrue(major >= 10 && minor >= 3 && bugFix >= 0);
BOOL isPanther = (major == 10) && (minor == 3);
BOOL isTiger = (major == 10) && (minor == 4);
BOOL isLeopard = (major == 10) && (minor == 5);
BOOL isSnowLeopard = (major == 10) && (minor == 6);
-
+
BOOL isLater = (major > 10) || ((major == 10) && (minor > 6));
- STAssertEquals([GTMSystemVersion isPanther], isPanther, nil);
- STAssertEquals([GTMSystemVersion isPantherOrGreater],
- (BOOL)(isPanther || isTiger
- || isLeopard || isSnowLeopard || isLater), nil);
- STAssertEquals([GTMSystemVersion isTiger], isTiger, nil);
- STAssertEquals([GTMSystemVersion isTigerOrGreater],
- (BOOL)(isTiger || isLeopard || isSnowLeopard || isLater), nil);
- STAssertEquals([GTMSystemVersion isLeopard], isLeopard, nil);
- STAssertEquals([GTMSystemVersion isLeopardOrGreater],
- (BOOL)(isLeopard || isSnowLeopard || isLater), nil);
- STAssertEquals([GTMSystemVersion isSnowLeopard], isSnowLeopard, nil);
- STAssertEquals([GTMSystemVersion isSnowLeopardOrGreater],
- (BOOL)(isSnowLeopard || isLater), nil);
-#endif
+ XCTAssertEqual([GTMSystemVersion isPanther], isPanther);
+ XCTAssertEqual([GTMSystemVersion isPantherOrGreater],
+ (BOOL)(isPanther || isTiger
+ || isLeopard || isSnowLeopard || isLater));
+ XCTAssertEqual([GTMSystemVersion isTiger], isTiger);
+ XCTAssertEqual([GTMSystemVersion isTigerOrGreater],
+ (BOOL)(isTiger || isLeopard || isSnowLeopard || isLater));
+ XCTAssertEqual([GTMSystemVersion isLeopard], isLeopard);
+ XCTAssertEqual([GTMSystemVersion isLeopardOrGreater],
+ (BOOL)(isLeopard || isSnowLeopard || isLater));
+ XCTAssertEqual([GTMSystemVersion isSnowLeopard], isSnowLeopard);
+ XCTAssertEqual([GTMSystemVersion isSnowLeopardOrGreater],
+ (BOOL)(isSnowLeopard || isLater));
+#endif
}
- (void)testRuntimeArchitecture {
// Not sure how to test this short of recoding it and verifying.
// This at least executes the code for me.
- STAssertNotNil([GTMSystemVersion runtimeArchitecture], nil);
+ XCTAssertNotNil([GTMSystemVersion runtimeArchitecture]);
}
- (void)testBuild {
// Not sure how to test this short of coding up a large fragile table.
// This at least executes the code for me.
NSString *systemVersion = [GTMSystemVersion build];
- STAssertNotEquals([systemVersion length], (NSUInteger)0, nil);
-
+ XCTAssertNotEqual([systemVersion length], (NSUInteger)0);
+
NSString *smallVersion = @"1A00";
NSString *largeVersion = @"100Z100";
- STAssertTrue([GTMSystemVersion isBuildGreaterThan:smallVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildGreaterThan:systemVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildGreaterThan:largeVersion], nil);
- STAssertTrue([GTMSystemVersion isBuildGreaterThanOrEqualTo:smallVersion], nil);
- STAssertTrue([GTMSystemVersion isBuildGreaterThanOrEqualTo:systemVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildGreaterThanOrEqualTo:largeVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildEqualTo:smallVersion], nil);
- STAssertTrue([GTMSystemVersion isBuildEqualTo:systemVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildEqualTo:largeVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildLessThanOrEqualTo:smallVersion], nil);
- STAssertTrue([GTMSystemVersion isBuildLessThanOrEqualTo:systemVersion], nil);
- STAssertTrue([GTMSystemVersion isBuildLessThanOrEqualTo:largeVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildLessThan:smallVersion], nil);
- STAssertFalse([GTMSystemVersion isBuildLessThan:systemVersion], nil);
- STAssertTrue([GTMSystemVersion isBuildLessThan:largeVersion], nil);
-
+ XCTAssertTrue([GTMSystemVersion isBuildGreaterThan:smallVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildGreaterThan:systemVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildGreaterThan:largeVersion]);
+ XCTAssertTrue([GTMSystemVersion isBuildGreaterThanOrEqualTo:smallVersion]);
+ XCTAssertTrue([GTMSystemVersion isBuildGreaterThanOrEqualTo:systemVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildGreaterThanOrEqualTo:largeVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildEqualTo:smallVersion]);
+ XCTAssertTrue([GTMSystemVersion isBuildEqualTo:systemVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildEqualTo:largeVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildLessThanOrEqualTo:smallVersion]);
+ XCTAssertTrue([GTMSystemVersion isBuildLessThanOrEqualTo:systemVersion]);
+ XCTAssertTrue([GTMSystemVersion isBuildLessThanOrEqualTo:largeVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildLessThan:smallVersion]);
+ XCTAssertFalse([GTMSystemVersion isBuildLessThan:systemVersion]);
+ XCTAssertTrue([GTMSystemVersion isBuildLessThan:largeVersion]);
+
}
@end
diff --git a/Foundation/GTMTransientRootPortProxy.h b/Foundation/GTMTransientRootPortProxy.h
deleted file mode 100644
index 5dc0a56..0000000
--- a/Foundation/GTMTransientRootPortProxy.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// GTMTransientRootPortProxy.h
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMTransientRootProxy.h"
-
-@interface GTMTransientRootPortProxy : GTMTransientRootProxy {
- @private
- NSPort *receivePort_;
- NSPort *sendPort_;
-}
-
-// Returns an autoreleased instance. See below for details on args.
-+ (id)rootProxyWithReceivePort:(NSPort *)receivePort
- sendPort:(NSPort *)sendPort
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout;
-
-// This function will return a GTMTransientRootProxy that is using NSPorts
-// for the connection. The |receivePort| and |sendPort| conventions
-// follow the same conventions as -[NSConnection initWithReceivePort:sendPort:].
-// Note that due to Radar 6676818 "NSConnection leaks when initialized with nil
-// sendPort" that you will leak a connection if you pass in "nil" for your
-// sendPort if you are using NSPorts (mach or socket) to communicate between
-// threads. The leak occurs on 10.5.6, and SL 10A286. This simple answer
-// is just to always use two ports to communicate. Check out the test to see
-// how we do cross thread communication.
-- (id)initWithReceivePort:(NSPort *)receivePort
- sendPort:(NSPort *)sendPort
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout;
-
-@end
diff --git a/Foundation/GTMTransientRootPortProxy.m b/Foundation/GTMTransientRootPortProxy.m
deleted file mode 100644
index ee9093a..0000000
--- a/Foundation/GTMTransientRootPortProxy.m
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-// GTMTransientRootPortProxy.m
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMTransientRootPortProxy.h"
-#import "GTMObjC2Runtime.h"
-
-@interface GTMTransientRootPortProxy (ProtectedMethods)
-// Returns an NSConnection for NSPorts. This method overrides the one in
-// the GTMTransientRootProxy which allows us to create a connection with a
-// NSPort.
-//
-- (NSConnection *)makeConnection;
-@end
-
-
-@implementation GTMTransientRootPortProxy
-
-+ (id)rootProxyWithReceivePort:(NSPort *)receivePort
- sendPort:(NSPort *)sendPort
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout {
- return [[[self alloc] initWithReceivePort:receivePort
- sendPort:sendPort
- protocol:protocol
- requestTimeout:requestTimeout
- replyTimeout:replyTimeout] autorelease];
-}
-
-- (id)initWithReceivePort:(NSPort *)receivePort
- sendPort:(NSPort *)sendPort
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout {
- if ((!sendPort && !receivePort) || !protocol) {
- [self release];
- return nil;
- }
-
- requestTimeout_ = requestTimeout;
- replyTimeout_ = replyTimeout;
-
- receivePort_ = [receivePort retain];
- sendPort_ = [sendPort retain];
-
- protocol_ = protocol; // Protocols can't be retained
- return self;
-}
-
-- (void)dealloc {
- [receivePort_ release];
- [sendPort_ release];
- [super dealloc];
-}
-
-@end
-
-@implementation GTMTransientRootPortProxy (ProtectedMethods)
-
-- (NSConnection *)makeConnection {
- return [NSConnection connectionWithReceivePort:receivePort_
- sendPort:sendPort_];
-}
-
-@end
diff --git a/Foundation/GTMTransientRootPortProxyTest.m b/Foundation/GTMTransientRootPortProxyTest.m
deleted file mode 100644
index a85498f..0000000
--- a/Foundation/GTMTransientRootPortProxyTest.m
+++ /dev/null
@@ -1,182 +0,0 @@
-//
-// GTMTransientRootPortProxyTest.m
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMTransientRootPortProxy.h"
-
-#define kDefaultTimeout 5.0
-
-enum {
- kGTMTransientThreadConditionStarting = 777,
- kGTMTransientThreadConditionStarted,
- kGTMTransientThreadConditionQuitting,
- kGTMTransientThreadConditionQuitted
-};
-
-// === Start off declaring some auxillary data structures ===
-
-// The @protocol that we'll use for testing with.
-@protocol DOPortTestProtocol
-- (oneway void)doOneWayVoid;
-- (bycopy NSString *)doReturnStringBycopy;
-@end
-
-// The "server" we'll use to test the DO connection. This server will implement
-// our test protocol, and it will run in a separate thread from the main
-// unit testing thread, so the DO requests can be serviced.
-@interface DOPortTestServer : NSObject <DOPortTestProtocol> {
- @private
- NSPort *clientSendPort_;
- NSPort *clientReceivePort_;
-}
-- (void)runThread:(NSConditionLock *)lock;
-- (NSPort *)clientSendPort;
-- (NSPort *)clientReceivePort;
-@end
-
-@implementation DOPortTestServer
-
-- (void)runThread:(NSConditionLock *)lock {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout];
- if(![lock lockWhenCondition:kGTMTransientThreadConditionStarting
- beforeDate:future]) {
- _GTMDevLog(@"Unable to acquire lock in runThread! This is BAD!");
- [pool drain];
- [NSThread exit];
- }
-
- clientSendPort_ = [NSPort port];
- clientReceivePort_ = [NSPort port];
-
- NSConnection *conn
- = [[NSConnection alloc] initWithReceivePort:clientSendPort_
- sendPort:clientReceivePort_];
- [conn setRootObject:self];
- [lock unlockWithCondition:kGTMTransientThreadConditionStarted];
- while (![lock tryLockWhenCondition:kGTMTransientThreadConditionQuitting]) {
- NSDate *runUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
- [[NSRunLoop currentRunLoop] runUntilDate:runUntil];
- }
- [conn setRootObject:nil];
- [clientSendPort_ invalidate];
- [clientReceivePort_ invalidate];
- [conn release];
- [pool drain];
- [lock unlockWithCondition:kGTMTransientThreadConditionQuitted];
-}
-
-- (NSPort *)clientSendPort {
- return clientSendPort_;
-}
-
-- (NSPort *)clientReceivePort {
- return clientReceivePort_;
-}
-
-- (oneway void)doOneWayVoid {
- // Do nothing
-}
-- (bycopy NSString *)doReturnStringBycopy {
- return @"TestString";
-}
-
-@end
-
-// === Done with auxillary data structures, now for the main test class ===
-
-@interface GTMTransientRootPortProxyTest : GTMTestCase {
- DOPortTestServer *server_;
- NSConditionLock *syncLock_;
-}
-
-@end
-
-@implementation GTMTransientRootPortProxyTest
-
-- (void)testTransientRootPortProxy {
- syncLock_ = [[[NSConditionLock alloc]
- initWithCondition:kGTMTransientThreadConditionStarting]
- autorelease];
-
- // Setup our server.
- server_ = [[[DOPortTestServer alloc] init] autorelease];
- [NSThread detachNewThreadSelector:@selector(runThread:)
- toTarget:server_
- withObject:syncLock_];
- NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout];
- STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionStarted
- beforeDate:future],
- @"Unable to start thread");
- [syncLock_ unlockWithCondition:kGTMTransientThreadConditionStarted];
-
- NSPort *receivePort = [server_ clientReceivePort];
- NSPort *sendPort = [server_ clientSendPort];
-
- GTMTransientRootPortProxy<DOPortTestProtocol> *failProxy =
- [GTMTransientRootPortProxy rootProxyWithReceivePort:nil
- sendPort:nil
- protocol:@protocol(DOPortTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
- STAssertNil(failProxy, @"should have failed w/o a port");
- failProxy =
- [GTMTransientRootPortProxy rootProxyWithReceivePort:receivePort
- sendPort:sendPort
- protocol:nil
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
- STAssertNil(failProxy, @"should have failed w/o a protocol");
-
- GTMTransientRootPortProxy<DOPortTestProtocol> *proxy =
- [GTMTransientRootPortProxy rootProxyWithReceivePort:receivePort
- sendPort:sendPort
- protocol:@protocol(DOPortTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
-
- STAssertEqualObjects([proxy doReturnStringBycopy],
- @"TestString", @"proxy should have returned "
- @"'TestString'");
-
- // Redo the *exact* same test to make sure we can have multiple instances
- // in the same app.
- proxy =
- [GTMTransientRootPortProxy rootProxyWithReceivePort:receivePort
- sendPort:sendPort
- protocol:@protocol(DOPortTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
-
- STAssertEqualObjects([proxy doReturnStringBycopy],
- @"TestString", @"proxy should have returned "
- @"'TestString'");
- [syncLock_ tryLockWhenCondition:kGTMTransientThreadConditionStarted];
- [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitting];
-
- // Wait for the server to shutdown so we clean up nicely.
- // The max amount of time we will wait until we abort this test.
- NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout];
- // The server did not shutdown and we want to capture this as an error
- STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionQuitted
- beforeDate:timeout],
- @"The server did not shutdown gracefully before the timeout.");
- [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitted];
-}
-
-@end
diff --git a/Foundation/GTMTransientRootProxy.h b/Foundation/GTMTransientRootProxy.h
deleted file mode 100644
index 3ebb501..0000000
--- a/Foundation/GTMTransientRootProxy.h
+++ /dev/null
@@ -1,114 +0,0 @@
-//
-// GTMTransientRootProxy.h
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-
-// Handle (re-)connecting to a transient root proxy object via DO.
-//
-// This class is designed to handle connecting and reconnecting to a Distributed
-// Objects root proxy (NSDistantObject* instance). It is a replacement for using
-// the NSDistantObject returned from NSConnection, directly. When the DO
-// connection is up, messages sent to this class are forwarded to the real
-// object (the NSDistantObject); when the DO connection is down, messages sent
-// to this class are silently swallowed. You can use the -isConnected method on
-// this class to see if the DO connection is up or down.
-//
-// This class may be useful when you need a DO connection, but the
-// server you're connected to may be going up and down. For example, the
-// web browser plugins in Google Desktop may need to connect to the Google
-// Desktop local webserver, but we'd want the browser plugins to be able to
-// gracefully handle the local Google Desktop webserver starting and stopping.
-//
-// === Example Usage ===
-//
-// Old code:
-//
-// NSDistantObject<MyProto> *o =
-// [NSConnection rootProxyForConnectionWithRegisteredName:@"server"
-// host:nil];
-// [o setProtocolForProxy:@protocol(MyProto)];
-// [o someMethodInMyProto];
-// // ... write a bunch of code to handle error conditions
-//
-// New code:
-//
-// GTMTransientRootProxy<MyProto> *o =
-// [GTMTransientRootProxy rootProxyWithRegisteredName:@"server"
-// host:nil
-// protocol:@protocol(MyProto)
-// requestTimeout:5.0
-// replyTimeout:5.0];
-// [o someMethodInMyProto];
-//
-// The 'Old code' requires you to handle all the error conditions that may
-// arise when using DO (such as the server crashing, or network going down),
-// handle properly tearing down the broken connection, and trying to reconnect
-// when the server finally comes back online. The 'New code' handles all of
-// those details for you.
-//
-// Also, when creating a GMTransientRootProxy object, you must tell it the
-// @protocol that will be used for communication - this is not optional. And
-// in order to quiet compiler warnings, you'll also want to staticly type
-// the pointer with the protocol as well.
-//
-@interface GTMTransientRootProxy : NSProxy {
- @protected
- GTM_WEAK Protocol *protocol_;
- NSDistantObject *realProxy_;
-
- NSString *registeredName_;
- NSString *host_;
-
- NSTimeInterval requestTimeout_;
- NSTimeInterval replyTimeout_;
-}
-
-// Returns an autoreleased instance
-+ (id)rootProxyWithRegisteredName:(NSString *)name
- host:(NSString *)host
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout;
-
-// This function will return a GTMTransientRootProxy that is using Mach ports
-// for the connection. The |name| and |host| arguments will be used to lookup
-// the correct information to create the Mach port connection.
-//
-- (id)initWithRegisteredName:(NSString *)name
- host:(NSString *)host
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout;
-
-// Returns YES if the DO connection is up and working, NO otherwise.
-//
-- (BOOL)isConnected;
-
-@end
-
-// Subclass of GTMTransientRootProxy that catches and ignores ALL exceptions.
-// This class overrides GTMTransientRootProxy's -forwardInvocation:
-// method, and wraps it in a try/catch block, and ignores all exceptions.
-//
-@interface GTMRootProxyCatchAll : GTMTransientRootProxy
-
-// Overridden, and ignores all thrown exceptions.
-- (void)forwardInvocation:(NSInvocation *)invocation;
-
-@end
diff --git a/Foundation/GTMTransientRootProxy.m b/Foundation/GTMTransientRootProxy.m
deleted file mode 100644
index 2f7dfec..0000000
--- a/Foundation/GTMTransientRootProxy.m
+++ /dev/null
@@ -1,230 +0,0 @@
-//
-// GTMTransientRootProxy.m
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMTransientRootProxy.h"
-#import "GTMObjC2Runtime.h"
-
-// Private methods on NSMethodSignature that we need to call. This method has
-// been available since 10.0, but Apple didn't add it to the headers until 10.5
-#if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-@interface NSMethodSignature (UndeclaredMethods)
-+ (NSMethodSignature *)signatureWithObjCTypes:(const char *)types;
-@end
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4
-
-@interface GTMTransientRootProxy (PrivateMethods)
-// Returns an NSConnection for NSMacPorts. This method is broken out to allow
-// subclasses to override it to generate different types of NSConnections.
-- (NSConnection *)makeConnection;
-
-// Returns the "real" proxy (stored in the realProxy_ ivar) associated with this
-// instance. If realProxy_ is nil, then an attempt is made to make a connection
-// to create the realProxy_.
-//
-- (NSDistantObject *)realProxy;
-
-// "Releases" the realProxy_ ivar, and removes |self| as an observer from
-// the NSNotificationCenter.
-//
-- (void)releaseRealProxy;
-
-// Notification that a connection has died.
-- (void)connectionDidDie:(NSNotification *)notification;
-@end
-
-@implementation GTMTransientRootProxy
-
-+ (id)rootProxyWithRegisteredName:(NSString *)name
- host:(NSString *)host
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout {
- return [[[self alloc] initWithRegisteredName:name
- host:host
- protocol:protocol
- requestTimeout:requestTimeout
- replyTimeout:replyTimeout] autorelease];
-}
-
-- (id)initWithRegisteredName:(NSString *)name
- host:(NSString *)host
- protocol:(Protocol *)protocol
- requestTimeout:(NSTimeInterval)requestTimeout
- replyTimeout:(NSTimeInterval)replyTimeout {
- if (!name || !protocol) {
- [self release];
- return nil;
- }
-
- requestTimeout_ = requestTimeout;
- replyTimeout_ = replyTimeout;
-
- registeredName_ = [name copy];
- host_ = [host copy];
-
- protocol_ = protocol; // Protocols can't be retained
-
- return self;
-}
-
-- (id)init {
- return [self initWithRegisteredName:nil
- host:nil
- protocol:nil
- requestTimeout:0.0
- replyTimeout:0.0];
-}
-
-- (void)dealloc {
- [self releaseRealProxy];
- [registeredName_ release];
- [host_ release];
- [super dealloc];
-}
-
-- (BOOL)isConnected {
- BOOL result = NO;
- @synchronized (self) {
- result = [[[self realProxy] connectionForProxy] isValid];
- }
- return result;
-}
-
-- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
- struct objc_method_description mdesc;
- mdesc = protocol_getMethodDescription(protocol_, selector, YES, YES);
- NSMethodSignature *returnValue = nil;
- if (mdesc.types == NULL) {
- // COV_NF_START
- _GTMDevLog(@"Unable to get the protocol method description. Returning "
- @"nil.");
- // COV_NF_END
- } else {
- returnValue = [NSMethodSignature signatureWithObjCTypes:mdesc.types];
- }
- return returnValue;
-}
-
-- (void)forwardInvocation:(NSInvocation *)invocation {
- @try {
- NSDistantObject *target = [self realProxy];
- [invocation invokeWithTarget:target];
-
- // We need to catch NSException* here rather than "id" because we need to
- // treat |ex| as an NSException when using the -name method. Also, we're
- // only looking to catch a few types of exception here, all of which are
- // NSException types; the rest we just rethrow.
- } @catch (NSException *ex) {
- NSString *exName = [ex name];
- // If we catch an exception who's name matches any of the following types,
- // it's because the DO connection probably went down. So, we'll just
- // release our realProxy_, and attempt to reconnect on the next call.
- if ([exName isEqualToString:NSPortTimeoutException]
- || [exName isEqualToString:NSInvalidSendPortException]
- || [exName isEqualToString:NSInvalidReceivePortException]
- || [exName isEqualToString:NSFailedAuthenticationException]
- || [exName isEqualToString:NSPortSendException]
- || [exName isEqualToString:NSPortReceiveException]) {
- [self releaseRealProxy]; // COV_NF_LINE
- } else {
- // If the exception was any other type (commonly
- // NSInvalidArgumentException) then we'll just re-throw it to the caller.
- @throw;
- }
- } // COV_NF_LINE
-}
-
-@end
-
-@implementation GTMTransientRootProxy (PrivateMethods)
-
-- (NSConnection *)makeConnection {
- return [NSConnection connectionWithRegisteredName:registeredName_ host:host_];
-}
-
-- (NSDistantObject *)realProxy {
- NSDistantObject *returnProxy = nil;
-
- @synchronized (self) {
- // No change so no notification
- if (realProxy_) return realProxy_;
-
- NSConnection *conn = [self makeConnection];
- [conn setRequestTimeout:requestTimeout_];
- [conn setReplyTimeout:replyTimeout_];
- @try {
- // Try to get the root proxy for this connection's vended object.
- realProxy_ = [conn rootProxy];
- } @catch (id ex) {
- // We may fail here if we can't get the root proxy in the amount of time
- // specified by the timeout above. This may happen, for example, if the
- // server process is stopped (via SIGSTOP). We'll just ignore this, and
- // try again at the next message.
- [conn invalidate];
- return nil;
- }
- if (!realProxy_) {
- [conn invalidate];
- // Again, no change in connection status
- return nil;
- }
- [realProxy_ retain];
- [realProxy_ setProtocolForProxy:protocol_];
- NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
- [nc addObserver:self
- selector:@selector(connectionDidDie:)
- name:NSConnectionDidDieNotification
- object:conn];
- // Retain/autorelease so it lives at least the duration of this synchronize
- returnProxy = [[realProxy_ retain] autorelease];
- } // @synchronized (self)
-
- return returnProxy;
-}
-
-- (void)connectionDidDie:(NSNotification *)notification {
- [self releaseRealProxy];
-}
-
-- (void)releaseRealProxy {
- @synchronized (self) {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- // Only trigger if we had a proxy before
- if (realProxy_) {
- [realProxy_ release];
- realProxy_ = nil;
- }
- }
-}
-
-@end
-
-@implementation GTMRootProxyCatchAll
-
-- (void)forwardInvocation:(NSInvocation *)invocation {
- @try {
- [super forwardInvocation:invocation];
- }
- @catch (id ex) {
- // Log for developers, but basically ignore it.
- _GTMDevLog(@"Proxy for invoking %@ has caught and is ignoring exception: %@",
- NSStringFromSelector([invocation selector]), ex);
- }
-}
-
-@end
diff --git a/Foundation/GTMTransientRootProxyTest.m b/Foundation/GTMTransientRootProxyTest.m
deleted file mode 100644
index 821faac..0000000
--- a/Foundation/GTMTransientRootProxyTest.m
+++ /dev/null
@@ -1,231 +0,0 @@
-//
-// GMTransientRootProxyTest.m
-//
-// Copyright 2006-2009 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMSenTestCase.h"
-#import "GTMTransientRootProxy.h"
-#import "GTMUnitTestDevLog.h"
-
-#define kDefaultTimeout 5.0
-
-// === Start off declaring some auxillary data structures ===
-static NSString *const kTestServerName = @"gtm_test_server";
-static NSString *const kGTMTransientRootNameKey = @"GTMTransientRootNameKey";
-static NSString *const kGTMTransientRootLockKey = @"GTMTransientRootLockKey";
-
-enum {
- kGTMTransientThreadConditionStarting = 777,
- kGTMTransientThreadConditionStarted,
- kGTMTransientThreadConditionQuitting,
- kGTMTransientThreadConditionQuitted
-};
-
-// The @protocol that we'll use for testing with.
-@protocol DOTestProtocol
-- (oneway void)doOneWayVoid;
-- (bycopy NSString *)doReturnStringBycopy;
-- (void)throwException;
-@end
-
-// The "server" we'll use to test the DO connection. This server will implement
-// our test protocol, and it will run in a separate thread from the main
-// unit testing thread, so the DO requests can be serviced.
-@interface DOTestServer : NSObject <DOTestProtocol>
-- (void)runThread:(NSDictionary *)args;
-@end
-
-@implementation DOTestServer
-
-- (void)runThread:(NSDictionary *)args {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSConditionLock *lock = [args objectForKey:kGTMTransientRootLockKey];
- NSString *serverName = [args objectForKey:kGTMTransientRootNameKey];
- NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout];
- if(![lock lockWhenCondition:kGTMTransientThreadConditionStarting
- beforeDate:future]) {
- _GTMDevLog(@"Unable to acquire lock in runThread! This is BAD!");
- [pool drain];
- [NSThread exit];
- }
-
- NSConnection *conn = [[[NSConnection alloc] init] autorelease];
- [conn setRootObject:self];
- if (![conn registerName:serverName]) {
- _GTMDevLog(@"Failed to register DO root object with name '%@'",
- serverName);
- [pool drain];
- [NSThread exit];
- }
- [lock unlockWithCondition:kGTMTransientThreadConditionStarted];
- while (![lock tryLockWhenCondition:kGTMTransientThreadConditionQuitting]) {
- NSDate* runUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
- [[NSRunLoop currentRunLoop] runUntilDate:runUntil];
- }
- [conn setRootObject:nil];
- [conn registerName:nil];
- [pool drain];
- [lock unlockWithCondition:kGTMTransientThreadConditionQuitted];
-}
-
-- (oneway void)doOneWayVoid {
- // Do nothing
-}
-- (bycopy NSString *)doReturnStringBycopy {
- return @"TestString";
-}
-
-- (void)throwException {
- [NSException raise:@"testingException" format:@"for the unittest"];
-}
-
-@end
-
-// === Done with auxillary data structures, now for the main test class ===
-
-@interface GTMTransientRootProxy (GTMTransientRootProxyTest)
-- (id)init;
-@end
-
-@interface GTMTransientRootProxyTest : GTMTestCase {
- @private
- DOTestServer *server_;
- NSConditionLock *syncLock_;
-}
-@end
-
-@implementation GTMTransientRootProxyTest
-
-- (void)testTransientRootProxy {
- // Setup our server and create a unqiue server name every time we run
- NSTimeInterval timeStamp = [[NSDate date] timeIntervalSinceReferenceDate];
- NSString *serverName =
- [NSString stringWithFormat:@"%@_%f", kTestServerName, timeStamp];
- server_ = [[[DOTestServer alloc] init] autorelease];
- syncLock_ = [[[NSConditionLock alloc]
- initWithCondition:kGTMTransientThreadConditionStarting]
- autorelease];
- NSDictionary *args = [NSDictionary dictionaryWithObjectsAndKeys:
- syncLock_, kGTMTransientRootLockKey,
- serverName, kGTMTransientRootNameKey,
- nil];
- [NSThread detachNewThreadSelector:@selector(runThread:)
- toTarget:server_
- withObject:args];
- NSDate *future = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout];
- STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionStarted
- beforeDate:future],
- @"Unable to start thread");
- [syncLock_ unlockWithCondition:kGTMTransientThreadConditionStarted];
-
- GTMTransientRootProxy *failProxy =
- [GTMTransientRootProxy rootProxyWithRegisteredName:nil
- host:nil
- protocol:@protocol(DOTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
- STAssertNil(failProxy, @"should have failed w/o a name");
- failProxy =
- [GTMTransientRootProxy rootProxyWithRegisteredName:serverName
- host:nil
- protocol:nil
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
- STAssertNil(failProxy, @"should have failed w/o a protocol");
- failProxy = [[[GTMTransientRootProxy alloc] init] autorelease];
- STAssertNil(failProxy, @"should have failed just calling init");
-
- GTMTransientRootProxy<DOTestProtocol> *proxy =
- [GTMTransientRootProxy rootProxyWithRegisteredName:serverName
- host:nil
- protocol:@protocol(DOTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
-
- STAssertEqualObjects([proxy doReturnStringBycopy], @"TestString",
- @"proxy should have returned 'TestString'");
-
- // Redo the *exact* same test to make sure we can have multiple instances
- // in the same app.
- proxy =
- [GTMTransientRootProxy rootProxyWithRegisteredName:serverName
- host:nil
- protocol:@protocol(DOTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
- STAssertEqualObjects([proxy doReturnStringBycopy],
- @"TestString", @"proxy should have returned "
- @"'TestString'");
-
- // Test the GTMRootProxyCatchAll within this test so we don't have to rebuild
- // the server again.
-
- GTMRootProxyCatchAll<DOTestProtocol> *catchProxy =
- [GTMRootProxyCatchAll rootProxyWithRegisteredName:serverName
- host:nil
- protocol:@protocol(DOTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
-
- [GTMUnitTestDevLog expectString:@"Proxy for invoking throwException has "
- @"caught and is ignoring exception: [NOTE: this exception originated in "
- @"the server.]\nfor the unittest"];
- id e = nil;
- @try {
- // Has the server throw an exception
- [catchProxy throwException];
- } @catch (id ex) {
- e = ex;
- }
- STAssertNil(e, @"The GTMRootProxyCatchAll did not catch the exception: %@.",
- e);
-
- proxy =
- [GTMTransientRootProxy rootProxyWithRegisteredName:@"FAKE_SERVER"
- host:nil
- protocol:@protocol(DOTestProtocol)
- requestTimeout:kDefaultTimeout
- replyTimeout:kDefaultTimeout];
- STAssertNotNil(proxy, @"proxy shouldn't be nil, even when registered w/ a "
- @"fake server");
- STAssertFalse([proxy isConnected], @"the proxy shouldn't be connected due to "
- @"the fake server");
-
- // Now set up a proxy, and then kill our server. We put a super short time
- // out on it, because we are expecting it to fail.
- proxy =
- [GTMTransientRootProxy rootProxyWithRegisteredName:serverName
- host:nil
- protocol:@protocol(DOTestProtocol)
- requestTimeout:0.01
- replyTimeout:0.01];
- [syncLock_ tryLockWhenCondition:kGTMTransientThreadConditionStarted];
- [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitting];
-
- // Wait for the server to shutdown so we clean up nicely.
- // The max amount of time we will wait until we abort this test.
- NSDate *timeout = [NSDate dateWithTimeIntervalSinceNow:kDefaultTimeout];
- // The server did not shutdown and we want to capture this as an error
- STAssertTrue([syncLock_ lockWhenCondition:kGTMTransientThreadConditionQuitted
- beforeDate:timeout],
- @"The server did not shutdown gracefully before the timeout.");
- [syncLock_ unlockWithCondition:kGTMTransientThreadConditionQuitted];
-
- // This should fail gracefully because the server is dead.
- STAssertNil([proxy doReturnStringBycopy], @"proxy should have returned nil");
-}
-
-@end
diff --git a/Foundation/GTMURITemplate.h b/Foundation/GTMURITemplate.h
deleted file mode 100644
index d0e9cea..0000000
--- a/Foundation/GTMURITemplate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Copyright (c) 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import <Foundation/Foundation.h>
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
-
-//
-// URI Template
-//
-// http://tools.ietf.org/html/draft-gregorio-uritemplate-04
-//
-// NOTE: This implemention is only a subset of the spec. It should be able
-// to parse any template that matches the spec, but if the template makes use
-// of a feature that is not supported, it will fail with an error.
-//
-
-@interface GTMURITemplate : NSObject
-
-// Process the template. If the template uses an unsupported feature, it will
-// throw an exception to help catch that limitation. Currently unsupported
-// feature is partial result modifiers (prefix/suffix).
-//
-// valueProvider should be anything that implements -objectForKey:. At the
-// simplest level, this can be an NSDictionary. However, a custom class that
-// implements valueForKey may be better for some uses (like if the values
-// are coming out of some other structure).
-+ (NSString *)expandTemplate:(NSString *)uriTemplate values:(id)valueProvider;
-
-@end
-
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
diff --git a/Foundation/GTMURITemplate.m b/Foundation/GTMURITemplate.m
deleted file mode 100644
index 5938b72..0000000
--- a/Foundation/GTMURITemplate.m
+++ /dev/null
@@ -1,521 +0,0 @@
-/* Copyright (c) 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import "GTMURITemplate.h"
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
-
-// Key constants for handling variables.
-static NSString *const kVariable = @"variable"; // NSString
-static NSString *const kExplode = @"explode"; // NSString
-static NSString *const kPartial = @"partial"; // NSString
-static NSString *const kPartialValue = @"partialValue"; // NSNumber
-
-// Help for passing the Expansion info in one shot.
-struct ExpansionInfo {
- // Constant for the whole expansion.
- unichar expressionOperator;
- NSString *joiner;
- BOOL allowReservedInEscape;
-
- // Update for each variable.
- NSString *explode;
-};
-
-// Helper just to shorten the lines when needed.
-static NSString *UnescapeString(NSString *str) {
- return [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-}
-
-static NSString *EscapeString(NSString *str, BOOL allowReserved) {
- static CFStringRef kReservedChars = CFSTR(":/?#[]@!$&'()*+,;=");
- CFStringRef allowedChars = allowReserved ? kReservedChars : NULL;
-
- // NSURL's stringByAddingPercentEscapesUsingEncoding: does not escape
- // some characters that should be escaped in URL parameters, like / and ?;
- // we'll use CFURL to force the encoding of those
- //
- // Reference: http://www.ietf.org/rfc/rfc3986.txt
- static CFStringRef kCharsToForceEscape = CFSTR("!*'();:@&=+$,/?%#[]");
- static CFStringRef kCharsToForceEscapeSansReserved = CFSTR("%");
- CFStringRef forceEscapedChars =
- allowReserved ? kCharsToForceEscapeSansReserved : kCharsToForceEscape;
-
- NSString *resultStr = str;
- CFStringRef escapedStr =
- CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
- (CFStringRef)str,
- allowedChars,
- forceEscapedChars,
- kCFStringEncodingUTF8);
- if (escapedStr) {
- resultStr = [(NSString *)escapedStr autorelease];
- }
- return resultStr;
-}
-
-@interface GTMURITemplate ()
-+ (BOOL)parseExpression:(NSString *)expression
- expressionOperator:(unichar*)outExpressionOperator
- variables:(NSMutableArray **)outVariables
- defaultValues:(NSMutableDictionary **)outDefaultValues;
-
-+ (NSString *)expandVariables:(NSArray *)variables
- expressionOperator:(unichar)expressionOperator
- values:(id)valueProvider
- defaultValues:(NSMutableDictionary *)defaultValues;
-
-+ (NSString *)expandString:(NSString *)valueStr
- variableName:(NSString *)variableName
- expansionInfo:(struct ExpansionInfo *)expansionInfo;
-+ (NSString *)expandArray:(NSArray *)valueArray
- variableName:(NSString *)variableName
- expansionInfo:(struct ExpansionInfo *)expansionInfo;
-+ (NSString *)expandDictionary:(NSDictionary *)valueDict
- variableName:(NSString *)variableName
- expansionInfo:(struct ExpansionInfo *)expansionInfo;
-@end
-
-@implementation GTMURITemplate
-
-#pragma mark Internal Helpers
-
-+ (BOOL)parseExpression:(NSString *)expression
- expressionOperator:(unichar*)outExpressionOperator
- variables:(NSMutableArray **)outVariables
- defaultValues:(NSMutableDictionary **)outDefaultValues {
-
- // Please see the spec for full details, but here are the basics:
- //
- // URI-Template = *( literals / expression )
- // expression = "{" [ operator ] variable-list "}"
- // variable-list = varspec *( "," varspec )
- // varspec = varname [ modifier ] [ "=" default ]
- // varname = varchar *( varchar / "." )
- // modifier = explode / partial
- // explode = ( "*" / "+" )
- // partial = ( substring / remainder ) offset
- //
- // Examples:
- // http://www.example.com/foo{?query,number}
- // http://maps.com/mapper{?address*}
- // http://directions.org/directions{?from+,to+}
- // http://search.org/query{?terms+=none}
- //
-
- // http://tools.ietf.org/html/draft-gregorio-uritemplate-04#section-2.2
- // Operator and op-reserve characters
- static NSCharacterSet *operatorSet = nil;
- // http://tools.ietf.org/html/draft-gregorio-uritemplate-04#section-2.4.1
- // Explode characters
- static NSCharacterSet *explodeSet = nil;
- // http://tools.ietf.org/html/draft-gregorio-uritemplate-04#section-2.4.2
- // Partial (prefix/subset) characters
- static NSCharacterSet *partialSet = nil;
-
- @synchronized(self) {
- if (operatorSet == nil) {
- operatorSet = [[NSCharacterSet characterSetWithCharactersInString:@"+./;?|!@"] retain];
- }
- if (explodeSet == nil) {
- explodeSet = [[NSCharacterSet characterSetWithCharactersInString:@"*+"] retain];
- }
- if (partialSet == nil) {
- partialSet = [[NSCharacterSet characterSetWithCharactersInString:@":^"] retain];
- }
- }
-
- // http://tools.ietf.org/html/draft-gregorio-uritemplate-04#section-3.3
- // Empty expression inlines the expression.
- if ([expression length] == 0) return NO;
-
- // Pull off any operator.
- *outExpressionOperator = 0;
- unichar firstChar = [expression characterAtIndex:0];
- if ([operatorSet characterIsMember:firstChar]) {
- *outExpressionOperator = firstChar;
- expression = [expression substringFromIndex:1];
- }
-
- if ([expression length] == 0) return NO;
-
- // Need to find at least one varspec for the expresssion to be considered
- // valid.
- BOOL gotAVarspec = NO;
-
- // Split the variable list.
- NSArray *varspecs = [expression componentsSeparatedByString:@","];
-
- // Extract the defaults, explodes and modifiers from the varspecs.
- *outVariables = [NSMutableArray arrayWithCapacity:[varspecs count]];
- for (NSString *varspec in varspecs) {
- NSString *defaultValue = nil;
-
- if ([varspec length] == 0) continue;
-
- NSMutableDictionary *varInfo =
- [NSMutableDictionary dictionaryWithCapacity:4];
-
- // Check for a default (foo=bar).
- NSRange range = [varspec rangeOfString:@"="];
- if (range.location != NSNotFound) {
- defaultValue =
- UnescapeString([varspec substringFromIndex:range.location + 1]);
- varspec = [varspec substringToIndex:range.location];
-
- if ([varspec length] == 0) continue;
- }
-
- // Check for explode (foo*).
- NSUInteger lenLessOne = [varspec length] - 1;
- if ([explodeSet characterIsMember:[varspec characterAtIndex:lenLessOne]]) {
- [varInfo setObject:[varspec substringFromIndex:lenLessOne] forKey:kExplode];
- varspec = [varspec substringToIndex:lenLessOne];
- if ([varspec length] == 0) continue;
- } else {
- // Check for partial (prefix/suffix) (foo:12).
- range = [varspec rangeOfCharacterFromSet:partialSet];
- if (range.location != NSNotFound) {
- NSString *partialMode = [varspec substringWithRange:range];
- NSString *valueStr = [varspec substringFromIndex:range.location + 1];
- // If there wasn't a value for the partial, ignore it.
- if ([valueStr length] > 0) {
- [varInfo setObject:partialMode forKey:kPartial];
- // TODO: Should validate valueStr is just a number...
- [varInfo setObject:[NSNumber numberWithInteger:[valueStr integerValue]]
- forKey:kPartialValue];
- }
- varspec = [varspec substringToIndex:range.location];
- if ([varspec length] == 0) continue;
- }
- }
-
- // Spec allows percent escaping in names, so undo that.
- varspec = UnescapeString(varspec);
-
- // Save off the cleaned up variable name.
- [varInfo setObject:varspec forKey:kVariable];
- [*outVariables addObject:varInfo];
- gotAVarspec = YES;
-
- // Now that the variable has been cleaned up, store its default.
- if (defaultValue) {
- if (*outDefaultValues == nil) {
- *outDefaultValues = [NSMutableDictionary dictionary];
- }
- [*outDefaultValues setObject:defaultValue forKey:varspec];
- }
- }
- // All done.
- return gotAVarspec;
-}
-
-+ (NSString *)expandVariables:(NSArray *)variables
- expressionOperator:(unichar)expressionOperator
- values:(id)valueProvider
- defaultValues:(NSMutableDictionary *)defaultValues {
- NSString *prefix = nil;
- struct ExpansionInfo expansionInfo;
- expansionInfo.expressionOperator = expressionOperator;
- expansionInfo.joiner = nil;
- expansionInfo.allowReservedInEscape = NO;
- switch (expressionOperator) {
- case 0:
- expansionInfo.joiner = @",";
- prefix = @"";
- break;
- case '+':
- expansionInfo.joiner = @",";
- prefix = @"";
- // The reserved character are safe from escaping.
- expansionInfo.allowReservedInEscape = YES;
- break;
- case '.':
- expansionInfo.joiner = @".";
- prefix = @".";
- break;
- case '/':
- expansionInfo.joiner = @"/";
- prefix = @"/";
- break;
- case ';':
- expansionInfo.joiner = @";";
- prefix = @";";
- break;
- case '?':
- expansionInfo.joiner = @"&";
- prefix = @"?";
- break;
- default:
- [NSException raise:@"GTMURITemplateUnsupported"
- format:@"Unknown expression operator '%C'", expressionOperator];
- break;
- }
-
- NSMutableArray *results = [NSMutableArray arrayWithCapacity:[variables count]];
-
- for (NSDictionary *varInfo in variables) {
- NSString *variable = [varInfo objectForKey:kVariable];
-
- expansionInfo.explode = [varInfo objectForKey:kExplode];
- // Look up the variable value.
- id rawValue = [valueProvider objectForKey:variable];
-
- // If the value is an empty array or dictionary, the default is still used.
- if (([rawValue isKindOfClass:[NSArray class]]
- || [rawValue isKindOfClass:[NSDictionary class]])
- && [rawValue count] == 0) {
- rawValue = nil;
- }
-
- // Got nothing? Check defaults.
- if (rawValue == nil) {
- rawValue = [defaultValues objectForKey:variable];
- }
-
- // If we didn't get any value, on to the next thing.
- if (!rawValue) {
- continue;
- }
-
- // Time do to the work...
- NSString *result = nil;
- if ([rawValue isKindOfClass:[NSString class]]) {
- result = [self expandString:rawValue
- variableName:variable
- expansionInfo:&expansionInfo];
- } else if ([rawValue isKindOfClass:[NSNumber class]]) {
- // Turn the number into a string and send it on its way.
- result = [self expandString:[rawValue stringValue]
- variableName:variable
- expansionInfo:&expansionInfo];
- } else if ([rawValue isKindOfClass:[NSArray class]]) {
- result = [self expandArray:rawValue
- variableName:variable
- expansionInfo:&expansionInfo];
- } else if ([rawValue isKindOfClass:[NSDictionary class]]) {
- result = [self expandDictionary:rawValue
- variableName:variable
- expansionInfo:&expansionInfo];
- } else {
- [NSException raise:@"GTMURITemplateUnsupported"
- format:@"Variable returned unsupported type (%@)",
- NSStringFromClass([rawValue class])];
- }
-
- // Did it generate anything?
- if (!result)
- continue;
-
- // Apply partial.
- // Defaults should get partial applied?
- // ( http://tools.ietf.org/html/draft-gregorio-uritemplate-04#section-2.5 )
- NSString *partial = [varInfo objectForKey:kPartial];
- if ([partial length] > 0) {
- [NSException raise:@"GTMURITemplateUnsupported"
- format:@"Unsupported partial on expansion %@", partial];
- }
-
- // Add the result
- [results addObject:result];
- }
-
- // Join and add any needed prefix.
- NSString *joinedResults =
- [results componentsJoinedByString:expansionInfo.joiner];
- if (([prefix length] > 0) && ([joinedResults length] > 0)) {
- return [prefix stringByAppendingString:joinedResults];
- }
- return joinedResults;
-}
-
-+ (NSString *)expandString:(NSString *)valueStr
- variableName:(NSString *)variableName
- expansionInfo:(struct ExpansionInfo *)expansionInfo {
- NSString *escapedValue =
- EscapeString(valueStr, expansionInfo->allowReservedInEscape);
- switch (expansionInfo->expressionOperator) {
- case ';':
- case '?':
- if ([valueStr length] > 0) {
- return [NSString stringWithFormat:@"%@=%@", variableName, escapedValue];
- }
- return variableName;
- default:
- return escapedValue;
- }
-}
-
-+ (NSString *)expandArray:(NSArray *)valueArray
- variableName:(NSString *)variableName
- expansionInfo:(struct ExpansionInfo *)expansionInfo {
- NSMutableArray *results = [NSMutableArray arrayWithCapacity:[valueArray count]];
- // When joining variable with value, use "var.val" except for 'path' and
- // 'form' style expression, use 'var=val' then.
- char variableValueJoiner = '.';
- char expressionOperator = expansionInfo->expressionOperator;
- if ((expressionOperator == ';') || (expressionOperator == '?')) {
- variableValueJoiner = '=';
- }
- // Loop over the values.
- for (NSString *value in valueArray) {
- // Escape it.
- value = EscapeString(value, expansionInfo->allowReservedInEscape);
- // Should variable names be used?
- if ([expansionInfo->explode isEqual:@"+"]) {
- value = [NSString stringWithFormat:@"%@%c%@",
- variableName, variableValueJoiner, value];
- }
- [results addObject:value];
- }
- if ([results count] > 0) {
- // Use the default joiner unless there was no explode request, then a list
- // always gets comma seperated.
- NSString *joiner = expansionInfo->joiner;
- if (expansionInfo->explode == nil) {
- joiner = @",";
- }
- // Join the values.
- NSString *joined = [results componentsJoinedByString:joiner];
- // 'form' style without an explode gets the variable name set to the
- // joined list of values.
- if ((expressionOperator == '?') && (expansionInfo->explode == nil)) {
- return [NSString stringWithFormat:@"%@=%@", variableName, joined];
- }
- return joined;
- }
- return nil;
-}
-
-+ (NSString *)expandDictionary:(NSDictionary *)valueDict
- variableName:(NSString *)variableName
- expansionInfo:(struct ExpansionInfo *)expansionInfo {
- NSMutableArray *results = [NSMutableArray arrayWithCapacity:[valueDict count]];
- // When joining variable with value:
- // - Default to the joiner...
- // - No explode, always comma...
- // - For 'path' and 'form' style expression, use 'var=val'.
- NSString *keyValueJoiner = expansionInfo->joiner;
- char expressionOperator = expansionInfo->expressionOperator;
- if (!expansionInfo->explode) {
- keyValueJoiner = @",";
- } else if ((expressionOperator == ';') || (expressionOperator == '?')) {
- keyValueJoiner = @"=";
- }
- // Loop over the sorted keys.
- NSArray *sortedKeys =
- [[valueDict allKeys] sortedArrayUsingSelector:@selector(compare:)];
- for (NSString *key in sortedKeys) {
- NSString *value = [valueDict objectForKey:key];
- // Escape them.
- key = EscapeString(key, expansionInfo->allowReservedInEscape);
- value = EscapeString(value, expansionInfo->allowReservedInEscape);
- // Should variable names be used?
- if ([expansionInfo->explode isEqual:@"+"]) {
- key = [NSString stringWithFormat:@"%@.%@", variableName, key];
- }
- if ((expressionOperator == '?' || expressionOperator == ';')
- && ([value length] == 0)) {
- [results addObject:key];
- } else {
- NSString *pair = [NSString stringWithFormat:@"%@%@%@",
- key, keyValueJoiner, value];
- [results addObject:pair];
- }
- }
- if ([results count]) {
- // Use the default joiner unless there was no explode request, then a list
- // always gets comma seperated.
- NSString *joiner = expansionInfo->joiner;
- if (!expansionInfo->explode) {
- joiner = @",";
- }
- // Join the values.
- NSString *joined = [results componentsJoinedByString:joiner];
- // 'form' style without an explode gets the variable name set to the
- // joined list of values.
- if ((expressionOperator == '?') && (expansionInfo->explode == nil)) {
- return [NSString stringWithFormat:@"%@=%@", variableName, joined];
- }
- return joined;
- }
- return nil;
-}
-
-#pragma mark Public API
-
-+ (NSString *)expandTemplate:(NSString *)uriTemplate values:(id)valueProvider {
- NSMutableString *result =
- [NSMutableString stringWithCapacity:[uriTemplate length]];
-
- NSScanner *scanner = [NSScanner scannerWithString:uriTemplate];
- [scanner setCharactersToBeSkipped:nil];
-
- // Defaults have to live through the full evaluation, so if any are encoured
- // they are reused throughout the expansion calls.
- NSMutableDictionary *defaultValues = nil;
-
- // Pull out the expressions for processing.
- while (![scanner isAtEnd]) {
- NSString *skipped = nil;
- // Find the next '{'.
- if ([scanner scanUpToString:@"{" intoString:&skipped]) {
- // Add anything before it to the result.
- [result appendString:skipped];
- }
- // Advance over the '{'.
- [scanner scanString:@"{" intoString:nil];
- // Collect the expression.
- NSString *expression = nil;
- if ([scanner scanUpToString:@"}" intoString:&expression]) {
- // Collect the trailing '}' on the expression.
- BOOL hasTrailingBrace = [scanner scanString:@"}" intoString:nil];
-
- // Parse the expression.
- NSMutableArray *variables = nil;
- unichar expressionOperator = 0;
- if ([self parseExpression:expression
- expressionOperator:&expressionOperator
- variables:&variables
- defaultValues:&defaultValues]) {
- // Do the expansion.
- NSString *substitution = [self expandVariables:variables
- expressionOperator:expressionOperator
- values:valueProvider
- defaultValues:defaultValues];
- if (substitution) {
- [result appendString:substitution];
- }
- } else {
- // Failed to parse, add the raw expression to the output.
- if (hasTrailingBrace) {
- [result appendFormat:@"{%@}", expression];
- } else {
- [result appendFormat:@"{%@", expression];
- }
- }
- } else if (![scanner isAtEnd]) {
- // Empty expression ('{}'). Copy over the opening brace and the trailing
- // one will be copied by the next cycle of the loop.
- [result appendString:@"{"];
- }
- }
-
- return result;
-}
-
-@end
-
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
diff --git a/Foundation/GTMURITemplateTest.m b/Foundation/GTMURITemplateTest.m
deleted file mode 100644
index ba2c8fb..0000000
--- a/Foundation/GTMURITemplateTest.m
+++ /dev/null
@@ -1,133 +0,0 @@
-/* Copyright (c) 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#import "GTMURITemplate.h"
-
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
-
-#import "GTMSenTestCase.h"
-#import "GTMScriptRunner.h"
-
-@interface GTMURITemplateTest : GTMTestCase
-- (NSDictionary *)loadTestSuitesNamed:(NSString *)testSuitesName;
-- (NSDictionary *)parseJSONString:(NSString *)json error:(NSError **)error;
-- (void)runTestSuites:(NSDictionary *)testSuites;
-@end
-
-@implementation GTMURITemplateTest
-
-- (NSDictionary *)parseJSONString:(NSString *)json error:(NSError **)error {
- NSDictionary *result = nil;
-
- // If we ever get a JSON parser in GTM (or the system gets one, next cat?),
- // then we can skip this conversion dance.
-
- NSString *fileName = [NSString stringWithFormat:@"URITemplate_%u.plist", arc4random()];
- NSString *tempOutPath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
-
- GTMScriptRunner *runner = [GTMScriptRunner runnerWithPython];
- NSString *command = [NSString stringWithFormat:
- @"import Foundation\n"
- @"import json\n"
- @"str_of_json = \"\"\"%@\"\"\"\n"
- @"Foundation.NSDictionary.dictionaryWithDictionary_(json.loads(str_of_json)).writeToFile_atomically_('%@', True)\n",
- json, tempOutPath];
- NSString *errStr = nil;
- NSString *outStr = [runner run:command standardError:&errStr];
-
- STAssertNil(outStr, @"got something on stdout: %@", outStr);
- STAssertNil(errStr, @"got something on stderr: %@", errStr);
- result = [NSDictionary dictionaryWithContentsOfFile:tempOutPath];
-
- [[NSFileManager defaultManager] removeItemAtPath:tempOutPath
- error:NULL];
-
- return result;
-}
-
-- (NSDictionary *)loadTestSuitesNamed:(NSString *)testSuitesName {
- NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
- STAssertNotNil(testBundle, nil);
-
- NSString *testSuitesPath = [testBundle pathForResource:testSuitesName
- ofType:nil];
- STAssertNotNil(testSuitesPath, @"%@ not found", testSuitesName);
-
- NSError *error = nil;
- NSString *testSuitesStr = [NSString stringWithContentsOfFile:testSuitesPath
- encoding:NSUTF8StringEncoding
- error:&error];
- STAssertNil(error, @"Loading %@, error %@", testSuitesName, error);
- STAssertNotNil(testSuitesStr, @"Loading %@", testSuitesName);
-
- NSDictionary *testSuites = [self parseJSONString:testSuitesStr
- error:&error];
- STAssertNil(error, @"Parsing %@, error %@", testSuitesName, error);
- STAssertNotNil(testSuites, @"failed to parse");
-
- return testSuites;
-}
-
-- (void)runTestSuites:(NSDictionary *)testSuites {
- // The file holds a set of named suites...
- for (NSString *suiteName in testSuites) {
- NSDictionary *suite = [testSuites objectForKey:suiteName];
- // Each suite has variables and test cases...
- NSDictionary *vars = [suite objectForKey:@"variables"];
- NSArray *testCases = [suite objectForKey:@"testcases"];
- STAssertTrue([vars count] != 0, @"'%@' no variables?", suiteName);
- STAssertTrue([testCases count] != 0, @"'%@' no testcases?", suiteName);
- NSUInteger idx = 0;
- for (NSArray *testCase in testCases) {
- // Each case is an array of the template and value...
- STAssertEquals([testCase count], (NSUInteger)2,
- @" test index %lu of '%@'", (unsigned long)idx, suiteName);
-
- NSString *testTemplate = [testCase objectAtIndex:0];
- NSString *expectedResult = [testCase objectAtIndex:1];
-
- NSString *result = [GTMURITemplate expandTemplate:testTemplate
- values:vars];
- STAssertEqualObjects(result, expectedResult,
- @"template was '%@' (index %lu of '%@')",
- testTemplate, (unsigned long)idx, suiteName);
- ++idx;
- }
- }
-}
-
-- (void)testRFCSuite {
- // All of the examples from the RFC are in the python impl source as json
- // test data. A copy is in the GTM tree as GTMURITemplateJSON.txt. The
- // original can be found at:
- // http://code.google.com/p/uri-templates/source/browse/trunk/testdata.json
- NSDictionary *testSuites = [self loadTestSuitesNamed:@"GTMURITemplateRFCTests.json"];
- STAssertNotNil(testSuites, nil);
- [self runTestSuites:testSuites];
-}
-
-- (void)testExtraSuite {
- // These are follow up cases not explictly listed in the spec, but does
- // as cases to confirm behaviors. The list was sent to the w3c uri list
- // for confirmation:
- // http://lists.w3.org/Archives/Public/uri/2010Sep/thread.html
- NSDictionary *testSuites = [self loadTestSuitesNamed:@"GTMURITemplateExtraTests.json"];
- STAssertNotNil(testSuites, nil);
- [self runTestSuites:testSuites];
-}
-
-@end
-
-#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
diff --git a/Foundation/GTMURLBuilder.h b/Foundation/GTMURLBuilder.h
index daa8d88..f333ec4 100644
--- a/Foundation/GTMURLBuilder.h
+++ b/Foundation/GTMURLBuilder.h
@@ -34,6 +34,10 @@
#import <Foundation/Foundation.h>
#import "GTMDefines.h"
+#if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10) \
+|| (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)
+__deprecated_msg("GTMURLBuilder is obsolete; update your app to use NSURLComponents queryItems property instead.")
+#endif
@interface GTMURLBuilder : NSObject {
@private
NSMutableDictionary *params_;
diff --git a/Foundation/GTMURLBuilder.m b/Foundation/GTMURLBuilder.m
index 31572e8..4f1a419 100644
--- a/Foundation/GTMURLBuilder.m
+++ b/Foundation/GTMURLBuilder.m
@@ -27,17 +27,6 @@
@synthesize baseURLString = baseURLString_;
-#if (!TARGET_OS_IPHONE && defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10) \
- || (TARGET_OS_IPHONE && defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)
-#if DEBUG
-+ (void)load {
- // Apps targeting iOS 8 and OS X 10.10 and higher should no longer use GTMURLBuilder.
- NSLog(@"*** GTMURLBuilder is obsolete; update your app to use NSURLComponents"
- @" queryItems property instead.");
-}
-#endif // DEBUG
-#endif // iOS 8+/OS X 10.10+
-
+ (GTMURLBuilder *)builderWithString:(NSString *)URLString {
GTMURLBuilder *URLBuilder =
[[[GTMURLBuilder alloc] initWithString:URLString] autorelease];
diff --git a/Foundation/GTMURLBuilderTest.m b/Foundation/GTMURLBuilderTest.m
index 4c0f128..0953a9e 100644
--- a/Foundation/GTMURLBuilderTest.m
+++ b/Foundation/GTMURLBuilderTest.m
@@ -29,34 +29,34 @@
GTMURLBuilder *URLBuilder = [[[GTMURLBuilder alloc]
initWithString:@"http://google.com:8080/pathA/pathB?param=val"]
autorelease];
- STAssertEqualStrings(@"http://google.com:8080/pathA/pathB?param=val",
- [URLBuilder URLString], nil);
- STAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"], nil);
+ XCTAssertEqualStrings(@"http://google.com:8080/pathA/pathB?param=val",
+ [URLBuilder URLString]);
+ XCTAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"]);
URLBuilder = [GTMURLBuilder builderWithString:
@"http://google.com:8080/pathA/pathB?param=val"];
- STAssertEqualStrings(@"http://google.com:8080/pathA/pathB?param=val",
- [URLBuilder URLString], nil);
- STAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"], nil);
+ XCTAssertEqualStrings(@"http://google.com:8080/pathA/pathB?param=val",
+ [URLBuilder URLString]);
+ XCTAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"]);
URLBuilder = [GTMURLBuilder builderWithString:
@"http://google.com:8080/path%3AA/pathB?param=val"];
- STAssertEqualStrings(@"http://google.com:8080/path%3AA/pathB?param=val",
- [URLBuilder URLString], nil);
- STAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"], nil);
+ XCTAssertEqualStrings(@"http://google.com:8080/path%3AA/pathB?param=val",
+ [URLBuilder URLString]);
+ XCTAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"]);
URLBuilder = [GTMURLBuilder builderWithString:
@"http://google.com:8080/pathA/pathB%2F?param=val"];
- STAssertEqualStrings(@"http://google.com:8080/pathA/pathB%2F?param=val",
- [URLBuilder URLString], nil);
- STAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"], nil);
+ XCTAssertEqualStrings(@"http://google.com:8080/pathA/pathB%2F?param=val",
+ [URLBuilder URLString]);
+ XCTAssertEqualStrings(@"val", [URLBuilder valueForParameter:@"param"]);
}
- (void)testMailToHandling {
GTMURLBuilder *URLBuilder =
[GTMURLBuilder builderWithString:@"mailto:ytmapp-ios@google.com"];
[URLBuilder setValue:@"blah" forParameter:@"subject"];
- STAssertEqualStrings(@"mailto:ytmapp-ios@google.com?subject=blah",
- [URLBuilder URLString], nil);
+ XCTAssertEqualStrings(@"mailto:ytmapp-ios@google.com?subject=blah",
+ [URLBuilder URLString]);
}
- (void)testIsEqualTo {
@@ -66,12 +66,12 @@
[GTMURLBuilder builderWithString:@"http://google.com/pathA/pathB"];
[URLBuilderB setValue:@"d" forParameter:@"c"];
[URLBuilderB setValue:@"b" forParameter:@"a"];
- STAssertTrue([URLBuilderA isEqual:URLBuilderB], nil);
+ XCTAssertTrue([URLBuilderA isEqual:URLBuilderB]);
[URLBuilderB setValue:@"c" forParameter:@"a"];
- STAssertFalse([URLBuilderA isEqual:URLBuilderB], nil);
+ XCTAssertFalse([URLBuilderA isEqual:URLBuilderB]);
[URLBuilderB setValue:@"b" forParameter:@"a"];
[URLBuilderB setValue:@"f" forParameter:@"e"];
- STAssertFalse([URLBuilderA isEqual:URLBuilderB], nil);
+ XCTAssertFalse([URLBuilderA isEqual:URLBuilderB]);
}
- (void)testSetParameters {
@@ -83,7 +83,7 @@
[NSDictionary dictionaryWithObjectsAndKeys:@"a", @"p1", @"b", @"p2", nil];
[URLBuilderA setParameters:params];
[URLBuilderA setValue:@"x" forParameter:@"p1"];
- STAssertTrue([URLBuilderA isEqual:URLBuilderB], nil);
+ XCTAssertTrue([URLBuilderA isEqual:URLBuilderB]);
}
- (void)testReplaceParameters {
@@ -95,17 +95,17 @@
[NSDictionary dictionaryWithObjectsAndKeys:@"a", @"p1", @"b", @"p2", nil];
[URLBuilderA setParameters:params];
[URLBuilderA setValue:@"x" forParameter:@"p1"];
- STAssertTrue([URLBuilderA isEqual:URLBuilderB], nil);
+ XCTAssertTrue([URLBuilderA isEqual:URLBuilderB]);
}
- (void)testURLPathParsing {
GTMURLBuilder *URLBuilder =
[GTMURLBuilder builderWithString:@"http://google.com/"];
- STAssertEqualStrings(@"http://google.com/", [URLBuilder URLString], nil);
+ XCTAssertEqualStrings(@"http://google.com/", [URLBuilder URLString]);
URLBuilder = [GTMURLBuilder builderWithString:@"http://google.com/pA/pB"];
- STAssertEqualStrings(@"http://google.com/pA/pB", [URLBuilder URLString], nil);
+ XCTAssertEqualStrings(@"http://google.com/pA/pB", [URLBuilder URLString]);
URLBuilder = [GTMURLBuilder builderWithString:@"http://google.com/p%3AA/pB"];
- STAssertEqualStrings(@"http://google.com/p%3AA/pB", [URLBuilder URLString], nil);
+ XCTAssertEqualStrings(@"http://google.com/p%3AA/pB", [URLBuilder URLString]);
}
@end
diff --git a/Foundation/GTMValidatingContainers.h b/Foundation/GTMValidatingContainers.h
deleted file mode 100644
index e53b541..0000000
--- a/Foundation/GTMValidatingContainers.h
+++ /dev/null
@@ -1,196 +0,0 @@
-//
-// GTMValidatingContainers.h
-//
-// Mutable containers that do verification of objects being added to them
-// at runtime. Support for arrays, dictionaries and sets.
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-// GTMValidatingContainers are a set of mutable container classes that allow
-// you to have a selector on a target that is called to verify that the objects
-// being put into the container are valid. This can be controlled at compile
-// time so that you don't take the performance hit in a release build using the
-// GTM_CONTAINERS_VALIDATE macro.
-// We have supplied validators for simple cases such as kindOfClass or
-// conformsToProtocol. See GTMKindOfClassValidator et al. for details.
-//
-// Example of usage:
-// id target = [GTMKindOfClassValidator validateAgainstClass:[NSString class]];
-// SEL selector = @selector(validateObject:forContainer:);
-// GTMValidatingArray *array = [GTMValidatingArray validatingArrayWithTarget:target
-// selector:selector];
-// [array addObject:@"foo"]; // Will be good
-// [array addObject:[NSNumber numberWithInt:2]]; // Will fail
-//
-// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and
-// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens
-// when a validation fails. If you implement your own validators, you may want
-// to control their internals using the same macros for consistency.
-//
-// Note that the validating collection types retain their targets.
-
-#import <Foundation/Foundation.h>
-#import "GTMDefines.h"
-
-// By default we only validate containers in debug. If you want to validate
-// in release as well, #define GTM_CONTAINERS_VALIDATE in a prefix or build
-// settings.
-#ifndef GTM_CONTAINERS_VALIDATE
-#if DEBUG
-#define GTM_CONTAINERS_VALIDATE 1
-#else // DEBUG
-#define GTM_CONTAINERS_VALIDATE 0
-#endif // DEBUG
-#endif // GTM_CONTAINERS_VALIDATE
-
-// If GTM_CONTAINERS_VALIDATE is on, and log and assert are both turned off
-// (see below), the object that failed validation will just not be added
-// to the container.
-
-// If you don't want log to occur on validation failure define
-// GTM_CONTAINERS_VALIDATION_FAILED_LOG to 0 in a prefix or build settings.
-#ifndef GTM_CONTAINERS_VALIDATION_FAILED_LOG
-#define GTM_CONTAINERS_VALIDATION_FAILED_LOG GTM_CONTAINERS_VALIDATE
-#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG
-
-// If you don't want an assert to occur on validation failure define
-// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT to 0 in a prefix or build settings.
-#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
-#define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT GTM_CONTAINERS_VALIDATE
-#endif // GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
-
-// Sometimes you get a container back from somebody else and want to validate
-// that it contains what you think it contains. _GTMValidateContainer
-// allows you to do exactly that. _GTMValidateContainer... give you specialty
-// functions for doing common types of validations. These all inline to nothing
-// if GTM_CONTAINERS_VALIDATE is not defined.
-#if GTM_CONTAINERS_VALIDATE
-void _GTMValidateContainer(id container, id target, SEL selector);
-void _GTMValidateContainerContainsKindOfClass(id container, Class cls);
-void _GTMValidateContainerContainsMemberOfClass(id container, Class cls);
-void _GTMValidateContainerConformsToProtocol(id container, Protocol *prot);
-void _GTMValidateContainerItemsRespondToSelector(id container, SEL sel);
-#else
-GTM_INLINE void _GTMValidateContainer(id container, id target, SEL selector) {
-}
-GTM_INLINE void _GTMValidateContainerContainsKindOfClass(id container,
- Class cls) {
-}
-GTM_INLINE void _GTMValidateContainerContainsMemberOfClass(id container,
- Class cls) {
-}
-GTM_INLINE void _GTMValidateContainerConformsToProtocol(id container,
- Protocol *prot) {
-}
-GTM_INLINE void _GTMValidateContainerItemsRespondToSelector(id container,
- SEL sel) {
-}
-#endif
-
-
-// See comments near top of file for class description.
-@interface GTMValidatingArray : NSMutableArray {
-#if GTM_CONTAINERS_VALIDATE
- NSMutableArray *embeddedContainer_;
- id target_;
- SEL selector_;
-#endif // #if GTM_CONTAINERS_VALIDATE
-}
-+ (id)validatingArrayWithTarget:(id)target selector:(SEL)sel;
-+ (id)validatingArrayWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel;
-- (id)initValidatingWithTarget:(id)target selector:(SEL)sel;
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel;
-@end
-
-// See comments near top of file for class description.
-@interface GTMValidatingDictionary : NSMutableDictionary {
-#if GTM_CONTAINERS_VALIDATE
- NSMutableDictionary *embeddedContainer_;
- id target_;
- SEL selector_;
-#endif // #if GTM_CONTAINERS_VALIDATE
-}
-+ (id)validatingDictionaryWithTarget:(id)target selector:(SEL)sel;
-+ (id)validatingDictionaryWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel;
-- (id)initValidatingWithTarget:(id)target selector:(SEL)sel;
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel;
-@end
-
-// See comments near top of file for class description.
-@interface GTMValidatingSet : NSMutableSet {
-#if GTM_CONTAINERS_VALIDATE
- NSMutableSet *embeddedContainer_;
- id target_;
- SEL selector_;
-#endif // #if GTM_CONTAINERS_VALIDATE
-}
-+ (id)validatingSetWithTarget:(id)target selector:(SEL)sel;
-+ (id)validatingSetWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel;
-- (id)initValidatingWithTarget:(id)target selector:(SEL)sel;
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel;
-@end
-
-#pragma mark -
-#pragma mark Simple Common Validators
-// See comments near top of file for examples of how these are used.
-@protocol GTMContainerValidatorProtocol
-- (BOOL)validateObject:(id)object forContainer:(id)container;
-@end
-
-// Validates that a given object is a kind of class (instance of class or an
-// instance of any class that inherits from that class)
-@interface GTMKindOfClassValidator : NSObject <GTMContainerValidatorProtocol> {
- Class cls_;
-}
-+ (id)validateAgainstClass:(Class)cls;
-- (id)initWithClass:(Class)cls;
-@end
-
-// Validates that a given object is a member of class (exact instance of class)
-@interface GTMMemberOfClassValidator : NSObject <GTMContainerValidatorProtocol> {
- Class cls_;
-}
-+ (id)validateAgainstClass:(Class)cls;
-- (id)initWithClass:(Class)cls;
-@end
-
-// Validates that a given object conforms to a protocol
-@interface GTMConformsToProtocolValidator : NSObject <GTMContainerValidatorProtocol> {
- Protocol* prot_;
-}
-+ (id)validateAgainstProtocol:(Protocol*)prot;
-- (id)initWithProtocol:(Protocol*)prot;
-@end
-
-// Validates that a given object responds to a given selector
-@interface GTMRespondsToSelectorValidator : NSObject <GTMContainerValidatorProtocol> {
- SEL sel_;
-}
-+ (id)validateAgainstSelector:(SEL)sel;
-- (id)initWithSelector:(SEL)sel;
-@end
diff --git a/Foundation/GTMValidatingContainers.m b/Foundation/GTMValidatingContainers.m
deleted file mode 100644
index a227ad4..0000000
--- a/Foundation/GTMValidatingContainers.m
+++ /dev/null
@@ -1,491 +0,0 @@
-//
-// GTMValidatingContainers.m
-//
-// Mutable containers that do verification of objects being added to them
-// at runtime. Support for arrays, dictionaries and sets.
-//
-// Documentation on subclassing class clusters (which we are doing) is here:
-// http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_9.html#//apple_ref/doc/uid/TP40002974-CH4-DontLinkElementID_105
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMValidatingContainers.h"
-
-#if GTM_CONTAINERS_VALIDATE
-
-#import "GTMDebugSelectorValidation.h"
-#if GTM_IPHONE_SDK
-#import <objc/message.h>
-#import <objc/runtime.h>
-#else // GTM_IPHONE_SDK
-#import <objc/objc-runtime.h>
-#endif // GTM_IPHONE_SDK
-
-GTM_INLINE BOOL VerifyObjectWithTargetAndSelectorForContainer(id anObject,
- id target,
- SEL selector,
- id container) {
- // We must take care here, since Intel leaves junk in high bytes of return
- // register for predicates that return BOOL.
- // For details see:
- // http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_tips/chapter_5_section_23.html
- // and
- // http://www.red-sweater.com/blog/320/abusing-objective-c-with-class#comment-83187
- BOOL isGood = ((BOOL (*)(id, SEL, id, id))objc_msgSend)(target, selector,
- anObject, container);
- if (!isGood) {
-#if GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- _GTMDevAssert(isGood, @"%@ failed container verification for %@",
- anObject, [container description]);
-#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG
-#if GTM_CONTAINERS_VALIDATION_FAILED_LOG
- _GTMDevLog(@"%@ failed container verification for %@", anObject,
- [container description]);
-#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG
- }
- return isGood;
-}
-
-GTM_INLINE void VerifySelectorOnTarget(SEL sel, id target) {
- GTMAssertSelectorNilOrImplementedWithReturnTypeAndArguments(target,
- sel,
- @encode(BOOL),
- @encode(id),
- @encode(id),
- nil);
-}
-
-void _GTMValidateContainerContainsKindOfClass(id container, Class cls) {
- GTMKindOfClassValidator *validator;
- validator = [GTMKindOfClassValidator validateAgainstClass:cls];
- _GTMValidateContainer(container,
- validator,
- @selector(validateObject:forContainer:));
-}
-
-void _GTMValidateContainerContainsMemberOfClass(id container, Class cls) {
- GTMMemberOfClassValidator *validator;
- validator = [GTMMemberOfClassValidator validateAgainstClass:cls];
- _GTMValidateContainer(container,
- validator,
- @selector(validateObject:forContainer:));
-}
-
-void _GTMValidateContainerConformsToProtocol(id container, Protocol* prot) {
- GTMConformsToProtocolValidator *validator;
- validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot];
- _GTMValidateContainer(container,
- validator,
- @selector(validateObject:forContainer:));
-}
-
-void _GTMValidateContainerItemsRespondToSelector(id container, SEL sel) {
- GTMRespondsToSelectorValidator *validator;
- validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel];
- _GTMValidateContainer(container,
- validator,
- @selector(validateObject:forContainer:));
-}
-
-void _GTMValidateContainer(id container, id target, SEL selector) {
- if ([container respondsToSelector:@selector(objectEnumerator)]) {
- NSEnumerator *enumerator = [container objectEnumerator];
- id val;
- while ((val = [enumerator nextObject])) {
- VerifyObjectWithTargetAndSelectorForContainer(val,
- target,
- selector,
- container);
- }
- } else {
-#if GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- _GTMDevAssert(0, @"container %@ does not respond to -objectEnumerator",
- [container description]);
-#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG
-#if GTM_CONTAINERS_VALIDATION_FAILED_LOG
- _GTMDevLog(@"container does not respont to -objectEnumerator: %@",
- [container description]);
-#endif // GTM_CONTAINERS_VALIDATION_FAILED_LOG
- }
-}
-#endif // GTM_CONTAINERS_VALIDATE
-
-@implementation GTMValidatingArray
-
-+ (id)validatingArrayWithTarget:(id)target selector:(SEL)sel {
- return [self validatingArrayWithCapacity:0 target:target selector:sel];
-}
-
-+ (id)validatingArrayWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- return [[[self alloc] initValidatingWithCapacity:0
- target:target
- selector:sel] autorelease];
-}
-
-- (id)initValidatingWithTarget:(id)target selector:(SEL)sel {
- return [self initValidatingWithCapacity:0 target:target selector:sel];
-}
-
-#if GTM_CONTAINERS_VALIDATE
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- if ((self = [super init])) {
- embeddedContainer_ = [[NSMutableArray alloc] initWithCapacity:capacity];
- target_ = [target retain];
- selector_ = sel;
- VerifySelectorOnTarget(selector_, target_);
- }
- return self;
-}
-
-- (void)dealloc {
- [embeddedContainer_ release];
- [target_ release];
- [super dealloc];
-}
-
-- (NSUInteger)count {
- return [embeddedContainer_ count];
-}
-
-- (id)objectAtIndex:(NSUInteger)idx {
- return [embeddedContainer_ objectAtIndex:idx];
-}
-
-- (void)addObject:(id)anObject {
- if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_,
- selector_, self)) {
- [embeddedContainer_ addObject:anObject];
- }
-}
-
-- (void)insertObject:(id)anObject atIndex:(NSUInteger)idx {
- if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_,
- selector_, self)) {
- [embeddedContainer_ insertObject:anObject atIndex:idx];
- }
-}
-
-- (void)removeLastObject {
- [embeddedContainer_ removeLastObject];
-}
-
-- (void)removeObjectAtIndex:(NSUInteger)idx {
- [embeddedContainer_ removeObjectAtIndex:idx];
-}
-
-- (void)replaceObjectAtIndex:(NSUInteger)idx withObject:(id)anObject {
- if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_,
- selector_, self)) {
- [embeddedContainer_ replaceObjectAtIndex:idx withObject:anObject];
- }
-}
-
-- (NSString*)description {
- return [NSString stringWithFormat:@"%@ - %@",
- NSStringFromClass([self class]),
- [embeddedContainer_ description]];
-}
-
-#else // GTM_CONTAINERS_VALIDATE
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- if ((self = [super init])) {
- [self release];
- }
- return (GTMValidatingArray*)[[NSMutableArray alloc] initWithCapacity:capacity];
-}
-#endif // GTM_CONTAINERS_VALIDATE
-@end
-
-@implementation GTMValidatingDictionary
-+ (id)validatingDictionaryWithTarget:(id)target selector:(SEL)sel {
- return [self validatingDictionaryWithCapacity:0 target:target selector:sel];
-}
-
-+ (id)validatingDictionaryWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- return [[[self alloc] initValidatingWithCapacity:0
- target:target
- selector:sel] autorelease];
-}
-
-- (id)initValidatingWithTarget:(id)target selector:(SEL)sel {
- return [self initValidatingWithCapacity:0 target:target selector:sel];
-}
-
-#if GTM_CONTAINERS_VALIDATE
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- if ((self = [super init])) {
- embeddedContainer_ = [[NSMutableDictionary alloc] initWithCapacity:capacity];
- target_ = [target retain];
- selector_ = sel;
- VerifySelectorOnTarget(selector_, target_);
- }
- return self;
-}
-
-- (void)dealloc {
- [target_ release];
- [embeddedContainer_ release];
- [super dealloc];
-}
-
-- (NSUInteger)count {
- return [embeddedContainer_ count];
-}
-
-- (NSEnumerator *)keyEnumerator {
- return [embeddedContainer_ keyEnumerator];
-}
-
-- (id)objectForKey:(id)aKey {
- return [embeddedContainer_ objectForKey:aKey];
-}
-
-- (void)removeObjectForKey:(id)aKey {
- [embeddedContainer_ removeObjectForKey:aKey];
-}
-
-- (void)setObject:(id)anObject forKey:(id)aKey {
- if (VerifyObjectWithTargetAndSelectorForContainer(anObject, target_,
- selector_, self)) {
- [embeddedContainer_ setObject:anObject forKey:aKey];
- }
-}
-
-- (NSString*)description {
- return [NSString stringWithFormat:@"%@ - %@",
- NSStringFromClass([self class]),
- [embeddedContainer_ description]];
-}
-
-#else // GTM_CONTAINERS_VALIDATE
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- if ((self = [super init])) {
- [self release];
- }
- return (GTMValidatingDictionary*)[[NSMutableDictionary alloc]
- initWithCapacity:capacity];
-
-}
-#endif // GTM_CONTAINERS_VALIDATE
-@end
-
-@implementation GTMValidatingSet
-+ (id)validatingSetWithTarget:(id)target selector:(SEL)sel {
- return [self validatingSetWithCapacity:0 target:target selector:sel];
-}
-
-+ (id)validatingSetWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- return [[[self alloc] initValidatingWithCapacity:0
- target:target
- selector:sel] autorelease];
-}
-- (id)initValidatingWithTarget:(id)target selector:(SEL)sel {
- return [self initValidatingWithCapacity:0 target:target selector:sel];
-}
-
-#if GTM_CONTAINERS_VALIDATE
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- if ((self = [super init])) {
- embeddedContainer_ = [[NSMutableSet alloc] initWithCapacity:capacity];
- target_ = [target retain];
- selector_ = sel;
- VerifySelectorOnTarget(selector_, target_);
- }
- return self;
-}
-
-- (void)dealloc {
- [target_ release];
- [embeddedContainer_ release];
- [super dealloc];
-}
-
-- (NSUInteger)count {
- return [embeddedContainer_ count];
-}
-
-- (id)member:(id)object {
- return [embeddedContainer_ member:object];
-}
-
-- (NSEnumerator *)objectEnumerator {
- return [embeddedContainer_ objectEnumerator];
-}
-
-- (void)addObject:(id)object {
- if (object && VerifyObjectWithTargetAndSelectorForContainer(object,
- target_,
- selector_,
- self)) {
- [embeddedContainer_ addObject:object];
- }
-}
-
-- (void)removeObject:(id)object {
- [embeddedContainer_ removeObject:object];
-}
-
-- (NSString*)description {
- return [NSString stringWithFormat:@"%@ - %@",
- NSStringFromClass([self class]),
- [embeddedContainer_ description]];
-}
-
-#else // GTM_CONTAINERS_VALIDATE
-- (id)initValidatingWithCapacity:(NSUInteger)capacity
- target:(id)target
- selector:(SEL)sel {
- if ((self = [super init])) {
- [self release];
- }
- return (GTMValidatingSet*)[[NSMutableSet alloc] initWithCapacity:capacity];
-}
-#endif // GTM_CONTAINERS_VALIDATE
-@end
-
-#pragma mark -
-#pragma mark Simple Common Validators
-@implementation GTMKindOfClassValidator
-+ (id)validateAgainstClass:(Class)cls {
- return [[[self alloc] initWithClass:cls] autorelease];
-}
-
-- (id)initWithClass:(Class)cls {
-#if GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- if (!cls) {
- _GTMDevLog(@"nil class");
- [self release];
- return nil;
- }
- cls_ = cls;
- }
- return self;
-#else // GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- [self release];
- }
- return nil;
-#endif // GTM_CONTAINERS_VALIDATE
-}
-
-- (BOOL)validateObject:(id)object forContainer:(id)container {
- return [object isKindOfClass:cls_];
-}
-@end
-
-@implementation GTMMemberOfClassValidator
-+ (id)validateAgainstClass:(Class)cls {
- return [[[self alloc] initWithClass:cls] autorelease];
-}
-
-- (id)initWithClass:(Class)cls {
-#if GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- if (!cls) {
- _GTMDevLog(@"nil class");
- [self release];
- return nil;
- }
- cls_ = cls;
- }
- return self;
-#else // GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- [self release];
- }
- return nil;
-#endif // GTM_CONTAINERS_VALIDATE
-}
-
-- (BOOL)validateObject:(id)object forContainer:(id)container {
- return [object isMemberOfClass:cls_];
-}
-@end
-
-@implementation GTMConformsToProtocolValidator
-+ (id)validateAgainstProtocol:(Protocol*)prot {
- return [[[self alloc] initWithProtocol:prot] autorelease];
-}
-
-- (id)initWithProtocol:(Protocol*)prot {
-#if GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- if (!prot) {
- _GTMDevLog(@"nil protocol");
- [self release];
- return nil;
- }
- prot_ = prot;
- }
- return self;
-#else // GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- [self release];
- }
- return nil;
-#endif // GTM_CONTAINERS_VALIDATE
-}
-
-- (BOOL)validateObject:(id)object forContainer:(id)container {
- return [object conformsToProtocol:prot_];
-}
-@end
-
-@implementation GTMRespondsToSelectorValidator
-+ (id)validateAgainstSelector:(SEL)sel {
- return [[[self alloc] initWithSelector:sel] autorelease];
-}
-
-- (id)initWithSelector:(SEL)sel {
-#if GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- if (!sel) {
- _GTMDevLog(@"nil selector");
- [self release];
- return nil;
- }
- sel_ = sel;
- }
- return self;
-#else // GTM_CONTAINERS_VALIDATE
- if ((self = [super init])) {
- [self release];
- }
- return nil;
-#endif // GTM_CONTAINERS_VALIDATE
-}
-
-- (BOOL)validateObject:(id)object forContainer:(id)container {
- return [object respondsToSelector:sel_];
-}
-@end
diff --git a/Foundation/GTMValidatingContainersTest.m b/Foundation/GTMValidatingContainersTest.m
deleted file mode 100644
index 806ecb0..0000000
--- a/Foundation/GTMValidatingContainersTest.m
+++ /dev/null
@@ -1,378 +0,0 @@
-//
-// GTMValidatingContainersTest.m
-//
-// Copyright 2008 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy
-// of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-//
-
-#import "GTMValidatingContainers.h"
-#import "GTMSenTestCase.h"
-#import "GTMUnitTestDevLog.h"
-
-#pragma mark Test Support Declarations
-@protocol GTMVCTestProtocol
-@end
-
-@interface GTMVCTestClass : NSObject
-+ (id)instance;
-@end
-
-@interface GTMVCTestSubClass : GTMVCTestClass <GTMVCTestProtocol>
-- (void)foo;
-@end
-
-@interface GTMVCValidatingTests : GTMTestCase {
- GTMVCTestClass *testClass_;
- GTMVCTestSubClass *testSubClass_;
-}
-@end
-
-@interface GTMVCValidatorTests : GTMVCValidatingTests
-@end
-
-@interface GTMVCContainerTests : GTMVCValidatingTests {
- GTMConformsToProtocolValidator *validator_;
- SEL selector_;
-}
-@end
-
-@interface GTMVCArrayTests : GTMVCContainerTests
-@end
-
-@interface GTMVCDictionaryTests : GTMVCContainerTests
-@end
-
-@interface GTMVCSetTests : GTMVCContainerTests
-@end
-
-@interface GTMValidateContainerTests : GTMTestCase
-@end
-
-#pragma mark -
-#pragma mark Test Support Definitions
-
-@implementation GTMVCTestClass
-+ (id)instance {
- return [[[self alloc] init] autorelease];
-}
-
-- (NSString*)description {
- return NSStringFromClass([self class]);
-}
-@end
-
-@implementation GTMVCTestSubClass
-- (void)foo {
-}
-@end
-
-@implementation GTMVCContainerTests
-- (void)setUp {
- [super setUp];
- Protocol *prot = @protocol(GTMVCTestProtocol);
- validator_ = [[GTMConformsToProtocolValidator alloc] initWithProtocol:prot];
- selector_ = @selector(validateObject:forContainer:);
-}
-
-- (void)tearDown {
- [validator_ release];
- [super tearDown];
-}
-@end
-
-@implementation GTMVCValidatingTests
-
-- (void)setUp {
- [super setUp];
- testClass_ = [[GTMVCTestClass alloc] init];
- testSubClass_ = [[GTMVCTestSubClass alloc] init];
-}
-
-- (void)tearDown {
- [testClass_ release];
- [testSubClass_ release];
- [super tearDown];
-}
-
-@end
-
-@implementation GTMVCValidatorTests
-
-- (void)testKindOfClassValidator {
-#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- [GTMUnitTestDevLog expectString:@"nil class"];
- GTMKindOfClassValidator *validator;
- validator = [GTMKindOfClassValidator validateAgainstClass:nil];
- STAssertNil(validator, @"should be nil");
-
- Class cls = [GTMVCTestClass class];
- validator = [GTMKindOfClassValidator validateAgainstClass:cls];
- STAssertNotNil(validator, @"should be valid");
-
- BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
- STAssertTrue(isGood, @"should be validated");
-
- isGood = [validator validateObject:testSubClass_ forContainer:nil];
- STAssertTrue(isGood, @"should be validated");
-
- isGood = [validator validateObject:[NSNumber numberWithInt:0]
- forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- GTMKindOfClassValidator *validator;
- validator = [GTMKindOfClassValidator validateAgainstClass:nil];
- STAssertNil(validator, @"should be nil");
-
- Class cls = [GTMVCTestClass class];
- validator = [GTMKindOfClassValidator validateAgainstClass:cls];
- STAssertNil(validator, @"should be nil");
-#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
-}
-
-- (void)testMemberOfClassValidator {
-#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- [GTMUnitTestDevLog expectString:@"nil class"];
- GTMMemberOfClassValidator *validator;
- validator = [GTMMemberOfClassValidator validateAgainstClass:nil];
- STAssertNil(validator, @"should be nil");
-
- Class cls = [GTMVCTestClass class];
- validator = [GTMMemberOfClassValidator validateAgainstClass:cls];
- STAssertNotNil(validator, @"should be valid");
-
- BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
- STAssertTrue(isGood, @"should be validated");
-
- isGood = [validator validateObject:testSubClass_ forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-
- isGood = [validator validateObject:nil forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-
- isGood = [validator validateObject:[NSNumber numberWithInt:0]
- forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- GTMMemberOfClassValidator *validator;
- validator = [GTMMemberOfClassValidator validateAgainstClass:nil];
- STAssertNil(validator, @"should be nil");
-
- Class cls = [GTMVCTestClass class];
- validator = [GTMMemberOfClassValidator validateAgainstClass:cls];
- STAssertNil(validator, @"should be nil");
-#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
-}
-
-- (void)testConformsToProtocolValidator {
-#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- [GTMUnitTestDevLog expectString:@"nil protocol"];
- GTMConformsToProtocolValidator *validator;
- validator = [GTMConformsToProtocolValidator validateAgainstProtocol:nil];
- STAssertNil(validator, @"should be nil");
-
- Protocol *prot = @protocol(GTMVCTestProtocol);
- validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot];
- STAssertNotNil(validator, @"should be valid");
-
- BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-
- isGood = [validator validateObject:testSubClass_ forContainer:nil];
- STAssertTrue(isGood, @"should succeed");
-
- isGood = [validator validateObject:nil forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- GTMConformsToProtocolValidator *validator;
- validator = [GTMConformsToProtocolValidator validateAgainstProtocol:nil];
- STAssertNil(validator, @"should be nil");
-
- Protocol *prot = @protocol(GTMVCTestProtocol);
- validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot];
- STAssertNil(validator, @"should be nil");
-#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
-}
-
-- (void)testRespondsToSelectorValidator {
-#if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- [GTMUnitTestDevLog expectString:@"nil selector"];
- GTMRespondsToSelectorValidator *validator;
- validator = [GTMRespondsToSelectorValidator validateAgainstSelector:nil];
- STAssertNil(validator, @"should be nil");
-
- SEL sel = @selector(foo);
- validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel];
- STAssertNotNil(validator, @"should be valid");
-
- BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-
- isGood = [validator validateObject:testSubClass_ forContainer:nil];
- STAssertTrue(isGood, @"should succeed");
-
- isGood = [validator validateObject:nil forContainer:nil];
- STAssertFalse(isGood, @"should fail");
-#else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
- GTMRespondsToSelectorValidator *validator;
- validator = [GTMRespondsToSelectorValidator validateAgainstSelector:nil];
- STAssertNil(validator, @"should be nil");
-
- SEL sel = @selector(foo);
- validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel];
- STAssertNil(validator, @"should be nil");
-#endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
-}
-
-
-@end
-
-@implementation GTMVCArrayTests
-- (void)testContainer {
- GTMValidatingArray *array;
- array = [GTMValidatingArray validatingArrayWithTarget:validator_
- selector:selector_];
- STAssertNotNil(array, @"should be valid");
-
- array = [[[GTMValidatingArray alloc] initValidatingWithTarget:validator_
- selector:selector_] autorelease];
- STAssertNotNil(array, @"should be valid");
-
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"];
- [array addObject:testSubClass_];
- [array addObject:testClass_];
- STAssertEquals([array objectAtIndex:0], testSubClass_, @"");
-
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"];
- [array insertObject:testClass_ atIndex:0];
- [array insertObject:testSubClass_ atIndex:0];
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"];
- [array replaceObjectAtIndex:0 withObject:testClass_];
- [array replaceObjectAtIndex:0 withObject:testSubClass_];
- [array removeLastObject];
- [array removeObjectAtIndex:0];
- NSUInteger expectedCount = 0U;
-#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
- // If we're not validating, we don't expect any logs
- [GTMUnitTestDevLog resetExpectedLogs];
- expectedCount = 2U;
-#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
- STAssertEquals([array count], expectedCount, @"should have no objects left");
-
-}
-@end
-
-@implementation GTMVCDictionaryTests
-- (void)testContainer {
- GTMValidatingDictionary *dictionary;
- dictionary = [GTMValidatingDictionary validatingDictionaryWithTarget:validator_
- selector:selector_];
- STAssertNotNil(dictionary, @"should be valid");
-
- dictionary = [[[GTMValidatingDictionary alloc] initValidatingWithTarget:validator_
- selector:selector_] autorelease];
- STAssertNotNil(dictionary, @"should be valid");
-
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingDictionary .*"];
- [dictionary setObject:testClass_ forKey:@"Key1"];
- [dictionary setObject:testSubClass_ forKey:@"Key2"];
- STAssertEquals([dictionary objectForKey:@"Key2"], testSubClass_, @"");
- STAssertNotNil([dictionary keyEnumerator], @"");
-
- [dictionary removeObjectForKey:@"Key2"];
- [dictionary removeObjectForKey:@"Key1"];
- STAssertEquals([dictionary count], (NSUInteger)0, @"should have no objects left");
-
- // So we get full code coverage
- [testSubClass_ foo];
-#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
- // If we're not validating, we don't expect any logs
- [GTMUnitTestDevLog resetExpectedLogs];
-#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
-}
-@end
-
-@implementation GTMVCSetTests
-- (void)testContainer {
- GTMValidatingSet *set;
- set = [GTMValidatingSet validatingSetWithTarget:validator_
- selector:selector_];
- STAssertNotNil(set, @"should be valid");
-
- set = [[[GTMValidatingSet alloc] initValidatingWithTarget:validator_
- selector:selector_] autorelease];
- STAssertNotNil(set, @"should be valid");
-
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingSet .*"];
- [set addObject:testClass_];
- [set addObject:testSubClass_];
- STAssertEqualObjects([set member:testSubClass_], testSubClass_, @"");
- STAssertNotNil([set objectEnumerator], @"");
-
- [set removeObject:testClass_];
- [set removeObject:testSubClass_];
-#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
- // If we're not validating, we don't expect any logs
- [GTMUnitTestDevLog resetExpectedLogs];
-#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
- STAssertEquals([set count], (NSUInteger)0, @"should have no objects left");
-}
-@end
-
-@implementation GTMValidateContainerTests
-- (void)testValidatingContainers {
- NSDictionary *homogenousDict = [NSDictionary dictionaryWithObjectsAndKeys:
- [GTMVCTestSubClass instance], @"key1",
- [GTMVCTestSubClass instance], @"key2",
- nil];
- NSDictionary *heterogenousDict = [NSDictionary dictionaryWithObjectsAndKeys:
- [GTMVCTestClass instance], @"key1",
- [GTMVCTestSubClass instance], @"key2",
- nil];
-
- // Test bad container
- [GTMUnitTestDevLog expectPattern:@"container does not respont to -objectEnumerator: .*"];
- _GTMValidateContainerContainsKindOfClass([NSString string],
- [GTMVCTestSubClass class]);
-
- _GTMValidateContainerContainsKindOfClass(homogenousDict,
- [GTMVCTestSubClass class]);
- _GTMValidateContainerContainsKindOfClass(heterogenousDict,
- [GTMVCTestClass class]);
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"];
- _GTMValidateContainerContainsKindOfClass(heterogenousDict,
- [GTMVCTestSubClass class]);
-
- _GTMValidateContainerContainsMemberOfClass(homogenousDict,
- [GTMVCTestSubClass class]);
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestSubClass failed container verification for .*"];
- _GTMValidateContainerContainsMemberOfClass(heterogenousDict,
- [GTMVCTestClass class]);
-
- _GTMValidateContainerConformsToProtocol(homogenousDict,
- @protocol(GTMVCTestProtocol));
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"];
- _GTMValidateContainerConformsToProtocol(heterogenousDict,
- @protocol(GTMVCTestProtocol));
-
- _GTMValidateContainerItemsRespondToSelector(homogenousDict,
- @selector(foo));
- [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"];
- _GTMValidateContainerItemsRespondToSelector(heterogenousDict,
- @selector(foo));
-#if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
- // If we're not validating, we don't expect any logs
- [GTMUnitTestDevLog resetExpectedLogs];
-#endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
-}
-@end
diff --git a/Foundation/TestData/GTMURITemplateExtraTests.json b/Foundation/TestData/GTMURITemplateExtraTests.json
deleted file mode 100644
index e84ab90..0000000
--- a/Foundation/TestData/GTMURITemplateExtraTests.json
+++ /dev/null
@@ -1,222 +0,0 @@
-{
- "No varspec (section 3.3, paragraph 3)" :
- {
- "variables": {
- "var" : "value"
- },
- "testcases" : [
- ["{}", "{}"],
- ["{,}", "{,}"],
- ["{,,}", "{,,}"]
- ]
- },
- "Missing closing brace (section 3.3 paragraph 4)" :
- {
- "variables": {
- "var" : "value",
- "hello" : "Hello World!",
- "list" : [ "val1", "val2", "val3" ],
- "keys" : {"key1": "val1", "key2": "val2"},
- "x" : "1024",
- "y" : "768"
- },
- "testcases" : [
- ["{var", "value"],
- ["{hello", "Hello%20World%21"],
- ["{x,y", "1024,768"],
- ["{var=default", "value"],
- ["{undef=default", "default"],
- ["{list", "val1,val2,val3"],
- ["{list*", "val1,val2,val3"],
- ["{list+", "list.val1,list.val2,list.val3"],
- ["{keys", "key1,val1,key2,val2"],
- ["{keys*", "key1,val1,key2,val2"],
- ["{keys+", "keys.key1,val1,keys.key2,val2"]
- ]
- },
- "varspec of only operator and explodes (section 3.3?)" :
- {
- "variables": {
- "var" : "value"
- },
- "testcases" : [
- ["{+}", "{+}"],
- ["{;}", "{;}"],
- ["{?}", "{?}"],
- ["{/}", "{/}"],
- ["{.}", "{.}"],
- ["{+,}", "{+,}"],
- ["{;,}", "{;,}"],
- ["{?,}", "{?,}"],
- ["{/,}", "{/,}"],
- ["{.,}", "{.,}"],
- ["{++}", "{++}"],
- ["{;+}", "{;+}"],
- ["{?+}", "{?+}"],
- ["{/+}", "{/+}"],
- ["{.+}", "{.+}"],
- ["{+*}", "{+*}"],
- ["{;*}", "{;*}"],
- ["{?*}", "{?*}"],
- ["{/*}", "{/*}"],
- ["{.*}", "{.*}"]
- ]
- },
- "One good varspec and bad varspecs (section 3.3, paragraph 3?)" :
- {
- "variables": {
- "var" : "value"
- },
- "testcases" : [
- ["{var,}", "value"],
- ["{,var}", "value"],
- ["{,var,,}", "value"],
- ["{+var,,}", "value"],
- ["{;var,,}", ";var=value"],
- ["{?var,,}", "?var=value"],
- ["{/var,,}", "/value"],
- ["{.var,,}", ".value"],
- ["{+,var,}", "value"],
- ["{;,var,}", ";var=value"],
- ["{?,var,}", "?var=value"],
- ["{/,var,}", "/value"],
- ["{.,var,}", ".value"],
- ["{+,,var}", "value"],
- ["{;,,var}", ";var=value"],
- ["{?,,var}", "?var=value"],
- ["{/,,var}", "/value"],
- ["{.,,var}", ".value"]
- ]
- },
- "Multiple undefined variables (section 3.4)" :
- {
- "variables": {
- "var" : "value"
- },
- "testcases" : [
- ["{undef1,undef2}", ""],
- ["{+undef1,undef2}", ""],
- ["{;undef1,undef2}", ""],
- ["{?undef1,undef2}", ""],
- ["{/undef1,undef2}", ""],
- ["{.undef1,undef2}", ""]
- ]
- },
- "Default with variable in varspec (just reported like above cases)" :
- {
- "variables": {
- "var" : "value"
- },
- "testcases" : [
- ["{=foo}", "{=foo}"]
- ]
- },
- "varspec with bad partial (partial gets ignored)" :
- {
- "variables": {
- "var" : "value"
- },
- "testcases" : [
- ["{var:}", "value"],
- ["{var^}", "value"]
- ]
- },
- "Default of empty string and edge cases with empty strings" :
- {
- "variables": {
- "empty" : "",
- "x" : "1024",
- "y" : "768"
- },
- "testcases" : [
- ["{empty}", ""],
- ["{;x,empty,y}", ";x=1024;empty;y=768"],
- ["{?x,empty,y}", "?x=1024&empty&y=768"],
- ["{x,empty,y}", "1024,,768"],
- ["{+x,empty,y}", "1024,,768"],
- ["{/x,empty,y}", "/1024//768"],
- ["{.x,empty,y}", ".1024..768"],
- ["{undef=}", ""],
- ["{;x,undef=,y}", ";x=1024;undef;y=768"],
- ["{?x,undef=,y}", "?x=1024&undef&y=768"],
- ["{x,undef=,y}", "1024,,768"],
- ["{+x,undef=,y}", "1024,,768"],
- ["{/x,undef=,y}", "/1024//768"],
- ["{.x,undef=,y}", ".1024..768"]
- ]
- },
- "Two defaults for one variable" :
- {
- "variables": {
- "y" : "768"
- },
- "testcases" : [
- ["1{undef=a}2{undef=b}3", "1a2b3"],
- ["0{undef}1{undef=a}2{undef}3{undef=b}4{undef}5", "01a2a3b4b5"]
- ]
- },
- "Empty strings within arrays and associative arrays" :
- {
- "variables": {
- "list" : [ "val1", "", "val3" ],
- "keysA" : {"key1": "", "key2": "val2"},
- "keysB" : {"key1": "val1", "": "val2"}
- },
- "testcases" : [
- ["{list}", "val1,,val3"],
- ["{list*}", "val1,,val3"],
- ["{list+}", "list.val1,list.,list.val3"],
- ["{keysA}", "key1,,key2,val2"],
- ["{keysA*}", "key1,,key2,val2"],
- ["{keysA+}", "keysA.key1,,keysA.key2,val2"],
- ["{keysB}", ",val2,key1,val1"],
- ["{keysB*}", ",val2,key1,val1"],
- ["{keysB+}", "keysB.,val2,keysB.key1,val1"],
- ["{+list}", "val1,,val3"],
- ["{+list*}", "val1,,val3"],
- ["{+list+}", "list.val1,list.,list.val3"],
- ["{+keysA}", "key1,,key2,val2"],
- ["{+keysA*}", "key1,,key2,val2"],
- ["{+keysA+}", "keysA.key1,,keysA.key2,val2"],
- ["{+keysB}", ",val2,key1,val1"],
- ["{+keysB*}", ",val2,key1,val1"],
- ["{+keysB+}", "keysB.,val2,keysB.key1,val1"],
- ["{;list}", ";val1,,val3"],
- ["{;list*}", ";val1;;val3"],
- ["{;list+}", ";list=val1;list=;list=val3"],
- ["{;keysA}", ";key1,key2,val2"],
- ["{;keysA*}", ";key1;key2=val2"],
- ["{;keysA+}", ";keysA.key1;keysA.key2=val2"],
- ["{;keysB}", ";,val2,key1,val1"],
- ["{;keysB*}", ";=val2;key1=val1"],
- ["{;keysB+}", ";keysB.=val2;keysB.key1=val1"],
- ["{?list}", "?list=val1,,val3"],
- ["{?list*}", "?val1&&val3"],
- ["{?list+}", "?list=val1&list=&list=val3"],
- ["{?keysA}", "?keysA=key1,key2,val2"],
- ["{?keysA*}", "?key1&key2=val2"],
- ["{?keysA+}", "?keysA.key1&keysA.key2=val2"],
- ["{?keysB}", "?keysB=,val2,key1,val1"],
- ["{?keysB*}", "?=val2&key1=val1"],
- ["{?keysB+}", "?keysB.=val2&keysB.key1=val1"],
- ["{/list}", "/val1,,val3"],
- ["{/list*}", "/val1//val3"],
- ["{/list+}", "/list.val1/list./list.val3"],
- ["{/keysA}", "/key1,,key2,val2"],
- ["{/keysA*}", "/key1//key2/val2"],
- ["{/keysA+}", "/keysA.key1//keysA.key2/val2"],
- ["{/keysB}", "/,val2,key1,val1"],
- ["{/keysB*}", "//val2/key1/val1"],
- ["{/keysB+}", "/keysB./val2/keysB.key1/val1"],
- ["X{.list}", "X.val1,,val3"],
- ["X{.list*}", "X.val1..val3"],
- ["X{.list+}", "X.list.val1.list..list.val3"],
- ["X{.keysA}", "X.key1,,key2,val2"],
- ["X{.keysA*}", "X.key1..key2.val2"],
- ["X{.keysA+}", "X.keysA.key1..keysA.key2.val2"],
- ["X{.keysB}", "X.,val2,key1,val1"],
- ["X{.keysB*}", "X..val2.key1.val1"],
- ["X{.keysB+}", "X.keysB..val2.keysB.key1.val1"]
- ]
- }
-}
diff --git a/Foundation/TestData/GTMURITemplateRFCTests.json b/Foundation/TestData/GTMURITemplateRFCTests.json
deleted file mode 100644
index 03fa22d..0000000
--- a/Foundation/TestData/GTMURITemplateRFCTests.json
+++ /dev/null
@@ -1,131 +0,0 @@
-{
- "Test Suite 1" :
- {
- "variables": {
- "var" : "value",
- "hello" : "Hello World!",
- "empty" : "",
- "list" : [ "val1", "val2", "val3" ],
- "keys" : {"key1": "val1", "key2": "val2"},
- "path" : "/foo/bar",
- "x" : "1024",
- "y" : "768"
- },
- "testcases" : [
- ["{var}", "value"],
- ["{hello}", "Hello%20World%21"],
- ["{path}/here", "%2Ffoo%2Fbar/here"],
- ["{x,y}", "1024,768"],
- ["{var=default}", "value"],
- ["{undef=default}", "default"],
- ["{list}", "val1,val2,val3"],
- ["{list*}", "val1,val2,val3"],
- ["{list+}", "list.val1,list.val2,list.val3"],
- ["{keys}", "key1,val1,key2,val2"],
- ["{keys*}", "key1,val1,key2,val2"],
- ["{keys+}", "keys.key1,val1,keys.key2,val2"],
- ["{+var}", "value"],
- ["{+hello}", "Hello%20World!"],
- ["{+path}/here", "/foo/bar/here"],
- ["{+path,x}/here", "/foo/bar,1024/here"],
- ["{+path}{x}/here", "/foo/bar1024/here"],
- ["{+empty}/here", "/here"],
- ["{+undef}/here", "/here"],
- ["{+list}", "val1,val2,val3"],
- ["{+list*}", "val1,val2,val3"],
- ["{+list+}", "list.val1,list.val2,list.val3"],
- ["{+keys}", "key1,val1,key2,val2"],
- ["{+keys*}", "key1,val1,key2,val2"],
- ["{+keys+}", "keys.key1,val1,keys.key2,val2"],
- ["{;x,y}", ";x=1024;y=768"],
- ["{;x,y,empty}", ";x=1024;y=768;empty"],
- ["{;x,y,undef}", ";x=1024;y=768"],
- ["{;list}", ";val1,val2,val3"],
- ["{;list*}", ";val1;val2;val3"],
- ["{;list+}", ";list=val1;list=val2;list=val3"],
- ["{;keys}", ";key1,val1,key2,val2"],
- ["{;keys*}", ";key1=val1;key2=val2"],
- ["{;keys+}", ";keys.key1=val1;keys.key2=val2"],
- ["{?x,y}", "?x=1024&y=768"],
- ["{?x,y,empty}", "?x=1024&y=768&empty"],
- ["{?x,y,undef}", "?x=1024&y=768"],
- ["{?list}", "?list=val1,val2,val3"],
- ["{?list*}", "?val1&val2&val3"],
- ["{?list+}", "?list=val1&list=val2&list=val3"],
- ["{?keys}", "?keys=key1,val1,key2,val2"],
- ["{?keys*}", "?key1=val1&key2=val2"],
- ["{?keys+}", "?keys.key1=val1&keys.key2=val2"],
- ["{/var}", "/value"],
- ["{/var,empty}", "/value/"],
- ["{/var,undef}", "/value"],
- ["{/list}", "/val1,val2,val3"],
- ["{/list*}", "/val1/val2/val3"],
- ["{/list*,x}", "/val1/val2/val3/1024"],
- ["{/list+}", "/list.val1/list.val2/list.val3"],
- ["{/keys}", "/key1,val1,key2,val2"],
- ["{/keys*}", "/key1/val1/key2/val2"],
- ["{/keys+}", "/keys.key1/val1/keys.key2/val2"],
- ["X{.var}", "X.value"],
- ["X{.empty}", "X"],
- ["X{.undef}", "X"],
- ["X{.list}", "X.val1,val2,val3"],
- ["X{.list*}", "X.val1.val2.val3"],
- ["X{.list*,x}", "X.val1.val2.val3.1024"],
- ["X{.list+}", "X.list.val1.list.val2.list.val3"],
- ["X{.keys}", "X.key1,val1,key2,val2"],
- ["X{.keys*}", "X.key1.val1.key2.val2"],
- ["X{.keys+}", "X.keys.key1.val1.keys.key2.val2"]
- ]
- },
- "Test Suite 2" :
- {
- "variables": {
- "var" : "value",
- "empty" : "",
- "name" : [ "Fred", "Wilma", "Pebbles" ],
- "favs" : {"color":"red", "volume": "high"},
- "empty_list" : [],
- "empty_keys" : {}
- },
- "testcases" : [
- ["{var=default}", "value"],
- ["{undef=default}", "default"],
- ["x{empty}y", "xy"],
- ["x{empty=_}y", "xy"],
- ["x{undef}y", "xy"],
- ["x{undef=_}y", "x_y"],
- ["x{empty_list}y", "xy"],
- ["x{empty_list=_}y", "x_y"],
- ["x{empty_list*}y", "xy"],
- ["x{empty_list*=_}y", "x_y"],
- ["x{empty_list+}y", "xy"],
- ["x{empty_list+=_}y", "x_y"],
- ["x{empty_keys}y", "xy"],
- ["x{empty_keys=_}y", "x_y"],
- ["x{empty_keys*}y", "xy"],
- ["x{empty_keys*=_}y", "x_y"],
- ["x{empty_keys+}y", "xy"],
- ["x{empty_keys+=_}y", "x_y"],
- ["x{?name=none}", "x?name=Fred,Wilma,Pebbles"],
- ["x{?favs=none}", "x?favs=color,red,volume,high"],
- ["x{?favs*=none}", "x?color=red&volume=high"],
- ["x{?favs+=none}", "x?favs.color=red&favs.volume=high"],
- ["x{?undef}", "x"],
- ["x{?undef=none}", "x?undef=none"],
- ["x{?empty}", "x?empty"],
- ["x{?empty=none}", "x?empty"],
- ["x{?empty_list}", "x"],
- ["x{?empty_list=none}", "x?empty_list=none"],
- ["x{?empty_list*}", "x"],
- ["x{?empty_list*=none}", "x?empty_list=none"],
- ["x{?empty_list+}", "x"],
- ["x{?empty_list+=none}", "x?empty_list=none"],
- ["x{?empty_keys}", "x"],
- ["x{?empty_keys=none}", "x?empty_keys=none"],
- ["x{?empty_keys*}", "x"],
- ["x{?empty_keys*=none}", "x?empty_keys=none"],
- ["x{?empty_keys+}", "x"],
- ["x{?empty_keys+=none}", "x?empty_keys=none"]
- ]
- }
-}