diff options
Diffstat (limited to 'UnitTesting')
48 files changed, 1556 insertions, 13665 deletions
diff --git a/UnitTesting/GTMAppKit+UnitTesting.h b/UnitTesting/GTMAppKit+UnitTesting.h deleted file mode 100644 index 7f6bd26..0000000 --- a/UnitTesting/GTMAppKit+UnitTesting.h +++ /dev/null @@ -1,171 +0,0 @@ -// -// GTMAppKit+UnitTesting.m -// -// Categories for making unit testing of graphics/UI easier. -// -// 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 <AppKit/AppKit.h> -#import "GTMNSObject+UnitTesting.h" - -// Categories for making unit testing of graphics/UI easier. -// Allows you to take a state/images of instances of AppKit classes. -// See GTMNSObject+UnitTesting.h for details. - -@interface NSApplication (GTMUnitTestingAdditions) -@end - -@interface NSWindow (GTMUnitTestingAdditions) <GTMUnitTestingImaging> -@end - -@interface NSControl (GTMUnitTestingAdditions) -@end - -@interface NSButton (GTMUnitTestingAdditions) -@end - -@interface NSTextField (GTMUnitTestingAdditions) -@end - -@interface NSCell (GTMUnitTestingAdditions) -@end - -@interface NSImage (GTMUnitTestingAdditions) <GTMUnitTestingImaging> -@end - -@interface NSMenu (GTMUnitTestingAdditions) -@end - -@interface NSMenuItem (GTMUnitTestingAdditions) -@end - -@interface NSTabView (GTMUnitTestingAdditions) -@end - -@interface NSTabViewItem (GTMUnitTestingAdditions) -@end - -@interface NSToolbar (GTMUnitTestingAdditions) -@end - -@interface NSToolbarItem (GTMUnitTestingAdditions) -@end - -@interface NSMatrix (GTMUnitTestingAdditions) -@end - -@interface NSBox (GTMUnitTestingAdditions) -@end - -@interface NSSegmentedControl (GTMUnitTestingAdditions) -@end - -@interface NSComboBox (GTMUnitTestingAdditions) -@end - -@protocol GTMUnitTestViewDrawer; - -// Fails when the |a1|'s drawing in an area |a2| does not equal the image file named |a3|. -// See the description of the -gtm_pathForImageNamed method -// to understand how |a3| is found and written out. -// See the description of the GTMUnitTestView for a better idea -// how the view works. -// Implemented as a macro to match the rest of the SenTest macros. -// -// Args: -// a1: The object that implements the GTMUnitTestViewDrawer protocol -// that is doing the drawing. -// a2: The size of the drawing -// a3: The name of the image file to check against. -// Do not include the extension -// a4: contextInfo to pass to drawer -// description: A format string as in the printf() function. -// Can be nil or an empty string but must be present. -// ...: A variable number of arguments to the format string. Can be absent. -// - -#define GTMAssertDrawingEqualToImageNamed(a1, a2, a3, a4, description, ...) \ - do { \ - id<GTMUnitTestViewDrawer> a1Drawer = (a1); \ - NSSize a2Size = (a2); \ - NSString* a3String = (a3); \ - void *a4ContextInfo = (a4); \ - NSRect frame = NSMakeRect(0, 0, a2Size.width, a2Size.height); \ - GTMUnitTestView *view = [[[GTMUnitTestView alloc] initWithFrame:frame drawer:a1Drawer contextInfo:a4ContextInfo] autorelease]; \ - GTMAssertObjectImageEqualToImageNamed(view, a3String, STComposeString(description, ##__VA_ARGS__)); \ - } while(0) - -// Category for making unit testing of graphics/UI easier. - -// Allows you to take a state of a view. Supports both image and state. -// See NSObject+UnitTesting.h for details. -@interface NSView (GTMUnitTestingAdditions) <GTMUnitTestingImaging> -// Returns whether unitTestEncodeState should recurse into subviews -// -// If you have "Full keyboard access" in the -// Keyboard & Mouse > Keyboard Shortcuts preferences pane set to "Text boxes -// and Lists only" that Apple adds a set of subviews to NSTextFields. So in the -// case of NSTextFields we don't want to recurse into their subviews. There may -// be other cases like this, so instead of specializing unitTestEncodeState: to -// look for NSTextFields, NSTextFields will just not allow us to recurse into -// their subviews. -// -// Returns: -// should unitTestEncodeState pick up subview state. -- (BOOL)gtm_shouldEncodeStateForSubviews; - -@end - -// A view that allows you to delegate out drawing using the formal -// GTMUnitTestViewDelegate protocol -// This is useful when writing up unit tests for visual elements. -// Your test will often end up looking like this: -// - (void)testFoo { -// GTMAssertDrawingEqualToFile(self, NSMakeSize(200, 200), @"Foo", nil, nil); -// } -// and your testSuite will also implement the unitTestViewDrawRect method to do -// it's actual drawing. The above creates a view of size 200x200 that draws -// it's content using |self|'s unitTestViewDrawRect method and compares it to -// the contents of the file Foo.tif to make sure it's valid -@interface GTMUnitTestView : NSView { - @private - id<GTMUnitTestViewDrawer> drawer_; // delegate for doing drawing (STRONG) - void* contextInfo_; // info passed in by user for them to use when drawing -} - -// Create a GTMUnitTestView. -// -// Args: -// rect: the area to draw. -// drawer: the object that will do the drawing via the GTMUnitTestViewDrawer -// protocol -// contextInfo: -- (id)initWithFrame:(NSRect)frame drawer:(id<GTMUnitTestViewDrawer>)drawer contextInfo:(void*)contextInfo; -@end - -/// \cond Protocols - -// Formal protocol for doing unit testing of views. See description of -// GTMUnitTestView for details. -@protocol GTMUnitTestViewDrawer <NSObject> - -// Draw the view. Equivalent to drawRect on a standard NSView. -// -// Args: -// rect: the area to draw. -- (void)gtm_unitTestViewDrawRect:(NSRect)rect contextInfo:(void*)contextInfo; -@end - diff --git a/UnitTesting/GTMAppKit+UnitTesting.m b/UnitTesting/GTMAppKit+UnitTesting.m deleted file mode 100644 index 5b4d6f7..0000000 --- a/UnitTesting/GTMAppKit+UnitTesting.m +++ /dev/null @@ -1,583 +0,0 @@ -// -// GTMAppKit+UnitTesting.m -// -// Categories for making unit testing of graphics/UI easier. -// -// 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 "GTMDefines.h" -#import "GTMAppKit+UnitTesting.h" -#import "GTMGeometryUtils.h" -#import "GTMMethodCheck.h" - -#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 - #define ENCODE_NSINTEGER(coder, i, key) [(coder) encodeInt:(i) forKey:(key)] -#else - #define ENCODE_NSINTEGER(coder, i, key) [(coder) encodeInteger:(i) forKey:(key)] -#endif - -@implementation NSApplication (GTMUnitTestingAdditions) -GTM_METHOD_CHECK(NSObject, gtm_unitTestEncodeState:); - -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - ENCODE_NSINTEGER(inCoder, [[self mainWindow] windowNumber], @"ApplicationMainWindow"); - - // Descend down into the windows allowing them to store their state - NSWindow *window = nil; - int i = 0; - GTM_FOREACH_OBJECT(window, [self windows]) { - if ([window isVisible]) { - // Only record visible windows because invisible windows may be closing on us - // This appears to happen differently in 64 bit vs 32 bit, and items - // in the window may hold an extra retain count for a while until the - // event loop is spun. To avoid all this, we just don't record non - // visible windows. - // See rdar://5851458 for details. - [inCoder encodeObject:window forKey:[NSString stringWithFormat:@"Window %d", i]]; - i = i + 1; - } - } - - // and encode the menu bar - NSMenu *mainMenu = [self mainMenu]; - if (mainMenu) { - [inCoder encodeObject:mainMenu forKey:@"MenuBar"]; - } -} -@end - -@implementation NSWindow (GTMUnitTestingAdditions) - -- (CGImageRef)gtm_unitTestImage { - return [[[self contentView] superview] gtm_unitTestImage]; -} - -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeObject:[self title] forKey:@"WindowTitle"]; - [inCoder encodeBool:[self isVisible] forKey:@"WindowIsVisible"]; - // Do not record if window is key, because users running unit tests - // and clicking around to other apps, could change this mid test causing - // issues. - // [inCoder encodeBool:[self isKeyWindow] forKey:@"WindowIsKey"]; - [inCoder encodeBool:[self isMainWindow] forKey:@"WindowIsMain"]; - [inCoder encodeObject:[self contentView] forKey:@"WindowContent"]; - if ([self toolbar]) { - [inCoder encodeObject:[self toolbar] forKey:@"WindowToolbar"]; - } -} - -@end - -@implementation NSControl (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeObject:[self class] forKey:@"ControlType"]; - [inCoder encodeObject:[self objectValue] forKey:@"ControlValue"]; - [inCoder encodeObject:[self selectedCell] forKey:@"ControlSelectedCell"]; - ENCODE_NSINTEGER(inCoder, [self tag], @"ControlTag"); - [inCoder encodeBool:[self isEnabled] forKey:@"ControlIsEnabled"]; -} - -@end - -@implementation NSButton (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - NSString *alternateTitle = [self alternateTitle]; - if (alternateTitle) { - [inCoder encodeObject:alternateTitle forKey:@"ButtonAlternateTitle"]; - } -} - -@end - -@implementation NSTextField (GTMUnitTestingAdditions) - -- (BOOL)gtm_shouldEncodeStateForSubviews { - return NO; -} - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - id controlCell = [self cell]; - if ([controlCell isKindOfClass:[NSTextFieldCell class]]) { - NSTextFieldCell *textFieldCell = controlCell; - [inCoder encodeObject:[textFieldCell placeholderString] - forKey:@"PlaceHolderString"]; - } -} - -@end - -@implementation NSCell (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - BOOL isImageCell = NO; - if ([self hasValidObjectValue]) { - id val = [self objectValue]; - [inCoder encodeObject:val forKey:@"CellValue"]; - isImageCell = [val isKindOfClass:[NSImage class]]; - } - if (!isImageCell) { - // Image cells have a title that includes addresses that aren't going - // to be constant, so we don't encode them. All the info we need - // is going to be in the CellValue encoding. - [inCoder encodeObject:[self title] forKey:@"CellTitle"]; - } - ENCODE_NSINTEGER(inCoder, [self state], @"CellState"); - ENCODE_NSINTEGER(inCoder, [self tag], @"CellTag"); -} - -@end - -@implementation NSImage (GTMUnitTestingAdditions) - -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeObject:NSStringFromSize([self size]) forKey:@"ImageSize"]; - [inCoder encodeObject:[self name] forKey:@"ImageName"]; -} - -- (CGImageRef)gtm_unitTestImage { - // Create up a context - NSSize size = [self size]; - NSRect rect = GTMNSRectOfSize(size); - CGSize cgSize = GTMNSSizeToCGSize(size); - CGContextRef contextRef = GTMCreateUnitTestBitmapContextOfSizeWithData(cgSize, - NULL); - NSGraphicsContext *bitmapContext - = [NSGraphicsContext graphicsContextWithGraphicsPort:contextRef flipped:NO]; - _GTMDevAssert(bitmapContext, @"Couldn't create ns bitmap context"); - - [NSGraphicsContext saveGraphicsState]; - [NSGraphicsContext setCurrentContext:bitmapContext]; - [self drawInRect:rect fromRect:rect operation:NSCompositeCopy fraction:1.0]; - - CGImageRef image = CGBitmapContextCreateImage(contextRef); - CFRelease(contextRef); - [NSGraphicsContext restoreGraphicsState]; - return (CGImageRef)GTMCFAutorelease(image); -} - -@end - -@implementation NSMenu (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - // Hack here to work around - // rdar://5881796 Application menu item title wrong when accessed programatically - // which causes us to have different results on x86_64 vs x386. - // Hack is braced intentionally. We don't record the title of the - // "application" menu or it's menu title because they are wrong on 32 bit. - // They appear to work right on 64bit. - { - NSMenu *mainMenu = [NSApp mainMenu]; - NSMenu *appleMenu = [[mainMenu itemAtIndex:0] submenu]; - if (![self isEqual:appleMenu]) { - [inCoder encodeObject:[self title] forKey:@"MenuTitle"]; - } - } - // Descend down into the menuitems allowing them to store their state - NSMenuItem *menuItem = nil; - int i = 0; - GTM_FOREACH_OBJECT(menuItem, [self itemArray]) { - [inCoder encodeObject:menuItem - forKey:[NSString stringWithFormat:@"MenuItem %d", i]]; - ++i; - } -} - -@end - -@implementation NSMenuItem (GTMUnitTestingAdditions) - -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - // Hack here to work around - // rdar://5881796 Application menu item title wrong when accessed programatically - // which causes us to have different results on x86_64 vs x386. - // See comment above. - { - NSMenu *mainMenu = [NSApp mainMenu]; - NSMenuItem *appleMenuItem = [mainMenu itemAtIndex:0]; - if (![self isEqual:appleMenuItem]) { - [inCoder encodeObject:[self title] forKey:@"MenuItemTitle"]; - } - } - [inCoder encodeObject:[self keyEquivalent] forKey:@"MenuItemKeyEquivalent"]; - [inCoder encodeBool:[self isSeparatorItem] forKey:@"MenuItemIsSeparator"]; - ENCODE_NSINTEGER(inCoder, [self state], @"MenuItemState"); - [inCoder encodeBool:[self isEnabled] forKey:@"MenuItemIsEnabled"]; - [inCoder encodeBool:[self isAlternate] forKey:@"MenuItemIsAlternate"]; - [inCoder encodeObject:[self toolTip] forKey:@"MenuItemTooltip"]; - ENCODE_NSINTEGER(inCoder, [self tag], @"MenuItemTag"); - ENCODE_NSINTEGER(inCoder, [self indentationLevel], @"MenuItemIndentationLevel"); - - // Do our submenu if neccessary - if ([self hasSubmenu]) { - [inCoder encodeObject:[self submenu] forKey:@"MenuItemSubmenu"]; - } -} - -@end - -@implementation NSTabView (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - NSTabViewItem *tab = nil; - int i = 0; - GTM_FOREACH_OBJECT(tab, [self tabViewItems]) { - NSString *key = [NSString stringWithFormat:@"TabItem %d", i]; - [inCoder encodeObject:tab forKey:key]; - i = i + 1; - } -} - -@end - -@implementation NSTabViewItem (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeObject:[self label] forKey:@"TabLabel"]; - [inCoder encodeObject:[self view] forKey:@"TabView"]; -} - -@end - -@implementation NSToolbar (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - NSToolbarItem *item = nil; - NSUInteger i = 0; - GTM_FOREACH_OBJECT(item, [self items]) { - NSString *key - = [NSString stringWithFormat:@"ToolbarItem %lu", (unsigned long)i]; - [inCoder encodeObject:item forKey:key]; - i = i + 1; - } -} - -@end - -@implementation NSToolbarItem (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeObject:[self label] forKey:@"Label"]; - [inCoder encodeObject:[self paletteLabel] forKey:@"PaletteLabel"]; - [inCoder encodeObject:[self toolTip] forKey:@"ToolTip"]; - NSView *view = [self view]; - if (view) { - [inCoder encodeObject:view forKey:@"View"]; - } -} - -@end - -@implementation NSMatrix (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - - ENCODE_NSINTEGER(inCoder, [self mode], @"MatrixMode"); - ENCODE_NSINTEGER(inCoder, [self numberOfRows], @"MatrixRowCount"); - ENCODE_NSINTEGER(inCoder, [self numberOfColumns], @"MatrixColumnCount"); - [inCoder encodeBool:[self allowsEmptySelection] - forKey:@"MatrixAllowEmptySelection"]; - [inCoder encodeBool:[self isSelectionByRect] forKey:@"MatrixSelectionByRect"]; - [inCoder encodeBool:[self autosizesCells] forKey:@"MatrixAutosizesCells"]; - [inCoder encodeSize:[self intercellSpacing] forKey:@"MatrixIntercellSpacing"]; - - [inCoder encodeObject:[self prototype] forKey:@"MatrixCellPrototype"]; - - // Dump the list of cells - NSCell *cell; - long i = 0; - GTM_FOREACH_OBJECT(cell, [self cells]) { - [inCoder encodeObject:cell - forKey:[NSString stringWithFormat:@"MatrixCell %ld", i]]; - ++i; - } -} - -@end - -@implementation NSBox (GTMUnitTestingAdditions) - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - - [inCoder encodeObject:[self title] forKey:@"BoxTitle"]; - ENCODE_NSINTEGER(inCoder, [self titlePosition], @"BoxTitlePosition"); - ENCODE_NSINTEGER(inCoder, [self boxType], @"BoxType"); - ENCODE_NSINTEGER(inCoder, [self borderType], @"BoxBorderType"); - // 10.5+ [inCoder encodeBool:[self isTransparent] forKey:@"BoxIsTransparent"]; -} - -@end - -@implementation NSSegmentedControl (GTMUnitTestingAdditions) - -// Encodes the state of an NSSegmentedControl and all its segments. -// -// Arguments: -// inCoder - the coder to encode state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - - NSInteger segmentCount = [self segmentCount]; - ENCODE_NSINTEGER(inCoder, segmentCount, @"SegmentCount"); - - for (NSInteger i = 0; i < segmentCount; ++i) { - NSString *key = [NSString stringWithFormat:@"Segment %ld", (long)i]; - [inCoder encodeObject:[self labelForSegment:i] forKey:key]; - } -} - -@end - -@implementation NSComboBox (GTMUnitTestingAdditions) - -- (BOOL)gtm_shouldEncodeStateForSubviews { - // Subclass of NSTextView, don't want subviews for the same reason. - return NO; -} - -// Encodes the state of an NSSegmentedControl and all its segments. -// -// Arguments: -// inCoder - the coder to encode state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - - NSInteger aCount = [self numberOfItems]; - ENCODE_NSINTEGER(inCoder, aCount, @"ComboBoxNumberOfItems"); - aCount = [self numberOfVisibleItems]; - ENCODE_NSINTEGER(inCoder, aCount, @"ComboBoxNumberOfVisibleItems"); - - // Include the objectValues if it doesn't use a data source. - if (![self usesDataSource]) { - NSArray *objectValues = [self objectValues]; - for (NSUInteger i = 0; i < [objectValues count]; ++i) { - id value = [objectValues objectAtIndex:i]; - if ([value isKindOfClass:[NSString class]]) { - NSString *key = [NSString stringWithFormat:@"ComboBoxObjectValue %lu", - (unsigned long)i]; - [inCoder encodeObject:value forKey:key]; - } - } - } -} - -@end - - -// A view that allows you to delegate out drawing using the formal -// GTMUnitTestViewDelegate protocol above. This is useful when writing up unit -// tests for visual elements. -// Your test will often end up looking like this: -// - (void)testFoo { -// GTMAssertDrawingEqualToFile(self, NSMakeSize(200, 200), @"Foo", nil, nil); -// } -// and your testSuite will also implement the unitTestViewDrawRect method to do -// it's actual drawing. The above creates a view of size 200x200 that draws -// it's content using |self|'s unitTestViewDrawRect method and compares it to -// the contents of the file Foo.tif to make sure it's valid -@implementation GTMUnitTestView - -- (id)initWithFrame:(NSRect)frame - drawer:(id<GTMUnitTestViewDrawer>)drawer - contextInfo:(void*)contextInfo { - self = [super initWithFrame:frame]; - if (self != nil) { - drawer_ = [drawer retain]; - contextInfo_ = contextInfo; - } - return self; -} - -- (void)dealloc { - [drawer_ release]; - [super dealloc]; -} - - -- (void)drawRect:(NSRect)rect { - [drawer_ gtm_unitTestViewDrawRect:rect contextInfo:contextInfo_]; -} - - -@end - -@implementation NSView (GTMUnitTestingAdditions) - -// Returns an image containing a representation of the object -// suitable for use in comparing against a master image. -// Does all of it's drawing with smoothfonts and antialiasing off -// to avoid issues with font smoothing settings and antialias differences -// between ppc and x86. -// -// Returns: -// an image of the object -- (CGImageRef)gtm_unitTestImage { - // Create up a context - NSRect bounds = [self bounds]; - CGSize cgSize = GTMNSSizeToCGSize(bounds.size); - CGContextRef contextRef = GTMCreateUnitTestBitmapContextOfSizeWithData(cgSize, - NULL); - NSGraphicsContext *bitmapContext - = [NSGraphicsContext graphicsContextWithGraphicsPort:contextRef flipped:NO]; - _GTMDevAssert(bitmapContext, @"Couldn't create ns bitmap context"); - - // Save our state and turn off font smoothing and antialias. - CGContextSaveGState(contextRef); - CGContextSetShouldSmoothFonts(contextRef, false); - CGContextSetShouldAntialias(contextRef, false); - [self displayRectIgnoringOpacity:bounds inContext:bitmapContext]; - - CGImageRef image = CGBitmapContextCreateImage(contextRef); - CFRelease(contextRef); - return (CGImageRef)GTMCFAutorelease(image); -} - -// Returns whether gtm_unitTestEncodeState should recurse into subviews -// of a particular view. -// If you have "Full keyboard access" in the -// Keyboard & Mouse > Keyboard Shortcuts preferences pane set to "Text boxes -// and Lists only" that Apple adds a set of subviews to NSTextFields. So in the -// case of NSTextFields we don't want to recurse into their subviews. There may -// be other cases like this, so instead of specializing gtm_unitTestEncodeState: to -// look for NSTextFields, NSTextFields will just not allow us to recurse into -// their subviews. -// -// Returns: -// should gtm_unitTestEncodeState pick up subview state. -- (BOOL)gtm_shouldEncodeStateForSubviews { - return YES; -} - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeBool:[self isHidden] forKey:@"ViewIsHidden"]; - [inCoder encodeObject:[self toolTip] forKey:@"ViewToolTip"]; - NSArray *supportedAttrs = [self accessibilityAttributeNames]; - if ([supportedAttrs containsObject:NSAccessibilityHelpAttribute]) { - NSString *help - = [self accessibilityAttributeValue:NSAccessibilityHelpAttribute]; - [inCoder encodeObject:help forKey:@"ViewAccessibilityHelp"]; - } - if ([supportedAttrs containsObject:NSAccessibilityDescriptionAttribute]) { - NSString *description - = [self accessibilityAttributeValue:NSAccessibilityDescriptionAttribute]; - [inCoder encodeObject:description forKey:@"ViewAccessibilityDescription"]; - } - NSMenu *menu = [self menu]; - if (menu) { - [inCoder encodeObject:menu forKey:@"ViewMenu"]; - } - if ([self gtm_shouldEncodeStateForSubviews]) { - NSView *subview = nil; - int i = 0; - GTM_FOREACH_OBJECT(subview, [self subviews]) { - [inCoder encodeObject:subview forKey:[NSString stringWithFormat:@"ViewSubView %d", i]]; - i = i + 1; - } - } -} - -@end - diff --git a/UnitTesting/GTMAppKitUnitTestingUtilities.h b/UnitTesting/GTMAppKitUnitTestingUtilities.h index 1edccd7..b3852ba 100644 --- a/UnitTesting/GTMAppKitUnitTestingUtilities.h +++ b/UnitTesting/GTMAppKitUnitTestingUtilities.h @@ -23,21 +23,6 @@ // Collection of utilities for unit testing @interface GTMAppKitUnitTestingUtilities : NSObject -// Sets up the user interface so that we can run consistent UI unittests on -// it. This includes setting scroll bar types, setting selection colors -// setting color spaces etc so that everything is consistent across machines. -// This should be called in main, before NSApplicationMain is called. -+ (void)setUpForUIUnitTests; - -// Syntactic sugar combining that checks to see if we are running unittests -// and then calls setUpForUIUnitTests wrapped up in a NSAutoreleasePool so that -// your main can look like this: -// int main(int argc, const char *argv[]) { -// [UnitTestingUtilities setUpForUIUnitTestsIfBeingTested]; -// return NSApplicationMain(argc, argv); -// } -+ (void)setUpForUIUnitTestsIfBeingTested; - // Check if the screen saver is running. Some unit tests don't work when // the screen saver is active. + (BOOL)isScreenSaverActive; diff --git a/UnitTesting/GTMAppKitUnitTestingUtilities.m b/UnitTesting/GTMAppKitUnitTestingUtilities.m index 71c4d76..d90d608 100644 --- a/UnitTesting/GTMAppKitUnitTestingUtilities.m +++ b/UnitTesting/GTMAppKitUnitTestingUtilities.m @@ -17,68 +17,12 @@ // #import "GTMAppKitUnitTestingUtilities.h" -#import <AppKit/AppKit.h> -#include <signal.h> -#include <unistd.h> #import "GTMDefines.h" -// The Users profile before we change it on them -static CMProfileRef gGTMCurrentColorProfile = NULL; - -// Compares two color profiles -static BOOL GTMAreCMProfilesEqual(CMProfileRef a, CMProfileRef b); -// Stores the user's color profile away, and changes over to generic. -static void GTMSetColorProfileToGenericRGB(); -// Restores the users profile. -static void GTMRestoreColorProfile(void); -// Signal handler to try and restore users profile. -static void GTMHandleCrashSignal(int signalNumber); - static CGKeyCode GTMKeyCodeForCharCode(CGCharCode charCode); @implementation GTMAppKitUnitTestingUtilities -// Sets up the user interface so that we can run consistent UI unittests on it. -+ (void)setUpForUIUnitTests { - // Give some names to undocumented defaults values - const NSInteger MediumFontSmoothing = 2; - const NSInteger BlueTintedAppearance = 1; - - // This sets up some basic values that we want as our defaults for doing pixel - // based user interface tests. These defaults only apply to the unit test app, - // except or the color profile which will be set system wide, and then - // restored when the tests complete. - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - // Scroll arrows together bottom - [defaults setObject:@"DoubleMax" forKey:@"AppleScrollBarVariant"]; - // Smallest font size to CG should perform antialiasing on - [defaults setInteger:4 forKey:@"AppleAntiAliasingThreshold"]; - // Type of smoothing - [defaults setInteger:MediumFontSmoothing forKey:@"AppleFontSmoothing"]; - // Blue aqua - [defaults setInteger:BlueTintedAppearance forKey:@"AppleAquaColorVariant"]; - // Standard highlight colors - [defaults setObject:@"0.709800 0.835300 1.000000" - forKey:@"AppleHighlightColor"]; - [defaults setObject:@"0.500000 0.500000 0.500000" - forKey:@"AppleOtherHighlightColor"]; - // Use english plz - [defaults setObject:[NSArray arrayWithObject:@"en"] forKey:@"AppleLanguages"]; - // How fast should we draw sheets. This speeds up the sheet tests considerably - [defaults setFloat:.001f forKey:@"NSWindowResizeTime"]; - // Switch over the screen profile to "generic rgb". This installs an - // atexit handler to return our profile back when we are done. - GTMSetColorProfileToGenericRGB(); -} - -+ (void)setUpForUIUnitTestsIfBeingTested { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - if ([GTMFoundationUnitTestingUtilities areWeBeingUnitTested]) { - [self setUpForUIUnitTests]; - } - [pool drain]; -} - + (BOOL)isScreenSaverActive { BOOL answer = NO; ProcessSerialNumber psn; @@ -150,108 +94,6 @@ CantWorkWithScreenSaver: @end -BOOL GTMAreCMProfilesEqual(CMProfileRef a, CMProfileRef b) { - BOOL equal = YES; - if (a != b) { - CMProfileMD5 aMD5; - CMProfileMD5 bMD5; - CMError aMD5Err = CMGetProfileMD5(a, aMD5); - CMError bMD5Err = CMGetProfileMD5(b, bMD5); - equal = (!aMD5Err && - !bMD5Err && - !memcmp(aMD5, bMD5, sizeof(CMProfileMD5))) ? YES : NO; - } - return equal; -} - -void GTMRestoreColorProfile(void) { - if (gGTMCurrentColorProfile) { - CGDirectDisplayID displayID = CGMainDisplayID(); - CMError error = CMSetProfileByAVID((UInt32)displayID, - gGTMCurrentColorProfile); - CMCloseProfile(gGTMCurrentColorProfile); - if (error) { - // COV_NF_START - // No way to force this case in a unittest. - _GTMDevLog(@"Failed to restore previous color profile! " - @"You may need to open System Preferences : Displays : Color " - @"and manually restore your color settings. (Error: %ld)", - (long)error); - // COV_NF_END - } else { - _GTMDevLog(@"Color profile restored"); - } - gGTMCurrentColorProfile = NULL; - } -} - -void GTMHandleCrashSignal(int signalNumber) { - // Going down in flames, might as well try to restore the color profile - // anyways. - GTMRestoreColorProfile(); - // Go ahead and exit with the signal value relayed just incase. - _exit(signalNumber + 128); -} - -void GTMSetColorProfileToGenericRGB(void) { - NSColorSpace *genericSpace = [NSColorSpace genericRGBColorSpace]; - CMProfileRef genericProfile = (CMProfileRef)[genericSpace colorSyncProfile]; - CMProfileRef previousProfile; - CGDirectDisplayID displayID = CGMainDisplayID(); - CMError error = CMGetProfileByAVID((UInt32)displayID, &previousProfile); - if (error) { - // COV_NF_START - // No way to force this case in a unittest. - _GTMDevLog(@"Failed to get current color profile. " - "I will not be able to restore your current profile, thus I'm " - "not changing it. Many unit tests may fail as a result. (Error: %li)", - (long)error); - return; - // COV_NF_END - } - if (GTMAreCMProfilesEqual(genericProfile, previousProfile)) { - CMCloseProfile(previousProfile); - return; - } - CFStringRef previousProfileName; - CFStringRef genericProfileName; - CMCopyProfileDescriptionString(previousProfile, &previousProfileName); - CMCopyProfileDescriptionString(genericProfile, &genericProfileName); - - _GTMDevLog(@"Temporarily changing your system color profile from \"%@\" to \"%@\".", - previousProfileName, genericProfileName); - _GTMDevLog(@"This allows the pixel-based unit-tests to have consistent color " - "values across all machines."); - _GTMDevLog(@"The colors on your screen will change for the duration of the testing."); - - - if ((error = CMSetProfileByAVID((UInt32)displayID, genericProfile))) { - // COV_NF_START - // No way to force this case in a unittest. - _GTMDevLog(@"Failed to set color profile to \"%@\"! Many unit tests will fail as " - "a result. (Error: %li)", genericProfileName, (long)error); - // COV_NF_END - } else { - gGTMCurrentColorProfile = previousProfile; - atexit(GTMRestoreColorProfile); - // WebKit DRT and Chrome TestShell both use this trick. If the test is - // already crashing, might as well try restoring the color profile, and if - // it fails, it is no worse than crashing without having tried. - signal(SIGILL, GTMHandleCrashSignal); - signal(SIGTRAP, GTMHandleCrashSignal); - signal(SIGEMT, GTMHandleCrashSignal); - signal(SIGFPE, GTMHandleCrashSignal); - signal(SIGBUS, GTMHandleCrashSignal); - signal(SIGSEGV, GTMHandleCrashSignal); - signal(SIGSYS, GTMHandleCrashSignal); - signal(SIGPIPE, GTMHandleCrashSignal); - signal(SIGXCPU, GTMHandleCrashSignal); - signal(SIGXFSZ, GTMHandleCrashSignal); - } - CFRelease(previousProfileName); - CFRelease(genericProfileName); -} - // Returns a virtual key code for a given charCode. Handles all of the // NS*FunctionKeys as well. static CGKeyCode GTMKeyCodeForCharCode(CGCharCode charCode) { diff --git a/UnitTesting/GTMCALayer+UnitTesting.h b/UnitTesting/GTMCALayer+UnitTesting.h deleted file mode 100644 index b757ba9..0000000 --- a/UnitTesting/GTMCALayer+UnitTesting.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// GTMCALayer+UnitTesting.h -// -// Code for making unit testing of graphics/UI easier. Generally you -// will only want to look at the macros: -// GTMAssertDrawingEqualToFile -// GTMAssertViewRepEqualToFile -// and the protocol GTMUnitTestCALayerDrawer. When using these routines -// make sure you are using device colors and not calibrated/generic colors -// or else your test graphics WILL NOT match across devices/graphics cards. -// -// 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 <QuartzCore/QuartzCore.h> -#import "GTMNSObject+UnitTesting.h" - -// Category for making unit testing of graphics/UI easier. - -// Allows you to take a state of a view. Supports both image and state. -// See GTMNSObject+UnitTesting.h for details. -@interface CALayer (GTMUnitTestingAdditions) <GTMUnitTestingImaging> -// Returns whether gtm_unitTestEncodeState should recurse into sublayers -// -// Returns: -// should gtm_unitTestEncodeState pick up sublayer state. -- (BOOL)gtm_shouldEncodeStateForSublayers; -@end - -@interface NSObject (GTMCALayerUnitTestingDelegateMethods) -// Delegate method that allows a delegate for a layer to -// decide whether we should recurse -- (BOOL)gtm_shouldEncodeStateForSublayersOfLayer:(CALayer*)layer; -@end diff --git a/UnitTesting/GTMCALayer+UnitTesting.m b/UnitTesting/GTMCALayer+UnitTesting.m deleted file mode 100644 index 52367e5..0000000 --- a/UnitTesting/GTMCALayer+UnitTesting.m +++ /dev/null @@ -1,89 +0,0 @@ -// -// GTMCALayer+UnitTesting.m -// -// Category for making unit testing of graphics/UI easier. -// Allows you to save a view out to a image file, and compare a view -// with a previously stored representation to make sure it hasn't changed. -// -// 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 "GTMCALayer+UnitTesting.h" - -@implementation CALayer (GTMUnitTestingAdditions) - -// Returns an image containing a representation of the object -// suitable for use in comparing against a master image. -// NB this means that all colors should be from "NSDevice" color space -// Does all of it's drawing with smoothfonts and antialiasing off -// to avoid issues with font smoothing settings and antialias differences -// between ppc and x86. -// -// Returns: -// an image of the object -- (CGImageRef)gtm_unitTestImage { - CGRect bounds = [self bounds]; - CGSize size = CGSizeMake(CGRectGetWidth(bounds), CGRectGetHeight(bounds)); - CGContextRef context = GTMCreateUnitTestBitmapContextOfSizeWithData(size, - NULL); - _GTMDevAssert(context, @"Couldn't create context"); - - // iPhone renders are flipped - CGAffineTransform transform = CGAffineTransformMakeTranslation(0, size.height); - transform = CGAffineTransformScale(transform, 1.0, -1.0); - CGContextConcatCTM(context, transform); - - [self renderInContext:context]; - CGImageRef image = CGBitmapContextCreateImage(context); - CFRelease(context); - return (CGImageRef)GTMCFAutorelease(image); -} - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeBool:[self isHidden] forKey:@"LayerIsHidden"]; - [inCoder encodeBool:[self isDoubleSided] forKey:@"LayerIsDoublesided"]; - [inCoder encodeBool:[self isOpaque] forKey:@"LayerIsOpaque"]; - [inCoder encodeFloat:[self opacity] forKey:@"LayerOpacity"]; - // TODO: There is a ton more we can add here. What are we interested in? - if ([self gtm_shouldEncodeStateForSublayers]) { - int i = 0; - for (CALayer *subLayer in [self sublayers]) { - [inCoder encodeObject:subLayer - forKey:[NSString stringWithFormat:@"CALayerSubLayer %d", i]]; - i = i + 1; - } - } -} - -// Returns whether gtm_unitTestEncodeState should recurse into sublayers -// -// Returns: -// should gtm_unitTestEncodeState pick up sublayer state. -- (BOOL)gtm_shouldEncodeStateForSublayers { - BOOL value = YES; - if([self.delegate respondsToSelector:@selector(gtm_shouldEncodeStateForSublayersOfLayer:)]) { - value = [self.delegate gtm_shouldEncodeStateForSublayersOfLayer:self]; - } - return value; -} - -@end diff --git a/UnitTesting/GTMDevLogUnitTestingBridge.m b/UnitTesting/GTMDevLogUnitTestingBridge.m deleted file mode 100644 index c57893b..0000000 --- a/UnitTesting/GTMDevLogUnitTestingBridge.m +++ /dev/null @@ -1,44 +0,0 @@ -// -// GTMDevLogUnitTestingBridge.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. -// - -#include "GTMUnitTestDevLog.h" - -// -// NOTE: Odds are this file should not be included in your project. It is -// only needed for some enhanced unit testing. -// -// By adding: -// #define _GTMDevLog _GTMUnitTestDevLog -// to your prefix header (like the GTM Framework does), this function then -// works to forward logging messages to the GTMUnitTestDevLog class to -// allow logging validation during unittest, otherwise the messages go to -// NSLog like normal. -// -// See GTMUnitTestDevLog.h for more information on checking logs in unittests. -// -void _GTMUnitTestDevLog(NSString *format, ...) { - Class devLogClass = NSClassFromString(@"GTMUnitTestDevLog"); - va_list argList; - va_start(argList, format); - if (devLogClass) { - [devLogClass log:format args:argList]; - } else { - NSLogv(format, argList); // COV_NF_LINE the class is in all our unittest setups - } - va_end(argList); -} diff --git a/UnitTesting/GTMIPhoneSecurityLibraryTest.m b/UnitTesting/GTMIPhoneSecurityLibraryTest.m deleted file mode 100644 index f6fd37a..0000000 --- a/UnitTesting/GTMIPhoneSecurityLibraryTest.m +++ /dev/null @@ -1,75 +0,0 @@ -// -// GTMIPhoneSecurityLibraryTest.m -// -// Copyright 2012 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" - -// Tests that using the keychain library within unit tests works correctly. -@interface GTMIPhoneSecurityLibraryTest : GTMTestCase -@end - -@implementation GTMIPhoneSecurityLibraryTest - -static NSString * const kAccount = @"GTMTestingSecurityAccount"; -static NSString * const kService = @"GTMTestingSecurityService"; -static NSString * const kPassword = @"GTMTestingSecurityPassword"; - -- (NSMutableDictionary *)keychainQueryItem { - return [NSMutableDictionary dictionaryWithObjectsAndKeys: - (id)kSecClassGenericPassword, (id)kSecClass, - kAccount, (id)kSecAttrAccount, - kService, (id)kSecAttrService, - nil]; -} - -- (void)assertCorrectPassword { - NSMutableDictionary *keychainQueryItem = [self keychainQueryItem]; - [keychainQueryItem setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; - [keychainQueryItem setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; - - CFDataRef result = NULL; - OSStatus status = SecItemCopyMatching((CFDictionaryRef)keychainQueryItem, - (CFTypeRef *)&result); - STAssertEquals(status, - (OSStatus)noErr, - @"Error retrieving password from keychain"); - STAssertNotNULL(result, @"No password found"); - NSString *password = - [[[NSString alloc] initWithData:(NSData *)result - encoding:NSUTF8StringEncoding] autorelease]; - STAssertEqualStrings(kPassword, password, @"Unexpected password found"); - CFRelease(result); -} - -- (void)testSecurityCalls { - NSMutableDictionary *passwordItem = [self keychainQueryItem]; - NSData *passwordData = [kPassword dataUsingEncoding:NSUTF8StringEncoding]; - [passwordItem setObject:passwordData forKey:(id)kSecValueData]; - - OSStatus result = SecItemAdd((CFDictionaryRef)passwordItem, NULL); - STAssertTrue(result == noErr || result == errSecDuplicateItem, - @"Unexpected result code: %lu", - (unsigned long)result); - [self assertCorrectPassword]; - - // Test that accessing the keychain will continue to work after a delay. - NSDate *sleepUntil = [NSDate dateWithTimeIntervalSinceNow:30]; - [[NSRunLoop mainRunLoop] runUntilDate:sleepUntil]; - [self assertCorrectPassword]; -} - -@end diff --git a/UnitTesting/GTMIPhoneUnitTestDelegate.m b/UnitTesting/GTMIPhoneUnitTestDelegate.m index affcc3e..a112a99 100644 --- a/UnitTesting/GTMIPhoneUnitTestDelegate.m +++ b/UnitTesting/GTMIPhoneUnitTestDelegate.m @@ -179,7 +179,7 @@ static int ClassSort(const void *a, const void *b) { fputs([fixtureStartString UTF8String], stderr); fflush(stderr); NSInvocation *invocation; - GTM_FOREACH_OBJECT(invocation, invocations) { + for (invocation in invocations) { GTMTestCase *testCase = [[currClass alloc] initWithInvocation:invocation]; BOOL failed = NO; diff --git a/UnitTesting/GTMIPhoneUnitTestMain.m b/UnitTesting/GTMIPhoneUnitTestMain.m index 6bfc711..0a504b7 100644 --- a/UnitTesting/GTMIPhoneUnitTestMain.m +++ b/UnitTesting/GTMIPhoneUnitTestMain.m @@ -22,6 +22,30 @@ #endif #import <UIKit/UIKit.h> +#if GTM_ENABLE_TCCSERVICE_ACCESS + +// Enable access to AddressBook, Calendar and Photos +// https://groups.google.com/forum/#!topic/kif-framework/xayP4VVBPyg + +__asm(".section __TEXT,__entitlements"); +__asm(".ascii \"" + "<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\n" + "<!DOCTYPE plist PUBLIC \\\"-//Apple//DTD PLIST 1.0//EN\\\" " + "\\\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\\\">" + "<plist version=\\\"1.0\\\">" + "<dict>" + "<key>com.apple.private.tcc.allow</key>" + "<array>" + "<string>kTCCServiceAddressBook</string>" + "<string>kTCCServiceCalendar</string>" + "<string>kTCCServicePhotos</string>" + "</array>" + "</dict>" + "</plist>" + "\""); + +#endif // GTM_ENABLE_TCCSERVICE_ACCESS + // Creates an application that runs all tests from classes extending // SenTestCase, outputs results and test run time, and terminates right // afterwards. @@ -32,8 +56,8 @@ int main(int argc, char *argv[]) { #else NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; #endif -#if GTM_IPHONE_USE_SENTEST - // Is using SenTest, just create a dummy app that can be used as the +#if GTM_IPHONE_USE_SENTEST || GTM_USING_XCTEST + // Is using SenTest or XCTest, just create a dummy app that can be used as the // TEST_HOST. retVal = UIApplicationMain(argc, argv, nil, nil); #else diff --git a/UnitTesting/GTMNSObject+BindingUnitTesting.h b/UnitTesting/GTMNSObject+BindingUnitTesting.h deleted file mode 100644 index feac5b3..0000000 --- a/UnitTesting/GTMNSObject+BindingUnitTesting.h +++ /dev/null @@ -1,120 +0,0 @@ -// -// GTMNSObject+BindingUnitTesting.h -// -// Utilities for doing advanced unittesting with object bindings. -// -// 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. -// - -#include <Foundation/Foundation.h> - -// Utility functions for GTMTestExposedBindings Macro. Don't use it directly -// but use the macro below instead -BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object, - NSArray **errors); - -// Tests the setters and getters for exposed bindings -// For objects that expose bindings, this tests them for you, saving you from -// having to write a whole pile of set/get test code if you add binding support. -// You will need to implement valueClassForBinding: for your bindings, -// and you may possibly want to implement unitTestExposedBindingsToIgnore -// and unitTestExposedBindingsTestValues. See descriptions of those -// methods below for details. -// Implemented as a macro to match the rest of the SenTest macros. -// -// Args: -// a1: The object to be checked. -// description: A format string as in the printf() function. -// Can be nil or an empty string but must be present. -// ...: A variable number of arguments to the format string. Can be absent. -// -#define GTMTestExposedBindings(a1, description, ...) \ -do { \ - NSObject *a1Object = (a1); \ - NSArray *errors = nil; \ - BOOL isGood = GTMDoExposedBindingsFunctionCorrectly(a1Object, &errors); \ - if (!isGood) { \ - NSString *failString; \ - GTM_FOREACH_OBJECT(failString, errors) { \ - if (description != nil) { \ - STFail(@"%@: %@", failString, STComposeString(description, ##__VA_ARGS__)); \ - } else { \ - STFail(@"%@", failString); \ - } \ - } \ - } \ -} while(0) - -// Utility class for setting up Binding Tests. Basically a pair of a value to -// set a binding to, followed by the expected return value. -// See description of gtm_unitTestExposedBindingsTestValues: below -// for example of usage. -@interface GTMBindingUnitTestData : NSObject { - @private - id valueToSet_; - id expectedValue_; -} - -+ (id)testWithIdentityValue:(id)value; -+ (id)testWithValue:(id)value expecting:(id)expecting; -- (id)initWithValue:(id)value expecting:(id)expecting; -- (id)valueToSet; -- (id)expectedValue; -@end - -@interface NSObject (GTMBindingUnitTestingAdditions) -// Allows you to ignore certain bindings when running GTMTestExposedBindings -// If you have bindings you want to ignore, add them to the array returned -// by this method. The standard way to implement this would be: -// - (NSMutableArray*)unitTestExposedBindingsToIgnore { -// NSMutableArray *array = [super unitTestExposedBindingsToIgnore]; -// [array addObject:@"bindingToIgnore1"]; -// ... -// return array; -// } -// The NSObject implementation by default will ignore NSFontBoldBinding, -// NSFontFamilyNameBinding, NSFontItalicBinding, NSFontNameBinding and -// NSFontSizeBinding if your exposed bindings contains NSFontBinding because -// the NSFont*Bindings are NOT KVC/KVO compliant. -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore; - -// Allows you to set up test values for your different bindings. -// if you have certain values you want to test against your bindings, add -// them to the array returned by this method. The array is an array of -// GTMBindingUnitTestData. -// The standard way to implement this would be: -// - (NSMutableArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { -// NSMutableArray *dict = [super unitTestExposedBindingsTestValues:binding]; -// if ([binding isEqualToString:@"myBinding"]) { -// MySpecialBindingValueSet *value -// = [[[MySpecialBindingValueSet alloc] init] autorelease]; -// [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; -// ... -// else if ([binding isEqualToString:@"myBinding2"]) { -// ... -// } -// return array; -// } -// The NSObject implementation handles many of the default bindings, and -// gives you a reasonable set of test values to start. -// See the implementation for the current list of bindings, and values that we -// set for those bindings. -- (NSMutableArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding; - -// A special version of isEqualTo to test whether two binding values are equal -// by default it calls directly to isEqualTo: but can be overridden for special -// cases (like NSImages) where the standard isEqualTo: isn't sufficient. -- (BOOL)gtm_unitTestIsEqualTo:(id)value; -@end diff --git a/UnitTesting/GTMNSObject+BindingUnitTesting.m b/UnitTesting/GTMNSObject+BindingUnitTesting.m deleted file mode 100644 index 4b43f58..0000000 --- a/UnitTesting/GTMNSObject+BindingUnitTesting.m +++ /dev/null @@ -1,577 +0,0 @@ -// -// GTMNSObject+BindingUnitTesting.m -// -// An informal protocol for doing advanced binding unittesting with objects. -// -// 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 <AppKit/AppKit.h> -#import "GTMDefines.h" -#import "GTMNSObject+BindingUnitTesting.h" -#import "GTMSystemVersion.h" - -BOOL GTMDoExposedBindingsFunctionCorrectly(NSObject *object, - NSArray **errors) { - NSMutableArray *errorArray = [NSMutableArray array]; - if (errors) { - *errors = nil; - } - NSArray *bindings = [object exposedBindings]; - if ([bindings count]) { - NSArray *bindingsToIgnore = [object gtm_unitTestExposedBindingsToIgnore]; - NSString *bindingKey; - GTM_FOREACH_OBJECT(bindingKey, bindings) { - if (![bindingsToIgnore containsObject:bindingKey]) { - Class theClass = [object valueClassForBinding:bindingKey]; - if (!theClass) { - NSString *error - = [NSString stringWithFormat:@"%@ should have valueClassForBinding '%@'", - object, bindingKey]; - [errorArray addObject:error]; - continue; - } - @try { - @try { - [object valueForKey:bindingKey]; - } - @catch (NSException *e) { - _GTMDevLog(@"%@ is not key value coding compliant for key %@", - object, bindingKey); - continue; - } // COV_NF_LINE - compiler bug - NSArray *testValues - = [object gtm_unitTestExposedBindingsTestValues:bindingKey]; - GTMBindingUnitTestData *testData; - GTM_FOREACH_OBJECT(testData, testValues) { - id valueToSet = [testData valueToSet]; - [object setValue:valueToSet forKey:bindingKey]; - id valueReceived = [object valueForKey:bindingKey]; - id desiredValue = [testData expectedValue]; - if (![desiredValue gtm_unitTestIsEqualTo:valueReceived]) { - NSString *error - = [NSString stringWithFormat:@"%@ unequal to expected %@ for binding '%@'", - valueReceived, desiredValue, bindingKey]; - [errorArray addObject:error]; - continue; - } - } - } - @catch(NSException *e) { - NSString *error - = [NSString stringWithFormat:@"%@:%@-> Binding %@", - [e name], [e reason], bindingKey]; - [errorArray addObject:error]; - } // COV_NF_LINE - compiler bug - } - } - } else { - NSString *error = - [NSString stringWithFormat:@"%@ does not have any exposed bindings", - object]; - [errorArray addObject:error]; - } - if (errors) { - *errors = errorArray; - } - return [errorArray count] == 0; -} - -@implementation GTMBindingUnitTestData -+ (id)testWithIdentityValue:(id)value { - return [self testWithValue:value expecting:value]; -} - -+ (id)testWithValue:(id)value expecting:(id)expecting { - return [[[self alloc] initWithValue:value expecting:expecting] autorelease]; -} - -- (id)initWithValue:(id)value expecting:(id)expecting { - if ((self = [super init])) { - valueToSet_ = [value retain]; - expectedValue_ = [expecting retain]; - } - return self; -} - -- (BOOL)isEqual:(id)object { - BOOL isEqual = [object isMemberOfClass:[self class]]; - if (isEqual) { - id objValue = [object valueToSet]; - id objExpect = [object expectedValue]; - isEqual = (((valueToSet_ == objValue) || ([valueToSet_ isEqual:objValue])) - && ((expectedValue_ == objExpect) || ([expectedValue_ isEqual:objExpect]))); - } - return isEqual; -} - -- (NSUInteger)hash { - return [valueToSet_ hash] + [expectedValue_ hash]; -} - -- (void)dealloc { - [valueToSet_ release]; - [expectedValue_ release]; - [super dealloc]; -} - -- (id)valueToSet { - return valueToSet_; -} - -- (id)expectedValue { - return expectedValue_; -} -@end - -@implementation NSObject (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [NSMutableArray arrayWithObject:NSValueBinding]; - if ([[self exposedBindings] containsObject:NSFontBinding]) { - NSString *fontBindings[] = { NSFontBoldBinding, NSFontFamilyNameBinding, - NSFontItalicBinding, NSFontNameBinding, NSFontSizeBinding }; - for (size_t i = 0; i < sizeof(fontBindings) / sizeof(NSString*); ++i) { - [array addObject:fontBindings[i]]; - } - } - return array; -} - -- (NSMutableArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { - - NSMutableArray *array = [NSMutableArray array]; - id value = [self valueForKey:binding]; - - // Always test identity if possible - if (value) { - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } - - // Now some default test values for a variety of bindings to make - // sure that we cover all the bases and save other people writing lots of - // duplicate test code. - - // If anybody can think of more to add, please go nuts. - if ([binding isEqualToString:NSAlignmentBinding]) { - value = [NSNumber numberWithInt:NSLeftTextAlignment]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithInt:NSRightTextAlignment]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithInt:NSCenterTextAlignment]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithInt:NSJustifiedTextAlignment]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithInt:NSNaturalTextAlignment]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - NSNumber *valueToSet = [NSNumber numberWithInt:500]; - [array addObject:[GTMBindingUnitTestData testWithValue:valueToSet - expecting:value]]; - valueToSet = [NSNumber numberWithInt:-1]; - [array addObject:[GTMBindingUnitTestData testWithValue:valueToSet - expecting:value]]; - } else if ([binding isEqualToString:NSAlternateImageBinding] || - [binding isEqualToString:NSImageBinding] || - [binding isEqualToString:NSMixedStateImageBinding] || - [binding isEqualToString:NSOffStateImageBinding] || - [binding isEqualToString:NSOnStateImageBinding]) { - // This handles all image bindings - value = [NSImage imageNamed:@"NSApplicationIcon"]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSAnimateBinding] || - [binding isEqualToString:NSDocumentEditedBinding] || - [binding isEqualToString:NSEditableBinding] || - [binding isEqualToString:NSEnabledBinding] || - [binding isEqualToString:NSHiddenBinding] || - [binding isEqualToString:NSVisibleBinding] || - [binding isEqualToString:NSIsIndeterminateBinding] || - // NSTranparentBinding 10.5 only - [binding isEqualToString:@"transparent"]) { - // This handles all bool value bindings - value = [NSNumber numberWithBool:YES]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithBool:NO]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSAlternateTitleBinding] || - [binding isEqualToString:NSHeaderTitleBinding] || - [binding isEqualToString:NSLabelBinding] || - [binding isEqualToString:NSTitleBinding] || - [binding isEqualToString:NSToolTipBinding]) { - // This handles all string value bindings - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"happy"]]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@""]]; - - // Test some non-ascii roman text - char a_not_alpha[] = { 'A', 0xE2, 0x89, 0xA2, 0xCE, 0x91, '.', 0x00 }; - value = [NSString stringWithUTF8String:a_not_alpha]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - // Test some korean - char hangugo[] = { 0xED, 0x95, 0x9C, 0xEA, 0xB5, - 0xAD, 0xEC, 0x96, 0xB4, 0x00 }; - value = [NSString stringWithUTF8String:hangugo]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - // Test some japanese - char nihongo[] = { 0xE6, 0x97, 0xA5, 0xE6, 0x9C, - 0xAC, 0xE8, 0xAA, 0x9E, 0x00 }; - value = [NSString stringWithUTF8String:nihongo]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - // Test some arabic - char arabic[] = { 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0x00 }; - value = [NSString stringWithUTF8String:arabic]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSRepresentedFilenameBinding]) { - // This handles all path bindings - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"/happy"]]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:@"/"]]; - - // Test some non-ascii roman text - char a_not_alpha[] = { '/', 'A', 0xE2, 0x89, 0xA2, 0xCE, 0x91, '.', 0x00 }; - value = [NSString stringWithUTF8String:a_not_alpha]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - // Test some korean - char hangugo[] = { '/', 0xED, 0x95, 0x9C, 0xEA, 0xB5, - 0xAD, 0xEC, 0x96, 0xB4, 0x00 }; - value = [NSString stringWithUTF8String:hangugo]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - // Test some japanese - char nihongo[] = { '/', 0xE6, 0x97, 0xA5, 0xE6, 0x9C, - 0xAC, 0xE8, 0xAA, 0x9E, 0x00 }; - value = [NSString stringWithUTF8String:nihongo]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - // Test some arabic - char arabic[] = { '/', 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0x00 }; - value = [NSString stringWithUTF8String:arabic]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSMaximumRecentsBinding]) { - value = [NSNumber numberWithInt:0]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithInt:-1]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithInt:INT16_MAX]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithInt:INT16_MIN]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSRowHeightBinding]) { - NSNumber *valueOne = [NSNumber numberWithInt:1]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:valueOne]]; - value = [NSNumber numberWithInt:0]; - id value2 = [NSNumber numberWithInt:INT16_MIN]; - // Row height no longer accepts <= 0 values on SnowLeopard - // which is a good thing. - if ([GTMSystemVersion isSnowLeopardOrGreater]) { - [array addObject:[GTMBindingUnitTestData testWithValue:value - expecting:valueOne]]; - - [array addObject:[GTMBindingUnitTestData testWithValue:value2 - expecting:valueOne]]; - } else { - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value2]]; - } - value = [NSNumber numberWithInt:INT16_MAX]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSMaxValueBinding] || - [binding isEqualToString:NSMaxWidthBinding] || - [binding isEqualToString:NSMinValueBinding] || - [binding isEqualToString:NSMinWidthBinding] || - [binding isEqualToString:NSContentWidthBinding] || - [binding isEqualToString:NSContentHeightBinding] || - [binding isEqualToString:NSWidthBinding] || - [binding isEqualToString:NSAnimationDelayBinding]) { - // NSAnimationDelay is deprecated on SnowLeopard. We continue to test it - // to make sure it doesn't get broken. - - // This handles all float value bindings - value = [NSNumber numberWithFloat:0]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithFloat:FLT_MAX]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithFloat:-FLT_MAX]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithFloat:FLT_MIN]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithFloat:-FLT_MIN]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithFloat:FLT_EPSILON]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSNumber numberWithFloat:-FLT_EPSILON]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSTextColorBinding]) { - // This handles all color value bindings - value = [NSColor colorWithCalibratedWhite:1.0 alpha:1.0]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSColor colorWithCalibratedWhite:1.0 alpha:0.0]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSColor colorWithCalibratedWhite:1.0 alpha:0.5]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSColor colorWithCalibratedRed:0.5 green:0.5 blue:0.5 alpha:0.5]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSColor colorWithDeviceCyan:0.25 magenta:0.25 yellow:0.25 - black:0.25 alpha:0.25]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSFontBinding]) { - // This handles all font value bindings - value = [NSFont boldSystemFontOfSize:[NSFont systemFontSize]]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSFont toolTipsFontOfSize:[NSFont smallSystemFontSize]]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - value = [NSFont labelFontOfSize:144.0]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSRecentSearchesBinding] || - [binding isEqualToString:NSSortDescriptorsBinding]) { - // This handles all array value bindings - value = [NSArray array]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else if ([binding isEqualToString:NSTargetBinding]) { - value = [NSNull null]; - [array addObject:[GTMBindingUnitTestData testWithIdentityValue:value]]; - } else { - _GTMDevLog(@"Skipped Binding: %@ for %@", binding, self); // COV_NF_LINE - } - return array; -} - -- (BOOL)gtm_unitTestIsEqualTo:(id)value { - return [self isEqualTo:value]; -} - -@end - -#pragma mark - -#pragma mark All the special AppKit Bindings issues below - -@interface NSImage (GTMBindingUnitTestingAdditions) -@end - -@implementation NSImage (GTMBindingUnitTestingAdditions) -- (BOOL)gtm_unitTestIsEqualTo:(id)value { - // NSImage just does pointer equality in the default isEqualTo implementation - // we need something a little more heavy duty that actually compares the - // images internally. - return [[self TIFFRepresentation] isEqualTo:[value TIFFRepresentation]]; -} -@end - -@interface NSScroller (GTMBindingUnitTestingAdditions) -@end - -@implementation NSScroller (GTMBindingUnitTestingAdditions) -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - if (major <= 10 && minor <= 5 && bugFix <= 5) { - // rdar://5849154 - NSScroller exposes binding with no value - // class for NSValueBinding - [array addObject:NSValueBinding]; - } - if (major <= 10 && minor <= 6) { - // Broken on SnowLeopard and below - // rdar://5849236 - NSScroller exposes binding for NSFontBinding - [array addObject:NSFontBinding]; - } - return array; -} -@end - -@interface NSTextField (GTMBindingUnitTestingAdditions) -@end - -@implementation NSTextField (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - // Not KVC Compliant - for (int i = 0; i < 10; i++) { - [array addObject:[NSString stringWithFormat:@"displayPatternValue%d", i]]; - } - return array; -} - -- (NSMutableArray *)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { - NSMutableArray *array = [super gtm_unitTestExposedBindingsTestValues:binding]; - if ([binding isEqualToString:NSAlignmentBinding]) { - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - if (major <= 10 && minor <= 6) { - // rdar://5851487 - If NSAlignmentBinding for a NSTextField is set to -1 - // and then got it returns 7 - NSNumber *textAlignment = [NSNumber numberWithInt:NSNaturalTextAlignment]; - GTMBindingUnitTestData *dataToRemove = - [GTMBindingUnitTestData testWithValue:[NSNumber numberWithInt:-1] - expecting:textAlignment]; - [array removeObject:dataToRemove]; - GTMBindingUnitTestData *dataToAdd = - [GTMBindingUnitTestData testWithValue:[NSNumber numberWithInt:-1] - expecting:[NSNumber numberWithInt:7]]; - [array addObject:dataToAdd]; - } - } - return array; -} -@end - -@interface NSSearchField (GTMBindingUnitTestingAdditions) -@end - -@implementation NSSearchField (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - if (major <= 10 && minor <= 6) { - // rdar://5851491 - Setting NSAlignmentBinding of search field to - // NSCenterTextAlignment broken - // Broken on 10.6 and below. - [array addObject:NSAlignmentBinding]; - } - // Not KVC Compliant - [array addObject:NSPredicateBinding]; - return array; -} - -@end - -@interface NSWindow (GTMBindingUnitTestingAdditions) -@end - -@implementation NSWindow (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - // Not KVC Compliant - [array addObject:NSContentWidthBinding]; - [array addObject:NSContentHeightBinding]; - for (int i = 0; i < 10; i++) { - [array addObject:[NSString stringWithFormat:@"displayPatternTitle%d", i]]; - } - return array; -} - -@end - -@interface NSBox (GTMBindingUnitTestingAdditions) -@end - -@implementation NSBox (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - // Not KVC Compliant - for (int i = 0; i < 10; i++) { - [array addObject:[NSString stringWithFormat:@"displayPatternTitle%d", i]]; - } - return array; -} - -@end - -@interface NSTableView (GTMBindingUnitTestingAdditions) -@end - -@implementation NSTableView (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - if (major <= 10 && minor <= 6) { - // rdar://6288332 - NSTableView does not respond to NSFontBinding - // Broken on 10.5 and SnowLeopard - [array addObject:NSFontBinding]; - } - // Not KVC Compliant - [array addObject:NSContentBinding]; - [array addObject:NSDoubleClickTargetBinding]; - [array addObject:NSDoubleClickArgumentBinding]; - [array addObject:NSSelectionIndexesBinding]; - return array; -} - -@end - -@interface NSTextView (GTMBindingUnitTestingAdditions) -@end - -@implementation NSTextView (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - if (major <= 10 && minor <= 6) { - //rdar://5849335 - NSTextView only partially KVC compliant for key - // NSAttributedStringBinding - [array addObject:NSAttributedStringBinding]; - } - // Not KVC Compliant - [array addObject:NSDataBinding]; - [array addObject:NSValueURLBinding]; - [array addObject:NSValuePathBinding]; - return array; -} - -@end - -@interface NSTabView (GTMBindingUnitTestingAdditions) -@end - -@implementation NSTabView (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - if (major <= 10 && minor <= 6) { - // rdar://5849248 - NSTabView exposes binding with no value class - // for NSSelectedIdentifierBinding - [array addObject:NSSelectedIdentifierBinding]; - } - // Not KVC Compliant - [array addObject:NSSelectedIndexBinding]; - [array addObject:NSSelectedLabelBinding]; - return array; -} - -@end - -@interface NSButton (GTMBindingUnitTestingAdditions) -@end - -@implementation NSButton (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - // Not KVC Compliant - [array addObject:NSArgumentBinding]; - return array; -} - -@end - -@interface NSProgressIndicator (GTMBindingUnitTestingAdditions) -@end - -@implementation NSProgressIndicator (GTMBindingUnitTestingAdditions) - -- (NSMutableArray*)gtm_unitTestExposedBindingsToIgnore { - NSMutableArray *array = [super gtm_unitTestExposedBindingsToIgnore]; - // Not KVC Compliant - [array addObject:NSAnimateBinding]; - return array; -} - -@end diff --git a/UnitTesting/GTMNSObject+UnitTesting.h b/UnitTesting/GTMNSObject+UnitTesting.h deleted file mode 100644 index e98828a..0000000 --- a/UnitTesting/GTMNSObject+UnitTesting.h +++ /dev/null @@ -1,430 +0,0 @@ -// -// GTMNSObject+UnitTesting.h -// -// Utilities for doing advanced unittesting with objects. -// -// 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 "GTMDefines.h" -#import <Foundation/Foundation.h> - -#if GTM_MACOS_SDK -#import <ApplicationServices/ApplicationServices.h> -#elif GTM_IPHONE_SDK -#import <CoreGraphics/CoreGraphics.h> -#endif - -#import "GTMSenTestCase.h" - -// NOTE: for "arch" in the file names on iOS, it is not CPU (armv6, armv7), but -// instead is "iPhone" or "iPad" for the device form factor. - -// Utility functions for GTMAssert* Macros. Don't use them directly -// but use the macros below instead -BOOL GTMIsObjectImageEqualToImageNamed(id object, - NSString *filename, - NSString **error); -BOOL GTMIsObjectStateEqualToStateNamed(id object, - NSString *filename, - NSString **error); - -// Fails when image of |a1| does not equal image in image file named |a2| -// -// Generates a failure when the unittest image of |a1| is not equal to the -// image stored in the image file named |a2|, or |a2| does not exist in the -// executable code's bundle. -// If |a2| does not exist in the executable code's bundle, we save a image -// representation of |a1| in the save directory with name |a2|. This can then -// be included in the bundle as the master to test against. -// If |a2| != |a1|, we save a image representation of |a1| in the save -// directory named |a2|_Failed and a file named |a2|_Failed_Diff showing the -// diff in red so that we can see what has changed. -// See pathForImageNamed to see how name is searched for. -// The save directory is specified by +gtm_setUnitTestSaveToDirectory, and is -// the desktop by default. -// Implemented as a macro to match the rest of the SenTest macros. -// -// Args: -// a1: The object to be checked. Must implement the -createUnitTestImage method. -// a2: The name of the image file to check against. -// Do not include the extension -// description: A format string as in the printf() function. -// Can be nil or an empty string but must be present. -// ...: A variable number of arguments to the format string. Can be absent. -// -#define GTMAssertObjectImageEqualToImageNamed(a1, a2, description, ...) \ -do { \ - id a1Object = (a1); \ - NSString* a2String = (a2); \ - NSString *failString = nil; \ - BOOL isGood = GTMIsObjectImageEqualToImageNamed(a1Object, a2String, &failString); \ - if (!isGood) { \ - if (description != nil) { \ - STFail(@"%@: %@", failString, STComposeString(description, ##__VA_ARGS__)); \ - } else { \ - STFail(@"%@", failString); \ - } \ - } \ -} while(0) - -// Fails when state of |a1| does not equal state in file |a2| -// -// Generates a failure when the unittest state of |a1| is not equal to the -// state stored in the state file named |a2|, or |a2| does not exist in the -// executable code's bundle. -// If |a2| does not exist in the executable code's bundle, we save a state -// representation of |a1| in the save directiry with name |a2|. This can then -// be included in the bundle as the master to test against. -// If |a2| != |a1|, we save a state representation of |a1| in the save -// directory with name |a2|_Failed so that we can compare the two files to see -// what has changed. -// The save directory is specified by +gtm_setUnitTestSaveToDirectory, and is -// the desktop by default. -// Implemented as a macro to match the rest of the SenTest macros. -// -// Args: -// a1: The object to be checked. Must implement the -createUnitTestImage method. -// a2: The name of the state file to check against. -// Do not include the extension -// description: A format string as in the printf() function. -// Can be nil or an empty string but must be present. -// ...: A variable number of arguments to the format string. Can be absent. -// -#define GTMAssertObjectStateEqualToStateNamed(a1, a2, description, ...) \ -do { \ - id a1Object = (a1); \ - NSString* a2String = (a2); \ - NSString *failString = nil; \ - BOOL isGood = GTMIsObjectStateEqualToStateNamed(a1Object, a2String, &failString); \ - if (!isGood) { \ - if (description != nil) { \ - STFail(@"%@: %@", failString, STComposeString(description, ##__VA_ARGS__)); \ - } else { \ - STFail(@"%@", failString); \ - } \ - } \ -} while(0); - -// test both GTMAssertObjectImageEqualToImageNamed and GTMAssertObjectStateEqualToStateNamed -// -// Combines the above two macros into a single ubermacro for comparing -// both state and image. When only the best will do... -#define GTMAssertObjectEqualToStateAndImageNamed(a1, a2, description, ...) \ -do { \ - GTMAssertObjectImageEqualToImageNamed(a1, a2, description, ##__VA_ARGS__); \ - GTMAssertObjectStateEqualToStateNamed(a1, a2, description, ##__VA_ARGS__); \ -} while (0) - -// Create a CGBitmapContextRef appropriate for using in creating a unit test -// image. If data is non-NULL, returns the buffer that the bitmap is -// using for it's underlying storage. You must free this buffer using -// free. If data is NULL, uses it's own internal storage. -// Defined as a C function instead of an obj-c method because you have to -// release the CGContextRef that is returned. -// -// Returns: -// an CGContextRef of the object. Caller must release - -CGContextRef GTMCreateUnitTestBitmapContextOfSizeWithData(CGSize size, - unsigned char **data); - -// GTMUnitTestingImaging protocol is for objects which need to save their -// image for using with the unit testing categories -@protocol GTMUnitTestingImaging -// Create a CGImageRef containing a representation suitable for use in -// comparing against a master image. -// -// Returns: -// an CGImageRef of the object. -- (CGImageRef)gtm_unitTestImage; -@end - -// GTMUnitTestingEncoding protocol is for objects which need to save their -// "state" for using with the unit testing categories -@protocol GTMUnitTestingEncoding -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. Encode data in the coder in the same -// manner that you would encode data in any other Keyed NSCoder subclass. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder; -@end - -// Category for saving and comparing object state and image for unit tests -// -// The GTMUnitTestAdditions category gives object the ability to store their -// state for use in unittesting in two different manners. -// 1) Objects can elect to save their "image" that we can compare at -// runtime to an image file to make sure that the representation hasn't -// changed. All views and Windows can save their image. In the case of Windows, -// they are "bluescreened" so that any transparent areas can be compared between -// machines. -// 2) Objects can elect to save their "state". State is the attributes that we -// want to verify when running unit tests. Applications, Windows, Views, -// Controls and Cells currently return a variety of state information. If you -// want to customize the state information that a particular object returns, you -// can do it via the GTMUnitTestingEncodedObjectNotification. Items that have -// delegates (Applications/Windows) can also have their delegates return state -// information if appropriate via the unitTestEncoderDidEncode:inCoder: delegate -// method. -// To compare state/image in your unit tests, you can use the three macros above -// GTMAssertObjectStateEqualToStateNamed, GTMAssertObjectImageEqualToImageNamed and -// GTMAssertObjectEqualToStateAndImageNamed. -@interface NSObject (GTMUnitTestingAdditions) <GTMUnitTestingEncoding> -// Allows you to control where the unit test utilities save any files -// (image or state) that they create on your behalf. By default they -// will save to the desktop. -+ (void)gtm_setUnitTestSaveToDirectory:(NSString*)path; -+ (NSString *)gtm_getUnitTestSaveToDirectory; - -// Checks to see that system settings are valid for doing an image comparison. -// Most of these are set by our unit test app. See the unit test app main.m -// for details. -// -// Returns: -// YES if we can do image comparisons for this object type. -- (BOOL)gtm_areSystemSettingsValidForDoingImage; - -// Return the type of image to work with. Only valid types on the iPhone -// are kUTTypeJPEG and kUTTypePNG. MacOS supports several more. -- (CFStringRef)gtm_imageUTI; - -// Return the extension to be used for saving unittest images -// -// Returns -// An extension (e.g. "png") -- (NSString*)gtm_imageExtension; - -// Return image data in the format expected for gtm_imageExtension -// So for a "png" extension I would expect "png" data -// -// Returns -// NSData for image -- (NSData*)gtm_imageDataForImage:(CGImageRef)image; - -// Save the unitTestImage to a image file with name -// |name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension -// in the save folder (desktop by default) -// -// Args: -// name: The name for the image file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToImageNamed:(NSString*)name; - -// Save unitTestImage of |self| to an image file at path |path|. -// All non-drawn areas will be transparent. -// -// Args: -// name: The name for the image file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToImageAt:(NSString*)path; - -// Compares unitTestImage of |self| to the image located at |path| -// -// Args: -// path: the path to the image file you want to compare against. -// If diff is non-nil, it will contain an auto-released diff of the images. -// -// Returns: -// YES if they are equal, NO is they are not -// If diff is non-nil, it will contain a diff of the images. Must -// be released by caller. -// -- (BOOL)gtm_compareWithImageAt:(NSString*)path diffImage:(CGImageRef*)diff; - -// Find the path for a image by name in your bundle. -// Searches for the following: -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.OSVersionBugFix.arch.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.arch.extension" -// "name.CompilerSDK.OSVersionMajor.arch.extension" -// "name.CompilerSDK.arch.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.OSVersionBugFix.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.extension" -// "name.CompilerSDK.OSVersionMajor.extension" -// "name.CompilerSDK.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersionBugFix.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.arch.extension" -// "name.OSVersionMajor.arch.extension" -// "name.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersionBugFix.extension" -// "name.OSVersionMajor.OSVersionMinor.extension" -// "name.OSVersionMajor.extension" -// "name.extension" -// Do not include the extension on your name. -// -// Args: -// name: The name for the image file you would like to find. -// -// Returns: -// the path if the image exists in your bundle -// or nil if no image to be found -// -- (NSString *)gtm_pathForImageNamed:(NSString*)name; - -// Generates a CGImageRef from the image at |path| -// Args: -// path: The path to the image. -// -// Returns: -// An autoreleased CGImageRef own, or nil if no image at path -- (CGImageRef)gtm_imageWithContentsOfFile:(NSString*)path; - -// Generates a path for a image in the save directory, which is desktop -// by default. -// Path will be: -// SaveDir/|name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension -// -// Args: -// name: The name for the image file you would like to generate a path for. -// -// Returns: -// the path -// -- (NSString *)gtm_saveToPathForImageNamed:(NSString*)name; - -// Gives us a representation of unitTestImage of |self|. -// -// Returns: -// a representation if successful -// nil if failed -// -- (NSData *)gtm_imageRepresentation; - -// Return the extension to be used for saving unittest states -// -// Returns -// An extension (e.g. "gtmUTState") -- (NSString*)gtm_stateExtension; - -// Save the encoded unit test state to a state file with name -// |name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension -// in the save folder (desktop by default) -// -// Args: -// name: The name for the state file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToStateNamed:(NSString*)name; - -// Save encoded unit test state of |self| to a state file at path |path|. -// -// Args: -// name: The name for the state file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToStateAt:(NSString*)path; - -// Compares encoded unit test state of |self| to the state file located at |path| -// -// Args: -// path: the path to the state file you want to compare against. -// -// Returns: -// YES if they are equal, NO is they are not -// -- (BOOL)gtm_compareWithStateAt:(NSString*)path; - - -// Find the path for a state by name in your bundle. -// Searches for: -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.OSVersionBugFix.arch.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.arch.extension" -// "name.CompilerSDK.OSVersionMajor.arch.extension" -// "name.CompilerSDK.arch.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.OSVersionBugFix.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.extension" -// "name.CompilerSDK.OSVersionMajor.extension" -// "name.CompilerSDK.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersionBugFix.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.arch.extension" -// "name.OSVersionMajor.arch.extension" -// "name.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersionBugFix.extension" -// "name.OSVersionMajor.OSVersionMinor.extension" -// "name.OSVersionMajor.extension" -// "name.extension" -// Do not include the extension on your name. -// -// Args: -// name: The name for the state file you would like to find. -// -// Returns: -// the path if the state exists in your bundle -// or nil if no state to be found -// -- (NSString *)gtm_pathForStateNamed:(NSString*)name; - -// Generates a path for a state in the save directory, which is desktop -// by default. -// Path will be: -// SaveDir/|name|.arch.OSVersionMajor.OSVersionMinor.OSVersionBugfix.extension -// -// Args: -// name: The name for the state file you would like to generate a path for. -// -// Returns: -// the path -// -- (NSString *)gtm_saveToPathForStateNamed:(NSString*)name; - -// Gives us the encoded unit test state for |self| -// -// Returns: -// the encoded state if successful -// nil if failed -// -- (NSDictionary *)gtm_stateRepresentation; - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. Encode data in the coder in the same -// manner that you would encode data in any other Keyed NSCoder subclass. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder; -@end - -// Informal protocol for delegates that wanst to be able to add state info -// when state info is collected for their "owned" objects -@interface NSObject (GTMUnitTestingEncodingAdditions) -// Delegate function for unit test objects that have delegates. Delegates have -// the option of encoding more data into the coder to store their state for -// unittest usage. -- (void)gtm_unitTestEncoderWillEncode:(id)sender inCoder:(NSCoder*)inCoder; -@end - -// Whenever an object is encoded by the unit test encoder, it send out a -// notification so that objects who want to add data to the encoded objects unit -// test state can do so. The Coder will be in the userInfo dictionary for the -// notification under the GTMUnitTestingEncoderKey key. -GTM_EXTERN NSString *const GTMUnitTestingEncodedObjectNotification; - -// Key for finding the encoder in the userInfo dictionary for -// GTMUnitTestingEncodedObjectNotification notifications. -GTM_EXTERN NSString *const GTMUnitTestingEncoderKey; diff --git a/UnitTesting/GTMNSObject+UnitTesting.m b/UnitTesting/GTMNSObject+UnitTesting.m deleted file mode 100644 index 5b60a6d..0000000 --- a/UnitTesting/GTMNSObject+UnitTesting.m +++ /dev/null @@ -1,1047 +0,0 @@ -// -// GTMNSObject+UnitTesting.m -// -// An informal protocol for doing advanced unittesting with objects. -// -// 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 "GTMNSObject+UnitTesting.h" -#import "GTMSystemVersion.h" - -#if GTM_IPHONE_SDK -#import <UIKit/UIKit.h> -#else -#import <AppKit/AppKit.h> -#endif - -NSString *const GTMUnitTestingEncodedObjectNotification - = @"GTMUnitTestingEncodedObjectNotification"; -NSString *const GTMUnitTestingEncoderKey = @"GTMUnitTestingEncoderKey"; - -#if GTM_IPHONE_SDK -// No UTIs on iPhone. Only two we need. -const CFStringRef kUTTypePNG = CFSTR("public.png"); -const CFStringRef kUTTypeJPEG = CFSTR("public.jpeg"); -#endif - -// This class exists so that we can locate our bundle using [NSBundle -// bundleForClass:]. We don't use [NSBundle mainBundle] because when we are -// being run as a unit test, we aren't the mainBundle -@interface GTMUnitTestingAdditionsBundleFinder : NSObject { - // Nothing here -} -// or here -@end - -@implementation GTMUnitTestingAdditionsBundleFinder -// Nothing here. We're just interested in the name for finding our bundle. -@end - -#if GTM_IPHONE_SDK -static NSString *iOS_Idiom(void) { - UIUserInterfaceIdiom idiom; -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_2 - idiom = [[UIDevice currentDevice] userInterfaceIdiom]; -#else - idiom = UI_USER_INTERFACE_IDIOM(); -#endif - if (idiom == UIUserInterfaceIdiomPad) { - return @"iPad"; - } - _GTMDevAssert((idiom == UIUserInterfaceIdiomPhone), - @"unknown idiom %zd", idiom); - return @"iPhone"; -} -#endif // GTM_IPHONE_SDK - -BOOL GTMIsObjectImageEqualToImageNamed(id object, - NSString* filename, - NSString **error) { - NSString *failString = nil; - if (error) { - *error = nil; - } - BOOL isGood = [object respondsToSelector:@selector(gtm_unitTestImage)]; - if (isGood) { - if ([object gtm_areSystemSettingsValidForDoingImage]) { - NSString *aPath = [object gtm_pathForImageNamed:filename]; - CGImageRef diff = nil; - isGood = aPath != nil; - if (isGood) { - isGood = [object gtm_compareWithImageAt:aPath diffImage:&diff]; - } - if (!isGood) { - if (aPath) { - filename = [filename stringByAppendingString:@"_Failed"]; - } - BOOL aSaved = [object gtm_saveToImageNamed:filename]; - NSString *fileNameWithExtension - = [NSString stringWithFormat:@"%@.%@", - filename, [object gtm_imageExtension]]; - NSString *fullSavePath = [object gtm_saveToPathForImageNamed:filename]; - if (NO == aSaved) { - if (!aPath) { - failString = [NSString stringWithFormat:@"File %@ did not exist in " - @"bundle. Tried to save as %@ and failed.", - fileNameWithExtension, fullSavePath]; - } else { - failString = [NSString stringWithFormat:@"Object image different " - @"than file %@. Tried to save as %@ and failed.", - aPath, fullSavePath]; - } - } else { - if (!aPath) { - failString = [NSString stringWithFormat:@"File %@ did not exist in " - @" bundle. Saved to %@", fileNameWithExtension, - fullSavePath]; - } else { - NSString *diffPath = [filename stringByAppendingString:@"_Diff"]; - diffPath = [object gtm_saveToPathForImageNamed:diffPath]; - NSData *data = nil; - if (diff) { - data = [object gtm_imageDataForImage:diff]; - } - if ([data writeToFile:diffPath atomically:YES]) { - failString = [NSString stringWithFormat:@"Object image different " - @"than file\n%@\nSaved image to\n%@\n" - @"Saved diff to\n%@\n", - aPath, fullSavePath, diffPath]; - } else { - failString = [NSString stringWithFormat:@"Object image different " - @"than file\n%@\nSaved image to\n%@\nUnable to save " - @"diff. Most likely the image and diff are " - @"different sizes.", - aPath, fullSavePath]; - } - } - } - } - CGImageRelease(diff); - } else { - failString = @"systemSettings not valid for taking image"; // COV_NF_LINE - } - } else { - if (object == nil) { - failString = @"Testing a nil image."; - } else { - failString = @"Object does not conform to GTMUnitTestingImaging protocol"; - } - } - if (error) { - *error = failString; - } - return isGood; -} - -BOOL GTMIsObjectStateEqualToStateNamed(id object, - NSString* filename, - NSString **error) { - NSString *failString = nil; - if (error) { - *error = nil; - } - BOOL isGood = [object conformsToProtocol:@protocol(GTMUnitTestingEncoding)]; - if (isGood) { - NSString *aPath = [object gtm_pathForStateNamed:filename]; - isGood = aPath != nil; - if (isGood) { - isGood = [object gtm_compareWithStateAt:aPath]; - } - if (!isGood) { - if (aPath) { - filename = [filename stringByAppendingString:@"_Failed"]; - } - BOOL aSaved = [object gtm_saveToStateNamed:filename]; - NSString *fileNameWithExtension = [NSString stringWithFormat:@"%@.%@", - filename, [object gtm_stateExtension]]; - NSString *fullSavePath = [object gtm_saveToPathForStateNamed:filename]; - if (NO == aSaved) { - if (!aPath) { - failString = [NSString stringWithFormat:@"File %@ did not exist in " - @"bundle. Tried to save as %@ and failed.", - fileNameWithExtension, fullSavePath]; - } else { - failString = [NSString stringWithFormat:@"Object state different " - @"than file %@. Tried to save as %@ and failed.", - aPath, fullSavePath]; - } - } else { - if (!aPath) { - failString = [NSString stringWithFormat:@"File %@ did not exist in " - @ "bundle. Saved to %@", fileNameWithExtension, - fullSavePath]; - } else { - failString = [NSString stringWithFormat:@"Object state different " - @"than file %@. Saved to %@", aPath, fullSavePath]; - } - } - } - } else { - failString = @"Object does not conform to GTMUnitTestingEncoding protocol"; - } - if (error) { - *error = failString; - } - return isGood; -} - -CGContextRef GTMCreateUnitTestBitmapContextOfSizeWithData(CGSize size, - unsigned char **data) { - CGContextRef context = NULL; - size_t height = size.height; - size_t width = size.width; - size_t bytesPerRow = width * 4; - size_t bitsPerComponent = 8; - CGColorSpaceRef cs = NULL; -#if GTM_IPHONE_SDK - cs = CGColorSpaceCreateDeviceRGB(); -#else - cs = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); -#endif - _GTMDevAssert(cs, @"Couldn't create colorspace"); - CGBitmapInfo info - = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault; - if (data) { - *data = (unsigned char*)calloc(bytesPerRow, height); - _GTMDevAssert(*data, @"Couldn't create bitmap"); - } - context = CGBitmapContextCreate(data ? *data : NULL, width, height, - bitsPerComponent, bytesPerRow, cs, info); - _GTMDevAssert(context, @"Couldn't create an context"); - if (!data) { - CGContextClearRect(context, CGRectMake(0, 0, size.width, size.height)); - } - CGContextSetRenderingIntent(context, kCGRenderingIntentRelativeColorimetric); - CGContextSetInterpolationQuality(context, kCGInterpolationNone); - CGContextSetShouldAntialias(context, NO); - CGContextSetAllowsAntialiasing(context, NO); - CGContextSetShouldSmoothFonts(context, NO); - CGColorSpaceRelease(cs); - return context; -} - -@interface NSObject (GTMUnitTestingAdditionsPrivate) -/// Find the path for a file named name.extension in your bundle. -// Searches for the following: -// "name.extension", -// "name.arch.extension", -// "name.arch.OSVersionMajor.extension" -// "name.arch.OSVersionMajor.OSVersionMinor.extension" -// "name.arch.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.extension" -// "name.arch.OSVersionMajor.extension" -// "name.OSVersionMajor.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.arch.extension" -// "name.OSVersionMajor.extension" -// "name.OSVersionMajor.OSVersionMinor.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersion.bugfix.extension" -// Do not include the ".extension" extension on your name. -// -// Args: -// name: The name for the file you would like to find. -// extension: the extension for the file you would like to find -// -// Returns: -// the path if the file exists in your bundle -// or nil if no file is found -// -- (NSString *)gtm_pathForFileNamed:(NSString*)name - extension:(NSString*)extension; -- (NSString *)gtm_saveToPathForFileNamed:(NSString*)name - extension:(NSString*)extension; -- (CGImageRef)gtm_unitTestImage; -// Returns nil if there is no override -- (NSString *)gtm_getOverrideDefaultUnitTestSaveToDirectory; -@end - -// This is a keyed coder for storing unit test state data. It is used only by -// the GTMUnitTestingAdditions category. Most of the work is done in -// encodeObject:forKey:. -@interface GTMUnitTestingKeyedCoder : NSCoder { - NSMutableDictionary *dictionary_; // storage for data (STRONG) -} - -// get the data stored in coder. -// -// Returns: -// NSDictionary with currently stored data. -- (NSDictionary*)dictionary; -@end - -// Small utility function for checking to see if a is b +/- 1. -GTM_INLINE BOOL almostEqual(unsigned char a, unsigned char b) { - unsigned char diff = a > b ? a - b : b - a; - BOOL notEqual = diff < 2; - return notEqual; -} - -@implementation GTMUnitTestingKeyedCoder - -// Set up storage for coder. Stores type and version. -// Version 1 -// -// Returns: -// self -- (id)init { - self = [super init]; - if (self != nil) { - dictionary_ = [[NSMutableDictionary alloc] initWithCapacity:2]; - [dictionary_ setObject:@"GTMUnitTestingArchive" forKey:@"$GTMArchive"]; - - // Version number can be changed here. - [dictionary_ setObject:[NSNumber numberWithInt:1] forKey:@"$GTMVersion"]; - } - return self; -} - -// Standard dealloc -- (void)dealloc { - [dictionary_ release]; - [super dealloc]; -} - -// Utility function for checking for a key value. We don't want duplicate keys -// in any of our dictionaries as we may be writing over data stored by previous -// objects. -// -// Arguments: -// key - key to check for in dictionary -- (void)checkForKey:(NSString*)key { - _GTMDevAssert(![dictionary_ objectForKey:key], - @"Key already exists for %@", key); -} - -// Key routine for the encoder. We store objects in our dictionary based on -// their key. As we encode objects we send out notifications to let other -// classes doing tests add their specific data to the base types. If we can't -// encode the object (it doesn't support gtm_unitTestEncodeState) and we don't -// get any info back from the notifier, we attempt to store it's description. -// -// Arguments: -// objv - object to be encoded -// key - key to encode it with -// -- (void)encodeObject:(id)objv forKey:(NSString *)key { - // Sanity checks - if (!objv) return; - [self checkForKey:key]; - - // Set up a new dictionary for the current object - NSMutableDictionary *curDictionary = dictionary_; - dictionary_ = [[NSMutableDictionary alloc] initWithCapacity:0]; - - // If objv responds to gtm_unitTestEncodeState get it to record - // its data. - if ([objv respondsToSelector:@selector(gtm_unitTestEncodeState:)]) { - [objv gtm_unitTestEncodeState:self]; - } - - // We then send out a notification to let other folks - // add data for this object - NSDictionary *notificationDict - = [NSDictionary dictionaryWithObject:self forKey:GTMUnitTestingEncoderKey]; - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc postNotificationName:GTMUnitTestingEncodedObjectNotification - object:objv - userInfo:notificationDict]; - - // If we got anything from the object, or from the notification, store it in - // our dictionary. Otherwise store the description. - if ([dictionary_ count] > 0) { - [curDictionary setObject:dictionary_ forKey:key]; - } else { - NSString *description = [objv description]; - // If description has a pointer value in it, we don't want to store it - // as the pointer value can change from run to run - if (description && [description rangeOfString:@"0x"].length == 0) { - [curDictionary setObject:description forKey:key]; - } else { - _GTMDevAssert(NO, @"Unable to encode forKey: %@", key); // COV_NF_LINE - } - } - [dictionary_ release]; - dictionary_ = curDictionary; -} - -// Basic encoding methods for POD types. -// -// Arguments: -// *v - value to encode -// key - key to encode it in - -- (void)encodeBool:(BOOL)boolv forKey:(NSString *)key { - [self checkForKey:key]; - [dictionary_ setObject:[NSNumber numberWithBool:boolv] forKey:key]; -} - -- (void)encodeInt:(int)intv forKey:(NSString *)key { - [self checkForKey:key]; - [dictionary_ setObject:[NSNumber numberWithInt:intv] forKey:key]; -} - -- (void)encodeInt32:(int32_t)intv forKey:(NSString *)key { - [self checkForKey:key]; - [dictionary_ setObject:[NSNumber numberWithLong:intv] forKey:key]; -} - -- (void)encodeInt64:(int64_t)intv forKey:(NSString *)key { - [self checkForKey:key]; - [dictionary_ setObject:[NSNumber numberWithLongLong:intv] forKey:key]; -} - -- (void)encodeFloat:(float)realv forKey:(NSString *)key { - [self checkForKey:key]; - [dictionary_ setObject:[NSNumber numberWithFloat:realv] forKey:key]; -} - -- (void)encodeDouble:(double)realv forKey:(NSString *)key { - [self checkForKey:key]; - [dictionary_ setObject:[NSNumber numberWithDouble:realv] forKey:key]; -} - -- (void)encodeBytes:(const uint8_t *)bytesp - length:(NSUInteger)lenv - forKey:(NSString *)key { - [self checkForKey:key]; - [dictionary_ setObject:[NSData dataWithBytes:bytesp - length:lenv] - forKey:key]; -} - -// Get our storage back as an NSDictionary -// -// Returns: -// NSDictionary containing our encoded info --(NSDictionary*)dictionary { - return [[dictionary_ retain] autorelease]; -} - -@end - -static NSString *gGTMUnitTestSaveToDirectory = nil; - -@implementation NSObject (GTMUnitTestingAdditions) - -+ (void)gtm_setUnitTestSaveToDirectory:(NSString*)path { - @synchronized([self class]) { - [gGTMUnitTestSaveToDirectory autorelease]; - gGTMUnitTestSaveToDirectory = [path copy]; - } -} - -+ (NSString *)gtm_getUnitTestSaveToDirectory { - NSString *result = nil; - @synchronized([self class]) { - if (!gGTMUnitTestSaveToDirectory) { -#if GTM_IPHONE_SDK - // About the only thing safe for the sandbox is the documents directory. - NSArray *documentsDirs - = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, - NSUserDomainMask, YES); - gGTMUnitTestSaveToDirectory = [documentsDirs objectAtIndex:0]; -#else - NSArray *desktopDirs - = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, - NSUserDomainMask, - YES); - gGTMUnitTestSaveToDirectory = [desktopDirs objectAtIndex:0]; -#endif - // Did we get overridden? - NSString *override = [self gtm_getOverrideDefaultUnitTestSaveToDirectory]; - if (override) { - gGTMUnitTestSaveToDirectory = override; - } - [gGTMUnitTestSaveToDirectory retain]; - } - result = gGTMUnitTestSaveToDirectory; - } - - return result; -} - -// Return nil if there is no override -- (NSString *)gtm_getOverrideDefaultUnitTestSaveToDirectory { - NSString *result = nil; - - // If we have an environment variable that ends in "BUILD_NUMBER" odds are - // we're on an automated build system, so use the build products dir as an - // override instead of writing on the desktop. - NSDictionary *env = [[NSProcessInfo processInfo] environment]; - NSString *key; - GTM_FOREACH_KEY(key, env) { - if ([key hasSuffix:@"BUILD_NUMBER"]) { - break; - } - } - if (key) { - result = [env objectForKey:@"BUILT_PRODUCTS_DIR"]; - } - - if (result && [result length] == 0) { - result = nil; - } - return result; -} - -/// Find the path for a file named name.extension in your bundle. -// Searches for the following: -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.OSVersionBugFix.arch.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.arch.extension" -// "name.CompilerSDK.OSVersionMajor.arch.extension" -// "name.CompilerSDK.arch.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.OSVersionBugFix.extension" -// "name.CompilerSDK.OSVersionMajor.OSVersionMinor.extension" -// "name.CompilerSDK.OSVersionMajor.extension" -// "name.CompilerSDK.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersionBugFix.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.arch.extension" -// "name.OSVersionMajor.arch.extension" -// "name.arch.extension" -// "name.OSVersionMajor.OSVersionMinor.OSVersionBugFix.extension" -// "name.OSVersionMajor.OSVersionMinor.extension" -// "name.OSVersionMajor.extension" -// "name.extension" -// Do not include the ".extension" extension on your name. -// -// Args: -// name: The name for the file you would like to find. -// extension: the extension for the file you would like to find -// -// Returns: -// the path if the file exists in your bundle -// or nil if no file is found -// -- (NSString *)gtm_pathForFileNamed:(NSString*)name - extension:(NSString*)extension { - NSString *thePath = nil; - Class bundleClass = [GTMUnitTestingAdditionsBundleFinder class]; - NSBundle *myBundle = [NSBundle bundleForClass:bundleClass]; - _GTMDevAssert(myBundle, - @"Couldn't find bundle for class: %@ searching for file:%@.%@", - NSStringFromClass(bundleClass), name, extension); - // System Version - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - NSString *systemVersions[4]; - systemVersions[0] = [NSString stringWithFormat:@".%d.%d.%d", - (int)major, (int)minor, (int)bugFix]; - systemVersions[1] - = [NSString stringWithFormat:@".%d.%d", (int)major, (int)minor]; - systemVersions[2] = [NSString stringWithFormat:@".%d", (int)major]; - systemVersions[3] = @""; - // Architecture - NSString *architecture[2]; -#if GTM_IPHONE_SDK - architecture[0] - = [NSString stringWithFormat:@".%@", iOS_Idiom()]; -#else - architecture[0] - = [NSString stringWithFormat:@".%@", - [GTMSystemVersion runtimeArchitecture]]; -#endif - architecture[1] = @""; - // Compiler SDK - // Some times Apple changes how things work based on the SDK built against. - NSString *sdks[2]; -#if GTM_MACOS_SDK -# if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7 - sdks[0] = @".10_7_SDK"; -# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 - sdks[0] = @".10_6_SDK"; -# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - sdks[0] = @".10_5_SDK"; -# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4 - sdks[0] = @".10_4_SDK"; -# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_3 - sdks[0] = @".10_3_SDK"; -# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_2 - sdks[0] = @".10_2_SDK"; -# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_1 - sdks[0] = @".10_1_SDK"; -# else - sdks[0] = @".10_0_SDK"; -# endif -#else // !GTM_MACOS_SDK -# if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 - sdks[0] = @".5_0_SDK"; -# elif __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_3 - sdks[0] = @".4_3_SDK"; -# else - sdks[0] = @""; -# endif -#endif // GTM_MACOS_SDK - sdks[1] = @""; - - // Note that we are searching for the most exact match first. - for (size_t i = 0; - !thePath && i < sizeof(sdks) / sizeof(*sdks); - ++i) { - for (size_t j = 0; - !thePath && j < sizeof(architecture) / sizeof(*architecture); - j++) { - for (size_t k = 0; - !thePath && k < sizeof(systemVersions) / sizeof(*systemVersions); - k++) { - NSString *fullName = [NSString stringWithFormat:@"%@%@%@%@", - name, sdks[i], systemVersions[k], architecture[j]]; - thePath = [myBundle pathForResource:fullName ofType:extension]; - } - } - } - - return thePath; -} - -- (NSString *)gtm_saveToPathForFileNamed:(NSString*)name - extension:(NSString*)extension { -#if GTM_IPHONE_SDK - NSString *systemArchitecture = iOS_Idiom(); -#else - NSString *systemArchitecture = [GTMSystemVersion runtimeArchitecture]; -#endif - - SInt32 major, minor, bugFix; - [GTMSystemVersion getMajor:&major minor:&minor bugFix:&bugFix]; - - // We don't include the CompilerSDK in here because it is not something that - // that is commonly needed. - NSString *fullName = [NSString stringWithFormat:@"%@.%d.%d.%d.%@", - name, (int)major, (int)minor, (int)bugFix, systemArchitecture]; - - NSString *basePath = [[self class] gtm_getUnitTestSaveToDirectory]; - return [[basePath stringByAppendingPathComponent:fullName] - stringByAppendingPathExtension:extension]; -} - -#pragma mark UnitTestImage - -// Checks to see that system settings are valid for doing an image comparison. -// To be overridden by subclasses. -// Returns: -// YES if we can do image comparisons for this object type. -- (BOOL)gtm_areSystemSettingsValidForDoingImage { - return YES; -} - -- (CFStringRef)gtm_imageUTI { -#if GTM_IPHONE_SDK - return kUTTypePNG; -#else - // Currently can't use PNG on Leopard. (10.5.2) - // Radar:5844618 PNG importer/exporter in ImageIO is lossy - return kUTTypeTIFF; -#endif -} - -// Return the extension to be used for saving unittest images -// -// Returns -// An extension (e.g. "png") -- (NSString*)gtm_imageExtension { - CFStringRef uti = [self gtm_imageUTI]; -#if GTM_IPHONE_SDK - if (CFEqual(uti, kUTTypePNG)) { - return @"png"; - } else if (CFEqual(uti, kUTTypeJPEG)) { - return @"jpg"; - } else { - _GTMDevAssert(NO, @"Illegal UTI for iPhone"); - } - return nil; -#else - CFStringRef extension - = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassFilenameExtension); - _GTMDevAssert(extension, @"No extension for uti: %@", uti); - - return GTMCFAutorelease(extension); -#endif -} - -// Return image data in the format expected for gtm_imageExtension -// So for a "png" extension I would expect "png" data -// -// Returns -// NSData for image -- (NSData*)gtm_imageDataForImage:(CGImageRef)image { - NSData *data = nil; -#if GTM_IPHONE_SDK - // iPhone support - UIImage *uiImage = [UIImage imageWithCGImage:image]; - CFStringRef uti = [self gtm_imageUTI]; - if (CFEqual(uti, kUTTypePNG)) { - data = UIImagePNGRepresentation(uiImage); - } else if (CFEqual(uti, kUTTypeJPEG)) { - data = UIImageJPEGRepresentation(uiImage, 1.0f); - } else { - _GTMDevAssert(NO, @"Illegal UTI for iPhone"); - } -#else - data = [NSMutableData data]; - CGImageDestinationRef dest - = CGImageDestinationCreateWithData((CFMutableDataRef)data, - [self gtm_imageUTI], - 1, - NULL); - // LZW Compression for TIFF - NSDictionary *tiffDict - = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber gtm_numberWithUnsignedInteger:NSTIFFCompressionLZW], - (const NSString*)kCGImagePropertyTIFFCompression, - nil]; - NSDictionary *destProps - = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithFloat:1.0f], - (const NSString*)kCGImageDestinationLossyCompressionQuality, - tiffDict, - (const NSString*)kCGImagePropertyTIFFDictionary, - nil]; - CGImageDestinationAddImage(dest, image, (CFDictionaryRef)destProps); - CGImageDestinationFinalize(dest); - CFRelease(dest); -#endif - return data; - -} - -// Save the unitTestImage to an image file with name |name| at -// ~/Desktop/|name|.extension. -// -// Note: When running under Pulse automation output is redirected to the -// Pulse base directory. -// -// Args: -// name: The name for the image file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToImageNamed:(NSString*)name { - NSString *newPath = [self gtm_saveToPathForImageNamed:name]; - return [self gtm_saveToImageAt:newPath]; -} - -// Save unitTestImage of |self| to an image file at path |path|. -// -// Args: -// name: The name for the image file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToImageAt:(NSString*)path { - if (!path) return NO; - NSData *data = [self gtm_imageRepresentation]; - return [data writeToFile:path atomically:YES]; -} - -// Generates a CGImageRef from the image at |path| -// Args: -// path: The path to the image. -// -// Returns: -// A CGImageRef that you own, or nil if no image at path -- (CGImageRef)gtm_imageWithContentsOfFile:(NSString*)path { - CGImageRef imageRef = nil; -#if GTM_IPHONE_SDK - UIImage *image = [UIImage imageWithContentsOfFile:path]; - if (image) { - imageRef = CGImageRetain(image.CGImage); - } -#else - CFURLRef url = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)path, - kCFURLPOSIXPathStyle, NO); - if (url) { - CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, NULL); - CFRelease(url); - if (imageSource) { - imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); - CFRelease(imageSource); - } - } -#endif - return (CGImageRef)GTMCFAutorelease(imageRef); -} - -/// Compares unitTestImage of |self| to the image located at |path| -// -// Args: -// path: the path to the image file you want to compare against. -// If diff is non-nil, it will contain an auto-released diff of the images. -// -// Returns: -// YES if they are equal, NO is they are not -// If diff is non-nil, it will contain an auto-released diff of the images. -// -- (BOOL)gtm_compareWithImageAt:(NSString*)path diffImage:(CGImageRef*)diff { - BOOL answer = NO; - if (diff) { - *diff = nil; - } - CGImageRef fileRep = [self gtm_imageWithContentsOfFile:path]; - _GTMDevAssert(fileRep, @"Unable to create imagerep from %@", path); - - CGImageRef imageRep = [self gtm_unitTestImage]; - _GTMDevAssert(imageRep, @"Unable to create imagerep for %@", self); - - size_t fileHeight = CGImageGetHeight(fileRep); - size_t fileWidth = CGImageGetWidth(fileRep); - size_t imageHeight = CGImageGetHeight(imageRep); - size_t imageWidth = CGImageGetWidth(imageRep); - if (fileHeight == imageHeight && fileWidth == imageWidth) { - // if all the sizes are equal, run through the bytes and compare - // them for equality. - // Do an initial fast check, if this fails and the caller wants a - // diff, we'll do the slow path and create the diff. The diff path - // could be optimized, but probably not necessary at this point. - answer = YES; - - CGSize imageSize = CGSizeMake(fileWidth, fileHeight); - CGRect imageRect = CGRectMake(0, 0, fileWidth, fileHeight); - unsigned char *fileData; - unsigned char *imageData; - CGContextRef fileContext - = GTMCreateUnitTestBitmapContextOfSizeWithData(imageSize, &fileData); - _GTMDevAssert(fileContext, @"Unable to create filecontext"); - CGContextDrawImage(fileContext, imageRect, fileRep); - CGContextRef imageContext - = GTMCreateUnitTestBitmapContextOfSizeWithData(imageSize, &imageData); - _GTMDevAssert(imageContext, @"Unable to create imageContext"); - CGContextDrawImage(imageContext, imageRect, imageRep); - - size_t fileBytesPerRow = CGBitmapContextGetBytesPerRow(fileContext); - size_t imageBytesPerRow = CGBitmapContextGetBytesPerRow(imageContext); - size_t row, col; - - _GTMDevAssert(imageWidth * 4 <= imageBytesPerRow, - @"We expect image data to be 32bit RGBA"); - - for (row = 0; row < fileHeight && answer; row++) { - answer = memcmp(fileData + fileBytesPerRow * row, - imageData + imageBytesPerRow * row, - imageWidth * 4) == 0; - } - if (!answer && diff) { - answer = YES; - unsigned char *diffData; - CGContextRef diffContext - = GTMCreateUnitTestBitmapContextOfSizeWithData(imageSize, &diffData); - _GTMDevAssert(diffContext, @"Can't make diff context"); - size_t diffRowBytes = CGBitmapContextGetBytesPerRow(diffContext); - for (row = 0; row < imageHeight; row++) { - uint32_t *imageRow = (uint32_t*)(imageData + imageBytesPerRow * row); - uint32_t *fileRow = (uint32_t*)(fileData + fileBytesPerRow * row); - uint32_t* diffRow = (uint32_t*)(diffData + diffRowBytes * row); - for (col = 0; col < imageWidth; col++) { - uint32_t imageColor = imageRow[col]; - uint32_t fileColor = fileRow[col]; - - unsigned char imageAlpha = imageColor & 0xF; - unsigned char imageBlue = imageColor >> 8 & 0xF; - unsigned char imageGreen = imageColor >> 16 & 0xF; - unsigned char imageRed = imageColor >> 24 & 0xF; - unsigned char fileAlpha = fileColor & 0xF; - unsigned char fileBlue = fileColor >> 8 & 0xF; - unsigned char fileGreen = fileColor >> 16 & 0xF; - unsigned char fileRed = fileColor >> 24 & 0xF; - - // Check to see if color is almost right. - // No matter how hard I've tried, I've still gotten occasionally - // screwed over by colorspaces not mapping correctly, and small - // sampling errors coming in. This appears to work for most cases. - // Almost equal is defined to check within 1% on all components. - BOOL equal = almostEqual(imageRed, fileRed) && - almostEqual(imageGreen, fileGreen) && - almostEqual(imageBlue, fileBlue) && - almostEqual(imageAlpha, fileAlpha); - answer &= equal; - if (diff) { - uint32_t newColor; - if (equal) { - newColor = (((uint32_t)imageRed) << 24) + - (((uint32_t)imageGreen) << 16) + - (((uint32_t)imageBlue) << 8) + - (((uint32_t)imageAlpha) / 2); - } else { - newColor = 0xFF0000FF; - } - diffRow[col] = newColor; - } - } - } - *diff = CGBitmapContextCreateImage(diffContext); - free(diffData); - CFRelease(diffContext); - } - free(fileData); - CFRelease(fileContext); - free(imageData); - CFRelease(imageContext); - } - return answer; -} - -// Find the path for an image by name in your bundle. -// Do not include the extension on your name. -// -// Args: -// name: The name for the image file you would like to find. -// -// Returns: -// the path if the image exists in your bundle -// or nil if no image to be found -// -- (NSString *)gtm_pathForImageNamed:(NSString*)name { - return [self gtm_pathForFileNamed:name - extension:[self gtm_imageExtension]]; -} - -- (NSString *)gtm_saveToPathForImageNamed:(NSString*)name { - return [self gtm_saveToPathForFileNamed:name - extension:[self gtm_imageExtension]]; -} - -// Gives us a representation of unitTestImage of |self|. -// -// Returns: -// a representation of image if successful -// nil if failed -// -- (NSData *)gtm_imageRepresentation { - CGImageRef imageRep = [self gtm_unitTestImage]; - NSData *data = [self gtm_imageDataForImage:imageRep]; - _GTMDevAssert(data, @"unable to create %@ from %@", - [self gtm_imageExtension], self); - return data; -} - -#pragma mark UnitTestState - -// Return the extension to be used for saving unittest states -// -// Returns -// An extension (e.g. "gtmUTState") -- (NSString*)gtm_stateExtension { - return @"gtmUTState"; -} - -// Save the encoded unit test state to a state file with name |name| at -// ~/Desktop/|name|.extension. -// -// Note: When running under Pulse automation output is redirected to the -// Pulse base directory. -// -// Args: -// name: The name for the state file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToStateNamed:(NSString*)name { - NSString *newPath = [self gtm_saveToPathForStateNamed:name]; - return [self gtm_saveToStateAt:newPath]; -} - -// Save encoded unit test state of |self| to a state file at path |path|. -// -// Args: -// name: The name for the state file you would like saved. -// -// Returns: -// YES if the file was successfully saved. -// -- (BOOL)gtm_saveToStateAt:(NSString*)path { - if (!path) return NO; - NSDictionary *dictionary = [self gtm_stateRepresentation]; - return [dictionary writeToFile:path atomically:YES]; -} - -// Compares encoded unit test state of |self| to the state file located at -// |path| -// -// Args: -// path: the path to the state file you want to compare against. -// -// Returns: -// YES if they are equal, NO is they are not -// -- (BOOL)gtm_compareWithStateAt:(NSString*)path { - NSDictionary *masterDict = [NSDictionary dictionaryWithContentsOfFile:path]; - _GTMDevAssert(masterDict, @"Unable to create dictionary from %@", path); - NSDictionary *selfDict = [self gtm_stateRepresentation]; - return [selfDict isEqual: masterDict]; -} - -// Find the path for a state by name in your bundle. -// Do not include the extension. -// -// Args: -// name: The name for the state file you would like to find. -// -// Returns: -// the path if the state exists in your bundle -// or nil if no state to be found -// -- (NSString *)gtm_pathForStateNamed:(NSString*)name { - return [self gtm_pathForFileNamed:name extension:[self gtm_stateExtension]]; -} - -- (NSString *)gtm_saveToPathForStateNamed:(NSString*)name { - return [self gtm_saveToPathForFileNamed:name - extension:[self gtm_stateExtension]]; -} - -// Gives us the encoded unit test state |self| -// -// Returns: -// the encoded state if successful -// nil if failed -// -- (NSDictionary *)gtm_stateRepresentation { - NSDictionary *dictionary = nil; - if ([self conformsToProtocol:@protocol(GTMUnitTestingEncoding)]) { - id<GTMUnitTestingEncoding> encoder = (id<GTMUnitTestingEncoding>)self; - GTMUnitTestingKeyedCoder *archiver; - archiver = [[[GTMUnitTestingKeyedCoder alloc] init] autorelease]; - [encoder gtm_unitTestEncodeState:archiver]; - dictionary = [archiver dictionary]; - } - return dictionary; -} - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. Encode data in the coder in the same -// manner that you would encode data in any other Keyed NSCoder subclass. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - // All impls of gtm_unitTestEncodeState - // should be calling [super gtm_unitTestEncodeState] as their first action. - _GTMDevAssert([inCoder isKindOfClass:[GTMUnitTestingKeyedCoder class]], - @"Coder must be of kind GTMUnitTestingKeyedCoder"); - - // If the object has a delegate, give it a chance to respond - if ([self respondsToSelector:@selector(delegate)]) { - id delegate = [self performSelector:@selector(delegate)]; - if (delegate && - [delegate respondsToSelector:@selector(gtm_unitTestEncoderWillEncode:inCoder:)]) { - [delegate gtm_unitTestEncoderWillEncode:self inCoder:inCoder]; - } - } -} - -@end diff --git a/UnitTesting/GTMSenTestCase.h b/UnitTesting/GTMSenTestCase.h index a96cb20..6b7198b 100644 --- a/UnitTesting/GTMSenTestCase.h +++ b/UnitTesting/GTMSenTestCase.h @@ -90,7 +90,7 @@ #define _XCExceptionFormatString @"throwing \"%@\"" #define _XCUnknownExceptionString @"throwing an unknown exception" -#if defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0 +#if (defined(__IPHONE_8_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0) || (GTM_MACOS_SDK == 1) // They changed the call to _XCTRegisterFailure in iOS 8. Once we no longer need to support // the iOS 7 SDK, we can remove this. #define _GTMXCRegisterFailure(expression, format...) _XCTRegisterFailure(self, expression, format) @@ -111,7 +111,7 @@ @try { \ __typeof__(a1) _a1value = (a1); \ if (_a1value != noErr) { \ - _failure = [NSString stringWithFormat:@"%ld != noErr", (long)_a1value]; \ + _failure = [NSString stringWithFormat:@"%d != noErr", (int)_a1value]; \ } \ } \ @catch (NSException *_exception) { \ @@ -142,7 +142,7 @@ __typeof__(a1) _a1value = (a1); \ __typeof__(a2) _a2value = (a2); \ if (_a1value != _a2value) { \ - _failure = [NSString stringWithFormat:@"(%ld) != (%ld)", (long)_a1value, (long)_a2value]; \ + _failure = [NSString stringWithFormat:@"(%d) != (%d)", (int)_a1value, (int)_a2value]; \ } \ } \ @catch (NSException *_exception) { \ @@ -152,7 +152,7 @@ _failure = @": " _XCUnknownExceptionString; \ } \ if (_failure) { \ - NSString *_expression = [NSString stringWithFormat:@"((%@) != (@%)) failed %@", @#a1, @#a2, _failure]; \ + NSString *_expression = [NSString stringWithFormat:@"((%@) != (%@)) failed %@", @#a1, @#a2, _failure]; \ _GTMXCRegisterFailure(_expression, format); \ } \ }) @@ -734,12 +734,12 @@ do { \ // SENTE_BEGIN /*" Generates a failure when !{ [a1 isEqualTo:a2] } is false - (or one is nil and the other is not). - _{a1 The object on the left.} - _{a2 The object on the right.} - _{description A format string as in the printf() function. Can be nil or - an empty string but must be present.} - _{... A variable number of arguments to the format string. Can be absent.} + (or one is nil and the other is not). + _{a1 The object on the left.} + _{a2 The object on the right.} + _{description A format string as in the printf() function. Can be nil or + an empty string but must be present.} + _{... A variable number of arguments to the format string. Can be absent.} "*/ #define STAssertEqualObjects(a1, a2, description, ...) \ do { \ diff --git a/UnitTesting/GTMSenTestCase.m b/UnitTesting/GTMSenTestCase.m index b7a59a3..5236c51 100644 --- a/UnitTesting/GTMSenTestCase.m +++ b/UnitTesting/GTMSenTestCase.m @@ -19,12 +19,7 @@ #import "GTMSenTestCase.h" #import <unistd.h> -#if GTM_IPHONE_SIMULATOR #import <objc/message.h> -#endif - -#import "GTMObjC2Runtime.h" -#import "GTMUnitTestDevLog.h" #if GTM_IPHONE_SDK #import <UIKit/UIKit.h> @@ -401,22 +396,6 @@ static NSInteger MethodSort(id a, id b, void *context) { @implementation GTMTestCase -- (void)invokeTest { - NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init]; - Class devLogClass = NSClassFromString(@"GTMUnitTestDevLog"); - if (devLogClass) { - [devLogClass performSelector:@selector(enableTracking)]; - [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)]; - - } - [super invokeTest]; - if (devLogClass) { - [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)]; - [devLogClass performSelector:@selector(disableTracking)]; - } - [localPool drain]; -} - + (BOOL)isAbstractTestCase { NSString *name = NSStringFromClass(self); return [name rangeOfString:@"AbstractTest"].location != NSNotFound; diff --git a/UnitTesting/GTMSenTestCaseTest.m b/UnitTesting/GTMSenTestCaseTest.m index 9d9a594..33055ad 100644 --- a/UnitTesting/GTMSenTestCaseTest.m +++ b/UnitTesting/GTMSenTestCaseTest.m @@ -16,6 +16,15 @@ // the License. // +#import "GTMDefines.h" + +// This test currently executes under XCTest and under the GTM SenTest replacement. +#if !GTM_USING_XCTEST +#define XCTAssertFalse STAssertFalse +#define XCTAssertEqual STAssertEquals +#define XCTAssertTrue STAssertTrue +#endif // !GTM_USING_XCTEST + #import "GTMSenTestCase.h" // These make use of the fact that methods are run in alphebetical order @@ -39,8 +48,8 @@ static int gZzCheckCalls_ = 0; @implementation GTMTestingAbstractTest - (void)testAbstractUnitTest { - STAssertFalse([self isMemberOfClass:[GTMTestingAbstractTest class]], - @"test should not run on the abstract class"); + XCTAssertFalse([self isMemberOfClass:[GTMTestingAbstractTest class]], + @"test should not run on the abstract class"); ++gAbstractCalls_; } @@ -51,11 +60,12 @@ static int gZzCheckCalls_ = 0; - (void)testZZCheck { ++gZzCheckCalls_; if ([self isMemberOfClass:[GTMTestingTestOne class]]) { - STAssertEquals(gAbstractCalls_, 1, + XCTAssertEqual(gAbstractCalls_, 1, @"wrong number of abstract calls at this point"); } else { - STAssertTrue([self isMemberOfClass:[GTMTestingTestTwo class]], nil); - STAssertEquals(gAbstractCalls_, 2, + XCTAssertTrue([self isMemberOfClass:[GTMTestingTestTwo class]], + @"Not member of class"); + XCTAssertEqual(gAbstractCalls_, 2, @"wrong number of abstract calls at this point"); } } @@ -66,7 +76,7 @@ static int gZzCheckCalls_ = 0; - (void)testZZZCheck { // Test defined at this leaf, it should always run, check on the other methods. - STAssertEquals(gZzCheckCalls_, 2, @"the parent class method wasn't called"); + XCTAssertEqual(gZzCheckCalls_, 2, @"the parent class method wasn't called"); } @end diff --git a/UnitTesting/GTMTestTimerTest.m b/UnitTesting/GTMTestTimerTest.m index 86f9d22..27758ff 100644 --- a/UnitTesting/GTMTestTimerTest.m +++ b/UnitTesting/GTMTestTimerTest.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,32 +25,32 @@ @implementation GTMTestTimerTest - (void)testTimer { GTMTestTimer *timer = GTMTestTimerCreate(); - STAssertNotNULL(timer, nil); + XCTAssertNotNULL(timer); GTMTestTimerRetain(timer); GTMTestTimerRelease(timer); - STAssertEqualsWithAccuracy(GTMTestTimerGetSeconds(timer), 0.0, 0.0, nil); + XCTAssertEqualWithAccuracy(GTMTestTimerGetSeconds(timer), 0.0, 0.0); GTMTestTimerStart(timer); - STAssertTrue(GTMTestTimerIsRunning(timer), nil); + XCTAssertTrue(GTMTestTimerIsRunning(timer)); NSRunLoop *loop = [NSRunLoop currentRunLoop]; [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; GTMTestTimerStop(timer); - - // We use greater than (and an almost absurd less than) because + + // We use greater than (and an almost absurd less than) because // these tests are very dependant on machine load, and we don't want // automated tests reporting false negatives. - STAssertGreaterThan(GTMTestTimerGetSeconds(timer), 0.1, nil); - STAssertGreaterThan(GTMTestTimerGetMilliseconds(timer), 100.0,nil); - STAssertGreaterThan(GTMTestTimerGetMicroseconds(timer), 100000.0, nil); - + XCTAssertGreaterThan(GTMTestTimerGetSeconds(timer), 0.1); + XCTAssertGreaterThan(GTMTestTimerGetMilliseconds(timer), 100.0); + XCTAssertGreaterThan(GTMTestTimerGetMicroseconds(timer), 100000.0); + // Check to make sure we're not WAY off the mark (by a factor of 10) - STAssertLessThan(GTMTestTimerGetMicroseconds(timer), 1000000.0, nil); - + XCTAssertLessThan(GTMTestTimerGetMicroseconds(timer), 1000000.0); + [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; GTMTestTimerStart(timer); [loop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - STAssertGreaterThan(GTMTestTimerGetSeconds(timer), 0.2, nil); + XCTAssertGreaterThan(GTMTestTimerGetSeconds(timer), 0.2); GTMTestTimerStop(timer); - STAssertEquals(GTMTestTimerGetIterations(timer), (NSUInteger)2, nil); + XCTAssertEqual(GTMTestTimerGetIterations(timer), (NSUInteger)2); GTMTestTimerRelease(timer); } @end diff --git a/UnitTesting/GTMUIKit+UnitTesting.h b/UnitTesting/GTMUIKit+UnitTesting.h deleted file mode 100644 index a9052f2..0000000 --- a/UnitTesting/GTMUIKit+UnitTesting.h +++ /dev/null @@ -1,128 +0,0 @@ -// -// GTMUIKit+UnitTesting.h -// -// Code for making unit testing of graphics/UI easier. Generally you -// will only want to look at the macros: -// GTMAssertDrawingEqualToFile -// GTMAssertViewRepEqualToFile -// and the protocol GTMUnitTestViewDrawer. When using these routines -// make sure you are using device colors and not calibrated/generic colors -// or else your test graphics WILL NOT match across devices/graphics cards. -// -// 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 <UIKit/UIKit.h> -#import "GTMNSObject+UnitTesting.h" - -@protocol GTMUnitTestViewDrawer; - -// Fails when the |a1|'s drawing in an area |a2| does not equal the image file named |a3|. -// See the description of the GTMAssertViewRepEqualToFile macro -// to understand how |a3| is found and written out. -// See the description of the GTMUnitTestView for a better idea -// how the view works. -// Implemented as a macro to match the rest of the SenTest macros. -// -// Args: -// a1: The object that implements the GTMUnitTestViewDrawer protocol -// that is doing the drawing. -// a2: The size of the drawing -// a3: The name of the image file to check against. -// Do not include the extension -// a4: contextInfo to pass to drawer -// description: A format string as in the printf() function. -// Can be nil or an empty string but must be present. -// ...: A variable number of arguments to the format string. Can be absent. -// - -#define GTMAssertDrawingEqualToFile(a1, a2, a3, a4, description, ...) \ - do { \ - id<GTMUnitTestViewDrawer> a1Drawer = (a1); \ - CGSize a2Size = (a2); \ - NSString* a3String = (a3); \ - void *a4ContextInfo = (a4); \ - CGRect frame = CGRectMake(0, 0, a2Size.width, a2Size.height); \ - GTMUnitTestView *view = [[[GTMUnitTestView alloc] initWithFrame:frame drawer:a1Drawer contextInfo:a4ContextInfo] autorelease]; \ - GTMAssertObjectImageEqualToImageNamed(view, a3String, @"%@", STComposeString(description, ##__VA_ARGS__)); \ - } while(0) - -// Category for making unit testing of graphics/UI easier. - -// Allows you to take a state of a view. Supports both image and state. -// See GTMNSObject+UnitTesting.h for details. -@interface UIView (GTMUnitTestingAdditions) <GTMUnitTestingImaging> - -// Encodes the state of an object in a manner suitable for comparing against a master state file -// This enables us to determine whether the object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder; - -// Returns whether gtm_unitTestEncodeState should recurse into subviews -// -// Returns: -// should gtm_unitTestEncodeState pick up subview state. -- (BOOL)gtm_shouldEncodeStateForSubviews; -@end - -// Category to help UIImage testing. UIImage can be tested using -// GTMAssertObjectImageEqualToImageNamed macro, which automatically creates -// result images and diff images in case test fails. -@interface UIImage (GTMUnitTestingAdditions) <GTMUnitTestingImaging> -@end - -// A view that allows you to delegate out drawing using the formal -// GTMUnitTestViewDelegate protocol -// This is useful when writing up unit tests for visual elements. -// Your test will often end up looking like this: -// - (void)testFoo { -// GTMAssertDrawingEqualToFile(self, CGSizeMake(200, 200), @"Foo", nil, nil); -// } -// and your testSuite will also implement the unitTestViewDrawRect method to do -// it's actual drawing. The above creates a view of size 200x200 that draws -// it's content using |self|'s unitTestViewDrawRect method and compares it to -// the contents of the file Foo.tif to make sure it's valid -@interface GTMUnitTestView : UIView { - @private - id<GTMUnitTestViewDrawer> drawer_; // delegate for doing drawing (STRONG) - void* contextInfo_; // info passed in by user for them to use when drawing -} - -// Create a GTMUnitTestView. -// -// Args: -// rect: the area to draw. -// drawer: the object that will do the drawing via the GTMUnitTestViewDrawer -// protocol -// contextInfo: -- (id)initWithFrame:(CGRect)frame drawer:(id<GTMUnitTestViewDrawer>)drawer contextInfo:(void*)contextInfo; - -@end - -/// \cond Protocols - -// Formal protocol for doing unit testing of views. See description of -// GTMUnitTestView for details. -@protocol GTMUnitTestViewDrawer <NSObject> - -// Draw the view. Equivalent to drawRect on a standard UIView. -// -// Args: -// rect: the area to draw. -- (void)gtm_unitTestViewDrawRect:(CGRect)rect contextInfo:(void*)contextInfo; - -@end diff --git a/UnitTesting/GTMUIKit+UnitTesting.m b/UnitTesting/GTMUIKit+UnitTesting.m deleted file mode 100644 index 7d3f200..0000000 --- a/UnitTesting/GTMUIKit+UnitTesting.m +++ /dev/null @@ -1,122 +0,0 @@ -// -// GTMUIKit+UnitTesting.m -// -// Category for making unit testing of graphics/UI easier. -// Allows you to save a view out to a image file, and compare a view -// with a previously stored representation to make sure it hasn't changed. -// -// 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 "GTMUIKit+UnitTesting.h" -#import "GTMCALayer+UnitTesting.h" -#import "GTMDefines.h" - -#if !GTM_IPHONE_SDK -#error This file is for iPhone use only -#endif // GTM_IPHONE_SDK - -// A view that allows you to delegate out drawing using the formal -// GTMUnitTestViewDelegate protocol above. This is useful when writing up unit -// tests for visual elements. -// Your test will often end up looking like this: -// - (void)testFoo { -// GTMAssertDrawingEqualToFile(self, CGSizeMake(200, 200), @"Foo", nil, nil); -// } -// and your testSuite will also implement the unitTestViewDrawRect method to do -// it's actual drawing. The above creates a view of size 200x200 that draws -// it's content using |self|'s unitTestViewDrawRect method and compares it to -// the contents of the file Foo.tif to make sure it's valid -@implementation GTMUnitTestView - -- (id)initWithFrame:(CGRect)frame - drawer:(id<GTMUnitTestViewDrawer>)drawer - contextInfo:(void*)contextInfo{ - self = [super initWithFrame:frame]; - if (self != nil) { - drawer_ = [drawer retain]; - contextInfo_ = contextInfo; - } - return self; -} - -- (void)dealloc { - [drawer_ release]; - [super dealloc]; -} - -- (void)drawRect:(CGRect)rect { - [drawer_ gtm_unitTestViewDrawRect:rect contextInfo:contextInfo_]; -} - -@end - -@implementation UIView (GTMUnitTestingAdditions) - -// Returns an image containing a representation of the object -// suitable for use in comparing against a master image. -// NB this means that all colors should be from "NSDevice" color space -// Does all of it's drawing with smoothfonts and antialiasing off -// to avoid issues with font smoothing settings and antialias differences -// between ppc and x86. -// -// Returns: -// an image of the object -- (CGImageRef)gtm_unitTestImage { - CALayer* layer = [self layer]; - return [layer gtm_unitTestImage]; -} - -// Encodes the state of an object in a manner suitable for comparing -// against a master state file so we can determine whether the -// object is in a suitable state. -// -// Arguments: -// inCoder - the coder to encode our state into -- (void)gtm_unitTestEncodeState:(NSCoder*)inCoder { - [super gtm_unitTestEncodeState:inCoder]; - [inCoder encodeBool:[self isHidden] forKey:@"ViewIsHidden"]; - CALayer* layer = [self layer]; - if (layer) { - [layer gtm_unitTestEncodeState:inCoder]; - } - if ([self gtm_shouldEncodeStateForSubviews]) { - int i = 0; - for (UIView *subview in [self subviews]) { - [inCoder encodeObject:subview - forKey:[NSString stringWithFormat:@"ViewSubView %d", i]]; - i++; - } - } -} - -// Returns whether gtm_unitTestEncodeState should recurse into subviews -// -// Returns: -// should gtm_unitTestEncodeState pick up subview state. -- (BOOL)gtm_shouldEncodeStateForSubviews { - return YES; -} - -- (BOOL)gtm_shouldEncodeStateForSublayersOfLayer:(CALayer*)layer { - return NO; -} -@end - -@implementation UIImage (GTMUnitTestingAdditions) -- (CGImageRef)gtm_unitTestImage { - return [self CGImage]; -} -@end diff --git a/UnitTesting/GTMUIKit+UnitTestingTest.m b/UnitTesting/GTMUIKit+UnitTestingTest.m deleted file mode 100644 index 4b0387c..0000000 --- a/UnitTesting/GTMUIKit+UnitTestingTest.m +++ /dev/null @@ -1,67 +0,0 @@ -// -// GTMUIKit+UnitTestingTest.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 <CoreGraphics/CoreGraphics.h> -#import "GTMUIKit+UnitTesting.h" -#import "GTMSenTestCase.h" - -@interface GTMUIView_UnitTestingTest : GTMTestCase <GTMUnitTestViewDrawer> -@end - -@implementation GTMUIView_UnitTestingTest - -- (void)testDrawing { - GTMAssertDrawingEqualToFile(self, - CGSizeMake(200,200), - @"GTMUIViewUnitTestingTest", - [UIApplication sharedApplication], - nil); -} - -- (void)testState { - UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)] autorelease]; - UIView *subview = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)] autorelease]; - [view addSubview:subview]; - GTMAssertObjectStateEqualToStateNamed(view, @"GTMUIViewUnitTestingTest", nil); -} - -- (void)testUIImage { - NSString* name = @"GTMUIViewUnitTestingTest"; - NSBundle *bundle = [NSBundle bundleForClass:[self class]]; - NSString *imagePath = [bundle pathForResource:name ofType:@"png"]; - STAssertNotNil(imagePath, nil); - UIImage* image = [UIImage imageWithContentsOfFile:imagePath]; - GTMAssertObjectImageEqualToImageNamed(image, name, nil); -} - -- (void)gtm_unitTestViewDrawRect:(CGRect)rect contextInfo:(void*)contextInfo { - UIApplication *app = [UIApplication sharedApplication]; - STAssertEqualObjects(app, - contextInfo, - @"Should be a UIApplication"); - CGPoint center = CGPointMake(CGRectGetMidX(rect), - CGRectGetMidY(rect)); - rect = CGRectMake(center.x - 50, center.y - 50, 100, 100); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextAddEllipseInRect(context, rect); - CGContextSetLineWidth(context, 5); - [[UIColor redColor] set]; - CGContextStrokePath(context); -} - -@end diff --git a/UnitTesting/GTMUIUnitTestingHarness/English.lproj/MainMenu.xib b/UnitTesting/GTMUIUnitTestingHarness/English.lproj/MainMenu.xib index 2a5aa22..346c749 100644 --- a/UnitTesting/GTMUIUnitTestingHarness/English.lproj/MainMenu.xib +++ b/UnitTesting/GTMUIUnitTestingHarness/English.lproj/MainMenu.xib @@ -1,2065 +1,311 @@ -<?xml version="1.0" encoding="UTF-8"?> -<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03"> - <data> - <int key="IBDocument.SystemTarget">0</int> - <string key="IBDocument.SystemVersion">9G55</string> - <string key="IBDocument.InterfaceBuilderVersion">677</string> - <string key="IBDocument.AppKitVersion">949.43</string> - <string key="IBDocument.HIToolboxVersion">353.00</string> - <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> - <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="377"/> - </object> - <object class="NSArray" key="IBDocument.PluginDependencies"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilderKit</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - </object> - <object class="NSMutableDictionary" key="IBDocument.Metadata"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <object class="NSMutableArray" key="IBDocument.RootObjects" id="1048"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomObject" id="1021"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSCustomObject" id="1014"> - <string key="NSClassName">FirstResponder</string> - </object> - <object class="NSCustomObject" id="1050"> - <string key="NSClassName">NSApplication</string> - </object> - <object class="NSMenu" id="649796088"> - <string key="NSTitle">AMainMenu</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="694149608"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">NewApplication</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <object class="NSCustomResource" key="NSOnImage" id="35465992"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuCheckmark</string> - </object> - <object class="NSCustomResource" key="NSMixedImage" id="513340101"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuMixedState</string> - </object> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="110575045"> - <string key="NSTitle">NewApplication</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="238522557"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">About NewApplication</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="304266470"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="609285721"> - <reference key="NSMenu" ref="110575045"/> - <string type="base64-UTF8" key="NSTitle">UHJlZmVyZW5jZXPigKY</string> - <string key="NSKeyEquiv">,</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="481834944"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="1046388886"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Services</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="752062318"> - <string key="NSTitle">Services</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <string key="NSName">_NSServicesMenu</string> - </object> - </object> - <object class="NSMenuItem" id="646227648"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="755159360"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Hide NewApplication</string> - <string key="NSKeyEquiv">h</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="342932134"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Hide Others</string> - <string key="NSKeyEquiv">h</string> - <int key="NSKeyEquivModMask">1572864</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="908899353"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Show All</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="1056857174"> - <reference key="NSMenu" ref="110575045"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="632727374"> - <reference key="NSMenu" ref="110575045"/> - <string key="NSTitle">Quit NewApplication</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - <string key="NSName">_NSAppleMenu</string> - </object> - </object> - <object class="NSMenuItem" id="379814623"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">File</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="720053764"> - <string key="NSTitle">File</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="705341025"> - <reference key="NSMenu" ref="720053764"/> - <string key="NSTitle">New</string> - <string key="NSKeyEquiv">n</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="722745758"> - <reference key="NSMenu" ref="720053764"/> - <string type="base64-UTF8" key="NSTitle">T3BlbuKApg</string> - <string key="NSKeyEquiv">o</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="1025936716"> - <reference key="NSMenu" ref="720053764"/> - <string key="NSTitle">Open Recent</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="1065607017"> - <string key="NSTitle">Open Recent</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="759406840"> - <reference key="NSMenu" ref="1065607017"/> - <string key="NSTitle">Clear Menu</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - <string key="NSName">_NSRecentDocumentsMenu</string> - </object> - </object> - <object class="NSMenuItem" id="425164168"> - <reference key="NSMenu" ref="720053764"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="776162233"> - <reference key="NSMenu" ref="720053764"/> - <string key="NSTitle">Close</string> - <string key="NSKeyEquiv">w</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="1023925487"> - <reference key="NSMenu" ref="720053764"/> - <string key="NSTitle">Save</string> - <string key="NSKeyEquiv">s</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="117038363"> - <reference key="NSMenu" ref="720053764"/> - <string type="base64-UTF8" key="NSTitle">U2F2ZSBBc+KApg</string> - <string key="NSKeyEquiv">S</string> - <int key="NSKeyEquivModMask">1179648</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="579971712"> - <reference key="NSMenu" ref="720053764"/> - <string key="NSTitle">Revert to Saved</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="1010469920"> - <reference key="NSMenu" ref="720053764"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="294629803"> - <reference key="NSMenu" ref="720053764"/> - <string key="NSTitle">Page Setup...</string> - <string key="NSKeyEquiv">P</string> - <int key="NSKeyEquivModMask">1179648</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSToolTip"/> - </object> - <object class="NSMenuItem" id="49223823"> - <reference key="NSMenu" ref="720053764"/> - <string type="base64-UTF8" key="NSTitle">UHJpbnTigKY</string> - <string key="NSKeyEquiv">p</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="952259628"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">Edit</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="789758025"> - <string key="NSTitle">Edit</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="1058277027"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Undo</string> - <string key="NSKeyEquiv">z</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="790794224"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Redo</string> - <string key="NSKeyEquiv">Z</string> - <int key="NSKeyEquivModMask">1179648</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="1040322652"> - <reference key="NSMenu" ref="789758025"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="296257095"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Cut</string> - <string key="NSKeyEquiv">x</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="860595796"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Copy</string> - <string key="NSKeyEquiv">c</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="29853731"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Paste</string> - <string key="NSKeyEquiv">v</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="437104165"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Delete</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="583158037"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Select All</string> - <string key="NSKeyEquiv">a</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="212016141"> - <reference key="NSMenu" ref="789758025"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="892235320"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Find</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="963351320"> - <string key="NSTitle">Find</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="447796847"> - <reference key="NSMenu" ref="963351320"/> - <string type="base64-UTF8" key="NSTitle">RmluZOKApg</string> - <string key="NSKeyEquiv">f</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <int key="NSTag">1</int> - </object> - <object class="NSMenuItem" id="326711663"> - <reference key="NSMenu" ref="963351320"/> - <string key="NSTitle">Find Next</string> - <string key="NSKeyEquiv">g</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <int key="NSTag">2</int> - </object> - <object class="NSMenuItem" id="270902937"> - <reference key="NSMenu" ref="963351320"/> - <string key="NSTitle">Find Previous</string> - <string key="NSKeyEquiv">G</string> - <int key="NSKeyEquivModMask">1179648</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <int key="NSTag">3</int> - </object> - <object class="NSMenuItem" id="159080638"> - <reference key="NSMenu" ref="963351320"/> - <string key="NSTitle">Use Selection for Find</string> - <string key="NSKeyEquiv">e</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <int key="NSTag">7</int> - </object> - <object class="NSMenuItem" id="88285865"> - <reference key="NSMenu" ref="963351320"/> - <string key="NSTitle">Jump to Selection</string> - <string key="NSKeyEquiv">j</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="972420730"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Spelling and Grammar</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="769623530"> - <string key="NSTitle">Spelling and Grammar</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="679648819"> - <reference key="NSMenu" ref="769623530"/> - <string type="base64-UTF8" key="NSTitle">U2hvdyBTcGVsbGluZ+KApg</string> - <string key="NSKeyEquiv">:</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="96193923"> - <reference key="NSMenu" ref="769623530"/> - <string key="NSTitle">Check Spelling</string> - <string key="NSKeyEquiv">;</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="948374510"> - <reference key="NSMenu" ref="769623530"/> - <string key="NSTitle">Check Spelling While Typing</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="967646866"> - <reference key="NSMenu" ref="769623530"/> - <string key="NSTitle">Check Grammar With Spelling</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="507821607"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Substitutions</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="698887838"> - <string key="NSTitle">Substitutions</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="605118523"> - <reference key="NSMenu" ref="698887838"/> - <string key="NSTitle">Smart Copy/Paste</string> - <string key="NSKeyEquiv">f</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <int key="NSTag">1</int> - </object> - <object class="NSMenuItem" id="197661976"> - <reference key="NSMenu" ref="698887838"/> - <string key="NSTitle">Smart Quotes</string> - <string key="NSKeyEquiv">g</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <int key="NSTag">2</int> - </object> - <object class="NSMenuItem" id="708854459"> - <reference key="NSMenu" ref="698887838"/> - <string key="NSTitle">Smart Links</string> - <string key="NSKeyEquiv">G</string> - <int key="NSKeyEquivModMask">1179648</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <int key="NSTag">3</int> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="676164635"> - <reference key="NSMenu" ref="789758025"/> - <string key="NSTitle">Speech</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="785027613"> - <string key="NSTitle">Speech</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="731782645"> - <reference key="NSMenu" ref="785027613"/> - <string key="NSTitle">Start Speaking</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="680220178"> - <reference key="NSMenu" ref="785027613"/> - <string key="NSTitle">Stop Speaking</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - </object> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="626404410"> - <reference key="NSMenu" ref="649796088"/> - <string type="base64-UTF8" key="NSTitle">wqxNZW51IFRpdGxlA</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="502084290"> - <string type="base64-UTF8" key="NSTitle">wqxNZW51IFRpdGxlA</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="83534624"> - <reference key="NSMenu" ref="502084290"/> - <string type="base64-UTF8" key="NSTitle">wqxNZW51IEl0ZW0</string> - <string key="NSKeyEquiv">t</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="1028416764"> - <reference key="NSMenu" ref="502084290"/> - <string key="NSTitle">Show Colors</string> - <string key="NSKeyEquiv">C</string> - <int key="NSKeyEquivModMask">1179648</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="586577488"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">View</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="466310130"> - <string key="NSTitle">View</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="102151532"> - <reference key="NSMenu" ref="466310130"/> - <string key="NSTitle">Show Toolbar</string> - <string key="NSKeyEquiv">t</string> - <int key="NSKeyEquivModMask">1572864</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - <object class="NSMenuItem" id="237841660"> - <reference key="NSMenu" ref="466310130"/> - <string type="base64-UTF8" key="NSTitle">Q3VzdG9taXplIFRvb2xiYXLigKY</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="391199113"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">Help</string> - <string key="NSKeyEquiv"/> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="374024848"> - <string key="NSTitle">Help</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="238773614"> - <reference key="NSMenu" ref="374024848"/> - <string key="NSTitle">NewApplication Help</string> - <string key="NSKeyEquiv">?</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="513340101"/> - </object> - </object> - </object> - </object> - </object> - <string key="NSName">_NSMainMenu</string> - </object> - <object class="NSCustomObject" id="728136523"> - <string key="NSClassName">GTMUILocalizer</string> - </object> - </object> - <object class="IBObjectContainer" key="IBDocument.Objects"> - <object class="NSMutableArray" key="connectionRecords"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">print:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="49223823"/> - </object> - <int key="connectionID">86</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">runPageLayout:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="294629803"/> - </object> - <int key="connectionID">87</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">clearRecentDocuments:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="759406840"/> - </object> - <int key="connectionID">127</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">orderFrontStandardAboutPanel:</string> - <reference key="source" ref="1021"/> - <reference key="destination" ref="238522557"/> - </object> - <int key="connectionID">142</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">performClose:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="776162233"/> - </object> - <int key="connectionID">193</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleContinuousSpellChecking:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="948374510"/> - </object> - <int key="connectionID">222</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">undo:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1058277027"/> - </object> - <int key="connectionID">223</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">copy:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="860595796"/> - </object> - <int key="connectionID">224</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">checkSpelling:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="96193923"/> - </object> - <int key="connectionID">225</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">paste:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="29853731"/> - </object> - <int key="connectionID">226</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">stopSpeaking:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="680220178"/> - </object> - <int key="connectionID">227</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">cut:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="296257095"/> - </object> - <int key="connectionID">228</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">showGuessPanel:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="679648819"/> - </object> - <int key="connectionID">230</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">redo:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="790794224"/> - </object> - <int key="connectionID">231</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">selectAll:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="583158037"/> - </object> - <int key="connectionID">232</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">startSpeaking:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="731782645"/> - </object> - <int key="connectionID">233</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">delete:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="437104165"/> - </object> - <int key="connectionID">235</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">performFindPanelAction:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="447796847"/> - </object> - <int key="connectionID">241</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">centerSelectionInVisibleArea:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="88285865"/> - </object> - <int key="connectionID">245</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleGrammarChecking:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="967646866"/> - </object> - <int key="connectionID">347</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleSmartInsertDelete:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="605118523"/> - </object> - <int key="connectionID">355</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleAutomaticQuoteSubstitution:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="197661976"/> - </object> - <int key="connectionID">356</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleAutomaticLinkDetection:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="708854459"/> - </object> - <int key="connectionID">357</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">showHelp:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="238773614"/> - </object> - <int key="connectionID">360</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">orderFrontColorPanel:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1028416764"/> - </object> - <int key="connectionID">361</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">saveDocument:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1023925487"/> - </object> - <int key="connectionID">362</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">saveDocumentAs:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="117038363"/> - </object> - <int key="connectionID">363</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">revertDocumentToSaved:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="579971712"/> - </object> - <int key="connectionID">364</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">runToolbarCustomizationPalette:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="237841660"/> - </object> - <int key="connectionID">365</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleToolbarShown:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="102151532"/> - </object> - <int key="connectionID">366</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">hide:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="755159360"/> - </object> - <int key="connectionID">367</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">hideOtherApplications:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="342932134"/> - </object> - <int key="connectionID">368</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">terminate:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="632727374"/> - </object> - <int key="connectionID">369</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">unhideAllApplications:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="908899353"/> - </object> - <int key="connectionID">370</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">newDocument:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="705341025"/> - </object> - <int key="connectionID">373</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">openDocument:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="722745758"/> - </object> - <int key="connectionID">374</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">owner_</string> - <reference key="source" ref="728136523"/> - <reference key="destination" ref="1021"/> - </object> - <int key="connectionID">376</int> - </object> - </object> - <object class="IBMutableOrderedSet" key="objectRecords"> - <object class="NSArray" key="orderedObjects"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBObjectRecord"> - <int key="objectID">0</int> - <object class="NSArray" key="object" id="1049"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <reference key="children" ref="1048"/> - <nil key="parent"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-2</int> - <reference key="object" ref="1021"/> - <reference key="parent" ref="1049"/> - <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-1</int> - <reference key="object" ref="1014"/> - <reference key="parent" ref="1049"/> - <string key="objectName">First Responder</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">-3</int> - <reference key="object" ref="1050"/> - <reference key="parent" ref="1049"/> - <string key="objectName">Application</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">29</int> - <reference key="object" ref="649796088"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="694149608"/> - <reference ref="391199113"/> - <reference ref="952259628"/> - <reference ref="379814623"/> - <reference ref="586577488"/> - <reference ref="626404410"/> - </object> - <reference key="parent" ref="1049"/> - <string key="objectName">MainMenu</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">56</int> - <reference key="object" ref="694149608"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="110575045"/> - </object> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">103</int> - <reference key="object" ref="391199113"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="374024848"/> - </object> - <reference key="parent" ref="649796088"/> - <string key="objectName">1</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">217</int> - <reference key="object" ref="952259628"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="789758025"/> - </object> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">83</int> - <reference key="object" ref="379814623"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="720053764"/> - </object> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">81</int> - <reference key="object" ref="720053764"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1023925487"/> - <reference ref="117038363"/> - <reference ref="49223823"/> - <reference ref="722745758"/> - <reference ref="705341025"/> - <reference ref="1025936716"/> - <reference ref="294629803"/> - <reference ref="776162233"/> - <reference ref="425164168"/> - <reference ref="579971712"/> - <reference ref="1010469920"/> - </object> - <reference key="parent" ref="379814623"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">75</int> - <reference key="object" ref="1023925487"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">3</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">80</int> - <reference key="object" ref="117038363"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">8</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">78</int> - <reference key="object" ref="49223823"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">6</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">72</int> - <reference key="object" ref="722745758"/> - <reference key="parent" ref="720053764"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">82</int> - <reference key="object" ref="705341025"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">9</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">124</int> - <reference key="object" ref="1025936716"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1065607017"/> - </object> - <reference key="parent" ref="720053764"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">77</int> - <reference key="object" ref="294629803"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">5</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">73</int> - <reference key="object" ref="776162233"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">1</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">79</int> - <reference key="object" ref="425164168"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">7</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">112</int> - <reference key="object" ref="579971712"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">10</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">74</int> - <reference key="object" ref="1010469920"/> - <reference key="parent" ref="720053764"/> - <string key="objectName">2</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">125</int> - <reference key="object" ref="1065607017"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="759406840"/> - </object> - <reference key="parent" ref="1025936716"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">126</int> - <reference key="object" ref="759406840"/> - <reference key="parent" ref="1065607017"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">205</int> - <reference key="object" ref="789758025"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="437104165"/> - <reference ref="583158037"/> - <reference ref="1058277027"/> - <reference ref="212016141"/> - <reference ref="296257095"/> - <reference ref="29853731"/> - <reference ref="860595796"/> - <reference ref="1040322652"/> - <reference ref="790794224"/> - <reference ref="892235320"/> - <reference ref="972420730"/> - <reference ref="676164635"/> - <reference ref="507821607"/> - </object> - <reference key="parent" ref="952259628"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">202</int> - <reference key="object" ref="437104165"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">198</int> - <reference key="object" ref="583158037"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">207</int> - <reference key="object" ref="1058277027"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">214</int> - <reference key="object" ref="212016141"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">199</int> - <reference key="object" ref="296257095"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">203</int> - <reference key="object" ref="29853731"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">197</int> - <reference key="object" ref="860595796"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">206</int> - <reference key="object" ref="1040322652"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">215</int> - <reference key="object" ref="790794224"/> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">218</int> - <reference key="object" ref="892235320"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="963351320"/> - </object> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">216</int> - <reference key="object" ref="972420730"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="769623530"/> - </object> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">200</int> - <reference key="object" ref="769623530"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="948374510"/> - <reference ref="96193923"/> - <reference ref="679648819"/> - <reference ref="967646866"/> - </object> - <reference key="parent" ref="972420730"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">219</int> - <reference key="object" ref="948374510"/> - <reference key="parent" ref="769623530"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">201</int> - <reference key="object" ref="96193923"/> - <reference key="parent" ref="769623530"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">204</int> - <reference key="object" ref="679648819"/> - <reference key="parent" ref="769623530"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">220</int> - <reference key="object" ref="963351320"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="270902937"/> - <reference ref="88285865"/> - <reference ref="159080638"/> - <reference ref="326711663"/> - <reference ref="447796847"/> - </object> - <reference key="parent" ref="892235320"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">213</int> - <reference key="object" ref="270902937"/> - <reference key="parent" ref="963351320"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">210</int> - <reference key="object" ref="88285865"/> - <reference key="parent" ref="963351320"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">221</int> - <reference key="object" ref="159080638"/> - <reference key="parent" ref="963351320"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">208</int> - <reference key="object" ref="326711663"/> - <reference key="parent" ref="963351320"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">209</int> - <reference key="object" ref="447796847"/> - <reference key="parent" ref="963351320"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">106</int> - <reference key="object" ref="374024848"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="238773614"/> - </object> - <reference key="parent" ref="391199113"/> - <string key="objectName">2</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">111</int> - <reference key="object" ref="238773614"/> - <reference key="parent" ref="374024848"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">57</int> - <reference key="object" ref="110575045"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="238522557"/> - <reference ref="755159360"/> - <reference ref="908899353"/> - <reference ref="632727374"/> - <reference ref="646227648"/> - <reference ref="609285721"/> - <reference ref="481834944"/> - <reference ref="304266470"/> - <reference ref="1046388886"/> - <reference ref="1056857174"/> - <reference ref="342932134"/> - </object> - <reference key="parent" ref="694149608"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">58</int> - <reference key="object" ref="238522557"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">134</int> - <reference key="object" ref="755159360"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">150</int> - <reference key="object" ref="908899353"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">136</int> - <reference key="object" ref="632727374"/> - <reference key="parent" ref="110575045"/> - <string key="objectName">1111</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">144</int> - <reference key="object" ref="646227648"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">129</int> - <reference key="object" ref="609285721"/> - <reference key="parent" ref="110575045"/> - <string key="objectName">121</string> - </object> - <object class="IBObjectRecord"> - <int key="objectID">143</int> - <reference key="object" ref="481834944"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">236</int> - <reference key="object" ref="304266470"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">131</int> - <reference key="object" ref="1046388886"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="752062318"/> - </object> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">149</int> - <reference key="object" ref="1056857174"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">145</int> - <reference key="object" ref="342932134"/> - <reference key="parent" ref="110575045"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">130</int> - <reference key="object" ref="752062318"/> - <reference key="parent" ref="1046388886"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">295</int> - <reference key="object" ref="586577488"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="466310130"/> - </object> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">296</int> - <reference key="object" ref="466310130"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="102151532"/> - <reference ref="237841660"/> - </object> - <reference key="parent" ref="586577488"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">297</int> - <reference key="object" ref="102151532"/> - <reference key="parent" ref="466310130"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">298</int> - <reference key="object" ref="237841660"/> - <reference key="parent" ref="466310130"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">299</int> - <reference key="object" ref="626404410"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="502084290"/> - </object> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">300</int> - <reference key="object" ref="502084290"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1028416764"/> - <reference ref="83534624"/> - </object> - <reference key="parent" ref="626404410"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">345</int> - <reference key="object" ref="1028416764"/> - <reference key="parent" ref="502084290"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">211</int> - <reference key="object" ref="676164635"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="785027613"/> - </object> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">212</int> - <reference key="object" ref="785027613"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="680220178"/> - <reference ref="731782645"/> - </object> - <reference key="parent" ref="676164635"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">195</int> - <reference key="object" ref="680220178"/> - <reference key="parent" ref="785027613"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">196</int> - <reference key="object" ref="731782645"/> - <reference key="parent" ref="785027613"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">346</int> - <reference key="object" ref="967646866"/> - <reference key="parent" ref="769623530"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">348</int> - <reference key="object" ref="507821607"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="698887838"/> - </object> - <reference key="parent" ref="789758025"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">349</int> - <reference key="object" ref="698887838"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="605118523"/> - <reference ref="197661976"/> - <reference ref="708854459"/> - </object> - <reference key="parent" ref="507821607"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">350</int> - <reference key="object" ref="605118523"/> - <reference key="parent" ref="698887838"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">351</int> - <reference key="object" ref="197661976"/> - <reference key="parent" ref="698887838"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">354</int> - <reference key="object" ref="708854459"/> - <reference key="parent" ref="698887838"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">375</int> - <reference key="object" ref="728136523"/> - <reference key="parent" ref="1049"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">377</int> - <reference key="object" ref="83534624"/> - <reference key="parent" ref="502084290"/> - </object> - </object> - </object> - <object class="NSMutableDictionary" key="flattenedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>-1.IBPluginDependency</string> - <string>-2.IBPluginDependency</string> - <string>-3.IBPluginDependency</string> - <string>103.IBPluginDependency</string> - <string>103.ImportedFromIB2</string> - <string>106.IBEditorWindowLastContentRect</string> - <string>106.IBPluginDependency</string> - <string>106.ImportedFromIB2</string> - <string>106.editorWindowContentRectSynchronizationRect</string> - <string>111.IBPluginDependency</string> - <string>111.ImportedFromIB2</string> - <string>112.IBPluginDependency</string> - <string>112.ImportedFromIB2</string> - <string>124.IBPluginDependency</string> - <string>124.ImportedFromIB2</string> - <string>125.IBPluginDependency</string> - <string>125.ImportedFromIB2</string> - <string>125.editorWindowContentRectSynchronizationRect</string> - <string>126.IBPluginDependency</string> - <string>126.ImportedFromIB2</string> - <string>129.IBPluginDependency</string> - <string>129.ImportedFromIB2</string> - <string>130.IBPluginDependency</string> - <string>130.ImportedFromIB2</string> - <string>130.editorWindowContentRectSynchronizationRect</string> - <string>131.IBPluginDependency</string> - <string>131.ImportedFromIB2</string> - <string>134.IBPluginDependency</string> - <string>134.ImportedFromIB2</string> - <string>136.IBPluginDependency</string> - <string>136.ImportedFromIB2</string> - <string>143.IBPluginDependency</string> - <string>143.ImportedFromIB2</string> - <string>144.IBPluginDependency</string> - <string>144.ImportedFromIB2</string> - <string>145.IBPluginDependency</string> - <string>145.ImportedFromIB2</string> - <string>149.IBPluginDependency</string> - <string>149.ImportedFromIB2</string> - <string>150.IBPluginDependency</string> - <string>150.ImportedFromIB2</string> - <string>195.IBPluginDependency</string> - <string>195.ImportedFromIB2</string> - <string>196.IBPluginDependency</string> - <string>196.ImportedFromIB2</string> - <string>197.IBPluginDependency</string> - <string>197.ImportedFromIB2</string> - <string>198.IBPluginDependency</string> - <string>198.ImportedFromIB2</string> - <string>199.IBPluginDependency</string> - <string>199.ImportedFromIB2</string> - <string>200.IBPluginDependency</string> - <string>200.ImportedFromIB2</string> - <string>200.editorWindowContentRectSynchronizationRect</string> - <string>201.IBPluginDependency</string> - <string>201.ImportedFromIB2</string> - <string>202.IBPluginDependency</string> - <string>202.ImportedFromIB2</string> - <string>203.IBPluginDependency</string> - <string>203.ImportedFromIB2</string> - <string>204.IBPluginDependency</string> - <string>204.ImportedFromIB2</string> - <string>205.IBEditorWindowLastContentRect</string> - <string>205.IBPluginDependency</string> - <string>205.ImportedFromIB2</string> - <string>205.editorWindowContentRectSynchronizationRect</string> - <string>206.IBPluginDependency</string> - <string>206.ImportedFromIB2</string> - <string>207.IBPluginDependency</string> - <string>207.ImportedFromIB2</string> - <string>208.IBPluginDependency</string> - <string>208.ImportedFromIB2</string> - <string>209.IBPluginDependency</string> - <string>209.ImportedFromIB2</string> - <string>210.IBPluginDependency</string> - <string>210.ImportedFromIB2</string> - <string>211.IBPluginDependency</string> - <string>211.ImportedFromIB2</string> - <string>212.IBPluginDependency</string> - <string>212.ImportedFromIB2</string> - <string>212.editorWindowContentRectSynchronizationRect</string> - <string>213.IBPluginDependency</string> - <string>213.ImportedFromIB2</string> - <string>214.IBPluginDependency</string> - <string>214.ImportedFromIB2</string> - <string>215.IBPluginDependency</string> - <string>215.ImportedFromIB2</string> - <string>216.IBPluginDependency</string> - <string>216.ImportedFromIB2</string> - <string>217.IBPluginDependency</string> - <string>217.ImportedFromIB2</string> - <string>218.IBPluginDependency</string> - <string>218.ImportedFromIB2</string> - <string>219.IBPluginDependency</string> - <string>219.ImportedFromIB2</string> - <string>220.IBPluginDependency</string> - <string>220.ImportedFromIB2</string> - <string>220.editorWindowContentRectSynchronizationRect</string> - <string>221.IBPluginDependency</string> - <string>221.ImportedFromIB2</string> - <string>236.IBPluginDependency</string> - <string>236.ImportedFromIB2</string> - <string>29.IBEditorWindowLastContentRect</string> - <string>29.IBPluginDependency</string> - <string>29.ImportedFromIB2</string> - <string>29.WindowOrigin</string> - <string>29.editorWindowContentRectSynchronizationRect</string> - <string>295.IBPluginDependency</string> - <string>296.IBEditorWindowLastContentRect</string> - <string>296.IBPluginDependency</string> - <string>296.editorWindowContentRectSynchronizationRect</string> - <string>297.IBPluginDependency</string> - <string>298.IBPluginDependency</string> - <string>299.IBPluginDependency</string> - <string>300.IBEditorWindowLastContentRect</string> - <string>300.IBPluginDependency</string> - <string>300.editorWindowContentRectSynchronizationRect</string> - <string>345.IBPluginDependency</string> - <string>346.IBPluginDependency</string> - <string>346.ImportedFromIB2</string> - <string>348.IBPluginDependency</string> - <string>348.ImportedFromIB2</string> - <string>349.IBPluginDependency</string> - <string>349.ImportedFromIB2</string> - <string>349.editorWindowContentRectSynchronizationRect</string> - <string>350.IBPluginDependency</string> - <string>350.ImportedFromIB2</string> - <string>351.IBPluginDependency</string> - <string>351.ImportedFromIB2</string> - <string>354.IBPluginDependency</string> - <string>354.ImportedFromIB2</string> - <string>375.IBPluginDependency</string> - <string>377.IBPluginDependency</string> - <string>56.IBPluginDependency</string> - <string>56.ImportedFromIB2</string> - <string>57.IBEditorWindowLastContentRect</string> - <string>57.IBPluginDependency</string> - <string>57.ImportedFromIB2</string> - <string>57.editorWindowContentRectSynchronizationRect</string> - <string>58.IBPluginDependency</string> - <string>58.ImportedFromIB2</string> - <string>72.IBPluginDependency</string> - <string>72.ImportedFromIB2</string> - <string>73.IBPluginDependency</string> - <string>73.ImportedFromIB2</string> - <string>74.IBPluginDependency</string> - <string>74.ImportedFromIB2</string> - <string>75.IBPluginDependency</string> - <string>75.ImportedFromIB2</string> - <string>77.IBPluginDependency</string> - <string>77.ImportedFromIB2</string> - <string>78.IBPluginDependency</string> - <string>78.ImportedFromIB2</string> - <string>79.IBPluginDependency</string> - <string>79.ImportedFromIB2</string> - <string>80.IBPluginDependency</string> - <string>80.ImportedFromIB2</string> - <string>81.IBEditorWindowLastContentRect</string> - <string>81.IBPluginDependency</string> - <string>81.ImportedFromIB2</string> - <string>81.editorWindowContentRectSynchronizationRect</string> - <string>82.IBPluginDependency</string> - <string>82.ImportedFromIB2</string> - <string>83.IBPluginDependency</string> - <string>83.ImportedFromIB2</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilderKit</string> - <string>com.apple.InterfaceBuilderKit</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="1" id="9"/> - <string>{{417, 1069}, {216, 23}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{596, 852}, {216, 23}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{522, 812}, {146, 23}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{436, 809}, {64, 6}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{608, 612}, {275, 83}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{186, 593}, {243, 243}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{187, 434}, {243, 243}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{608, 612}, {167, 43}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{608, 612}, {241, 103}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{2560, 1536}, {442, 20}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{74, 862}</string> - <string>{{6, 978}, {478, 20}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{296, 1049}, {234, 43}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{475, 832}, {234, 43}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{2790, 1493}, {176, 43}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{231, 634}, {176, 43}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{608, 612}, {215, 63}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{12, 909}, {245, 183}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{23, 794}, {245, 183}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{144, 633}, {199, 203}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>{{145, 474}, {199, 203}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <reference ref="9"/> - </object> - </object> - <object class="NSMutableDictionary" key="unlocalizedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <nil key="activeLocalization"/> - <object class="NSMutableDictionary" key="localizations"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - </object> - <nil key="sourceID"/> - <int key="maxID">388</int> - </object> - <object class="IBClassDescriber" key="IBDocument.Classes"> - <object class="NSMutableArray" key="referencedPartialClassDescriptions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBPartialClassDescription"> - <string key="className">GTMLargeTypeWindow</string> - <string key="superclassName">NSPanel</string> - <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">copy:</string> - <string key="NS.object.0">id</string> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">AppKit/GTMLargeTypeWindow.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">GTMUILocalizer</string> - <string key="superclassName">NSObject</string> - <object class="NSMutableDictionary" key="outlets"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMutableArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>otherObjectToLocalize_</string> - <string>owner_</string> - <string>yetAnotherObjectToLocalize_</string> - </object> - <object class="NSMutableArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>id</string> - <string>id</string> - <string>id</string> - </object> - </object> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">AppKit/GTMUILocalizer.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSApplication</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier" id="271775925"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">UnitTesting/GTMAppKit+UnitTesting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSControl</string> - <reference key="sourceIdentifier" ref="271775925"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenu</string> - <reference key="sourceIdentifier" ref="271775925"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSMenuItem</string> - <reference key="sourceIdentifier" ref="271775925"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">AppKit/GTMCarbonEvent.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">AppKit/GTMDelegatingTableColumn.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Foundation/GTMHTTPServer.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Foundation/GTMNSAppleEventDescriptor+Foundation.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">Foundation/GTMNSObject+KeyValueObserving.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">UnitTesting/GTMCALayer+UnitTesting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">UnitTesting/GTMNSObject+BindingUnitTesting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSObject</string> - <object class="IBClassDescriptionSource" key="sourceIdentifier"> - <string key="majorKey">IBProjectSource</string> - <string key="minorKey">UnitTesting/GTMNSObject+UnitTesting.h</string> - </object> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSView</string> - <reference key="sourceIdentifier" ref="271775925"/> - </object> - <object class="IBPartialClassDescription"> - <string key="className">NSWindow</string> - <reference key="sourceIdentifier" ref="271775925"/> - </object> - </object> - </object> - <int key="IBDocument.localizationMode">0</int> - <string key="IBDocument.LastKnownRelativeProjectPath">../../../GTM.xcodeproj</string> - <int key="IBDocument.defaultPropertyAccessControl">3</int> - </data> -</archive> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="15G31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> + <dependencies> + <deployment identifier="macosx"/> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/> + </dependencies> + <objects> + <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/> + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> + <customObject id="-3" userLabel="Application"/> + <menu title="AMainMenu" systemMenu="main" id="29" userLabel="MainMenu"> + <items> + <menuItem title="NewApplication" id="56"> + <menu key="submenu" title="NewApplication" systemMenu="apple" id="57"> + <items> + <menuItem title="About NewApplication" id="58"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="orderFrontStandardAboutPanel:" target="-2" id="142"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="236"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Preferences…" keyEquivalent="," id="129" userLabel="121"/> + <menuItem isSeparatorItem="YES" id="143"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Services" id="131"> + <menu key="submenu" title="Services" systemMenu="services" id="130"/> + </menuItem> + <menuItem isSeparatorItem="YES" id="144"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Hide NewApplication" keyEquivalent="h" id="134"> + <connections> + <action selector="hide:" target="-1" id="367"/> + </connections> + </menuItem> + <menuItem title="Hide Others" keyEquivalent="h" id="145"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="hideOtherApplications:" target="-1" id="368"/> + </connections> + </menuItem> + <menuItem title="Show All" id="150"> + <connections> + <action selector="unhideAllApplications:" target="-1" id="370"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="149"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Quit NewApplication" id="136" userLabel="1111"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="terminate:" target="-1" id="369"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="File" id="83"> + <menu key="submenu" title="File" id="81"> + <items> + <menuItem title="New" keyEquivalent="n" id="82" userLabel="9"> + <connections> + <action selector="newDocument:" target="-1" id="373"/> + </connections> + </menuItem> + <menuItem title="Open…" keyEquivalent="o" id="72"> + <connections> + <action selector="openDocument:" target="-1" id="374"/> + </connections> + </menuItem> + <menuItem title="Open Recent" id="124"> + <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125"> + <items> + <menuItem title="Clear Menu" id="126"> + <connections> + <action selector="clearRecentDocuments:" target="-1" id="127"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem isSeparatorItem="YES" id="79" userLabel="7"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Close" keyEquivalent="w" id="73" userLabel="1"> + <connections> + <action selector="performClose:" target="-1" id="193"/> + </connections> + </menuItem> + <menuItem title="Save" keyEquivalent="s" id="75" userLabel="3"> + <connections> + <action selector="saveDocument:" target="-1" id="362"/> + </connections> + </menuItem> + <menuItem title="Save As…" keyEquivalent="S" id="80" userLabel="8"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="saveDocumentAs:" target="-1" id="363"/> + </connections> + </menuItem> + <menuItem title="Revert to Saved" id="112" userLabel="10"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="revertDocumentToSaved:" target="-1" id="364"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="74" userLabel="2"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Page Setup..." keyEquivalent="P" id="77" userLabel="5"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="runPageLayout:" target="-1" id="87"/> + </connections> + </menuItem> + <menuItem title="Print…" keyEquivalent="p" id="78" userLabel="6"> + <connections> + <action selector="print:" target="-1" id="86"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Edit" id="217"> + <menu key="submenu" title="Edit" id="205"> + <items> + <menuItem title="Undo" keyEquivalent="z" id="207"> + <connections> + <action selector="undo:" target="-1" id="223"/> + </connections> + </menuItem> + <menuItem title="Redo" keyEquivalent="Z" id="215"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="redo:" target="-1" id="231"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="206"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Cut" keyEquivalent="x" id="199"> + <connections> + <action selector="cut:" target="-1" id="228"/> + </connections> + </menuItem> + <menuItem title="Copy" keyEquivalent="c" id="197"> + <connections> + <action selector="copy:" target="-1" id="224"/> + </connections> + </menuItem> + <menuItem title="Paste" keyEquivalent="v" id="203"> + <connections> + <action selector="paste:" target="-1" id="226"/> + </connections> + </menuItem> + <menuItem title="Delete" id="202"> + <connections> + <action selector="delete:" target="-1" id="235"/> + </connections> + </menuItem> + <menuItem title="Select All" keyEquivalent="a" id="198"> + <connections> + <action selector="selectAll:" target="-1" id="232"/> + </connections> + </menuItem> + <menuItem isSeparatorItem="YES" id="214"> + <modifierMask key="keyEquivalentModifierMask" command="YES"/> + </menuItem> + <menuItem title="Find" id="218"> + <menu key="submenu" title="Find" id="220"> + <items> + <menuItem title="Find…" tag="1" keyEquivalent="f" id="209"> + <connections> + <action selector="performFindPanelAction:" target="-1" id="241"/> + </connections> + </menuItem> + <menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"/> + <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + </menuItem> + <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"/> + <menuItem title="Jump to Selection" keyEquivalent="j" id="210"> + <connections> + <action selector="centerSelectionInVisibleArea:" target="-1" id="245"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Spelling and Grammar" id="216"> + <menu key="submenu" title="Spelling and Grammar" id="200"> + <items> + <menuItem title="Show Spelling…" keyEquivalent=":" id="204"> + <connections> + <action selector="showGuessPanel:" target="-1" id="230"/> + </connections> + </menuItem> + <menuItem title="Check Spelling" keyEquivalent=";" id="201"> + <connections> + <action selector="checkSpelling:" target="-1" id="225"/> + </connections> + </menuItem> + <menuItem title="Check Spelling While Typing" id="219"> + <connections> + <action selector="toggleContinuousSpellChecking:" target="-1" id="222"/> + </connections> + </menuItem> + <menuItem title="Check Grammar With Spelling" id="346"> + <connections> + <action selector="toggleGrammarChecking:" target="-1" id="347"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Substitutions" id="348"> + <menu key="submenu" title="Substitutions" id="349"> + <items> + <menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"> + <connections> + <action selector="toggleSmartInsertDelete:" target="-1" id="355"/> + </connections> + </menuItem> + <menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"> + <connections> + <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="356"/> + </connections> + </menuItem> + <menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="toggleAutomaticLinkDetection:" target="-1" id="357"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Speech" id="211"> + <menu key="submenu" title="Speech" id="212"> + <items> + <menuItem title="Start Speaking" id="196"> + <connections> + <action selector="startSpeaking:" target="-1" id="233"/> + </connections> + </menuItem> + <menuItem title="Stop Speaking" id="195"> + <connections> + <action selector="stopSpeaking:" target="-1" id="227"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="¬Menu Title" id="299"> + <menu key="submenu" title="¬Menu Title" id="300"> + <items> + <menuItem title="¬Menu Item" keyEquivalent="t" id="377"/> + <menuItem title="Show Colors" keyEquivalent="C" id="345"> + <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/> + <connections> + <action selector="orderFrontColorPanel:" target="-1" id="361"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="View" id="295"> + <menu key="submenu" title="View" id="296"> + <items> + <menuItem title="Show Toolbar" keyEquivalent="t" id="297"> + <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> + <connections> + <action selector="toggleToolbarShown:" target="-1" id="366"/> + </connections> + </menuItem> + <menuItem title="Customize Toolbar…" id="298"> + <connections> + <action selector="runToolbarCustomizationPalette:" target="-1" id="365"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem title="Help" id="103" userLabel="1"> + <menu key="submenu" title="Help" id="106" userLabel="2"> + <items> + <menuItem title="NewApplication Help" keyEquivalent="?" id="111"> + <connections> + <action selector="showHelp:" target="-1" id="360"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + </items> + </menu> + <customObject id="375" customClass="GTMUILocalizer"> + <connections> + <outlet property="owner_" destination="-2" id="376"/> + </connections> + </customObject> + </objects> +</document> diff --git a/UnitTesting/GTMUIUnitTestingHarness/main.m b/UnitTesting/GTMUIUnitTestingHarness/main.m index 7438499..ceff0c9 100644 --- a/UnitTesting/GTMUIUnitTestingHarness/main.m +++ b/UnitTesting/GTMUIUnitTestingHarness/main.m @@ -19,14 +19,11 @@ #import <Cocoa/Cocoa.h> -#import "GTMAppKitUnitTestingUtilities.h" #import "GTMFoundationUnitTestingUtilities.h" int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [GTMAppKitUnitTestingUtilities setUpForUIUnitTestsIfBeingTested]; - // Give ourselves a max of 10 minutes for the tests. Sometimes (in automated // builds) the unittesting bundle fails to load which causes the app to keep // running forever. This will force it to exit after a certain amount of time diff --git a/UnitTesting/GTMUnitTestDevLog.h b/UnitTesting/GTMUnitTestDevLog.h index 2be231e..35d5e0d 100644 --- a/UnitTesting/GTMUnitTestDevLog.h +++ b/UnitTesting/GTMUnitTestDevLog.h @@ -16,69 +16,16 @@ // the License. // -#import "GTMDefines.h" #import <Foundation/Foundation.h> +#import "GTMDefines.h" -// GTMUnitTestDevLog tracks what messages are logged to verify that you only -// log what you expect to log during the running of unittests. This allows you -// to log with impunity from your actual core implementations and still be able -// to find unexpected logs in your output when running unittests. -// In your unittests you tell GTMUnitTestDevLog what messages you expect your -// test to spit out, and it will cause any that don't match to appear as errors -// in your unittest run output. You can match on exact strings or standard -// regexps. -// Set GTM_SHOW_UNITTEST_DEVLOGS in the environment to show the logs that that -// are expected and encountered. Otherwise they aren't display to keep the -// unit test results easier to read. +// GTMUnitTestDevLog modifies assertion logs so they don't get trapped by +// build systems. @interface GTMUnitTestDevLog : NSObject -// Log a message -+ (void)log:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); -+ (void)log:(NSString*)format args:(va_list)args NS_FORMAT_FUNCTION(1, 0); // Turn tracking on/off + (void)enableTracking; + (void)disableTracking; -+ (BOOL)isTrackingEnabled; - -// Note that you are expecting a string that has an exact match. No need to -// escape any pattern characters. -+ (void)expectString:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); - -// Note that you are expecting a pattern. Pattern characters that you want -// exact matches on must be escaped. See [GTMRegex escapedPatternForString]. -// Patterns match across newlines (kGTMRegexOptionSupressNewlineSupport) making -// it easier to match output from the descriptions of NS collection types such -// as NSArray and NSDictionary. -+ (void)expectPattern:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); - -// Note that you are expecting exactly 'n' strings -+ (void)expect:(NSUInteger)n - casesOfString:(NSString *)format, ... NS_FORMAT_FUNCTION(2, 3); -// Note that you are expecting exactly 'n' patterns -+ (void)expect:(NSUInteger)n - casesOfPattern:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); -+ (void)expect:(NSUInteger)n - casesOfPattern:(NSString*)format - args:(va_list)args NS_FORMAT_FUNCTION(2, 0); - -// Call when you want to verify that you have matched all the logs you expect -// to match. If your unittests inherit from GTMTestcase (like they should) you -// will get this called for free. -+ (void)verifyNoMoreLogsExpected; - -// Resets the expected logs so that you don't have anything expected. -// In general should not be needed, unless you have a variable logging case -// of some sort. -+ (void)resetExpectedLogs; @end - -// Does the same as GTMUnitTestDevLog, but the logs are only expected in debug. -// ie-the expect requests don't count in release builds. -@interface GTMUnitTestDevLogDebug : GTMUnitTestDevLog -@end - -// The name of the exception that is raised when GTMUnitTestDevLog -// finds a problem. -GTM_EXTERN NSString *const GTMLogFailureException; diff --git a/UnitTesting/GTMUnitTestDevLog.m b/UnitTesting/GTMUnitTestDevLog.m index 7a12bb0..ae4050f 100644 --- a/UnitTesting/GTMUnitTestDevLog.m +++ b/UnitTesting/GTMUnitTestDevLog.m @@ -18,52 +18,12 @@ #import "GTMUnitTestDevLog.h" - -#import "GTMRegex.h" -#import "GTMSenTestCase.h" - -#if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42) -// Some versions of GCC (4.2 and below AFAIK) aren't great about supporting -// -Wmissing-format-attribute -// when the function is anything more complex than foo(NSString *fmt, ...). -// You see the error inside the function when you turn ... into va_args and -// attempt to call another function (like vsprintf for example). -// So we just shut off the warning for this file. We reenable it at the end. -#pragma GCC diagnostic ignored "-Wmissing-format-attribute" -#endif // !__clang__ - -#if !GTM_IPHONE_SDK -// Add support for grabbing messages from Carbon. -#import <CoreServices/CoreServices.h> -static void GTMDevLogDebugAssert(OSType componentSignature, - UInt32 options, - const char *assertionString, - const char *exceptionLabelString, - const char *errorString, - const char *fileName, - long lineNumber, - void *value, - ConstStr255Param outputMsg) { - NSString *outLog = [[[NSString alloc] initWithBytes:&(outputMsg[1]) - length:StrLength(outputMsg) - encoding:NSMacOSRomanStringEncoding] - autorelease]; - _GTMDevLog(@"%@", outLog); // Don't want any percents in outLog honored -} -static inline void GTMInstallDebugAssertOutputHandler(void) { - InstallDebugAssertOutputHandler(GTMDevLogDebugAssert); -} -static inline void GTMUninstallDebugAssertOutputHandler(void) { - InstallDebugAssertOutputHandler(NULL); -} -#else // GTM_IPHONE_SDK -static inline void GTMInstallDebugAssertOutputHandler(void) {}; -static inline void GTMUninstallDebugAssertOutputHandler(void) {}; -#endif // GTM_IPHONE_SDK - -NSString *const GTMLogFailureException = @"GTMLogFailureException"; - @interface GTMUnttestDevLogAssertionHandler : NSAssertionHandler +- (void)handleFailure:(NSString *)functionName + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format + arguments:(va_list)argList NS_FORMAT_FUNCTION(4,0); @end @implementation GTMUnttestDevLogAssertionHandler @@ -72,24 +32,18 @@ NSString *const GTMLogFailureException = @"GTMLogFailureException"; file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format, ... { + NSString *call = [NSString stringWithFormat:@"[%@ %@]", + NSStringFromClass([object class]), + NSStringFromSelector(selector)]; + va_list argList; va_start(argList, format); - NSString *descStr - = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease]; + [self handleFailure:call + file:fileName + lineNumber:line + description:format + arguments:argList]; va_end(argList); - - // You need a format that will be useful in logs, but won't trip up Xcode or - // any other build systems parsing of the output. - NSString *outLog - = [NSString stringWithFormat:@"RecordedNSAssert in %@ - %@ (%@:%ld)", - NSStringFromSelector(selector), - descStr, - fileName, (long)line]; - // To avoid unused variable warning when _GTMDevLog is stripped. - (void)outLog; - _GTMDevLog(@"%@", outLog); // Don't want any percents in outLog honored - [NSException raise:NSInternalInconsistencyException - format:@"NSAssert raised"]; } - (void)handleFailureInFunction:(NSString *)functionName @@ -98,45 +52,38 @@ NSString *const GTMLogFailureException = @"GTMLogFailureException"; description:(NSString *)format, ... { va_list argList; va_start(argList, format); - NSString *descStr - = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease]; + [self handleFailure:functionName + file:fileName + lineNumber:line + description:format + arguments:argList]; va_end(argList); +} + +- (void)handleFailure:(NSString *)failure + file:(NSString *)fileName + lineNumber:(NSInteger)line + description:(NSString *)format + arguments:(va_list)argList { + NSString *descStr + = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease]; // You need a format that will be useful in logs, but won't trip up Xcode or // any other build systems parsing of the output. NSString *outLog - = [NSString stringWithFormat:@"RecordedNSAssert in %@ - %@ (%@:%ld)", - functionName, - descStr, - fileName, (long)line]; + = [NSString stringWithFormat:@"RecordedNSAssert in %@ - %@ (%@:%ld)", + failure, descStr, fileName, (long)line]; // To avoid unused variable warning when _GTMDevLog is stripped. (void)outLog; _GTMDevLog(@"%@", outLog); // Don't want any percents in outLog honored [NSException raise:NSInternalInconsistencyException format:@"NSAssert raised"]; } - @end @implementation GTMUnitTestDevLog -// If unittests are ever being run on separate threads, this may need to be -// made a thread local variable. -static BOOL gTrackingEnabled = NO; - -+ (NSMutableArray *)patterns { - static NSMutableArray *patterns = nil; - if (!patterns) { - patterns = [[NSMutableArray array] retain]; - } - return patterns; -} - -+ (BOOL)isTrackingEnabled { - return gTrackingEnabled; -} + (void)enableTracking { - GTMInstallDebugAssertOutputHandler(); NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; @@ -148,154 +95,14 @@ static BOOL gTrackingEnabled = NO; GTMUnttestDevLogAssertionHandler *handler = [[[GTMUnttestDevLogAssertionHandler alloc] init] autorelease]; [threadDictionary setObject:handler forKey:@"NSAssertionHandler"]; - - gTrackingEnabled = YES; } + (void)disableTracking { - GTMUninstallDebugAssertOutputHandler(); // Clear our assertion handler back out. NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; [threadDictionary removeObjectForKey:@"NSAssertionHandler"]; - - gTrackingEnabled = NO; } -+ (void)log:(NSString*)format, ... { - va_list argList; - va_start(argList, format); - [self log:format args:argList]; - va_end(argList); -} - -+ (void)log:(NSString*)format args:(va_list)args { - if ([self isTrackingEnabled]) { - NSString *logString = [[[NSString alloc] initWithFormat:format - arguments:args] autorelease]; - @synchronized(self) { - NSMutableArray *patterns = [self patterns]; - BOOL logError = [patterns count] == 0 ? YES : NO; - GTMRegex *regex = nil; - if (!logError) { - regex = [[[patterns objectAtIndex:0] retain] autorelease]; - logError = [regex matchesString:logString] ? NO : YES; - [patterns removeObjectAtIndex:0]; - } - if (logError) { - - if (regex) { - [NSException raise:GTMLogFailureException - format:@"Unexpected log: %@\nExpected: %@", - logString, regex]; - } else { - [NSException raise:GTMLogFailureException - format:@"Unexpected log: %@", logString]; - } - } else { - static BOOL envChecked = NO; - static BOOL showExpectedLogs = YES; - if (!envChecked) { - showExpectedLogs = getenv("GTM_SHOW_UNITTEST_DEVLOGS") ? YES : NO; - } - if (showExpectedLogs) { - NSLog(@"Expected Log: %@", logString); - } - } - } - } else { - NSLogv(format, args); - } -} - -+ (void)expectString:(NSString *)format, ... { - va_list argList; - va_start(argList, format); - NSString *string = [[[NSString alloc] initWithFormat:format - arguments:argList] autorelease]; - va_end(argList); - NSString *pattern = [GTMRegex escapedPatternForString:string]; - [self expect:1 casesOfPattern:@"%@", pattern]; - -} - -+ (void)expectPattern:(NSString *)format, ... { - va_list argList; - va_start(argList, format); - [self expect:1 casesOfPattern:format args:argList]; - va_end(argList); -} - -+ (void)expect:(NSUInteger)n casesOfString:(NSString *)format, ... { - va_list argList; - va_start(argList, format); - NSString *string = [[[NSString alloc] initWithFormat:format - arguments:argList] autorelease]; - va_end(argList); - NSString *pattern = [GTMRegex escapedPatternForString:string]; - [self expect:n casesOfPattern:@"%@", pattern]; -} - -+ (void)expect:(NSUInteger)n casesOfPattern:(NSString*)format, ... { - va_list argList; - va_start(argList, format); - [self expect:n casesOfPattern:format args:argList]; - va_end(argList); -} - -+ (void)expect:(NSUInteger)n -casesOfPattern:(NSString*)format - args:(va_list)args { - NSString *pattern = [[[NSString alloc] initWithFormat:format - arguments:args] autorelease]; - GTMRegex *regex = [GTMRegex regexWithPattern:pattern - options:kGTMRegexOptionSupressNewlineSupport]; - @synchronized(self) { - NSMutableArray *patterns = [self patterns]; - for (NSUInteger i = 0; i < n; ++i) { - [patterns addObject:regex]; - } - } -} - -+ (void)verifyNoMoreLogsExpected { - @synchronized(self) { - NSMutableArray *patterns = [self patterns]; - if ([patterns count] > 0) { - NSMutableArray *patternsCopy = [[patterns copy] autorelease]; - [self resetExpectedLogs]; - [NSException raise:GTMLogFailureException - format:@"Logs still expected %@", patternsCopy]; - } - } -} - -+ (void)resetExpectedLogs { - @synchronized(self) { - NSMutableArray *patterns = [self patterns]; - [patterns removeAllObjects]; - } -} @end - - -@implementation GTMUnitTestDevLogDebug - -+ (void)expect:(NSUInteger)n -casesOfPattern:(NSString*)format - args:(va_list)args { -#if DEBUG - // In debug, let the base work happen - [super expect:n casesOfPattern:format args:args]; -#else - // nothing when not in debug -#endif -} - -@end - -#if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42) -// See comment at top of file. -#pragma GCC diagnostic error "-Wmissing-format-attribute" -#endif // !__clang__ diff --git a/UnitTesting/GTMUnitTestingBindingTest.m b/UnitTesting/GTMUnitTestingBindingTest.m deleted file mode 100644 index 26ae5df..0000000 --- a/UnitTesting/GTMUnitTestingBindingTest.m +++ /dev/null @@ -1,116 +0,0 @@ -// -// GTMUnitTestingBindingTest.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 "GTMUnitTestingTest.h" -#import "GTMNSObject+BindingUnitTesting.h" - -@interface GTMUnitTestingBindingTest : GTMTestCase { - int expectedFailureCount_; -} -@end - -@interface GTMUnitTestingBindingBadClass : NSObject -@end - -@implementation GTMUnitTestingBindingTest - -// Iterates through all of our subviews testing the exposed bindings -- (void)doSubviewBindingTest:(NSView*)view { - NSArray *subviews = [view subviews]; - NSView *subview; - GTM_FOREACH_OBJECT(subview, subviews) { - GTMTestExposedBindings(subview, @"testing %@", subview); - [self doSubviewBindingTest:subview]; - } -} - -- (void)testBindings { - // Get our window to work with and test it's bindings - GTMUnitTestingTestController *testWindowController - = [[GTMUnitTestingTestController alloc] initWithWindowNibName:@"GTMUnitTestingTest"]; - NSWindow *window = [testWindowController window]; - GTMTestExposedBindings(window, @"Window failed binding test"); - [self doSubviewBindingTest:[window contentView]]; - [window close]; - [testWindowController release]; - - // Run a test against something with no bindings. - // We're expecting a failure here. - expectedFailureCount_ = 1; - GTMTestExposedBindings(@"foo", @"testing no bindings"); - STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing bindings"); - - // Run test against some with bad bindings. - // We're expecting failures here. - expectedFailureCount_ = 4; - GTMUnitTestingBindingBadClass *bad = [[[GTMUnitTestingBindingBadClass alloc] init] autorelease]; - GTMTestExposedBindings(bad, @"testing bad bindings"); - STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing bad bindings"); -} - -- (void)failWithException:(NSException *)anException { - if (expectedFailureCount_ > 0) { - expectedFailureCount_ -= 1; - } else { - [super failWithException:anException]; // COV_NF_LINE - not expecting exception - } -} - -@end - -// Forces several error cases in our binding tests to test them -@implementation GTMUnitTestingBindingBadClass - -NSString *const kGTMKeyWithNoClass = @"keyWithNoClass"; -NSString *const kGTMKeyWithNoValue = @"keyWithNoValue"; -NSString *const kGTMKeyWeCantSet = @"keyWeCantSet"; -NSString *const kGTMKeyThatIsntEqual = @"keyThatIsntEqual"; - -- (NSArray *)exposedBindings { - return [NSArray arrayWithObjects:kGTMKeyWithNoClass, - kGTMKeyWithNoValue, - kGTMKeyWeCantSet, - kGTMKeyThatIsntEqual, - nil]; -} - -- (NSArray*)gtm_unitTestExposedBindingsTestValues:(NSString*)binding { - GTMBindingUnitTestData *data - = [GTMBindingUnitTestData testWithIdentityValue:kGTMKeyThatIsntEqual]; - return [NSArray arrayWithObject:data]; -} - -- (Class)valueClassForBinding:(NSString*)binding { - return [binding isEqualTo:kGTMKeyWithNoClass] ? nil : [NSString class]; -} - -- (id)valueForKey:(NSString*)binding { - if ([binding isEqualTo:kGTMKeyWithNoValue]) { - [NSException raise:NSUndefinedKeyException format:@""]; - } - return @"foo"; -} - -- (void)setValue:(id)value forKey:(NSString*)binding { - if ([binding isEqualTo:kGTMKeyWeCantSet]) { - [NSException raise:NSUndefinedKeyException format:@""]; - } -} -@end - diff --git a/UnitTesting/GTMUnitTestingTest.h b/UnitTesting/GTMUnitTestingTest.h deleted file mode 100644 index ea9521b..0000000 --- a/UnitTesting/GTMUnitTestingTest.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// GTMUnitTestingTest.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 <AppKit/AppKit.h> - -// GTMUnitTestingTestController controller so that initWithWindowNibName can -// find the appropriate bundle to load our nib from. See [GTMUnitTestingTest -// -testUnitTestingFramework] for more info -@interface GTMUnitTestingTestController : NSWindowController { - IBOutlet NSTextField *field_; -} - -- (NSTextField *)textField; -@end diff --git a/UnitTesting/GTMUnitTestingTest.m b/UnitTesting/GTMUnitTestingTest.m deleted file mode 100644 index 0f87d28..0000000 --- a/UnitTesting/GTMUnitTestingTest.m +++ /dev/null @@ -1,253 +0,0 @@ -// -// GTMUnitTestingTest.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 "GTMUnitTestingTest.h" -#import "GTMAppKit+UnitTesting.h" - -NSString *const kGTMWindowNibName = @"GTMUnitTestingTest"; -NSString *const kGTMWindowSaveFileName = @"GTMUnitTestingWindow"; - -@interface GTMUnitTestingTest : GTMTestCase { - int expectedFailureCount_; -} -@end - -// GTMUnitTestingTest support classes -@interface GTMUnitTestingView : NSObject <GTMUnitTestViewDrawer> { - BOOL goodContext_; -} -- (BOOL)hadGoodContext; -@end - -@interface GTMUnitTestingDelegate : NSObject <NSImageDelegate> { - BOOL didEncode_; -} -- (BOOL)didEncode; -@end - -@interface GTMUnitTestingProxyTest : NSProxy -- (id)init; -@end - -@implementation GTMUnitTestingTest - -// Brings up the window defined in the nib and takes a snapshot of it. -// We use the "empty" GTMUnitTestingTestController controller so that -// initWithWindowNibName can find the appropriate bundle to load our nib from. -// For some reason when running unit tests, with all the injecting going on -// the nib loader can get confused as to where it should load a nib from. -// Having a NSWindowController subclass in the same bundle as the nib seems -// to help the nib loader find the nib, and any custom classes that are attached -// to it. -- (void)testUnitTestingFramework { - // set up our delegates so we can test delegate handling - GTMUnitTestingDelegate *appDelegate = [[GTMUnitTestingDelegate alloc] init]; - [NSApp setDelegate:appDelegate]; - - // Get our window - GTMUnitTestingTestController *testWindowController - = [[GTMUnitTestingTestController alloc] initWithWindowNibName:kGTMWindowNibName]; - NSWindow *window = [testWindowController window]; - // Test the app state. This will cover windows and menus - GTMAssertObjectStateEqualToStateNamed(NSApp, - @"GTMUnitTestingTestApp", - @"Testing the app state"); - - // Test the window image and state - GTMAssertObjectEqualToStateAndImageNamed(window, - kGTMWindowSaveFileName, - @"Testing the window image and state"); - - // Verify that all of our delegate encoders got called - STAssertTrue([appDelegate didEncode], @"app delegate didn't get called?"); - - // Clean up - [NSApp setDelegate:nil]; - [appDelegate release]; - [testWindowController release]; -} - -- (void)testViewUnitTesting { - GTMUnitTestingView *unitTestingView = [[GTMUnitTestingView alloc] init]; - GTMAssertDrawingEqualToImageNamed(unitTestingView, - NSMakeSize(200,200), - @"GTMUnitTestingView", - NSApp, - @"Testing view drawing"); - STAssertTrue([unitTestingView hadGoodContext], @"bad context?"); - [unitTestingView release]; -} - -- (void)testImageUnitTesting { - NSImage *image = [NSImage imageNamed:@"NSApplicationIcon"]; - GTMUnitTestingDelegate *imgDelegate = [[GTMUnitTestingDelegate alloc] init]; - [image setDelegate:imgDelegate]; - GTMAssertObjectEqualToStateAndImageNamed(image, - @"GTMUnitTestingImage", - @"Testing NSImage image and state"); - STAssertTrue([imgDelegate didEncode], @"imgDelegate didn't get called?"); - [image setDelegate:nil]; - [imgDelegate release]; -} - -- (void)testFailures { - NSString *const bogusTestName = @"GTMUnitTestTestingFailTest"; - NSString *tempDir = NSTemporaryDirectory(); - STAssertNotNil(tempDir, @"No Temp Dir?"); - NSString *originalPath = [NSObject gtm_getUnitTestSaveToDirectory]; - STAssertNotNil(originalPath, @"No save dir?"); - [NSObject gtm_setUnitTestSaveToDirectory:tempDir]; - STAssertEqualObjects(tempDir, [NSObject gtm_getUnitTestSaveToDirectory], - @"Save to dir not set?"); - NSString *statePath = [self gtm_saveToPathForStateNamed:bogusTestName]; - STAssertNotNil(statePath, @"no state path?"); - NSString *imagePath = [self gtm_saveToPathForImageNamed:bogusTestName]; - STAssertNotNil(imagePath, @"no image path?"); - GTMUnitTestingTestController *testWindowController - = [[GTMUnitTestingTestController alloc] initWithWindowNibName:kGTMWindowNibName]; - NSWindow *window = [testWindowController window]; - - // Test against a golden master filename that doesn't exist - expectedFailureCount_ = 2; - GTMAssertObjectEqualToStateAndImageNamed(window, - bogusTestName, - @"Creating image and state files"); - STAssertEquals(expectedFailureCount_, 0, - @"Didn't get expected failures creating files"); - - // Change our image and state and verify failures - [[testWindowController textField] setStringValue:@"Foo"]; - expectedFailureCount_ = 2; - GTMAssertObjectEqualToStateAndImageNamed(window, - kGTMWindowSaveFileName, - @"Testing the window image and state"); - STAssertEquals(expectedFailureCount_, 0, - @"Didn't get expected failures testing files"); - - // Now change the size of our image and verify failures - NSRect oldFrame = [window frame]; - NSRect newFrame = oldFrame; - newFrame.size.width += 1; - [window setFrame:newFrame display:YES]; - expectedFailureCount_ = 1; - GTMAssertObjectImageEqualToImageNamed(window, - kGTMWindowSaveFileName, - @"Testing the changed window size"); - [window setFrame:oldFrame display:YES]; - - // Set our unit test save dir to a bogus directory and - // run the tests again. - [NSObject gtm_setUnitTestSaveToDirectory:@"/zim/blatz/foo/bob/bar"]; - expectedFailureCount_ = 2; - GTMAssertObjectEqualToStateAndImageNamed(window, - kGTMWindowSaveFileName, - @"Testing the window image and state"); - STAssertEquals(expectedFailureCount_, 0, - @"Didn't get expected failures testing files"); - expectedFailureCount_ = 2; - GTMAssertObjectEqualToStateAndImageNamed(window, - @"GTMUnitTestingWindowDoesntExist", - @"Testing the window image and state"); - STAssertEquals(expectedFailureCount_, 0, - @"Didn't get expected failures testing files"); - - // Reset our unit test save dir - [NSObject gtm_setUnitTestSaveToDirectory:nil]; - - // Test against something that doesn't have an image - expectedFailureCount_ = 1; - GTMAssertObjectImageEqualToImageNamed(@"a string", - @"GTMStringsDontHaveImages", - @"Testing that strings should fail"); - STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing files"); - - // Test against something that doesn't implement our support - expectedFailureCount_ = 1; - GTMUnitTestingProxyTest *proxy = [[GTMUnitTestingProxyTest alloc] init]; - GTMAssertObjectStateEqualToStateNamed(proxy, - @"NSProxiesDontDoState", - @"Testing that NSProxy should fail"); - STAssertEquals(expectedFailureCount_, 0, @"Didn't get expected failures testing proxy"); - [proxy release]; - - [window close]; -} - -- (void)failWithException:(NSException *)anException { - if (expectedFailureCount_ > 0) { - expectedFailureCount_ -= 1; - } else { - [super failWithException:anException]; // COV_NF_LINE - not expecting exception - } -} - - -@end - -@implementation GTMUnitTestingTestController -- (NSTextField *)textField { - return field_; -} - -@end - -@implementation GTMUnitTestingDelegate - -- (void)gtm_unitTestEncoderWillEncode:(id)sender inCoder:(NSCoder*)inCoder { - // Test various encodings - [inCoder encodeBool:YES forKey:@"BoolTest"]; - [inCoder encodeInt:1 forKey:@"IntTest"]; - [inCoder encodeInt32:1 forKey:@"Int32Test"]; - [inCoder encodeInt64:1 forKey:@"Int64Test"]; - [inCoder encodeFloat:1.0f forKey:@"FloatTest"]; - [inCoder encodeDouble:1.0 forKey:@"DoubleTest"]; - [inCoder encodeBytes:(const uint8_t*)"BytesTest" length:9 forKey:@"BytesTest"]; - didEncode_ = YES; -} - -- (BOOL)didEncode { - return didEncode_; -} -@end - -@implementation GTMUnitTestingView - -- (void)gtm_unitTestViewDrawRect:(NSRect)rect contextInfo:(void*)contextInfo { - [[NSColor redColor] set]; - NSRectFill(rect); - goodContext_ = [(id)contextInfo isEqualTo:NSApp]; -} - -- (BOOL)hadGoodContext { - return goodContext_; -} -@end - -// GTMUnitTestingProxyTest is for testing the case where we don't conform to -// the GTMUnitTestingEncoding protocol. -@implementation GTMUnitTestingProxyTest -- (id)init { - return self; -} - -- (BOOL)conformsToProtocol:(Protocol *)protocol { - return NO; -} - -@end diff --git a/UnitTesting/TestData/GTMUIViewUnitTestingTest.gtmUTState b/UnitTesting/TestData/GTMUIViewUnitTestingTest.gtmUTState deleted file mode 100644 index 87ae9e5..0000000 --- a/UnitTesting/TestData/GTMUIViewUnitTestingTest.gtmUTState +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>$GTMArchive</key> - <string>GTMUnitTestingArchive</string> - <key>$GTMVersion</key> - <integer>1</integer> - <key>LayerIsDoublesided</key> - <true/> - <key>LayerIsHidden</key> - <false/> - <key>LayerIsOpaque</key> - <true/> - <key>LayerOpacity</key> - <real>1</real> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>LayerIsDoublesided</key> - <true/> - <key>LayerIsHidden</key> - <false/> - <key>LayerIsOpaque</key> - <true/> - <key>LayerOpacity</key> - <real>1</real> - <key>ViewIsHidden</key> - <false/> - </dict> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUIViewUnitTestingTest.png b/UnitTesting/TestData/GTMUIViewUnitTestingTest.png Binary files differdeleted file mode 100644 index 03fd9f0..0000000 --- a/UnitTesting/TestData/GTMUIViewUnitTestingTest.png +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingImage.10.6.tiff b/UnitTesting/TestData/GTMUnitTestingImage.10.6.tiff Binary files differdeleted file mode 100644 index ec06a53..0000000 --- a/UnitTesting/TestData/GTMUnitTestingImage.10.6.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingImage.gtmUTState b/UnitTesting/TestData/GTMUnitTestingImage.gtmUTState deleted file mode 100644 index 969ddf6..0000000 --- a/UnitTesting/TestData/GTMUnitTestingImage.gtmUTState +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>$GTMArchive</key> - <string>GTMUnitTestingArchive</string> - <key>$GTMVersion</key> - <integer>1</integer> - <key>BoolTest</key> - <true/> - <key>BytesTest</key> - <data> - Qnl0ZXNUZXN0 - </data> - <key>DoubleTest</key> - <real>1</real> - <key>FloatTest</key> - <real>1</real> - <key>ImageName</key> - <string>NSApplicationIcon</string> - <key>ImageSize</key> - <string>{128, 128}</string> - <key>Int32Test</key> - <integer>1</integer> - <key>Int64Test</key> - <integer>1</integer> - <key>IntTest</key> - <integer>1</integer> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUnitTestingImage.tiff b/UnitTesting/TestData/GTMUnitTestingImage.tiff Binary files differdeleted file mode 100644 index 4d08297..0000000 --- a/UnitTesting/TestData/GTMUnitTestingImage.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingTest.nib/classes.nib b/UnitTesting/TestData/GTMUnitTestingTest.nib/classes.nib deleted file mode 100644 index cc51f67..0000000 --- a/UnitTesting/TestData/GTMUnitTestingTest.nib/classes.nib +++ /dev/null @@ -1,86 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>IBClasses</key> - <array> - <dict> - <key>CLASS</key> - <string>NSView</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>SUPERCLASS</key> - <string>NSResponder</string> - </dict> - <dict> - <key>CLASS</key> - <string>NSApplication</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>SUPERCLASS</key> - <string>NSResponder</string> - </dict> - <dict> - <key>CLASS</key> - <string>NSTextField</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>SUPERCLASS</key> - <string>NSControl</string> - </dict> - <dict> - <key>CLASS</key> - <string>NSMenu</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>SUPERCLASS</key> - <string>NSObject</string> - </dict> - <dict> - <key>CLASS</key> - <string>NSControl</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>SUPERCLASS</key> - <string>NSView</string> - </dict> - <dict> - <key>CLASS</key> - <string>NSObject</string> - <key>LANGUAGE</key> - <string>ObjC</string> - </dict> - <dict> - <key>CLASS</key> - <string>NSCell</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>SUPERCLASS</key> - <string>NSObject</string> - </dict> - <dict> - <key>CLASS</key> - <string>NSWindow</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>SUPERCLASS</key> - <string>NSResponder</string> - </dict> - <dict> - <key>CLASS</key> - <string>GTMUnitTestingTestController</string> - <key>LANGUAGE</key> - <string>ObjC</string> - <key>OUTLETS</key> - <dict> - <key>field_</key> - <string>NSTextField</string> - </dict> - <key>SUPERCLASS</key> - <string>NSWindowController</string> - </dict> - </array> - <key>IBVersion</key> - <string>1</string> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUnitTestingTest.nib/designable.nib b/UnitTesting/TestData/GTMUnitTestingTest.nib/designable.nib new file mode 100644 index 0000000..b2aa6ee --- /dev/null +++ b/UnitTesting/TestData/GTMUnitTestingTest.nib/designable.nib @@ -0,0 +1,1144 @@ +<?xml version="1.0" encoding="UTF-8"?> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> + <data> + <int key="IBDocument.SystemTarget">1050</int> + <string key="IBDocument.SystemVersion">15G1004</string> + <string key="IBDocument.InterfaceBuilderVersion">11201</string> + <string key="IBDocument.AppKitVersion">1404.47</string> + <string key="IBDocument.HIToolboxVersion">807.20</string> + <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="NS.object.0">11201</string> + </object> + <array key="IBDocument.IntegratedClassDependencies"> + <string>NSBox</string> + <string>NSButton</string> + <string>NSButtonCell</string> + <string>NSColorWell</string> + <string>NSCustomObject</string> + <string>NSProgressIndicator</string> + <string>NSScrollView</string> + <string>NSScroller</string> + <string>NSSearchField</string> + <string>NSSearchFieldCell</string> + <string>NSSlider</string> + <string>NSSliderCell</string> + <string>NSTabView</string> + <string>NSTabViewItem</string> + <string>NSTableColumn</string> + <string>NSTableHeaderView</string> + <string>NSTableView</string> + <string>NSTextField</string> + <string>NSTextFieldCell</string> + <string>NSTextView</string> + <string>NSView</string> + <string>NSWindowTemplate</string> + </array> + <array key="IBDocument.PluginDependencies"> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + </array> + <dictionary class="NSMutableDictionary" key="IBDocument.Metadata"/> + <array class="NSMutableArray" key="IBDocument.RootObjects" id="948991554"> + <object class="NSCustomObject" id="774623032"> + <string key="NSClassName">GTMUnitTestingTestController</string> + </object> + <object class="NSCustomObject" id="121913320"> + <string key="NSClassName">FirstResponder</string> + </object> + <object class="NSCustomObject" id="575648047"> + <string key="NSClassName">NSApplication</string> + </object> + <object class="NSWindowTemplate" id="392237883"> + <int key="NSWindowStyleMask">3</int> + <int key="NSWindowBacking">2</int> + <string key="NSWindowRect">{{196, 192}, {393, 318}}</string> + <int key="NSWTFlags">536871936</int> + <string key="NSWindowTitle">Window</string> + <string key="NSWindowClass">NSWindow</string> + <nil key="NSViewClass"/> + <nil key="NSUserInterfaceItemIdentifier"/> + <object class="NSView" key="NSWindowView" id="640013893"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSScrollView" id="85174318"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSClipView" id="410309725"> + <reference key="NSNextResponder" ref="85174318"/> + <int key="NSvFlags">2322</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTableView" id="497150328"> + <reference key="NSNextResponder" ref="410309725"/> + <int key="NSvFlags">256</int> + <string key="NSFrameSize">{223, 32}</string> + <reference key="NSSuperview" ref="410309725"/> + <reference key="NSNextKeyView" ref="975309690"/> + <bool key="NSEnabled">YES</bool> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <bool key="NSControlAllowsExpansionToolTips">YES</bool> + <object class="NSTableHeaderView" key="NSHeaderView" id="218180457"> + <reference key="NSNextResponder" ref="700173326"/> + <int key="NSvFlags">256</int> + <string key="NSFrameSize">{223, 23}</string> + <reference key="NSSuperview" ref="700173326"/> + <reference key="NSNextKeyView" ref="837150896"/> + <reference key="NSTableView" ref="497150328"/> + </object> + <object class="_NSCornerView" key="NSCornerView" id="837150896"> + <reference key="NSNextResponder" ref="85174318"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{224, 0}, {16, 23}}</string> + <reference key="NSSuperview" ref="85174318"/> + <reference key="NSNextKeyView" ref="410309725"/> + </object> + <array class="NSMutableArray" key="NSTableColumns"> + <object class="NSTableColumn" id="867115630"> + <double key="NSWidth">101</double> + <double key="NSMinWidth">40</double> + <double key="NSMaxWidth">1000</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497536</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents"/> + <object class="NSFont" key="NSSupport" id="26"> + <bool key="IBIsSystemFont">YES</bool> + <double key="NSSize">11</double> + <int key="NSfFlags">3100</int> + </object> + <object class="NSColor" key="NSBackgroundColor" id="907423441"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes> + </object> + <object class="NSColor" key="NSTextColor" id="1031637411"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">headerTextColor</string> + <object class="NSColor" key="NSColor" id="637251812"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MAA</bytes> + </object> + </object> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="1026765034"> + <int key="NSCellFlags">337641536</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents">Text Cell</string> + <object class="NSFont" key="NSSupport" id="719066366"> + <bool key="IBIsSystemFont">YES</bool> + <double key="NSSize">13</double> + <int key="NSfFlags">1044</int> + </object> + <reference key="NSControlView" ref="497150328"/> + <object class="NSColor" key="NSBackgroundColor" id="421034111"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlBackgroundColor</string> + <object class="NSColor" key="NSColor" id="450059627"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor" id="183411164"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlTextColor</string> + <reference key="NSColor" ref="637251812"/> + </object> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <bool key="NSIsEditable">YES</bool> + <reference key="NSTableView" ref="497150328"/> + </object> + <object class="NSTableColumn" id="328836390"> + <double key="NSWidth">116</double> + <double key="NSMinWidth">40</double> + <double key="NSMaxWidth">1000</double> + <object class="NSTableHeaderCell" key="NSHeaderCell"> + <int key="NSCellFlags">75497536</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents"/> + <reference key="NSSupport" ref="26"/> + <reference key="NSBackgroundColor" ref="907423441"/> + <reference key="NSTextColor" ref="1031637411"/> + </object> + <object class="NSTextFieldCell" key="NSDataCell" id="114565872"> + <int key="NSCellFlags">337641536</int> + <int key="NSCellFlags2">2048</int> + <string key="NSContents">Text Cell</string> + <reference key="NSSupport" ref="719066366"/> + <reference key="NSControlView" ref="497150328"/> + <reference key="NSBackgroundColor" ref="421034111"/> + <reference key="NSTextColor" ref="183411164"/> + </object> + <int key="NSResizingMask">3</int> + <bool key="NSIsResizeable">YES</bool> + <bool key="NSIsEditable">YES</bool> + <reference key="NSTableView" ref="497150328"/> + </object> + </array> + <double key="NSIntercellSpacingWidth">3</double> + <double key="NSIntercellSpacingHeight">2</double> + <reference key="NSBackgroundColor" ref="421034111"/> + <object class="NSColor" key="NSGridColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">gridColor</string> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MC41AA</bytes> + </object> + </object> + <double key="NSRowHeight">17</double> + <int key="NSTvFlags">-700448768</int> + <reference key="NSDelegate"/> + <reference key="NSDataSource"/> + <int key="NSColumnAutoresizingStyle">4</int> + <int key="NSDraggingSourceMaskForLocal">15</int> + <int key="NSDraggingSourceMaskForNonLocal">0</int> + <bool key="NSAllowsTypeSelect">YES</bool> + <int key="NSTableViewDraggingDestinationStyle">0</int> + <int key="NSTableViewGroupRowStyle">1</int> + </object> + </array> + <string key="NSFrame">{{1, 23}, {223, 32}}</string> + <reference key="NSSuperview" ref="85174318"/> + <reference key="NSNextKeyView" ref="497150328"/> + <reference key="NSDocView" ref="497150328"/> + <reference key="NSBGColor" ref="421034111"/> + <int key="NScvFlags">4</int> + <bool key="NSAutomaticallyAdjustsContentInsets">YES</bool> + </object> + <object class="NSScroller" id="975309690"> + <reference key="NSNextResponder" ref="85174318"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{224, 23}, {15, 32}}</string> + <reference key="NSSuperview" ref="85174318"/> + <reference key="NSNextKeyView" ref="745203310"/> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <string key="NSControlAction">_doScroller:</string> + <reference key="NSControlTarget" ref="85174318"/> + <reference key="NSTarget" ref="85174318"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">37</double> + <double key="NSPercent">0.1947367936372757</double> + </object> + <object class="NSScroller" id="745203310"> + <reference key="NSNextResponder" ref="85174318"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{1, 55}, {223, 15}}</string> + <reference key="NSSuperview" ref="85174318"/> + <reference key="NSNextKeyView" ref="826932166"/> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <string key="NSControlAction">_doScroller:</string> + <reference key="NSControlTarget" ref="85174318"/> + <int key="NSsFlags">1</int> + <reference key="NSTarget" ref="85174318"/> + <string key="NSAction">_doScroller:</string> + <double key="NSPercent">0.57142859697341919</double> + </object> + <object class="NSClipView" id="700173326"> + <reference key="NSNextResponder" ref="85174318"/> + <int key="NSvFlags">2338</int> + <array class="NSMutableArray" key="NSSubviews"> + <reference ref="218180457"/> + </array> + <string key="NSFrame">{{1, 0}, {223, 23}}</string> + <reference key="NSSuperview" ref="85174318"/> + <reference key="NSNextKeyView" ref="218180457"/> + <reference key="NSDocView" ref="218180457"/> + <bool key="NSAutomaticallyAdjustsContentInsets">YES</bool> + </object> + <reference ref="837150896"/> + </array> + <string key="NSFrame">{{20, 227}, {240, 71}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="700173326"/> + <int key="NSsFlags">133170</int> + <reference key="NSVScroller" ref="975309690"/> + <reference key="NSHScroller" ref="745203310"/> + <reference key="NSContentView" ref="410309725"/> + <reference key="NSHeaderClipView" ref="700173326"/> + <reference key="NSCornerView" ref="837150896"/> + <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes> + <double key="NSMinMagnification">0.25</double> + <double key="NSMaxMagnification">4</double> + <double key="NSMagnification">1</double> + </object> + <object class="NSBox" id="1010937789"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{266, 0}, {5, 318}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="321194065"/> + <string key="NSOffsets">{0, 0}</string> + <object class="NSTextFieldCell" key="NSTitleCell"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">Box</string> + <reference key="NSSupport" ref="719066366"/> + <object class="NSColor" key="NSBackgroundColor" id="938122495"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textBackgroundColor</string> + <object class="NSColor" key="NSColor" id="103793517"> + <int key="NSColorSpace">3</int> + <bytes key="NSWhite">MQA</bytes> + </object> + </object> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">labelColor</string> + <reference key="NSColor" ref="637251812"/> + </object> + </object> + <int key="NSBorderType">3</int> + <int key="NSBoxType">2</int> + <int key="NSTitlePosition">0</int> + <bool key="NSTransparent">NO</bool> + </object> + <object class="NSTextField" id="321194065"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{280, 281}, {38, 17}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="437142657"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="765978048"> + <int key="NSCellFlags">68157504</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">HaHa</string> + <reference key="NSSupport" ref="719066366"/> + <reference key="NSControlView" ref="321194065"/> + <object class="NSColor" key="NSBackgroundColor" id="434344295"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">controlColor</string> + <reference key="NSColor" ref="450059627"/> + </object> + <reference key="NSTextColor" ref="183411164"/> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">2</int> + </object> + <object class="NSSearchField" id="437142657"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{277, 251}, {96, 22}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="426312658"/> + <bool key="NSViewIsLayerTreeHost">YES</bool> + <bool key="NSEnabled">YES</bool> + <object class="NSSearchFieldCell" key="NSCell" id="581737406"> + <int key="NSCellFlags">342884416</int> + <int key="NSCellFlags2">268436480</int> + <string key="NSContents">Still Haven't Found What I'm Searching For</string> + <reference key="NSSupport" ref="719066366"/> + <reference key="NSControlView" ref="437142657"/> + <bool key="NSDrawsBackground">YES</bool> + <int key="NSTextBezelStyle">1</int> + <reference key="NSBackgroundColor" ref="938122495"/> + <reference key="NSTextColor" ref="183411164"/> + <object class="NSButtonCell" key="NSSearchButtonCell"> + <int key="NSCellFlags">0</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">search</string> + <reference key="NSControlView" ref="437142657"/> + <string key="NSAction">_searchFieldSearch:</string> + <reference key="NSTarget" ref="581737406"/> + <int key="NSButtonFlags">138690560</int> + <int key="NSButtonFlags2">0</int> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <object class="NSButtonCell" key="NSCancelButtonCell"> + <int key="NSCellFlags">0</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">clear</string> + <array class="NSMutableArray" key="NSAccessibilityOverriddenAttributes"> + <dictionary class="NSMutableDictionary"> + <string key="AXDescription">cancel</string> + <integer value="1" key="NSAccessibilityEncodedAttributesValueType"/> + </dictionary> + </array> + <reference key="NSControlView" ref="437142657"/> + <string key="NSAction">_searchFieldCancel:</string> + <reference key="NSTarget" ref="581737406"/> + <int key="NSButtonFlags">138690560</int> + <int key="NSButtonFlags2">0</int> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> + </object> + <int key="NSMaximumRecents">255</int> + <bytes key="NSSearchFieldFlags">BgAAAA</bytes> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">2</int> + </object> + <object class="NSTextField" id="426312658"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{277, 219}, {96, 22}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="582902776"/> + <bool key="NSEnabled">YES</bool> + <object class="NSTextFieldCell" key="NSCell" id="403080839"> + <int key="NSCellFlags">-1804599231</int> + <int key="NSCellFlags2">272630784</int> + <string key="NSContents">Once upon a time</string> + <reference key="NSSupport" ref="719066366"/> + <reference key="NSControlView" ref="426312658"/> + <bool key="NSDrawsBackground">YES</bool> + <reference key="NSBackgroundColor" ref="938122495"/> + <object class="NSColor" key="NSTextColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">textColor</string> + <reference key="NSColor" ref="637251812"/> + </object> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">2</int> + </object> + <object class="NSButton" id="582902776"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{275, 195}, {96, 18}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="938586919"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="540877530"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents">CheckMate!</string> + <reference key="NSSupport" ref="719066366"/> + <reference key="NSControlView" ref="582902776"/> + <int key="NSButtonFlags">1211912448</int> + <int key="NSButtonFlags2">130</int> + <object class="NSCustomResource" key="NSNormalImage"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSSwitch</string> + </object> + <object class="NSButtonImageSource" key="NSAlternateImage"> + <string key="NSImageName">NSSwitch</string> + </object> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSSlider" id="938586919"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{276, 159}, {96, 21}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="672462228"/> + <bool key="NSEnabled">YES</bool> + <object class="NSSliderCell" key="NSCell" id="630356720"> + <int key="NSCellFlags">-2080374784</int> + <int key="NSCellFlags2">0</int> + <string key="NSContents"/> + <object class="NSFont" key="NSSupport"> + <string key="NSName">Helvetica</string> + <double key="NSSize">12</double> + <int key="NSfFlags">16</int> + </object> + <reference key="NSControlView" ref="938586919"/> + <double key="NSMaxValue">100</double> + <double key="NSMinValue">0.0</double> + <double key="NSValue">50</double> + <double key="NSAltIncValue">0.0</double> + <int key="NSNumberOfTickMarks">0</int> + <int key="NSTickMarkPosition">1</int> + <bool key="NSAllowsTickMarkValuesOnly">NO</bool> + <bool key="NSVertical">NO</bool> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSButton" id="728377240"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{275, 115}, {96, 32}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="146897443"/> + <bool key="NSEnabled">YES</bool> + <object class="NSButtonCell" key="NSCell" id="808585577"> + <int key="NSCellFlags">67108864</int> + <int key="NSCellFlags2">134217728</int> + <string key="NSContents">Cancel</string> + <reference key="NSSupport" ref="719066366"/> + <reference key="NSControlView" ref="728377240"/> + <int key="NSButtonFlags">-2038284288</int> + <int key="NSButtonFlags2">129</int> + <string key="NSAlternateContents"/> + <string key="NSKeyEquivalent"/> + <int key="NSPeriodicDelay">200</int> + <int key="NSPeriodicInterval">25</int> + </object> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + </object> + <object class="NSColorWell" id="469359029"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <set class="NSMutableSet" key="NSDragTypes"> + <string>NSColor pasteboard type</string> + </set> + <string key="NSFrame">{{279, 62}, {87, 23}}</string> + <reference key="NSSuperview" ref="640013893"/> + <bool key="NSEnabled">YES</bool> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <bool key="NSIsBordered">YES</bool> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MC4wNTgxMzA0OTkgMC4wNTU1NDE4OTkgMQA</bytes> + </object> + </object> + <object class="NSProgressIndicator" id="146897443"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">1292</int> + <string key="NSFrame">{{280, 91}, {85, 12}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="469359029"/> + <int key="NSpiFlags">16648</int> + <double key="NSMinValue">16</double> + <double key="NSMaxValue">100</double> + </object> + <object class="NSScrollView" id="826932166"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">256</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSClipView" id="954815377"> + <reference key="NSNextResponder" ref="826932166"/> + <int key="NSvFlags">2322</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSTextView" id="1039988695"> + <reference key="NSNextResponder" ref="954815377"/> + <int key="NSvFlags">2322</int> + <string key="NSFrameSize">{223, 54}</string> + <reference key="NSSuperview" ref="954815377"/> + <reference key="NSNextKeyView" ref="767227615"/> + <object class="NSTextContainer" key="NSTextContainer" id="35629099"> + <object class="NSLayoutManager" key="NSLayoutManager"> + <object class="NSTextStorage" key="NSTextStorage"> + <object class="NSMutableString" key="NSString"> + <characters key="NS.bytes">Lorem ipsum dolor</characters> + </object> + <dictionary key="NSAttributes"> + <object class="NSFont" key="NSFont"> + <bool key="IBIsSystemFont">YES</bool> + <double key="NSSize">10</double> + <int key="NSfFlags">2843</int> + </object> + <object class="NSParagraphStyle" key="NSParagraphStyle"> + <int key="NSAlignment">3</int> + <array key="NSTabStops"> + <object class="NSTextTab"> + <double key="NSLocation">0.0</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">56</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">112</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">168</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">224</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">280</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">336</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">392</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">448</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">504</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">560</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">616</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">672</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">728</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">784</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">840</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">896</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">952</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1008</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1064</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1120</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1176</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1232</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1288</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1344</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1400</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1456</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1512</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1568</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1624</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1680</double> + </object> + <object class="NSTextTab"> + <double key="NSLocation">1736</double> + </object> + </array> + </object> + </dictionary> + <nil key="NSDelegate"/> + </object> + <array class="NSMutableArray" key="NSTextContainers"> + <reference ref="35629099"/> + </array> + <int key="NSLMFlags">38</int> + <nil key="NSDelegate"/> + </object> + <reference key="NSTextView" ref="1039988695"/> + <double key="NSWidth">223</double> + <int key="NSTCFlags">1</int> + </object> + <object class="NSTextViewSharedData" key="NSSharedData"> + <int key="NSFlags">67120103</int> + <int key="NSTextCheckingTypes">0</int> + <nil key="NSMarkedAttributes"/> + <reference key="NSBackgroundColor" ref="103793517"/> + <dictionary key="NSSelectedAttributes"> + <object class="NSColor" key="NSBackgroundColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">selectedTextBackgroundColor</string> + <reference key="NSColor" ref="450059627"/> + </object> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">6</int> + <string key="NSCatalogName">System</string> + <string key="NSColorName">selectedTextColor</string> + <reference key="NSColor" ref="637251812"/> + </object> + </dictionary> + <reference key="NSInsertionColor" ref="183411164"/> + <dictionary key="NSLinkAttributes"> + <object class="NSColor" key="NSColor"> + <int key="NSColorSpace">1</int> + <bytes key="NSRGB">MCAwIDEAA</bytes> + </object> + <integer value="1" key="NSUnderline"/> + </dictionary> + <nil key="NSDefaultParagraphStyle"/> + <nil key="NSTextFinder"/> + <int key="NSPreferredTextFinderStyle">1</int> + </object> + <int key="NSTVFlags">70</int> + <string key="NSMaxSize">{463, 10000000}</string> + <nil key="NSDelegate"/> + </object> + </array> + <string key="NSFrame">{{1, 1}, {223, 54}}</string> + <reference key="NSSuperview" ref="826932166"/> + <reference key="NSNextKeyView" ref="1039988695"/> + <reference key="NSDocView" ref="1039988695"/> + <reference key="NSBGColor" ref="103793517"/> + <object class="NSCursor" key="NSCursor"> + <string key="NSHotSpot">{4, -5}</string> + <int key="NSCursorType">1</int> + </object> + <int key="NScvFlags">4</int> + <bool key="NSAutomaticallyAdjustsContentInsets">YES</bool> + </object> + <object class="NSScroller" id="767227615"> + <reference key="NSNextResponder" ref="826932166"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{224, 1}, {15, 54}}</string> + <reference key="NSSuperview" ref="826932166"/> + <reference key="NSNextKeyView" ref="1010937789"/> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <string key="NSControlAction">_doScroller:</string> + <reference key="NSControlTarget" ref="826932166"/> + <reference key="NSTarget" ref="826932166"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">1</double> + <double key="NSPercent">0.73888885974884033</double> + </object> + <object class="NSScroller" id="666418199"> + <reference key="NSNextResponder" ref="826932166"/> + <int key="NSvFlags">-2147483392</int> + <string key="NSFrame">{{-100, -100}, {87, 18}}</string> + <reference key="NSSuperview" ref="826932166"/> + <reference key="NSNextKeyView" ref="954815377"/> + <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <string key="NSControlAction">_doScroller:</string> + <reference key="NSControlTarget" ref="826932166"/> + <int key="NSsFlags">1</int> + <reference key="NSTarget" ref="826932166"/> + <string key="NSAction">_doScroller:</string> + <double key="NSCurValue">1</double> + <double key="NSPercent">0.94565218687057495</double> + </object> + </array> + <string key="NSFrame">{{20, 163}, {240, 56}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="666418199"/> + <int key="NSsFlags">133138</int> + <reference key="NSVScroller" ref="767227615"/> + <reference key="NSHScroller" ref="666418199"/> + <reference key="NSContentView" ref="954815377"/> + <double key="NSMinMagnification">0.25</double> + <double key="NSMaxMagnification">4</double> + <double key="NSMagnification">1</double> + </object> + <object class="NSTabView" id="672462228"> + <reference key="NSNextResponder" ref="640013893"/> + <int key="NSvFlags">268</int> + <string key="NSFrame">{{13, 25}, {254, 124}}</string> + <reference key="NSSuperview" ref="640013893"/> + <reference key="NSNextKeyView" ref="940943414"/> + <array class="NSMutableArray" key="NSTabViewItems"> + <object class="NSTabViewItem" id="229928186"> + <string key="NSIdentifier">1</string> + <object class="NSView" key="NSView" id="940943414"> + <reference key="NSNextResponder" ref="672462228"/> + <int key="NSvFlags">274</int> + <string key="NSFrame">{{10, 33}, {234, 78}}</string> + <reference key="NSSuperview" ref="672462228"/> + </object> + <string key="NSLabel">Tab</string> + <reference key="NSColor" ref="434344295"/> + <reference key="NSTabView" ref="672462228"/> + </object> + <object class="NSTabViewItem" id="984817245"> + <string key="NSIdentifier">2</string> + <object class="NSView" key="NSView" id="50036484"> + <nil key="NSNextResponder"/> + <int key="NSvFlags">256</int> + <string key="NSFrame">{{10, 33}, {234, 78}}</string> + </object> + <string key="NSLabel">View</string> + <reference key="NSColor" ref="434344295"/> + <reference key="NSTabView" ref="672462228"/> + </object> + </array> + <reference key="NSSelectedTabViewItem" ref="229928186"/> + <reference key="NSFont" ref="719066366"/> + <int key="NSTvFlags">0</int> + <bool key="NSAllowTruncatedLabels">YES</bool> + <bool key="NSDrawsBackground">YES</bool> + <array class="NSMutableArray" key="NSSubviews"> + <reference ref="940943414"/> + </array> + </object> + </array> + <string key="NSFrameSize">{393, 318}</string> + <reference key="NSNextKeyView" ref="85174318"/> + </object> + <string key="NSScreenRect">{{0, 0}, {2560, 1577}}</string> + <bool key="NSWindowIsRestorable">YES</bool> + </object> + </array> + <object class="IBObjectContainer" key="IBDocument.Objects"> + <array key="connectionRecords"> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">field_</string> + <reference key="source" ref="774623032"/> + <reference key="destination" ref="426312658"/> + </object> + <int key="connectionID">45</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">window</string> + <reference key="source" ref="774623032"/> + <reference key="destination" ref="392237883"/> + </object> + <int key="connectionID">29</int> + </object> + </array> + <object class="IBMutableOrderedSet" key="objectRecords"> + <array key="orderedObjects"> + <object class="IBObjectRecord"> + <int key="objectID">0</int> + <array key="object" id="0"/> + <reference key="children" ref="948991554"/> + <nil key="parent"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-2</int> + <reference key="object" ref="774623032"/> + <reference key="parent" ref="0"/> + <string key="objectName">File's Owner</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-1</int> + <reference key="object" ref="121913320"/> + <reference key="parent" ref="0"/> + <string key="objectName">First Responder</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">-3</int> + <reference key="object" ref="575648047"/> + <reference key="parent" ref="0"/> + <string key="objectName">Application</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">1</int> + <reference key="object" ref="392237883"/> + <array class="NSMutableArray" key="children"> + <reference ref="640013893"/> + </array> + <reference key="parent" ref="0"/> + <string key="objectName">Window (Window)</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">2</int> + <reference key="object" ref="640013893"/> + <array class="NSMutableArray" key="children"> + <reference ref="728377240"/> + <reference ref="85174318"/> + <reference ref="321194065"/> + <reference ref="437142657"/> + <reference ref="426312658"/> + <reference ref="582902776"/> + <reference ref="826932166"/> + <reference ref="1010937789"/> + <reference ref="938586919"/> + <reference ref="146897443"/> + <reference ref="469359029"/> + <reference ref="672462228"/> + </array> + <reference key="parent" ref="392237883"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">5</int> + <reference key="object" ref="728377240"/> + <array class="NSMutableArray" key="children"> + <reference ref="808585577"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">7</int> + <reference key="object" ref="85174318"/> + <array class="NSMutableArray" key="children"> + <reference ref="497150328"/> + <reference ref="745203310"/> + <reference ref="218180457"/> + <reference ref="975309690"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">10</int> + <reference key="object" ref="497150328"/> + <array class="NSMutableArray" key="children"> + <reference ref="867115630"/> + <reference ref="328836390"/> + </array> + <reference key="parent" ref="85174318"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">12</int> + <reference key="object" ref="867115630"/> + <array class="NSMutableArray" key="children"> + <reference ref="1026765034"/> + </array> + <reference key="parent" ref="497150328"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">15</int> + <reference key="object" ref="1026765034"/> + <reference key="parent" ref="867115630"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">13</int> + <reference key="object" ref="328836390"/> + <array class="NSMutableArray" key="children"> + <reference ref="114565872"/> + </array> + <reference key="parent" ref="497150328"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">14</int> + <reference key="object" ref="114565872"/> + <reference key="parent" ref="328836390"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">16</int> + <reference key="object" ref="321194065"/> + <array class="NSMutableArray" key="children"> + <reference ref="765978048"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">18</int> + <reference key="object" ref="437142657"/> + <array class="NSMutableArray" key="children"> + <reference ref="581737406"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">20</int> + <reference key="object" ref="426312658"/> + <array class="NSMutableArray" key="children"> + <reference ref="403080839"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">22</int> + <reference key="object" ref="582902776"/> + <array class="NSMutableArray" key="children"> + <reference ref="540877530"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">24</int> + <reference key="object" ref="826932166"/> + <array class="NSMutableArray" key="children"> + <reference ref="1039988695"/> + <reference ref="666418199"/> + <reference ref="767227615"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">27</int> + <reference key="object" ref="1039988695"/> + <reference key="parent" ref="826932166"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">28</int> + <reference key="object" ref="1010937789"/> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">66</int> + <reference key="object" ref="938586919"/> + <array class="NSMutableArray" key="children"> + <reference ref="630356720"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">68</int> + <reference key="object" ref="146897443"/> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">69</int> + <reference key="object" ref="469359029"/> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">70</int> + <reference key="object" ref="672462228"/> + <array class="NSMutableArray" key="children"> + <reference ref="229928186"/> + <reference ref="984817245"/> + </array> + <reference key="parent" ref="640013893"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">71</int> + <reference key="object" ref="229928186"/> + <array class="NSMutableArray" key="children"> + <reference ref="940943414"/> + </array> + <reference key="parent" ref="672462228"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">74</int> + <reference key="object" ref="940943414"/> + <reference key="parent" ref="229928186"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">72</int> + <reference key="object" ref="984817245"/> + <array class="NSMutableArray" key="children"> + <reference ref="50036484"/> + </array> + <reference key="parent" ref="672462228"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">73</int> + <reference key="object" ref="50036484"/> + <reference key="parent" ref="984817245"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">77</int> + <reference key="object" ref="808585577"/> + <reference key="parent" ref="728377240"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">78</int> + <reference key="object" ref="765978048"/> + <reference key="parent" ref="321194065"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">79</int> + <reference key="object" ref="581737406"/> + <reference key="parent" ref="437142657"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">80</int> + <reference key="object" ref="403080839"/> + <reference key="parent" ref="426312658"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">81</int> + <reference key="object" ref="540877530"/> + <reference key="parent" ref="582902776"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">82</int> + <reference key="object" ref="630356720"/> + <reference key="parent" ref="938586919"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">83</int> + <reference key="object" ref="745203310"/> + <reference key="parent" ref="85174318"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">84</int> + <reference key="object" ref="218180457"/> + <reference key="parent" ref="85174318"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">85</int> + <reference key="object" ref="975309690"/> + <reference key="parent" ref="85174318"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">86</int> + <reference key="object" ref="666418199"/> + <reference key="parent" ref="826932166"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">87</int> + <reference key="object" ref="767227615"/> + <reference key="parent" ref="826932166"/> + </object> + </array> + </object> + <dictionary class="NSMutableDictionary" key="flattenedProperties"> + <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="YES" key="1.NSWindowTemplate.visibleAtLaunch"/> + <string key="10.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="12.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="13.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="15.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="16.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="18.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="20.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="22.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="27.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="28.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="66.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="68.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="69.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="7.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="70.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="71.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="72.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="73.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="74.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="77.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="78.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="79.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="80.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="81.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="82.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="83.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="84.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="85.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="86.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <string key="87.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> + <nil key="activeLocalization"/> + <dictionary class="NSMutableDictionary" key="localizations"/> + <nil key="sourceID"/> + <int key="maxID">87</int> + </object> + <object class="IBClassDescriber" key="IBDocument.Classes"/> + <int key="IBDocument.localizationMode">0</int> + <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <integer value="1050" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> + <integer value="4600" key="NS.object.0"/> + </object> + <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> + <int key="IBDocument.defaultPropertyAccessControl">3</int> + <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> + <string key="NS.key.0">NSSwitch</string> + <string key="NS.object.0">{15, 15}</string> + </object> + </data> +</archive> diff --git a/UnitTesting/TestData/GTMUnitTestingTest.nib/info.nib b/UnitTesting/TestData/GTMUnitTestingTest.nib/info.nib deleted file mode 100644 index 3fb1618..0000000 --- a/UnitTesting/TestData/GTMUnitTestingTest.nib/info.nib +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>IBFramework Version</key> - <string>644</string> - <key>IBLastKnownRelativeProjectPath</key> - <string>../GTM.xcodeproj</string> - <key>IBOldestOS</key> - <integer>5</integer> - <key>IBOpenObjects</key> - <array> - <integer>2</integer> - </array> - <key>IBSystem Version</key> - <string>9C31</string> - <key>targetFramework</key> - <string>IBCocoaFramework</string> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUnitTestingTest.nib/keyedobjects.nib b/UnitTesting/TestData/GTMUnitTestingTest.nib/keyedobjects.nib Binary files differindex d3104e2..8a771e8 100644 --- a/UnitTesting/TestData/GTMUnitTestingTest.nib/keyedobjects.nib +++ b/UnitTesting/TestData/GTMUnitTestingTest.nib/keyedobjects.nib diff --git a/UnitTesting/TestData/GTMUnitTestingTestApp.10.6.gtmUTState b/UnitTesting/TestData/GTMUnitTestingTestApp.10.6.gtmUTState deleted file mode 100644 index 2f2ef56..0000000 --- a/UnitTesting/TestData/GTMUnitTestingTestApp.10.6.gtmUTState +++ /dev/null @@ -1,2608 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>$GTMArchive</key> - <string>GTMUnitTestingArchive</string> - <key>$GTMVersion</key> - <integer>1</integer> - <key>ApplicationMainWindow</key> - <integer>0</integer> - <key>BoolTest</key> - <true/> - <key>BytesTest</key> - <data> - Qnl0ZXNUZXN0 - </data> - <key>DoubleTest</key> - <real>1</real> - <key>FloatTest</key> - <real>1</real> - <key>Int32Test</key> - <integer>1</integer> - <key>Int64Test</key> - <integer>1</integer> - <key>IntTest</key> - <integer>1</integer> - <key>MenuBar</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>About NewApplication</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Quit NewApplication</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>,</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Preferences…</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuTitle</key> - <string>Services</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Services</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>h</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Hide NewApplication</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>h</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Hide Others</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show All</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>n</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>New</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>o</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Open…</string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>P</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Page Setup...</string> - <key>MenuItemTooltip</key> - <string></string> - </dict> - <key>MenuItem 11</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>p</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Print…</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Clear Menu</string> - </dict> - <key>MenuTitle</key> - <string>Open Recent</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Open Recent</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>w</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Close</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <true/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>w</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Close All</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>s</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Save</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>S</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Save As…</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Revert to Saved</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuTitle</key> - <string>File</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>File</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>z</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Undo</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>Z</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Redo</string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>:</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Spelling…</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>;</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling While Typing</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Grammar With Spelling</string> - </dict> - <key>MenuTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItem 11</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Smart Copy/Paste</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Smart Quotes</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>3</integer> - <key>MenuItemTitle</key> - <string>Smart Links</string> - </dict> - <key>MenuTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItem 12</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Start Speaking</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Stop Speaking</string> - </dict> - <key>MenuTitle</key> - <string>Speech</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Speech</string> - </dict> - <key>MenuItem 13</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 14</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Special Characters…</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>x</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Cut</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>c</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Copy</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>v</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paste</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Delete</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>a</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Select All</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>f</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Find…</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>g</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Find Next</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>G</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>3</integer> - <key>MenuItemTitle</key> - <string>Find Previous</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>e</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>7</integer> - <key>MenuItemTitle</key> - <string>Use Selection for Find</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>j</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Jump to Selection</string> - </dict> - <key>MenuTitle</key> - <string>Find</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Find</string> - </dict> - <key>MenuTitle</key> - <string>Edit</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Edit</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>t</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>¬Menu Item</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>C</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Colors</string> - </dict> - <key>MenuTitle</key> - <string>¬Menu Title</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>¬Menu Title</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>t</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Toolbar</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Customize Toolbar…</string> - </dict> - <key>MenuTitle</key> - <string>View</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>View</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>?</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>NewApplication Help</string> - </dict> - <key>MenuTitle</key> - <string>Help</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Help</string> - </dict> - <key>MenuTitle</key> - <string>AMainMenu</string> - </dict> - <key>Window 0</key> - <dict> - <key>WindowContent</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTableView</string> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>BoxBorderType</key> - <integer>3</integer> - <key>BoxTitle</key> - <string>Box</string> - <key>BoxTitlePosition</key> - <integer>0</integer> - <key>BoxType</key> - <integer>2</integer> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 10</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewMenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Cut</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Copy</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paste</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Fonts</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Bold</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Italic</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Underline</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Outline</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Styles…</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Colors</string> - </dict> - <key>MenuTitle</key> - <string>Font</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Font</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Spelling and Grammar</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Document Now</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling While Typing</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Grammar With Spelling</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Correct Spelling Automatically</string> - </dict> - <key>MenuTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Replace Quotes</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Replace Dashes</string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Links</string> - </dict> - <key>MenuItem 11</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Data Detectors</string> - </dict> - <key>MenuItem 12</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Text Replacement</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Add Links</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Replace Text</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Substitutions</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Copy/Paste</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Quotes</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Dashes</string> - </dict> - <key>MenuTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Make Upper Case</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Make Lower Case</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Capitalize</string> - </dict> - <key>MenuTitle</key> - <string>Transformations</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Transformations</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Start Speaking</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Stop Speaking</string> - </dict> - <key>MenuTitle</key> - <string>Speech</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Speech</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paragraph</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>-1</integer> - <key>MenuItemTitle</key> - <string> Default</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string> Left to Right</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string> Right to Left</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Selection</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>-1</integer> - <key>MenuItemTitle</key> - <string> Default</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string> Left to Right</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string> Right to Left</string> - </dict> - <key>MenuTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuTitle</key> - <string>Menu</string> - </dict> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <true/> - </dict> - </dict> - <key>ViewSubView 11</key> - <dict> - <key>TabItem 0</key> - <dict> - <key>TabLabel</key> - <string>Tab</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>TabItem 1</key> - <dict> - <key>TabLabel</key> - <string>View</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>HaHa</string> - <key>CellValue</key> - <string>HaHa</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>HaHa</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>CellValue</key> - <string>Still Haven't Found What I'm Searching For</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSearchField</string> - <key>ControlValue</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Once upon a time</string> - <key>CellValue</key> - <string>Once upon a time</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>Once upon a time</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 5</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>CheckMate!</string> - <key>CellValue</key> - <string>1</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>1</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 6</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string></string> - <key>CellValue</key> - <string>50</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSlider</string> - <key>ControlValue</key> - <string>50</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 7</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Cancel</string> - <key>CellValue</key> - <string>0</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>0</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 8</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSColorWell</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 9</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>WindowIsMain</key> - <false/> - <key>WindowIsVisible</key> - <true/> - <key>WindowTitle</key> - <string>Window</string> - </dict> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUnitTestingTestApp.gtmUTState b/UnitTesting/TestData/GTMUnitTestingTestApp.gtmUTState deleted file mode 100644 index db045bf..0000000 --- a/UnitTesting/TestData/GTMUnitTestingTestApp.gtmUTState +++ /dev/null @@ -1,2204 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>$GTMArchive</key> - <string>GTMUnitTestingArchive</string> - <key>$GTMVersion</key> - <integer>1</integer> - <key>ApplicationMainWindow</key> - <integer>0</integer> - <key>BoolTest</key> - <true/> - <key>BytesTest</key> - <data> - Qnl0ZXNUZXN0 - </data> - <key>DoubleTest</key> - <real>1</real> - <key>FloatTest</key> - <real>1</real> - <key>Int32Test</key> - <integer>1</integer> - <key>Int64Test</key> - <integer>1</integer> - <key>IntTest</key> - <integer>1</integer> - <key>MenuBar</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>About NewApplication</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Quit NewApplication</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>,</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Preferences…</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuTitle</key> - <string>Services</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Services</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>h</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Hide NewApplication</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>h</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Hide Others</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show All</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>n</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>New</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>o</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Open…</string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>P</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Page Setup...</string> - <key>MenuItemTooltip</key> - <string></string> - </dict> - <key>MenuItem 11</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>p</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Print…</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Clear Menu</string> - </dict> - <key>MenuTitle</key> - <string>Open Recent</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Open Recent</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>w</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Close</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <true/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>w</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Close All</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>s</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Save</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>S</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Save As…</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Revert to Saved</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuTitle</key> - <string>File</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>File</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>z</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Undo</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>Z</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Redo</string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>:</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Spelling…</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>;</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling While Typing</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Grammar With Spelling</string> - </dict> - <key>MenuTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItem 11</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Smart Copy/Paste</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Smart Quotes</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>3</integer> - <key>MenuItemTitle</key> - <string>Smart Links</string> - </dict> - <key>MenuTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItem 12</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Start Speaking</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Stop Speaking</string> - </dict> - <key>MenuTitle</key> - <string>Speech</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Speech</string> - </dict> - <key>MenuItem 13</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 14</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Special Characters…</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>x</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Cut</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>c</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Copy</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>v</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paste</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Delete</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>a</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Select All</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>f</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Find…</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>g</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Find Next</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>G</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>3</integer> - <key>MenuItemTitle</key> - <string>Find Previous</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>e</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>7</integer> - <key>MenuItemTitle</key> - <string>Use Selection for Find</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>j</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Jump to Selection</string> - </dict> - <key>MenuTitle</key> - <string>Find</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Find</string> - </dict> - <key>MenuTitle</key> - <string>Edit</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Edit</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>t</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>¬Menu Item</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>C</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Colors</string> - </dict> - <key>MenuTitle</key> - <string>¬Menu Title</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>¬Menu Title</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>t</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Toolbar</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Customize Toolbar…</string> - </dict> - <key>MenuTitle</key> - <string>View</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>View</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string>?</string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>NewApplication Help</string> - </dict> - <key>MenuTitle</key> - <string>Help</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Help</string> - </dict> - <key>MenuTitle</key> - <string>AMainMenu</string> - </dict> - <key>Window 0</key> - <dict> - <key>WindowContent</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTableView</string> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>BoxBorderType</key> - <integer>3</integer> - <key>BoxTitle</key> - <string>Box</string> - <key>BoxTitlePosition</key> - <integer>0</integer> - <key>BoxType</key> - <integer>2</integer> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 10</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewMenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Cut</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Copy</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paste</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Fonts</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Bold</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Italic</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Underline</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Outline</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Styles…</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Colors</string> - </dict> - <key>MenuTitle</key> - <string>Font</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Font</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Spelling and Grammar</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Document Now</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling While Typing</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Grammar With Spelling</string> - </dict> - <key>MenuTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Copy/Paste</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Quotes</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Links</string> - </dict> - <key>MenuTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Start Speaking</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Stop Speaking</string> - </dict> - <key>MenuTitle</key> - <string>Speech</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Speech</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>-1</integer> - <key>MenuItemTitle</key> - <string>Default</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Left to Right</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Right to Left</string> - </dict> - <key>MenuTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuTitle</key> - <string>Menu</string> - </dict> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 11</key> - <dict> - <key>TabItem 0</key> - <dict> - <key>TabLabel</key> - <string>Tab</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>TabItem 1</key> - <dict> - <key>TabLabel</key> - <string>View</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>HaHa</string> - <key>CellValue</key> - <string>HaHa</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>HaHa</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>CellValue</key> - <string>Still Haven't Found What I'm Searching For</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSearchField</string> - <key>ControlValue</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Once upon a time</string> - <key>CellValue</key> - <string>Once upon a time</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>Once upon a time</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 5</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>CheckMate!</string> - <key>CellValue</key> - <string>1</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>1</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 6</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string></string> - <key>CellValue</key> - <string>50</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSlider</string> - <key>ControlValue</key> - <string>50</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 7</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Cancel</string> - <key>CellValue</key> - <string>0</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>0</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 8</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSColorWell</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 9</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>WindowIsMain</key> - <false/> - <key>WindowIsVisible</key> - <true/> - <key>WindowTitle</key> - <string>Window</string> - </dict> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUnitTestingView.10.6.tiff b/UnitTesting/TestData/GTMUnitTestingView.10.6.tiff Binary files differdeleted file mode 100644 index 3b7545b..0000000 --- a/UnitTesting/TestData/GTMUnitTestingView.10.6.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingView.tiff b/UnitTesting/TestData/GTMUnitTestingView.tiff Binary files differdeleted file mode 100644 index 228df73..0000000 --- a/UnitTesting/TestData/GTMUnitTestingView.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingWindow.10.5.6.tiff b/UnitTesting/TestData/GTMUnitTestingWindow.10.5.6.tiff Binary files differdeleted file mode 100644 index 9179576..0000000 --- a/UnitTesting/TestData/GTMUnitTestingWindow.10.5.6.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingWindow.10.5.7.tiff b/UnitTesting/TestData/GTMUnitTestingWindow.10.5.7.tiff Binary files differdeleted file mode 100644 index 9179576..0000000 --- a/UnitTesting/TestData/GTMUnitTestingWindow.10.5.7.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingWindow.10.5.8.tiff b/UnitTesting/TestData/GTMUnitTestingWindow.10.5.8.tiff Binary files differdeleted file mode 100644 index 9179576..0000000 --- a/UnitTesting/TestData/GTMUnitTestingWindow.10.5.8.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingWindow.10.6.gtmUTState b/UnitTesting/TestData/GTMUnitTestingWindow.10.6.gtmUTState deleted file mode 100644 index 02ec00d..0000000 --- a/UnitTesting/TestData/GTMUnitTestingWindow.10.6.gtmUTState +++ /dev/null @@ -1,1308 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>$GTMArchive</key> - <string>GTMUnitTestingArchive</string> - <key>$GTMVersion</key> - <integer>1</integer> - <key>WindowContent</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTableView</string> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>BoxBorderType</key> - <integer>3</integer> - <key>BoxTitle</key> - <string>Box</string> - <key>BoxTitlePosition</key> - <integer>0</integer> - <key>BoxType</key> - <integer>2</integer> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 10</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewMenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Cut</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Copy</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paste</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Fonts</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Bold</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Italic</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Underline</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Outline</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Styles…</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Colors</string> - </dict> - <key>MenuTitle</key> - <string>Font</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Font</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Spelling and Grammar</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Document Now</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling While Typing</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Grammar With Spelling</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Correct Spelling Automatically</string> - </dict> - <key>MenuTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Replace Quotes</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Replace Dashes</string> - </dict> - <key>MenuItem 10</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Links</string> - </dict> - <key>MenuItem 11</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Data Detectors</string> - </dict> - <key>MenuItem 12</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Text Replacement</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Add Links</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Replace Text</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Substitutions</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Copy/Paste</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Quotes</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Dashes</string> - </dict> - <key>MenuTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Make Upper Case</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Make Lower Case</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Capitalize</string> - </dict> - <key>MenuTitle</key> - <string>Transformations</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Transformations</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Start Speaking</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Stop Speaking</string> - </dict> - <key>MenuTitle</key> - <string>Speech</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Speech</string> - </dict> - <key>MenuItem 9</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paragraph</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>-1</integer> - <key>MenuItemTitle</key> - <string> Default</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string> Left to Right</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string> Right to Left</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Selection</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>-1</integer> - <key>MenuItemTitle</key> - <string> Default</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string> Left to Right</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string> Right to Left</string> - </dict> - <key>MenuTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuTitle</key> - <string>Menu</string> - </dict> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <true/> - </dict> - </dict> - <key>ViewSubView 11</key> - <dict> - <key>TabItem 0</key> - <dict> - <key>TabLabel</key> - <string>Tab</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>TabItem 1</key> - <dict> - <key>TabLabel</key> - <string>View</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>HaHa</string> - <key>CellValue</key> - <string>HaHa</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>HaHa</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>CellValue</key> - <string>Still Haven't Found What I'm Searching For</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSearchField</string> - <key>ControlValue</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Once upon a time</string> - <key>CellValue</key> - <string>Once upon a time</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>Once upon a time</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 5</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>CheckMate!</string> - <key>CellValue</key> - <string>1</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>1</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 6</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string></string> - <key>CellValue</key> - <string>50</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSlider</string> - <key>ControlValue</key> - <string>50</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 7</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Cancel</string> - <key>CellValue</key> - <string>0</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>0</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 8</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSColorWell</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 9</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>WindowIsMain</key> - <false/> - <key>WindowIsVisible</key> - <true/> - <key>WindowTitle</key> - <string>Window</string> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUnitTestingWindow.10.6.tiff b/UnitTesting/TestData/GTMUnitTestingWindow.10.6.tiff Binary files differdeleted file mode 100644 index 6a88f84..0000000 --- a/UnitTesting/TestData/GTMUnitTestingWindow.10.6.tiff +++ /dev/null diff --git a/UnitTesting/TestData/GTMUnitTestingWindow.gtmUTState b/UnitTesting/TestData/GTMUnitTestingWindow.gtmUTState deleted file mode 100644 index 8cba4c4..0000000 --- a/UnitTesting/TestData/GTMUnitTestingWindow.gtmUTState +++ /dev/null @@ -1,904 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>$GTMArchive</key> - <string>GTMUnitTestingArchive</string> - <key>$GTMVersion</key> - <integer>1</integer> - <key>WindowContent</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTableView</string> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>BoxBorderType</key> - <integer>3</integer> - <key>BoxTitle</key> - <string>Box</string> - <key>BoxTitlePosition</key> - <integer>0</integer> - <key>BoxType</key> - <integer>2</integer> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 10</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewMenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Cut</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Copy</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Paste</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Fonts</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>2</integer> - <key>MenuItemTitle</key> - <string>Bold</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Italic</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Underline</string> - </dict> - <key>MenuItem 4</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Outline</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Styles…</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <false/> - <key>MenuItemIsSeparator</key> - <true/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string></string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Colors</string> - </dict> - <key>MenuTitle</key> - <string>Font</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Font</string> - </dict> - <key>MenuItem 5</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Show Spelling and Grammar</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Document Now</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Spelling While Typing</string> - </dict> - <key>MenuItem 3</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Check Grammar With Spelling</string> - </dict> - <key>MenuTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Spelling and Grammar</string> - </dict> - <key>MenuItem 6</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Copy/Paste</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Quotes</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Smart Links</string> - </dict> - <key>MenuTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Substitutions</string> - </dict> - <key>MenuItem 7</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Start Speaking</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Stop Speaking</string> - </dict> - <key>MenuTitle</key> - <string>Speech</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Speech</string> - </dict> - <key>MenuItem 8</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemSubmenu</key> - <dict> - <key>MenuItem 0</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>-1</integer> - <key>MenuItemTitle</key> - <string>Default</string> - </dict> - <key>MenuItem 1</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Left to Right</string> - </dict> - <key>MenuItem 2</key> - <dict> - <key>MenuItemIndentationLevel</key> - <integer>0</integer> - <key>MenuItemIsAlternate</key> - <false/> - <key>MenuItemIsEnabled</key> - <true/> - <key>MenuItemIsSeparator</key> - <false/> - <key>MenuItemKeyEquivalent</key> - <string></string> - <key>MenuItemState</key> - <integer>0</integer> - <key>MenuItemTag</key> - <integer>1</integer> - <key>MenuItemTitle</key> - <string>Right to Left</string> - </dict> - <key>MenuTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuItemTag</key> - <integer>0</integer> - <key>MenuItemTitle</key> - <string>Writing Direction</string> - </dict> - <key>MenuTitle</key> - <string>Menu</string> - </dict> - </dict> - </dict> - <key>ViewSubView 1</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <false/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSScroller</string> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 11</key> - <dict> - <key>TabItem 0</key> - <dict> - <key>TabLabel</key> - <string>Tab</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>TabItem 1</key> - <dict> - <key>TabLabel</key> - <string>View</string> - <key>TabView</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewIsHidden</key> - <false/> - <key>ViewSubView 0</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>ViewSubView 2</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>HaHa</string> - <key>CellValue</key> - <string>HaHa</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>HaHa</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 3</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>CellValue</key> - <string>Still Haven't Found What I'm Searching For</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSearchField</string> - <key>ControlValue</key> - <string>Still Haven't Found What I'm Searching For</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 4</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Once upon a time</string> - <key>CellValue</key> - <string>Once upon a time</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSTextField</string> - <key>ControlValue</key> - <string>Once upon a time</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 5</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>CheckMate!</string> - <key>CellValue</key> - <string>1</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>1</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 6</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>1</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string></string> - <key>CellValue</key> - <string>50</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSSlider</string> - <key>ControlValue</key> - <string>50</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 7</key> - <dict> - <key>ButtonAlternateTitle</key> - <string></string> - <key>ControlIsEnabled</key> - <true/> - <key>ControlSelectedCell</key> - <dict> - <key>CellState</key> - <integer>0</integer> - <key>CellTag</key> - <integer>0</integer> - <key>CellTitle</key> - <string>Cancel</string> - <key>CellValue</key> - <string>0</string> - </dict> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSButton</string> - <key>ControlValue</key> - <string>0</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 8</key> - <dict> - <key>ControlIsEnabled</key> - <true/> - <key>ControlTag</key> - <integer>0</integer> - <key>ControlType</key> - <string>NSColorWell</string> - <key>ViewIsHidden</key> - <false/> - </dict> - <key>ViewSubView 9</key> - <dict> - <key>ViewIsHidden</key> - <false/> - </dict> - </dict> - <key>WindowIsMain</key> - <false/> - <key>WindowIsVisible</key> - <true/> - <key>WindowTitle</key> - <string>Window</string> -</dict> -</plist> diff --git a/UnitTesting/TestData/GTMUnitTestingWindow.tiff b/UnitTesting/TestData/GTMUnitTestingWindow.tiff Binary files differdeleted file mode 100644 index 63f5649..0000000 --- a/UnitTesting/TestData/GTMUnitTestingWindow.tiff +++ /dev/null |