| // 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 <Foundation/Foundation.h> |
| #import <UIKit/UIKit.h> |
| #import <XCTest/XCTest.h> |
| |
| #import "M3CButton.h" |
| |
| NS_ASSUME_NONNULL_BEGIN |
| |
| @interface M3CButtonInsetsTests : XCTestCase |
| @property(nonatomic, strong, nullable) M3CButton *button; |
| @property(nonatomic, strong, nullable) UIImage *image; |
| @property(nonatomic, strong, nullable) NSString *title; |
| @property(nonatomic, assign) UIEdgeInsets edgeInsetsForImageAndTitle; |
| @property(nonatomic, assign) UIEdgeInsets edgeInsetsForTitleOnly; |
| @property(nonatomic, assign) UIEdgeInsets edgeInsetsForImageOnly; |
| @property(nonatomic, assign) UIEdgeInsets imageEdgeInsetsForImageAndTitle; |
| @end |
| |
| @implementation M3CButtonInsetsTests |
| |
| - (void)setUp { |
| [super setUp]; |
| |
| self.button = [[M3CButton alloc] init]; |
| self.image = [UIImage systemImageNamed:@"plus"]; |
| self.title = @"some title"; |
| self.imageEdgeInsetsForImageAndTitle = UIEdgeInsetsMake(424, 625, 42, 31); |
| self.edgeInsetsForImageAndTitle = UIEdgeInsetsMake(4, 65, 2342, 3); |
| self.edgeInsetsForImageOnly = UIEdgeInsetsMake(49, 675, 23842, 73); |
| self.edgeInsetsForTitleOnly = UIEdgeInsetsMake(48, 765, 29342, 93); |
| } |
| |
| - (void)tearDown { |
| self.button = nil; |
| |
| [super tearDown]; |
| } |
| |
| - (void)testEdgeInsetsWithImageAndTitle { |
| // Given |
| [self.button setTitle:self.title forState:UIControlStateNormal]; |
| [self.button setImage:self.image forState:UIControlStateNormal]; |
| |
| // When |
| [self.button setEdgeInsetsWithImageAndTitle:self.edgeInsetsForImageAndTitle]; |
| [self.button setImageEdgeInsetsWithImageAndTitle:self.imageEdgeInsetsForImageAndTitle]; |
| |
| // Then |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.contentEdgeInsets, self.edgeInsetsForImageAndTitle)); |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.imageEdgeInsets, self.imageEdgeInsetsForImageAndTitle)); |
| } |
| |
| - (void)testEdgeInsetsWithImage { |
| // Given |
| [self.button setImage:self.image forState:UIControlStateNormal]; |
| |
| // When |
| [self.button setEdgeInsetsWithImageOnly:self.edgeInsetsForImageOnly]; |
| |
| // Then |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.contentEdgeInsets, self.edgeInsetsForImageOnly)); |
| } |
| |
| - (void)testEdgeInsetsWithTitle { |
| // Given |
| [self.button setTitle:self.title forState:UIControlStateNormal]; |
| |
| // When |
| [self.button setEdgeInsetsWithTitleOnly:self.edgeInsetsForTitleOnly]; |
| |
| // Then |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.contentEdgeInsets, self.edgeInsetsForTitleOnly)); |
| } |
| |
| - (void)testEdgeInsetsWithImageAndTitle_removeImage { |
| // Given |
| [self.button setTitle:self.title forState:UIControlStateNormal]; |
| [self.button setImage:self.image forState:UIControlStateNormal]; |
| [self.button setEdgeInsetsWithImageAndTitle:self.edgeInsetsForImageAndTitle]; |
| [self.button setImageEdgeInsetsWithImageAndTitle:self.imageEdgeInsetsForImageAndTitle]; |
| [self.button setEdgeInsetsWithImageOnly:self.edgeInsetsForImageOnly]; |
| [self.button setEdgeInsetsWithTitleOnly:self.edgeInsetsForTitleOnly]; |
| |
| // When |
| [self.button setImage:nil forState:UIControlStateNormal]; |
| |
| // Then |
| XCTAssertTrue( |
| UIEdgeInsetsEqualToEdgeInsets(self.button.contentEdgeInsets, self.edgeInsetsForTitleOnly)); |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.imageEdgeInsets, UIEdgeInsetsZero)); |
| } |
| |
| - (void)testEdgeInsetsWithImageAndTitle_removeTitle { |
| // Given |
| [self.button setTitle:self.title forState:UIControlStateNormal]; |
| [self.button setImage:self.image forState:UIControlStateNormal]; |
| [self.button setEdgeInsetsWithImageAndTitle:self.edgeInsetsForImageAndTitle]; |
| [self.button setImageEdgeInsetsWithImageAndTitle:self.imageEdgeInsetsForImageAndTitle]; |
| [self.button setEdgeInsetsWithImageOnly:self.edgeInsetsForImageOnly]; |
| [self.button setEdgeInsetsWithTitleOnly:self.edgeInsetsForTitleOnly]; |
| |
| // When |
| [self.button setTitle:nil forState:UIControlStateNormal]; |
| |
| // Then |
| XCTAssertTrue( |
| UIEdgeInsetsEqualToEdgeInsets(self.button.contentEdgeInsets, self.edgeInsetsForImageOnly)); |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.imageEdgeInsets, UIEdgeInsetsZero)); |
| } |
| |
| - (void)testEdgeInsetsWithImageAndTitle_setSelected { |
| // Given |
| [self.button setTitle:self.title forState:UIControlStateNormal]; |
| [self.button setImage:self.image forState:UIControlStateNormal]; |
| [self.button setEdgeInsetsWithImageAndTitle:self.edgeInsetsForImageAndTitle]; |
| [self.button setImageEdgeInsetsWithImageAndTitle:self.imageEdgeInsetsForImageAndTitle]; |
| [self.button setEdgeInsetsWithImageOnly:self.edgeInsetsForImageOnly]; |
| [self.button setEdgeInsetsWithTitleOnly:self.edgeInsetsForTitleOnly]; |
| |
| // We are trying to ensure that we are updating the edges when state changes. |
| // However setting non UIControlStateNormal values to nil just falls back to UIControlStateNormal. |
| [self.button setTitle:nil forState:UIControlStateNormal]; |
| [self.button setTitle:@"Selected" forState:UIControlStateSelected]; |
| [self.button setSelected:YES]; |
| |
| // When |
| self.button.selected = NO; |
| |
| // Then |
| XCTAssertTrue( |
| UIEdgeInsetsEqualToEdgeInsets(self.button.contentEdgeInsets, self.edgeInsetsForImageOnly)); |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.imageEdgeInsets, UIEdgeInsetsZero)); |
| } |
| |
| - (void)testEdgeInsetsWithImageAndTitle_attributedTitleOnly { |
| // Given |
| [self.button setTitle:nil forState:UIControlStateNormal]; |
| [self.button setImage:self.image forState:UIControlStateNormal]; |
| [self.button setEdgeInsetsWithImageAndTitle:self.edgeInsetsForImageAndTitle]; |
| [self.button setImageEdgeInsetsWithImageAndTitle:self.imageEdgeInsetsForImageAndTitle]; |
| [self.button setEdgeInsetsWithImageOnly:self.edgeInsetsForImageOnly]; |
| [self.button setEdgeInsetsWithTitleOnly:self.edgeInsetsForTitleOnly]; |
| |
| // When |
| NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Attributed title"]; |
| [self.button setAttributedTitle:attrString forState:UIControlStateNormal]; |
| |
| // Then |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.contentEdgeInsets, |
| self.edgeInsetsForImageAndTitle)); |
| XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.button.imageEdgeInsets, |
| self.imageEdgeInsetsForImageAndTitle)); |
| } |
| |
| @end |
| |
| NS_ASSUME_NONNULL_END |