// Copyright 2019-present the Material Components for iOS authors. All Rights Reserved. // // 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 #import "MDCTextControlLabelBehavior.h" #import "MaterialTextControlsPrivate+BaseStyle.h" #import "MDCTextControlAssistiveLabelDrawPriority.h" #import "MaterialTextControlsPrivate+Shared.h" #import "MaterialTextControlsPrivate+TextFields.h" @interface MDCBaseTextFieldLayout (Testing) - (CGFloat)textHeightWithFont:(UIFont *)font; @end @interface MDCBaseTextFieldLayoutTests : XCTestCase @end @implementation MDCBaseTextFieldLayoutTests #pragma mark Helpers - (UIView *)createSideView { UIView *sideView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; sideView.backgroundColor = [UIColor blueColor]; return sideView; } - (MDCBaseTextFieldLayout *)createLayoutWithSideViewsAndViewMode:(UITextFieldViewMode)viewMode isEditing:(BOOL)isEditing { CGSize textFieldSize = CGSizeMake(100, 30); UIFont *font = [UIFont systemFontOfSize:[UIFont systemFontSize]]; UIFont *floatingFont = [font fontWithSize:(font.pointSize * (CGFloat)0.5)]; MDCTextControlAssistiveLabelView *assistiveLabelView = [[MDCTextControlAssistiveLabelView alloc] init]; MDCTextControlVerticalPositioningReferenceBase *positioningReference = [[MDCTextControlVerticalPositioningReferenceBase alloc] init]; MDCBaseTextFieldLayout *layout = [[MDCBaseTextFieldLayout alloc] initWithTextFieldSize:textFieldSize positioningReference:positioningReference horizontalPositioningReference:[[MDCTextControlHorizontalPositioningReference alloc] init] text:@"Text" font:font floatingFont:floatingFont label:[[UILabel alloc] init] labelPosition:MDCTextControlLabelPositionFloating labelBehavior:MDCTextControlLabelBehaviorFloats sideViewAlignment:MDCTextControlTextFieldSideViewAlignmentCenteredInContainer leadingView:[self createSideView] leadingViewMode:viewMode trailingView:[self createSideView] trailingViewMode:viewMode clearButtonSideLength:19 clearButtonMode:viewMode leadingAssistiveLabel:assistiveLabelView.leadingAssistiveLabel trailingAssistiveLabel:assistiveLabelView.trailingAssistiveLabel assistiveLabelDrawPriority:MDCTextControlAssistiveLabelDrawPriorityTrailing customAssistiveLabelDrawPriority:0 isRTL:NO isEditing:isEditing]; return layout; } #pragma mark Tests - (void)testTextHeightWithFont { // Given MDCBaseTextFieldLayout *emptyLayout = [[MDCBaseTextFieldLayout alloc] init]; UIFont *systemFont = [UIFont systemFontOfSize:[UIFont systemFontSize]]; // When CGFloat ceiledLineHeight = (CGFloat)ceil((double)systemFont.lineHeight); CGFloat calculatedTextHeight = [emptyLayout textHeightWithFont:systemFont]; // Then XCTAssertEqual(ceiledLineHeight, calculatedTextHeight); } - (void)testLeftAndRightViewsWithViewModeAlways { // Given MDCBaseTextFieldLayout *nonEditingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeAlways isEditing:NO]; MDCBaseTextFieldLayout *editingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeAlways isEditing:YES]; // Then XCTAssertTrue(nonEditingLayout.displaysLeadingView); XCTAssertTrue(nonEditingLayout.displaysTrailingView); XCTAssertTrue(editingLayout.displaysLeadingView); XCTAssertTrue(editingLayout.displaysTrailingView); } - (void)testLeftAndRightViewsWithViewModeWhileEditing { // Given MDCBaseTextFieldLayout *nonEditingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeWhileEditing isEditing:NO]; MDCBaseTextFieldLayout *editingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeWhileEditing isEditing:YES]; // Then XCTAssertFalse(nonEditingLayout.displaysLeadingView); XCTAssertFalse(nonEditingLayout.displaysTrailingView); XCTAssertTrue(editingLayout.displaysLeadingView); XCTAssertTrue(editingLayout.displaysTrailingView); } - (void)testLeftAndRightViewsWithViewModeUnlessEditing { // Given MDCBaseTextFieldLayout *nonEditingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeUnlessEditing isEditing:NO]; MDCBaseTextFieldLayout *editingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeUnlessEditing isEditing:YES]; // Then XCTAssertTrue(nonEditingLayout.displaysLeadingView); XCTAssertTrue(nonEditingLayout.displaysTrailingView); XCTAssertFalse(editingLayout.displaysLeadingView); XCTAssertFalse(editingLayout.displaysTrailingView); } - (void)testLeftAndRightViewsWithViewModeNever { // Given MDCBaseTextFieldLayout *nonEditingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeNever isEditing:NO]; MDCBaseTextFieldLayout *editingLayout = [self createLayoutWithSideViewsAndViewMode:UITextFieldViewModeNever isEditing:YES]; // Then XCTAssertFalse(nonEditingLayout.displaysLeadingView); XCTAssertFalse(nonEditingLayout.displaysTrailingView); XCTAssertFalse(editingLayout.displaysLeadingView); XCTAssertFalse(editingLayout.displaysTrailingView); } - (void)testLabelFrameWithLabelPosition { // Given MDCBaseTextFieldLayout *layout = [[MDCBaseTextFieldLayout alloc] init]; // When layout.labelFrameNormal = CGRectMake(5, 5, 100, 20); layout.labelFrameFloating = CGRectMake(5, 0, 100, 20); // Then CGRect labelFrameWithLabelPositionFloating = [layout labelFrameWithLabelPosition:MDCTextControlLabelPositionFloating]; CGRect labelFrameWithLabelPositionNormal = [layout labelFrameWithLabelPosition:MDCTextControlLabelPositionNormal]; CGRect labelFrameWithLabelPositionNone = [layout labelFrameWithLabelPosition:MDCTextControlLabelPositionNone]; XCTAssertTrue(CGRectEqualToRect(labelFrameWithLabelPositionFloating, layout.labelFrameFloating)); XCTAssertTrue(CGRectEqualToRect(labelFrameWithLabelPositionNormal, layout.labelFrameNormal)); XCTAssertTrue(CGRectEqualToRect(labelFrameWithLabelPositionNone, CGRectZero)); } @end