blob: 98d154dc60445fc71c46d5ad11fe2480dcd4fe27 [file] [log] [blame]
// 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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $0.accessibilityHint }
XCTAssertEqual(accessibilityHints, [item.accessibilityHint!])
let accessibilityIdentifiers =
buttonBar.subviews.compactMap { $0 as? MDCButton }.compactMap { $0.accessibilityIdentifier }
XCTAssertEqual(accessibilityIdentifiers, [item.accessibilityIdentifier!])
let accessibilityLabels =
buttonBar.subviews.compactMap { $0 as? MDCButton }.compactMap { $0.accessibilityLabel }
XCTAssertEqual(accessibilityLabels, [item.accessibilityLabel!])
let accessibilityValues =
buttonBar.subviews.compactMap { $0 as? MDCButton }.compactMap { $0.accessibilityValue }
XCTAssertEqual(accessibilityValues, [item.accessibilityValue!])
let enabled = buttonBar.subviews.compactMap { $0 as? MDCButton }.map { $0.isEnabled }
XCTAssertEqual(enabled, [item.isEnabled])
let tags = buttonBar.subviews.compactMap { $0 as? MDCButton }.map { $0.tag }
XCTAssertEqual(tags, [item.tag])
let tintColors = buttonBar.subviews.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $0.tintColor }
XCTAssertEqual(tintColors, [item.tintColor!])
// Verify that the tint color reverts to the default
item.tintColor = nil
do {
let tintColors = buttonBar.subviews.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $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.compactMap { $0 as? MDCButton }.compactMap { $0.title(for: .normal) }
XCTAssertEqual(titles, [item.title!])
}
}