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