// // 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