featherless e3df3459fc
[ButtonBar] Fix crash when assigning tint color, title, or image to bar button item with custom view. (#9759)
When a bar button item with a custom view is provided to the button bar, the custom view is used in place of an MDCButton instance.  6ec9f334f0e093e1d2bf04165895ca725455150e introduced a change that unconditionally called a UIButton API on the views when the tintColor was changed, resulting in a crash when a custom view was used.

This change adds a test that, prior to this fix in this change, crashed, but after the fix included in this change now passes.

Upon inspection of the culprit code, it was revealed that image and title similarly could result in crashes, so those crashes have been fixed as part of this change as well.

Closes https://github.com/material-components/material-components-ios/issues/9760
2020-02-19 09:30:19 -05:00

72 lines
1.7 KiB
Swift

// Copyright 2020-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
class ButtonBarCustomViewTests: XCTestCase {
var buttonBar: MDCButtonBar!
override func setUp() {
super.setUp()
buttonBar = MDCButtonBar()
}
override func tearDown() {
buttonBar = nil
super.tearDown()
}
func testSettingTintColorOnItemModifiesCustomViewTintColor() {
// Given
let customView = UIView()
let item = UIBarButtonItem(customView: customView)
buttonBar.items = [item]
// When
item.tintColor = .red
// Then
XCTAssertEqual(customView.tintColor, item.tintColor)
}
func testSettingImageToNilOnItemDoesNothing() {
// Given
let customView = UIView()
let item = UIBarButtonItem(customView: customView)
buttonBar.items = [item]
// When
item.image = nil
// Then, doesn't crash.
}
func testSettingTitleOnItemDoesNothing() {
// Given
let customView = UIView()
let item = UIBarButtonItem(customView: customView)
buttonBar.items = [item]
// When
item.title = "Hello"
// Then, doesn't crash.
}
}