adium/adium

334dc418b409
Transition Adium from SenTestingKit to XCTest.

In order to build on OS X 10.11, Xcode 7.2, several changes have been made that are outlined:
- Unit tests Target Build Settings modified:
* 'Wrapper Extension' set to 'xctest'
* 'Enable Modules (C and Objective-C)' set to 'Yes'
- UnitTests Target of AutoHyperlink.framework Build Settings modified:
* 'Wrapper Extension' set to 'xctest'
* 'Enable Modules (C and Objective-C)' set to 'Yes'
* 'Other Linker Flags' removed '-framework SenTestingKit'
- 'SenTestingKit.framework' removed from Adium -> Linked Frameworks -> System
- 'SenTestingKit.framework' removed from Adium -> Linked Frameworks -> AutoHyperlinks.framework.xcodeproj -> External Frameworks and Libraries -> Linked Frameworks
- Find and Replace within 'Adium/Unit tests' && 'Adium/Linked Frameworks/Others/AutoHyperlinks.framework.xcodeproj/UnitTests'
* '' to ''
* 'SenTestCase' to 'XCTestCase'
* 'STAssert' to 'XCTAssert'
* 'XCTAssertEquals(' to 'XCTAssertEqual('
* regex '(\[\[\[)([^\]]*\][^\]]*\])(\ autorelease\]);' to '[[$2;'
* regex '(\[)([^\]]*\][^\]]*)(\ autorelease\])' to '$2'
- modified AutoHyperlinks.framework.xcodeproj -> project.pbxproj
* line 331: ’productType = "com.apple.product-type.bundle.ocunit-test";' to 'productType = "com.apple.product-type.bundle.unit-test";'
- AIWebKitMessageViewController.h
* forward declare WebUIDelegate, WebFrameLoadDelegate protocols
* add WebUIDelegate, WebFrameLoadDelegate protocols to 'AIWebKitMessageViewController' class
- AIFacebookXMPPOAuthWebViewWindowController.m lines 107 && 108
* '[[domDoc getElementById:@"email"] setValue:self.autoFillUsername];' to '[domDoc getElementById:@"email"].innerHTML = self.autoFillUsername;'
* '[[domDoc getElementById:@"pass"] setValue:self.autoFillPassword];' to '[domDoc getElementById:@"pass"].innerHTML = self.autoFillPassword;'
- XCTAssertEqual for NSRanges modified to ’XCTAssertTrue(NSEqualRanges(range1, range2)), ...)' in Unit tests
/*
* Adium is the legal property of its developers, whose names are listed in the copyright file included
* with this source distribution.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU
* General Public License as published by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if not,
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*!
* @class AICoreComponentLoader
* @brief Core - Component Loader
*
* Loads integrated plugins. Component classes to load are determined by CoreComponents.plist
*/
#import "AICoreComponentLoader.h"
//#define COMPONENT_LOAD_TIMING
#ifdef COMPONENT_LOAD_TIMING
NSTimeInterval aggregateComponentLoadingTime = 0.0;
#endif
@interface AICoreComponentLoader ()
- (void)loadComponents;
@end
@implementation AICoreComponentLoader
/*!
* @brief Init
*/
- (id)init
{
if ((self = [super init])) {
components = [[NSMutableDictionary alloc] init];
[self loadComponents];
}
return self;
}
#pragma mark -
/*!
* @brief Load integrated components
*/
- (void)loadComponents
{
//Fetch the list of components to load
NSArray *componentClassNames = [NSArray arrayWithObjects:
@"AIAccountListPreferencesPlugin",
@"AIAccountMenuAccessPlugin",
@"AIAliasSupportPlugin",
@"AIAppearancePreferencesPlugin",
@"AIAutoLinkingPlugin",
@"AIAutoReplyPlugin",
@"AIChatConsolidationPlugin",
@"AIChatCyclingPlugin",
@"AIContactAwayPlugin",
@"AIContactIdlePlugin",
@"AIContactInfoWindowPlugin",
@"AIContactListEditorPlugin",
@"AIContactOnlineSincePlugin",
@"AIContactSortSelectionPlugin",
@"AIContactStatusColoringPlugin",
@"AIDockNameOverlay",
@"AIContactStatusEventsPlugin",
@"AIDockAccountStatusPlugin",
@"AIDockBehaviorPlugin",
@"AIDualWindowInterfacePlugin",
@"AIEventSoundsPlugin",
@"AIExtendedStatusPlugin",
@"AILoggerPlugin",
@"AIMessageAliasPlugin",
@"AINewMessagePanelPlugin",
@"AINudgeBuzzHandlerPlugin",
@"AISCLViewPlugin",
@"AIStandardToolbarItemsPlugin",
@"AIStateMenuPlugin",
@"AIStatusChangedMessagesPlugin",
@"AITabStatusIconsPlugin",
@"BGContactNotesPlugin",
@"BGEmoticonMenuPlugin",
@"CBActionSupportPlugin",
@"CBContactCountingDisplayPlugin",
@"CBContactLastSeenPlugin",
@"CBStatusMenuItemPlugin",
@"DCInviteToChatPlugin",
@"DCJoinChatPanelPlugin",
@"DCMessageContextDisplayPlugin",
@"AIAddBookmarkPlugin",
@"ESAccountEvents",
@"ESAccountNetworkConnectivityPlugin",
@"ESAnnouncerPlugin",
@"ESApplescriptContactAlertPlugin",
@"ESBlockingPlugin",
@"ESContactClientPlugin",
@"ESContactServersideDisplayName",
@"ESFileTransferMessagesPlugin",
@"AIListObjectContentsPlugin",
@"ESOpenMessageWindowContactAlertPlugin",
@"ESSendMessageContactAlertPlugin",
@"ESUserIconHandlingPlugin",
@"ErrorMessageHandlerPlugin",
@"GBApplescriptFiltersPlugin",
@"SAContactOnlineForPlugin",
@"SHLinkManagementPlugin",
@"ESGlobalEventsPreferencesPlugin",
@"ESGeneralPreferencesPlugin",
@"NEHGrowlPlugin",
@"ESSecureMessagingPlugin",
@"ESStatusPreferencesPlugin",
@"AIAutomaticStatus",
@"ESAwayStatusWindowPlugin",
@"RAFBlockEditorPlugin",
@"SMContactListShowBehaviorPlugin",
@"ESiTunesPlugin",
@"ESProfilePreferencesPlugin",
@"OWSpellingPerContactPlugin",
@"GBQuestionHandlerPlugin",
@"AINulRemovalPlugin",
@"AIDefaultFontRemovalPlugin",
@"AIAdvancedPreferencesPlugin",
@"GBImportPlugin",
@"AIMentionEventPlugin",
@"AITwitterIMPlugin",
@"AITwitterPlugin",
// @"AILaconicaPlugin",
@"AITwitterURLHandler",
@"AITwitterActionsHTMLFilter",
@"AIURLShortenerPlugin",
@"AIGroupChatStatusTooltipPlugin",
@"AIRealNameTooltip",
@"AIUserHostTooltip",
@"AIUnreadMessagesTooltip",
@"AIIRCChannelLinker",
@"AIURLHandlerPlugin",
@"AIJumpControlPlugin",
@"AIWebKitMessageViewPlugin",
@"AWBonjourPlugin",
@"CBPurpleServicePlugin",
@"AIImageUploaderPlugin",
@"AITwitterStatusFollowup",
@"AIDoNothingContactAlertPlugin",
nil
];
//Load each component
for (NSString *className in componentClassNames) {
#ifdef COMPONENT_LOAD_TIMING
NSDate *start = [NSDate date];
#endif
@autoreleasepool {
Class class;
if (className && (class = NSClassFromString(className))) {
id <AIPlugin> object = [[class alloc] init];
NSAssert1(object, @"Failed to load %@", className);
[object installPlugin];
[components setObject:object forKey:className];
} else {
NSAssert1(NO, @"Failed to load %@", className);
}
}
#ifdef COMPONENT_LOAD_TIMING
NSTimeInterval t = -[start timeIntervalSinceNow];
aggregateComponentLoadingTime += t;
AILog(@"Loaded component: %@ in %f seconds", className, t);
#endif
}
#ifdef COMPONENT_LOAD_TIMING
AILog(@"Total time spent loading components: %f", aggregateComponentLoadingTime);
#endif
}
- (void)controllerDidLoad
{
}
/*!
* @brief Close integreated components
*/
- (void)controllerWillClose
{
for (id <AIPlugin> plugin in [components objectEnumerator]) {
[[NSNotificationCenter defaultCenter] removeObserver:plugin];
[plugin uninstallPlugin];
}
}
#pragma mark -
/*!
* @brief Retrieve a component plugin by its class name
*/
- (id <AIPlugin>)pluginWithClassName:(NSString *)className {
return [components objectForKey:className];
}
@end