blob: fb2ffd436c71ead27eb4e673a55af4f2d997ecc7 [file] [log] [blame] [edit]
// Copyright 2016-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.
// swiftlint:disable function_body_length
// swiftlint:disable type_body_length
import XCTest
import MaterialComponents.MaterialMath
import MaterialComponents.MaterialPalettes
import MaterialComponents.MaterialTextFields
class TextFieldControllerDefaultLegacyTests: XCTestCase {
override class func tearDown() {
RunLoop.main.run(until: Date.init(timeIntervalSinceNow: 1))
super.tearDown()
}
func testCopyingLegacyDefault() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyDefault(textInput: textField)
controller.characterCountMax = 49
controller.characterCountViewMode = .always
controller.disabledColor = .orange
controller.isFloatingEnabled = false
controller.floatingPlaceholderNormalColor = .purple
controller.floatingPlaceholderScale = 0.1
controller.placeholderText = "Placeholder"
controller.helperText = "Helper"
controller.inlinePlaceholderColor = .green
controller.activeColor = .blue
controller.normalColor = .white
controller.underlineViewMode = .always
controller.leadingUnderlineLabelTextColor = .yellow
controller.trailingUnderlineLabelTextColor = .orange
if let controllerCopy = controller.copy() as? MDCTextInputControllerLegacyDefault {
XCTAssertEqual(controller.characterCountMax, controllerCopy.characterCountMax)
XCTAssertEqual(controller.characterCountViewMode, controllerCopy.characterCountViewMode)
XCTAssertEqual(controller.disabledColor, controllerCopy.disabledColor)
XCTAssertEqual(controller.isFloatingEnabled, controllerCopy.isFloatingEnabled)
XCTAssertEqual(controller.floatingPlaceholderNormalColor, controllerCopy.floatingPlaceholderNormalColor)
XCTAssertEqual(controller.floatingPlaceholderScale, controllerCopy.floatingPlaceholderScale)
XCTAssertEqual(controller.placeholderText, controllerCopy.placeholderText)
XCTAssertEqual(controller.helperText, controllerCopy.helperText)
XCTAssertEqual(controller.inlinePlaceholderColor, controllerCopy.inlinePlaceholderColor)
XCTAssertEqual(controller.activeColor, controllerCopy.activeColor)
XCTAssertEqual(controller.normalColor, controllerCopy.normalColor)
XCTAssertEqual(controller.underlineViewMode, controllerCopy.underlineViewMode)
XCTAssertEqual(controller.leadingUnderlineLabelTextColor,
controllerCopy.leadingUnderlineLabelTextColor)
XCTAssertEqual(controller.trailingUnderlineLabelTextColor,
controllerCopy.trailingUnderlineLabelTextColor)
} else {
XCTFail("No copy or copy is wrong class")
}
}
func testCopyingLegacyFullWidth() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyFullWidth(textInput: textField)
controller.characterCountMax = 49
controller.characterCountViewMode = .always
controller.disabledColor = .yellow
controller.placeholderText = "Placeholder"
controller.helperText = "Helper"
controller.inlinePlaceholderColor = .green
controller.activeColor = .blue
controller.normalColor = .white
controller.underlineViewMode = .always
controller.trailingUnderlineLabelTextColor = .purple
if let controllerCopy = controller.copy() as? MDCTextInputControllerLegacyFullWidth {
XCTAssertEqual(controller.characterCountMax, controllerCopy.characterCountMax)
XCTAssertEqual(controller.characterCountViewMode, controllerCopy.characterCountViewMode)
XCTAssertEqual(controller.disabledColor, controllerCopy.disabledColor)
XCTAssertEqual(controller.placeholderText, controllerCopy.placeholderText)
XCTAssertEqual(controller.helperText, controllerCopy.helperText)
XCTAssertEqual(controller.inlinePlaceholderColor, controllerCopy.inlinePlaceholderColor)
XCTAssertEqual(controller.activeColor, controllerCopy.activeColor)
XCTAssertEqual(controller.normalColor, controllerCopy.normalColor)
XCTAssertEqual(controller.underlineViewMode, controllerCopy.underlineViewMode)
XCTAssertEqual(controller.trailingUnderlineLabelTextColor,
controllerCopy.trailingUnderlineLabelTextColor)
} else {
XCTFail("No copy or copy is wrong class")
}
}
func testDynamicTypeLegacyDefault() {
let textField = MDCTextField()
XCTAssertFalse(textField.mdc_adjustsFontForContentSizeCategory)
textField.mdc_adjustsFontForContentSizeCategory = true
XCTAssertTrue(textField.mdc_adjustsFontForContentSizeCategory)
let controller = MDCTextInputControllerLegacyDefault(textInput: textField)
XCTAssertNotNil(controller.textInput)
controller.mdc_adjustsFontForContentSizeCategory = true
XCTAssertTrue(controller.mdc_adjustsFontForContentSizeCategory)
// The controller takes over listening for dynamic type size changes.
XCTAssertFalse(textField.mdc_adjustsFontForContentSizeCategory)
}
func testDynamicTypeLegacyFullWidth() {
let textField = MDCTextField()
XCTAssertFalse(textField.mdc_adjustsFontForContentSizeCategory)
textField.mdc_adjustsFontForContentSizeCategory = true
XCTAssertTrue(textField.mdc_adjustsFontForContentSizeCategory)
let controller = MDCTextInputControllerLegacyFullWidth(textInput: textField)
XCTAssertNotNil(controller.textInput)
controller.mdc_adjustsFontForContentSizeCategory = true
XCTAssertTrue(controller.mdc_adjustsFontForContentSizeCategory)
// The controller takes over listening for dynamic type size changes.
XCTAssertFalse(textField.mdc_adjustsFontForContentSizeCategory)
}
func testCharacterMaxLegacyDefault() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyDefault(textInput: textField)
let altLeading = "Alternative Helper Test"
controller.helperText = altLeading
controller.characterCountMax = 50
// By setting the folowing text with is 51 characters when the max is set to 50 characters, it
// should trigger an error state.
textField.text = "Lorem ipsum dolor sit amet, consectetuer adipiscing"
XCTAssertTrue("51 / 50".isEqual(textField.trailingUnderlineLabel.text))
XCTAssertEqual(MDCPalette.red.accent400, textField.underline?.color)
XCTAssertEqual(MDCPalette.red.accent400, textField.trailingUnderlineLabel.textColor)
}
func testCharacterMaxLegacyFullWidth() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyFullWidth(textInput: textField)
let altLeading = "Alternative Helper Test"
controller.helperText = altLeading
controller.characterCountMax = 50
// By setting the folowing text with is 51 characters when the max is set to 50 characters, it
// should trigger an error state.
textField.text = "Lorem ipsum dolor sit amet, consectetuer adipiscing"
XCTAssertTrue("51 / 50".isEqual(textField.trailingUnderlineLabel.text))
XCTAssertEqual(MDCPalette.red.accent400, textField.trailingUnderlineLabel.textColor)
}
func testErrorsLegacyDefault() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyDefault(textInput: textField)
// Helper text is shown on the leading underline label. Make sure the color and content are as
// expected.
let altLeading = "Alternative Helper Test"
controller.helperText = altLeading
controller.leadingUnderlineLabelTextColor = .green
XCTAssertEqual(.green, textField.leadingUnderlineLabel.textColor)
XCTAssertEqual(altLeading, textField.leadingUnderlineLabel.text)
controller.trailingUnderlineLabelTextColor = .white
XCTAssertEqual(textField.trailingUnderlineLabel.textColor, .white)
XCTAssertNil(controller.errorText)
// Setting error text should change the color and content of the leading underline label
let error = "Error Test"
controller.setErrorText(error, errorAccessibilityValue: nil)
XCTAssertNotEqual(altLeading, textField.leadingUnderlineLabel.text)
XCTAssertEqual(error, textField.leadingUnderlineLabel.text)
XCTAssertEqual(error, controller.errorText)
let newError = "Different Error Test"
let altErrorAccessibilityValue = "Not the default"
controller.setErrorText(newError, errorAccessibilityValue: altErrorAccessibilityValue)
XCTAssertEqual(newError, controller.errorText)
XCTAssertEqual(newError, textField.leadingUnderlineLabel.text)
XCTAssertNotEqual(error, controller.errorText)
XCTAssertNotEqual(error, textField.leadingUnderlineLabel.text)
// Setting an error should change the leading label's text color.
XCTAssertNotEqual(.green, textField.leadingUnderlineLabel.textColor)
// Setting error color should change the color of the underline, leading, and trailing colors.
controller.errorColor = .blue
XCTAssertEqual(.blue, controller.errorColor)
XCTAssertNotEqual(MDCPalette.red.accent400, textField.leadingUnderlineLabel.textColor)
XCTAssertNotEqual(MDCPalette.red.accent400, textField.trailingUnderlineLabel.textColor)
XCTAssertNotEqual(MDCPalette.red.accent400, textField.underline?.color)
XCTAssertEqual(.blue, textField.leadingUnderlineLabel.textColor)
XCTAssertEqual(.blue, textField.trailingUnderlineLabel.textColor)
XCTAssertEqual(.blue, textField.underline?.color)
// If the controller is also in a character max error state, the leading label should still be
// showing the text from the error that was set.
controller.setErrorText(error, errorAccessibilityValue: nil)
controller.characterCountMax = 50
textField.text = "Lorem ipsum dolor sit amet, consectetuer adipiscing"
XCTAssertEqual(error, textField.leadingUnderlineLabel.text)
// Removing the error should set the leading text back to its previous text.
controller.setErrorText(nil, errorAccessibilityValue: nil)
XCTAssertNotEqual(error, textField.leadingUnderlineLabel.text)
XCTAssertEqual(altLeading, textField.leadingUnderlineLabel.text)
// Test error text being reset but character max still exceded.
XCTAssertEqual(.blue, textField.leadingUnderlineLabel.textColor)
XCTAssertEqual(.blue, textField.trailingUnderlineLabel.textColor)
XCTAssertEqual(.blue, textField.underline?.color)
// Removing the text should remove the error state from character max and therefore remove
// anything from showing the error color.
textField.text = nil
XCTAssertNotEqual(.blue, textField.leadingUnderlineLabel.textColor)
XCTAssertNotEqual(.blue, textField.trailingUnderlineLabel.textColor)
XCTAssertNotEqual(.blue, textField.underline?.color)
}
func testFloatingPlaceholderLegacyDefault() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyDefault(textInput: textField)
textField.sizeToFit()
controller.placeholderText = "Placeholder"
textField.text = "Set Text"
textField.setNeedsLayout()
textField.layoutIfNeeded()
let estimatedTextFrame = textField.bounds.inset(by: controller.textInsets(UIEdgeInsets()))
XCTAssertFalse(textField.placeholderLabel.frame.intersects(estimatedTextFrame))
}
func testLabelsLegacyDefault() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyDefault(textInput: textField)
let placeholderString = "Placeholder"
controller.placeholderText = placeholderString
XCTAssertEqual(controller.placeholderText, placeholderString)
XCTAssertEqual(textField.placeholder, controller.placeholderText)
let helperString = "Helper"
controller.helperText = helperString
XCTAssertEqual(controller.helperText, helperString)
XCTAssertEqual(textField.leadingUnderlineLabel.text, controller.helperText)
}
func testLabelsLegacyFullWidth() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyFullWidth(textInput: textField)
let placeholderString = "Placeholder"
controller.placeholderText = placeholderString
XCTAssertEqual(controller.placeholderText, placeholderString)
XCTAssertEqual(textField.placeholder, controller.placeholderText)
controller.helperText = "Helper"
XCTAssertEqual(controller.helperText, nil)
}
func testPresentationLegacyDefault() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyDefault(textInput: textField)
XCTAssertEqual(controller.isFloatingEnabled, true)
controller.isFloatingEnabled = false
XCTAssertEqual(controller.isFloatingEnabled, false)
controller.isFloatingEnabled = true
textField.sizeToFit()
XCTAssertEqual(textField.frame.height, 70)
controller.helperText = "Helper"
textField.sizeToFit()
XCTAssertEqual(MDCCeil(textField.frame.height), 85.0)
controller.characterCountViewMode = .never
XCTAssertEqual(.clear, textField.trailingUnderlineLabel.textColor)
controller.characterCountViewMode = .always
XCTAssertNotEqual(.clear, textField.trailingUnderlineLabel.textColor)
controller.underlineViewMode = .never
XCTAssertEqual(.lightGray, textField.underline?.color)
controller.underlineViewMode = .always
XCTAssertEqual(MDCPalette.blue.accent700, textField.underline?.color)
}
func testPresentationLegacyFullWidth() {
let textField = MDCTextField()
let controller = MDCTextInputControllerLegacyFullWidth(textInput: textField)
textField.sizeToFit()
XCTAssertEqual(textField.frame.height, 57)
controller.characterCountViewMode = .never
XCTAssertEqual(.clear, textField.trailingUnderlineLabel.textColor)
controller.characterCountViewMode = .always
XCTAssertNotEqual(.clear, textField.trailingUnderlineLabel.textColor)
controller.underlineViewMode = .never
XCTAssertEqual(.clear, textField.underline?.color)
controller.underlineViewMode = .always
XCTAssertEqual(.clear, textField.underline?.color)
controller.disabledColor = .red
XCTAssertEqual(controller.disabledColor, .clear)
}
}