blob: 710d64666de3844978bfcd7d09b828bfdca2bdc1 [file]
/*
Copyright 2018-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.MaterialButtonBar
import MaterialComponents.MaterialButtons
class ButtonBarObservationTests: XCTestCase {
var buttonBar: MDCButtonBar!
override func setUp() {
buttonBar = MDCButtonBar()
}
// Create a solid color image for testing purposes.
private func createImage(colored color: UIColor) -> UIImage {
UIGraphicsBeginImageContextWithOptions(CGSize(width: 64, height: 64), true, 1)
color.setFill()
UIRectFill(CGRect(x: 0, y: 0, width: 64, height: 64))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
// MARK: Initial state
func testInitialTextButtonStateMatchesItemState() {
// Given
let item = UIBarButtonItem(title: "LEFT", style: .plain, target: nil, action: nil)
// When
buttonBar.items = [item]
buttonBar.layoutSubviews()
// Then
let titles = buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.title(for: .normal) }
XCTAssertEqual(titles, [item.title!])
}
func testInitialImageButtonStateMatchesItemState() {
// Given
let image1 = createImage(colored: .red)
let item = UIBarButtonItem(image: image1, style: .plain, target: nil, action: nil)
// When
buttonBar.items = [item]
buttonBar.layoutSubviews()
// Then
let images =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.image(for: .normal) }
XCTAssertEqual(images, [item.image!])
}
func testInitialGeneralStateMatchesItemState() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
// When
item.accessibilityHint = "Hint"
item.accessibilityIdentifier = "Identifier"
item.accessibilityLabel = "Label"
item.accessibilityValue = "Value"
item.isEnabled = true
item.tag = 100
item.tintColor = .blue
buttonBar.items = [item]
buttonBar.layoutSubviews()
// Then
let accessibilityHints =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityHint }
XCTAssertEqual(accessibilityHints, [item.accessibilityHint!])
let accessibilityIdentifiers =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityIdentifier }
XCTAssertEqual(accessibilityIdentifiers, [item.accessibilityIdentifier!])
let accessibilityLabels =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityLabel }
XCTAssertEqual(accessibilityLabels, [item.accessibilityLabel!])
let accessibilityValues =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityValue }
XCTAssertEqual(accessibilityValues, [item.accessibilityValue!])
let enabled = buttonBar.subviews.flatMap { $0 as? MDCButton }.map { $0.isEnabled }
XCTAssertEqual(enabled, [item.isEnabled])
let tags = buttonBar.subviews.flatMap { $0 as? MDCButton }.map { $0.tag }
XCTAssertEqual(tags, [item.tag])
let tintColors = buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.tintColor }
XCTAssertEqual(tintColors, [item.tintColor!])
}
// MARK: KVO observation
func testAccessibilityHintChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.accessibilityHint = "Hint"
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.accessibilityHint = "Other hint"
// Then
let accessibilityLabels =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityHint }
XCTAssertEqual(accessibilityLabels, [item.accessibilityHint!])
}
func testAccessibilityIdentifierChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.accessibilityIdentifier = "Identifier"
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.accessibilityIdentifier = "Other identifier"
// Then
let accessibilityIdentifiers =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityIdentifier }
XCTAssertEqual(accessibilityIdentifiers, [item.accessibilityIdentifier!])
}
func testAccessibilityLabelChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.accessibilityLabel = "Label"
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.accessibilityLabel = "Other label"
// Then
let accessibilityLabels =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityLabel }
XCTAssertEqual(accessibilityLabels, [item.accessibilityLabel!])
}
func testAccessibilityValueChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.accessibilityValue = "Value"
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.accessibilityValue = "Other value"
// Then
let accessibilityValues =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.accessibilityValue }
XCTAssertEqual(accessibilityValues, [item.accessibilityValue!])
}
func testEnabledChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.isEnabled = true
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.isEnabled = false
// Then
let enabled = buttonBar.subviews.flatMap { $0 as? MDCButton }.map { $0.isEnabled }
XCTAssertEqual(enabled, [item.isEnabled])
}
func testImageChangesAreObserved() {
// Given
let image1 = createImage(colored: .red)
let item = UIBarButtonItem(image: image1, style: .plain, target: nil, action: nil)
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.image = createImage(colored: .blue)
// Then
let images =
buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.image(for: .normal) }
XCTAssertEqual(images, [item.image!])
}
func testTagChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.tag = 100
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.tag = 50
// Then
let tags = buttonBar.subviews.flatMap { $0 as? MDCButton }.map { $0.tag }
XCTAssertEqual(tags, [item.tag])
}
func testTintColorChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.tintColor = .blue
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.tintColor = .red
// Then
let tintColors = buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.tintColor }
XCTAssertEqual(tintColors, [item.tintColor!])
// Verify that the tint color reverts to the default
item.tintColor = nil
do {
let tintColors = buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.tintColor }
XCTAssertEqual(tintColors, [buttonBar.tintColor])
}
}
func testTintColorChangeToNilIsObservedAndReset() {
// Given
let item = UIBarButtonItem(title: "Title", style: .plain, target: nil, action: nil)
item.tintColor = .blue
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.tintColor = nil
// Then
let tintColors = buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.tintColor }
XCTAssertEqual(tintColors, [buttonBar.tintColor])
}
func testTitleChangesAreObserved() {
// Given
let item = UIBarButtonItem(title: "LEFT", style: .plain, target: nil, action: nil)
buttonBar.items = [item]
buttonBar.layoutSubviews()
// When
item.title = "NEW TITLE"
// Then
let titles = buttonBar.subviews.flatMap { $0 as? MDCButton }.flatMap { $0.title(for: .normal) }
XCTAssertEqual(titles, [item.title!])
}
}