blob: 955637c9b3e5ccfd9db6b60bc6b1851ace144516 [file] [log] [blame]
//
// GTMUILocalizerAndLayoutTweakerTest.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 "GTMUILocalizerAndLayoutTweakerTest.h"
#import "GTMUILocalizerAndLayoutTweaker.h"
static NSUInteger gTestPass = 0;
@interface GTMUILocalizerAndLayoutTweakerTest : GTMTestCase
@end
@implementation GTMUILocalizerAndLayoutTweakerTest
- (void)testWindowLocalization {
// Test with nib 1
for (gTestPass = 0; gTestPass < 3; ++gTestPass) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest1"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", gTestPass);
[controller release];
}
// Test with nib 2
for (gTestPass = 0; gTestPass < 3; ++gTestPass) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest2"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", gTestPass);
[controller release];
}
}
- (void)testSizeToFitFixedWidthTextField {
// In the xib, the one field is over sized, the other is undersized, this
// way we make sure the code handles both condions as there was a bahavior
// change between the 10.4 and 10.5 SDKs.
// The right field is also right aligned to make sure the width of the text
// field stays constant.
NSString *kTestStrings[] = {
@"The fox jumps the dog.",
@"The quick brown fox jumps over the lazy dog.",
@"The quick brown fox jumps over the lazy dog. The quick brown fox jumps "
@"over the lazy dog. The quick brown fox jumps over the lazy dog. "
@"The quick brown fox jumps over the lazy dog. The quick brown fox "
@"jumps over the lazy dog.",
@"The quick brown fox jumps over the lazy dog.\nThe quick brown fox jumps "
@"over the lazy dog.\nThe quick brown fox jumps over the lazy dog.\n"
@"The quick brown fox jumps over the lazy dog.\nThe quick brown fox "
@"jumps over the lazy dog.",
@"The quick brown fox jumps over the lazy dog. The quick brown fox jumps "
@"over the lazy dog.\nThe quick brown fox jumps over the lazy dog. "
@"The quick brown fox jumps over the lazy dog. The quick brown fox "
@"jumps over the lazy dog. The quick brown fox jumps over the lazy "
@"dog. The quick brown fox jumps over the lazy dog.\n\nThe End.",
};
for (size_t lp = 0;
lp < (sizeof(kTestStrings) / sizeof(kTestStrings[0]));
++lp) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest3"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", lp);
NSTextField *field;
for (field in [[window contentView] subviews]) {
XCTAssertTrue([field isMemberOfClass:[NSTextField class]],
@"Pass %tu", lp);
[field setStringValue:kTestStrings[lp]];
[GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:field];
}
[controller release];
}
}
- (void)testButtonStyleLocalizations {
// Since we special case standard push buttons, test all button types.
// This also tests the vertical vs. horizontal layout code on widthbox, if
// you look at the xib in IB, turn on the bounds rectagle display, and you'll
// see how IB's left alignment is a visual alignment, it doesn't actually
// align the bounds of the views.
for (gTestPass = 0; gTestPass < 3; ++gTestPass) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest4"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", gTestPass);
[controller release];
}
}
- (void)testWrappingForWidth {
NSString *kTestStrings[] = {
@"The fox jumps the dog.",
@"The quick brown fox jumps over the lazy dog.",
@"The quick brown fox jumps over the lazy dog. The quick brown fox jumps "
@"over the lazy dog. The quick brown fox jumps over the lazy dog. "
@"The quick brown fox jumps over the lazy dog.",
};
for (size_t lp = 0;
lp < (sizeof(kTestStrings) / sizeof(kTestStrings[0]));
++lp) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest5"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", lp);
NSView *view;
for (view in [[window contentView] subviews]) {
if ([view isMemberOfClass:[NSButton class]]) {
NSButton *btn = (id)view;
[btn setTitle:kTestStrings[lp]];
[GTMUILocalizerAndLayoutTweaker wrapButtonTitleForWidth:btn];
} else {
XCTAssertTrue([view isMemberOfClass:[NSMatrix class]],
@"Pass %tu", lp);
NSMatrix *mtx = (id)view;
NSCell *cell;
int i = 0;
for (cell in [mtx cells]) {
[cell setTitle:[NSString stringWithFormat:@"%d %@",
++i, kTestStrings[lp]]];
}
[GTMUILocalizerAndLayoutTweaker wrapRadioGroupForWidth:mtx];
}
[GTMUILocalizerAndLayoutTweaker sizeToFitView:view];
}
[controller release];
}
}
- (void)testTabViewLocalization {
// Test with nib 6
for (gTestPass = 0; gTestPass < 3; ++gTestPass) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest6"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", gTestPass);
NSTabView *tabView = [controller tabView];
for (NSInteger tabIndex = 0; tabIndex < [tabView numberOfTabViewItems];
++tabIndex) {
[tabView selectTabViewItemAtIndex:tabIndex];
}
[controller release];
}
// Test with nib 2
for (gTestPass = 0; gTestPass < 3; ++gTestPass) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest2"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", gTestPass);
[controller release];
}
}
#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
- (void)testSizeToFitFixedHeightTextField {
struct {
const char *name;
NSUInteger minWidth;
} kTestModes[] = {
{ "NoMin", 0 },
{ "Min", 450 },
};
NSString *kTestStrings[] = {
@"The fox jumps the dog.",
@"The quick brown fox jumps over the lazy dog.",
@"The quick brown fox jumps over the lazy dog. The quick brown fox jumps "
@"over the lazy dog. The quick brown fox jumps over the lazy dog. "
@"The quick brown fox jumps over the lazy dog. The quick brown fox "
@"jumps over the lazy dog.",
@"The quick brown fox jumps over the lazy dog. The quick brown fox jumps "
@"over the lazy dog. The quick brown fox jumps over the lazy dog. "
@"The quick brown fox jumps over the lazy dog. The quick brown fox "
@"jumps over the lazy dog. The quick brown fox jumps over the lazy "
@"dog. The quick brown fox jumps over the lazy dog. The End.",
};
for (size_t modeLoop = 0;
modeLoop < (sizeof(kTestModes) / sizeof(kTestModes[0]));
++modeLoop) {
for (size_t lp = 0;
lp < (sizeof(kTestStrings) / sizeof(kTestStrings[0]));
++lp) {
GTMUILocalizerAndLayoutTweakerTestWindowController *controller =
[[GTMUILocalizerAndLayoutTweakerTestWindowController alloc]
initWithWindowNibName:@"GTMUILocalizerAndLayoutTweakerTest7"];
NSWindow *window = [controller window];
XCTAssertNotNil(window, @"Pass %tu", lp);
NSTextField *field;
for (field in [[window contentView] subviews]) {
XCTAssertTrue([field isMemberOfClass:[NSTextField class]],
@"Pass %tu", lp);
[field setStringValue:kTestStrings[lp]];
NSUInteger minWidth = kTestModes[modeLoop].minWidth;
if (minWidth) {
[GTMUILocalizerAndLayoutTweaker sizeToFitFixedHeightTextField:field
minWidth:minWidth];
} else {
[GTMUILocalizerAndLayoutTweaker sizeToFitFixedHeightTextField:field];
}
}
[controller release];
}
}
}
- (void)testSizeToFitFixedHeightTextFieldIntegral {
NSTextField* textField =
[[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 50)];
[textField setBezeled:NO];
[textField setStringValue:@"The quick brown fox jumps over the lazy dog."];
[GTMUILocalizerAndLayoutTweaker sizeToFitFixedHeightTextField:textField];
XCTAssertTrue(
NSEqualRects([textField bounds], NSIntegralRect([textField bounds])));
[textField release];
}
#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
@end
@implementation GTMUILocalizerAndLayoutTweakerTestWindowController
- (NSTabView *)tabView {
return tabView_;
}
@end
@implementation GTMUILocalizerAndLayoutTweakerTestLocalizer
- (NSString *)localizedStringForString:(NSString *)string {
// "[FRAGMENT]:[COUNT]:[COUNT]"
// String is split, fragment is repeated count times, and spaces are then
// trimmed. Gives us strings that don't change for the test, but easy to
// vary in size. Which count is used, is controled by |gTestPass| so we
// can use a nib more then once.
NSArray *parts = [string componentsSeparatedByString:@":"];
if ([parts count] > (gTestPass + 1)) {
NSString *fragment = [parts objectAtIndex:0];
NSInteger count = [[parts objectAtIndex:gTestPass + 1] intValue];
if (count) {
NSMutableString *result =
[NSMutableString stringWithCapacity:count * [fragment length]];
while (count--) {
[result appendString:fragment];
}
NSCharacterSet *ws = [NSCharacterSet whitespaceCharacterSet];
return [result stringByTrimmingCharactersInSet:ws];
}
}
return nil;
}
- (void)awakeFromNib {
// Stop the base one from logging or doing anything since we don't need it
// for this test.
}
@end