blob: bd826e6cc0aedb29759ac34fbf7b20f0a8fbb0e8 [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.
import XCTest
import MaterialComponents.MaterialTextFields
class TextFieldTests: XCTestCase {
func testAttributedSetters() {
let textField = MDCTextField()
let string = "attributed"
textField.attributedPlaceholder = NSAttributedString(string: string)
XCTAssertEqual(textField.attributedPlaceholder?.string, string)
textField.attributedText = NSAttributedString(string: string)
XCTAssertEqual(textField.attributedText?.string, string)
}
// All the constraints created internally by the MDCTextField need to have a rather low priority
// so they can be overridden by a controller from the outside.
func testConstraintPriorities() {
let textField = MDCTextField()
for constraint in textField.constraints {
XCTAssertLessThanOrEqual(constraint.priority.rawValue,
UILayoutPriority.defaultLow.rawValue + 10,
String(describing: constraint))
}
}
func testBorder() {
let textField = MDCTextField()
XCTAssertTrue((textField.borderView?.isDescendant(of: textField))!)
}
func testCopying() {
let textField = MDCTextField()
textField.textInsetsMode = .never
textField.borderView?.borderFillColor = .purple
textField.borderView?.borderStrokeColor = .orange
textField.borderView?.borderPath =
UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 100, height: 100))
textField.borderView?.borderStrokeColor = .yellow
textField.clearButton.tintColor = .red
textField.clearButtonMode = .always
textField.cursorColor = .white
textField.font = UIFont.systemFont(ofSize: UIFont.labelFontSize)
textField.hidesPlaceholderOnInput = false
textField.isEnabled = false
textField.leadingViewMode = .unlessEditing
textField.placeholder = "test"
textField.text = "test"
textField.textColor = .red
textField.trailingViewMode = .unlessEditing
textField.underline?.color = .red
textField.underline?.lineHeight = 10
if let textFieldCopy = textField.copy() as? MDCTextField {
XCTAssertEqual(textField.textInsetsMode, textFieldCopy.textInsetsMode)
XCTAssertEqual(textField.attributedPlaceholder, textFieldCopy.attributedPlaceholder)
XCTAssertEqual(textField.attributedText, textFieldCopy.attributedText)
XCTAssertEqual(textField.borderView?.borderFillColor,
textFieldCopy.borderView?.borderFillColor)
XCTAssertEqual(textField.borderView?.borderStrokeColor,
textFieldCopy.borderView?.borderStrokeColor)
XCTAssertEqual(textField.borderView?.borderPath?.bounds.integral,
textFieldCopy.borderView?.borderPath?.bounds.integral)
XCTAssertEqual(textField.borderView?.borderStrokeColor,
textFieldCopy.borderView?.borderStrokeColor)
XCTAssertEqual(textField.clearButton.tintColor, textFieldCopy.clearButton.tintColor)
XCTAssertEqual(textField.clearButtonMode, textFieldCopy.clearButtonMode)
XCTAssertEqual(textField.cursorColor, textFieldCopy.cursorColor)
XCTAssertEqual(textField.font, textFieldCopy.font)
XCTAssertEqual(textField.hidesPlaceholderOnInput, textFieldCopy.hidesPlaceholderOnInput)
XCTAssertEqual(textField.isEnabled, textFieldCopy.isEnabled)
XCTAssertEqual(textField.leadingViewMode, textFieldCopy.leadingViewMode)
XCTAssertEqual(textField.mdc_adjustsFontForContentSizeCategory,
textFieldCopy.mdc_adjustsFontForContentSizeCategory)
XCTAssertEqual(textField.placeholder, textFieldCopy.placeholder)
XCTAssertEqual(textField.text, textFieldCopy.text)
XCTAssertEqual(textField.textColor, textFieldCopy.textColor)
XCTAssertEqual(textField.trailingViewMode, textFieldCopy.trailingViewMode)
XCTAssertEqual(textField.underline?.color, textFieldCopy.underline?.color)
XCTAssertEqual(textField.underline?.lineHeight, textFieldCopy.underline?.lineHeight)
} else {
XCTFail("No copy or copy is wrong class")
}
}
func testFontChange() {
let textField = MDCTextField()
textField.font = UIFont.systemFont(ofSize: UIFont.labelFontSize)
XCTAssertEqual(UIFont.systemFont(ofSize: UIFont.labelFontSize), textField.font)
XCTAssertNotEqual(UIFont.systemFont(ofSize: UIFont.smallSystemFontSize), textField.font)
}
func testLeadingingView() {
let leadingView = UIView()
let textField = MDCTextField()
textField.leadingView = leadingView
XCTAssertEqual(textField.leadingView, leadingView)
}
func testMDCDynamicTypeAPI() {
let textField = MDCTextField()
textField.mdc_adjustsFontForContentSizeCategory = true
XCTAssertTrue(textField.mdc_adjustsFontForContentSizeCategory)
if #available(iOS 10, *) {
XCTAssertEqual(textField.mdc_adjustsFontForContentSizeCategory,
textField.adjustsFontForContentSizeCategory)
}
}
func testOverlayViews() {
let textField = MDCTextField()
let leftView = UILabel()
let rightView = UILabel()
leftView.text = "X"
textField.leftView = leftView
textField.rightView = rightView
textField.leftViewMode = .always
textField.rightViewMode = .always
// This will trigger autolayout to scream in the console. It's ok. It's for the testing.
textField.layoutIfNeeded()
XCTAssertTrue(textField.subviews.contains(leftView))
XCTAssertTrue(textField.subviews.contains(rightView))
if UIView.userInterfaceLayoutDirection(for: .unspecified) == .leftToRight {
XCTAssertEqual(textField.leadingView, leftView)
XCTAssertEqual(textField.leadingView, textField.leftView)
XCTAssertEqual(textField.trailingView, rightView)
XCTAssertEqual(textField.trailingView, textField.rightView)
} else {
XCTAssertEqual(textField.leadingView, rightView)
XCTAssertEqual(textField.leadingView, textField.rightView)
XCTAssertEqual(textField.trailingView, leftView)
XCTAssertEqual(textField.trailingView, textField.leftView)
}
}
func testSizing() {
let textField = MDCTextField(frame: CGRect(x: 0, y: 0, width: 300, height: 0))
XCTAssertEqual(textField.frame.height, 0)
textField.frame = CGRect(x: 0, y: 0, width: 300, height: 40)
XCTAssertEqual(textField.frame.height, 40)
textField.sizeToFit()
XCTAssertEqual(textField.frame.height, 49)
textField.leadingUnderlineLabel.text = "Helper"
textField.sizeToFit()
XCTAssertEqual(textField.frame.height, 66)
textField.textInsetsMode = .never
XCTAssertEqual(textField.textInsetsMode, .never)
}
func testUnderlineSetters() {
let textField = MDCTextField()
textField.underline?.color = .red
textField.underline?.disabledColor = .yellow
textField.underline?.lineHeight = 10
XCTAssertEqual(textField.underline?.color, .red)
if let underline = textField.underline {
XCTAssertEqual(underline.color, .red)
XCTAssertEqual(underline.color, textField.underline?.color)
XCTAssertEqual(underline.lineHeight, 10)
XCTAssertEqual(underline.lineHeight, textField.underline?.lineHeight)
XCTAssertEqual(underline.disabledColor, .yellow)
} else {
XCTFail("No underline or underline is wrong class")
}
}
func testTraitCollectionDidChangeBlockCalledWithExpectedParameters() {
// Given
let testTextField = MDCTextField()
let expectation = XCTestExpectation(description: "traitCollection")
var passedTraitCollection: UITraitCollection? = nil
var passedTextField: MDCTextField? = nil
testTextField.traitCollectionDidChangeBlock = { (textField, traitCollection) in
passedTraitCollection = traitCollection
passedTextField = textField
expectation.fulfill()
}
let fakeTraitCollection = UITraitCollection(displayScale: 7)
// When
testTextField.traitCollectionDidChange(fakeTraitCollection)
// Then
self.wait(for: [expectation], timeout: 1)
XCTAssertEqual(passedTraitCollection, fakeTraitCollection)
XCTAssertEqual(passedTextField, testTextField)
}
// MARK - Material Elevation
func testDefaultBaseElevationOverrideIsNegative() {
// Then
XCTAssertLessThan(MDCTextField().mdc_overrideBaseElevation, 0);
}
func testSettingOverrideBaseElevationReturnsSetValue() {
// Given
let expectedBaseElevation: CGFloat = 99
let textField = MDCTextField()
// When
textField.mdc_overrideBaseElevation = expectedBaseElevation
// Then
XCTAssertEqual(textField.mdc_overrideBaseElevation, expectedBaseElevation, accuracy: 0.001)
}
}