blob: 61173712dd700dcfd69a8efc44ded3cc1b2bc58b [file] [log] [blame]
//
// GTMWindowSheetControllerTest.m
//
// Copyright 2009 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
//
#import "GTMSenTestCase.h"
#import "GTMWindowSheetController.h"
@interface GTMWindowSheetControllerTest : GTMTestCase
<GTMWindowSheetControllerDelegate,
NSTabViewDelegate> {
@private
GTMWindowSheetController *sheetController_;
NSWindow* window_;
BOOL didAlertClose_;
BOOL didSheetClose_;
}
- (void)alertDidEnd:(NSAlert *)alert
returnCode:(NSInteger)returnCode
context:(void *)context;
- (void)openSecondSheet:(NSAlert *)alert
returnCode:(NSInteger)returnCode
context:(void *)context;
- (void)sheetDidEnd:(NSWindow *)sheet
returnCode:(NSInteger)returnCode
context:(void *)context;
@end
@implementation GTMWindowSheetControllerTest
- (void)testOpenTwoSheetsAndSwitch {
// Set up window
NSWindow *window =
[[[NSWindow alloc] initWithContentRect:NSMakeRect(100, 100, 600, 600)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO] autorelease];
XCTAssertNotNil(window, @"Could not allocate window");
NSTabView *tabView =
[[[NSTabView alloc] initWithFrame:NSMakeRect(10, 10, 580, 580)]
autorelease];
XCTAssertNotNil(tabView, @"Could not allocate tab view");
[[window contentView] addSubview:tabView];
[tabView setDelegate:self];
NSTabViewItem *item1 =
[[[NSTabViewItem alloc] initWithIdentifier:@"one"] autorelease];
[item1 setLabel:@"One"];
NSTabViewItem *item2 =
[[[NSTabViewItem alloc] initWithIdentifier:@"two"] autorelease];
[item2 setLabel:@"Two"];
[tabView addTabViewItem:item1];
[tabView addTabViewItem:item2];
sheetController_ =
[[[GTMWindowSheetController alloc] initWithWindow:window
delegate:self] autorelease];
XCTAssertFalse([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should not be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)0,
@"Should have no views with sheets");
// Pop alert on first tab
NSAlert* alert = [[NSAlert alloc] init];
[alert setMessageText:@"Hell Has Broken Loose."];
[alert setInformativeText:@"All hell has broken loose. You may want to run "
@"outside screaming and waving your arms around "
@"wildly."];
NSButton *alertButton = [alert addButtonWithTitle:@"OK"];
[sheetController_ beginSystemSheet:alert
modalForView:[item1 view]
withParameters:[NSArray arrayWithObjects:
[NSNull null],
self,
[NSValue valueWithPointer:
@selector(alertDidEnd:returnCode:context:)],
[NSValue valueWithPointer:nil],
nil]];
didAlertClose_ = NO;
XCTAssertTrue([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)1,
@"Should have one view with sheets");
[tabView selectTabViewItem:item2];
XCTAssertFalse([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should not be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)1,
@"Should have one view with sheets");
// Pop sheet on second tab
NSPanel *sheet =
[[[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 300, 200)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO] autorelease];
[sheetController_ beginSheet:sheet
modalForView:[item2 view]
modalDelegate:self
didEndSelector:@selector(sheetDidEnd:returnCode:context:)
contextInfo:nil];
didSheetClose_ = NO;
XCTAssertTrue([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)2,
@"Should have two views with sheets");
[tabView selectTabViewItem:item1];
XCTAssertTrue([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)2,
@"Should have two views with sheets");
// Close alert
[alertButton performClick:self];
XCTAssertFalse([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should not be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)1,
@"Should have one view with sheets");
XCTAssertTrue(didAlertClose_, @"Alert should have closed");
[tabView selectTabViewItem:item2];
XCTAssertTrue([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)1,
@"Should have one view with sheets");
// Close sheet
[[NSApplication sharedApplication] endSheet:sheet returnCode:NSOKButton];
XCTAssertFalse([sheetController_ isSheetAttachedToView:
[[tabView selectedTabViewItem] view]],
@"Sheet should not be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)0,
@"Should have no views with sheets");
XCTAssertTrue(didSheetClose_, @"Sheet should have closed");
}
- (void)testOpenSheetAfterFirst {
// Set up window
window_ =
[[[NSWindow alloc] initWithContentRect:NSMakeRect(100, 100, 600, 600)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO] autorelease];
XCTAssertNotNil(window_, @"Could not allocate window");
sheetController_ =
[[[GTMWindowSheetController alloc] initWithWindow:window_
delegate:self] autorelease];
XCTAssertFalse([sheetController_ isSheetAttachedToView:[window_ contentView]],
@"Sheet should not be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)0,
@"Should have no views with sheets");
// Pop alert on first tab
NSAlert* alert = [[NSAlert alloc] init];
[alert setMessageText:@"Hell Has Broken Loose."];
[alert setInformativeText:@"All hell has broken loose. You may want to run "
@"outside screaming and waving your arms around "
@"wildly."];
NSButton *alertButton = [alert addButtonWithTitle:@"OK"];
// Allocate a second sheet to be launched by the alert
NSPanel *sheet =
[[[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 300, 200)
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO] autorelease];
[sheetController_ beginSystemSheet:alert
modalForView:[window_ contentView]
withParameters:[NSArray arrayWithObjects:
[NSNull null],
self,
[NSValue valueWithPointer:
@selector(openSecondSheet:returnCode:context:)],
[NSValue valueWithPointer:sheet],
nil]];
didAlertClose_ = NO;
didSheetClose_ = NO;
XCTAssertTrue([sheetController_ isSheetAttachedToView:[window_ contentView]],
@"Sheet should be attached to view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)1,
@"Should have one view with sheets");
// Close alert
[alertButton performClick:self];
XCTAssertTrue([sheetController_ isSheetAttachedToView:[window_ contentView]],
@"Second sheet should be attached to view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)1,
@"Should have one view with sheets");
XCTAssertTrue(didAlertClose_, @"Alert should have closed");
// Close sheet
[[NSApplication sharedApplication] endSheet:sheet returnCode:NSOKButton];
XCTAssertFalse([sheetController_ isSheetAttachedToView:[window_ contentView]],
@"Sheet should not be attached to current view");
XCTAssertEqual([[sheetController_ viewsWithAttachedSheets] count],
(NSUInteger)0,
@"Should have no views with sheets");
XCTAssertTrue(didSheetClose_, @"Sheet should have closed");
}
- (void)alertDidEnd:(NSAlert *)alert
returnCode:(NSInteger)returnCode
context:(void *)context {
didAlertClose_ = YES;
}
- (void)openSecondSheet:(NSAlert *)alert
returnCode:(NSInteger)returnCode
context:(void *)context {
didAlertClose_ = YES;
NSPanel* sheet = context;
// Pop a second sheet
[sheetController_ beginSheet:sheet
modalForView:[window_ contentView]
modalDelegate:self
didEndSelector:@selector(sheetDidEnd:returnCode:context:)
contextInfo:nil];
}
- (void)sheetDidEnd:(NSWindow *)sheet
returnCode:(NSInteger)returnCode
context:(void *)context {
didSheetClose_ = YES;
[sheet orderOut:self];
}
- (void)tabView:(NSTabView *)tabView
didSelectTabViewItem:(NSTabViewItem *)tabViewItem {
NSView* view = [tabViewItem view];
[sheetController_ setActiveView:view];
}
- (void)gtm_systemRequestsVisibilityForView:(NSView*)view {
XCTAssertTrue(false, @"Shouldn't be called");
}
@end