// 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 "MaterialTextControls+Enums.h" #import "MaterialTextControls+OutlinedTextFields.h" #import "MaterialColorScheme.h" #import "MaterialContainerScheme.h" #import "MaterialTextControls+OutlinedTextFieldsTheming.h" #import "MaterialTypographyScheme.h" static const CGFloat kDisabledOpacity = (CGFloat)0.60; static const CGFloat kTextColorNormalOpacity = (CGFloat)0.87; static const CGFloat kFloatingLabelColorEditingOpacity = (CGFloat)0.87; static const CGFloat kNormalLabelColorNormalOpacity = (CGFloat)0.60; static const CGFloat kOutlineColorNormalOpacity = (CGFloat)0.38; static const CGFloat kPrimaryFloatingLabelColorNormalOpacity = (CGFloat)0.60; static const CGFloat kPrimaryAssistiveLabelColorNormalOpacity = (CGFloat)0.60; @interface MDCOutlinedTextFieldThemingTest : XCTestCase @property(nonatomic, strong) MDCOutlinedTextField *textField; @property(nonatomic, strong) MDCSemanticColorScheme *colorScheme; @property(nonatomic, strong) MDCTypographyScheme *typographyScheme; @property(nonatomic, strong) MDCContainerScheme *containerScheme; @end @implementation MDCOutlinedTextFieldThemingTest - (void)setUp { [super setUp]; self.textField = [[MDCOutlinedTextField alloc] init]; self.colorScheme = [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201907]; self.typographyScheme = [[MDCTypographyScheme alloc] initWithDefaults:MDCTypographySchemeDefaultsMaterial201902]; self.containerScheme = [[MDCContainerScheme alloc] init]; self.containerScheme.colorScheme = self.colorScheme; self.containerScheme.typographyScheme = self.typographyScheme; } - (void)tearDown { self.textField = nil; self.colorScheme = nil; self.typographyScheme = nil; self.containerScheme = nil; [super tearDown]; } - (void)testTextFieldPrimaryThemingDefault { // When [self.textField applyThemeWithScheme:self.containerScheme]; // Then [self verifyTextFieldPrimaryTheming]; } - (void)testTextFieldPrimaryThemingCustom { // Given self.colorScheme = [self customColorScheme]; self.typographyScheme = [self customTypographyScheme]; self.containerScheme.colorScheme = self.colorScheme; self.containerScheme.typographyScheme = self.typographyScheme; // When [self.textField applyThemeWithScheme:self.containerScheme]; // Then [self verifyTextFieldPrimaryTheming]; } - (void)testTextFieldErrorThemingDefault { // When [self.textField applyErrorThemeWithScheme:self.containerScheme]; // Then [self verifyTextFieldErrorTheming]; } - (void)testTextFieldErrorThemingCustom { // Given self.colorScheme = [self customColorScheme]; self.typographyScheme = [self customTypographyScheme]; self.containerScheme.colorScheme = self.colorScheme; self.containerScheme.typographyScheme = self.typographyScheme; // When [self.textField applyErrorThemeWithScheme:self.containerScheme]; // Then [self verifyTextFieldErrorTheming]; } #pragma mark - Test helpers - (MDCSemanticColorScheme *)customColorScheme { MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201804]; colorScheme.primaryColor = [UIColor colorWithWhite:(CGFloat)0.9 alpha:0]; colorScheme.primaryColorVariant = [UIColor colorWithWhite:(CGFloat)0.8 alpha:(CGFloat)0.1]; colorScheme.secondaryColor = [UIColor colorWithWhite:(CGFloat)0.7 alpha:(CGFloat)0.2]; colorScheme.errorColor = [UIColor colorWithWhite:(CGFloat)0.6 alpha:(CGFloat)0.3]; colorScheme.surfaceColor = [UIColor colorWithWhite:(CGFloat)0.5 alpha:(CGFloat)0.4]; colorScheme.backgroundColor = [UIColor colorWithWhite:(CGFloat)0.4 alpha:(CGFloat)0.5]; colorScheme.onPrimaryColor = [UIColor colorWithWhite:(CGFloat)0.3 alpha:(CGFloat)0.6]; colorScheme.onSecondaryColor = [UIColor colorWithWhite:(CGFloat)0.2 alpha:(CGFloat)0.7]; colorScheme.onSurfaceColor = [UIColor colorWithWhite:(CGFloat)0.1 alpha:(CGFloat)0.8]; colorScheme.onBackgroundColor = [UIColor colorWithWhite:0 alpha:(CGFloat)0.9]; return colorScheme; } - (MDCTypographyScheme *)customTypographyScheme { MDCTypographyScheme *typographyScheme = [[MDCTypographyScheme alloc] init]; typographyScheme.headline1 = [UIFont systemFontOfSize:1]; typographyScheme.headline2 = [UIFont systemFontOfSize:2]; typographyScheme.headline3 = [UIFont systemFontOfSize:3]; typographyScheme.headline4 = [UIFont systemFontOfSize:4]; typographyScheme.headline5 = [UIFont systemFontOfSize:5]; typographyScheme.headline6 = [UIFont systemFontOfSize:6]; typographyScheme.subtitle1 = [UIFont systemFontOfSize:7]; typographyScheme.subtitle2 = [UIFont systemFontOfSize:8]; typographyScheme.body1 = [UIFont systemFontOfSize:9]; typographyScheme.body2 = [UIFont systemFontOfSize:10]; typographyScheme.caption = [UIFont systemFontOfSize:11]; typographyScheme.button = [UIFont systemFontOfSize:12]; typographyScheme.overline = [UIFont systemFontOfSize:13]; return typographyScheme; } - (void)verifyTextFieldPrimaryTheming { // Color UIColor *textColorNormal = [self.colorScheme.onSurfaceColor colorWithAlphaComponent:kTextColorNormalOpacity]; UIColor *textColorEditing = textColorNormal; UIColor *textColorDisabled = [textColorNormal colorWithAlphaComponent:kTextColorNormalOpacity * kDisabledOpacity]; UIColor *assistiveLabelColorNormal = [self.colorScheme.onSurfaceColor colorWithAlphaComponent:kPrimaryAssistiveLabelColorNormalOpacity]; UIColor *assistiveLabelColorEditing = assistiveLabelColorNormal; UIColor *assistiveLabelColorDisabled = [assistiveLabelColorNormal colorWithAlphaComponent:kPrimaryAssistiveLabelColorNormalOpacity * kDisabledOpacity]; UIColor *floatingLabelColorNormal = [self.colorScheme.onSurfaceColor colorWithAlphaComponent:kPrimaryFloatingLabelColorNormalOpacity]; UIColor *floatingLabelColorEditing = [self.colorScheme.primaryColor colorWithAlphaComponent:kFloatingLabelColorEditingOpacity]; UIColor *floatingLabelColorDisabled = [floatingLabelColorNormal colorWithAlphaComponent:kPrimaryFloatingLabelColorNormalOpacity * kDisabledOpacity]; UIColor *normalLabelColorNormal = [self.colorScheme.onSurfaceColor colorWithAlphaComponent:kNormalLabelColorNormalOpacity]; UIColor *normalLabelColorEditing = normalLabelColorNormal; UIColor *normalLabelColorDisabled = [normalLabelColorNormal colorWithAlphaComponent:kNormalLabelColorNormalOpacity * kDisabledOpacity]; UIColor *outlineColorNormal = [self.colorScheme.onSurfaceColor colorWithAlphaComponent:kOutlineColorNormalOpacity]; UIColor *outlineColorEditing = self.colorScheme.primaryColor; UIColor *outlineColorDisabled = [outlineColorNormal colorWithAlphaComponent:kOutlineColorNormalOpacity * kDisabledOpacity]; UIColor *tintColor = self.colorScheme.primaryColor; XCTAssertEqualObjects([self.textField floatingLabelColorForState:MDCTextControlStateNormal], floatingLabelColorNormal); XCTAssertEqualObjects([self.textField floatingLabelColorForState:MDCTextControlStateEditing], floatingLabelColorEditing); XCTAssertEqualObjects([self.textField floatingLabelColorForState:MDCTextControlStateDisabled], floatingLabelColorDisabled); XCTAssertEqualObjects([self.textField normalLabelColorForState:MDCTextControlStateNormal], normalLabelColorNormal); XCTAssertEqualObjects([self.textField normalLabelColorForState:MDCTextControlStateEditing], normalLabelColorEditing); XCTAssertEqualObjects([self.textField normalLabelColorForState:MDCTextControlStateDisabled], normalLabelColorDisabled); XCTAssertEqualObjects([self.textField textColorForState:MDCTextControlStateNormal], textColorNormal); XCTAssertEqualObjects([self.textField textColorForState:MDCTextControlStateEditing], textColorEditing); XCTAssertEqualObjects([self.textField textColorForState:MDCTextControlStateDisabled], textColorDisabled); XCTAssertEqualObjects( [self.textField leadingAssistiveLabelColorForState:MDCTextControlStateNormal], assistiveLabelColorNormal); XCTAssertEqualObjects( [self.textField leadingAssistiveLabelColorForState:MDCTextControlStateEditing], assistiveLabelColorEditing); XCTAssertEqualObjects( [self.textField leadingAssistiveLabelColorForState:MDCTextControlStateDisabled], assistiveLabelColorDisabled); XCTAssertEqualObjects( [self.textField trailingAssistiveLabelColorForState:MDCTextControlStateNormal], assistiveLabelColorNormal); XCTAssertEqualObjects( [self.textField trailingAssistiveLabelColorForState:MDCTextControlStateEditing], assistiveLabelColorEditing); XCTAssertEqualObjects( [self.textField trailingAssistiveLabelColorForState:MDCTextControlStateDisabled], assistiveLabelColorDisabled); XCTAssertEqualObjects([self.textField outlineColorForState:MDCTextControlStateNormal], outlineColorNormal); XCTAssertEqualObjects([self.textField outlineColorForState:MDCTextControlStateEditing], outlineColorEditing); XCTAssertEqualObjects([self.textField outlineColorForState:MDCTextControlStateDisabled], outlineColorDisabled); XCTAssertEqualObjects(self.textField.tintColor, tintColor); // Typography XCTAssertEqualObjects(self.textField.font, self.typographyScheme.subtitle1); XCTAssertEqualObjects(self.textField.leadingAssistiveLabel.font, self.typographyScheme.caption); XCTAssertEqualObjects(self.textField.trailingAssistiveLabel.font, self.typographyScheme.caption); } - (void)verifyTextFieldErrorTheming { // Color UIColor *textColorNormal = [self.colorScheme.onSurfaceColor colorWithAlphaComponent:kTextColorNormalOpacity]; UIColor *textColorEditing = textColorNormal; UIColor *textColorDisabled = [textColorNormal colorWithAlphaComponent:kTextColorNormalOpacity * kDisabledOpacity]; UIColor *assistiveLabelColorNormal = self.colorScheme.errorColor; UIColor *assistiveLabelColorEditing = assistiveLabelColorNormal; UIColor *assistiveLabelColorDisabled = [assistiveLabelColorNormal colorWithAlphaComponent:kDisabledOpacity]; UIColor *floatingLabelColorNormal = self.colorScheme.errorColor; UIColor *floatingLabelColorEditing = floatingLabelColorNormal; UIColor *floatingLabelColorDisabled = [floatingLabelColorNormal colorWithAlphaComponent:kDisabledOpacity]; UIColor *normalLabelColorNormal = [self.colorScheme.onSurfaceColor colorWithAlphaComponent:kNormalLabelColorNormalOpacity]; UIColor *normalLabelColorEditing = normalLabelColorNormal; UIColor *normalLabelColorDisabled = [normalLabelColorNormal colorWithAlphaComponent:kNormalLabelColorNormalOpacity * kDisabledOpacity]; UIColor *outlineColorNormal = self.colorScheme.errorColor; UIColor *outlineColorEditing = outlineColorNormal; UIColor *outlineColorDisabled = [outlineColorNormal colorWithAlphaComponent:kDisabledOpacity]; UIColor *tintColor = self.colorScheme.errorColor; XCTAssertEqualObjects([self.textField floatingLabelColorForState:MDCTextControlStateNormal], floatingLabelColorNormal); XCTAssertEqualObjects([self.textField floatingLabelColorForState:MDCTextControlStateEditing], floatingLabelColorEditing); XCTAssertEqualObjects([self.textField floatingLabelColorForState:MDCTextControlStateDisabled], floatingLabelColorDisabled); XCTAssertEqualObjects([self.textField normalLabelColorForState:MDCTextControlStateNormal], normalLabelColorNormal); XCTAssertEqualObjects([self.textField normalLabelColorForState:MDCTextControlStateEditing], normalLabelColorEditing); XCTAssertEqualObjects([self.textField normalLabelColorForState:MDCTextControlStateDisabled], normalLabelColorDisabled); XCTAssertEqualObjects([self.textField textColorForState:MDCTextControlStateNormal], textColorNormal); XCTAssertEqualObjects([self.textField textColorForState:MDCTextControlStateEditing], textColorEditing); XCTAssertEqualObjects([self.textField textColorForState:MDCTextControlStateDisabled], textColorDisabled); XCTAssertEqualObjects( [self.textField leadingAssistiveLabelColorForState:MDCTextControlStateNormal], assistiveLabelColorNormal); XCTAssertEqualObjects( [self.textField leadingAssistiveLabelColorForState:MDCTextControlStateEditing], assistiveLabelColorEditing); XCTAssertEqualObjects( [self.textField leadingAssistiveLabelColorForState:MDCTextControlStateDisabled], assistiveLabelColorDisabled); XCTAssertEqualObjects( [self.textField trailingAssistiveLabelColorForState:MDCTextControlStateNormal], assistiveLabelColorNormal); XCTAssertEqualObjects( [self.textField trailingAssistiveLabelColorForState:MDCTextControlStateEditing], assistiveLabelColorEditing); XCTAssertEqualObjects( [self.textField trailingAssistiveLabelColorForState:MDCTextControlStateDisabled], assistiveLabelColorDisabled); XCTAssertEqualObjects([self.textField outlineColorForState:MDCTextControlStateNormal], outlineColorNormal); XCTAssertEqualObjects([self.textField outlineColorForState:MDCTextControlStateEditing], outlineColorEditing); XCTAssertEqualObjects([self.textField outlineColorForState:MDCTextControlStateDisabled], outlineColorDisabled); XCTAssertEqualObjects(self.textField.tintColor, tintColor); // Typography XCTAssertEqualObjects(self.textField.font, self.typographyScheme.subtitle1); XCTAssertEqualObjects(self.textField.leadingAssistiveLabel.font, self.typographyScheme.caption); XCTAssertEqualObjects(self.textField.trailingAssistiveLabel.font, self.typographyScheme.caption); } @end