blob: 13814ba3a83d993c17650cbc943d028058224bf0 [file] [log] [blame]
// Copyright 2019-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 <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wprivate-header"
#import "MDCBottomNavigationItemView.h"
#pragma clang diagnostic pop
#import "supplemental/MDCBottomNavigationSnapshotTestMutableTraitCollection.h"
#import "supplemental/MDCBottomNavigationSnapshotTestUtilities.h"
#import "supplemental/MDCFakeBottomNavigationBar.h"
#import "MDCBottomNavigationBar.h"
#import "MDCRippleTouchController.h"
#import "MDCRippleView.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wprivate-header"
#import "MDCSnapshotTestCase.h"
#import "UIImage+MDCSnapshot.h"
#import "UIView+MDCSnapshot.h"
#pragma clang diagnostic pop
NS_ASSUME_NONNULL_BEGIN
@interface MDCBottomNavigationBarTitleLayoutSnapshotTests : MDCSnapshotTestCase
@property(nonatomic, strong) MDCFakeBottomNavigationBar *navigationBar;
@property(nonatomic, strong) UITabBarItem *tabItem1;
@property(nonatomic, strong) UITabBarItem *tabItem2;
@property(nonatomic, strong) UITabBarItem *tabItem3;
@property(nonatomic, strong) UITabBarItem *tabItem4;
@property(nonatomic, strong) UITabBarItem *tabItem5;
@end
@implementation MDCBottomNavigationBarTitleLayoutSnapshotTests
- (void)setUp {
[super setUp];
// Uncomment below to recreate all the goldens (or add the following line to the specific
// test you wish to recreate the golden for).
// self.recordMode = YES;
self.navigationBar = [[MDCFakeBottomNavigationBar alloc] init];
CGSize imageSize = CGSizeMake(24, 24);
self.tabItem1 = [[UITabBarItem alloc]
initWithTitle:@"Item 1"
image:[UIImage mdc_testImageOfSize:imageSize
withStyle:MDCSnapshotTestImageStyleEllipses]
tag:1];
self.tabItem2 = [[UITabBarItem alloc]
initWithTitle:@"Item 2"
image:[UIImage mdc_testImageOfSize:imageSize
withStyle:MDCSnapshotTestImageStyleCheckerboard]
tag:2];
self.tabItem2.badgeValue = MDCBottomNavigationTestBadgeTitleLatin;
self.tabItem3 = [[UITabBarItem alloc]
initWithTitle:@"Item 3"
image:[UIImage mdc_testImageOfSize:imageSize
withStyle:MDCSnapshotTestImageStyleFramedX]
tag:3];
self.tabItem4 = [[UITabBarItem alloc]
initWithTitle:@"Item 4"
image:[UIImage mdc_testImageOfSize:imageSize
withStyle:MDCSnapshotTestImageStyleRectangles]
tag:4];
self.tabItem5 = [[UITabBarItem alloc]
initWithTitle:@"Item 5"
image:[UIImage mdc_testImageOfSize:imageSize
withStyle:MDCSnapshotTestImageStyleDiagonalLines]
tag:5];
self.navigationBar.items =
@[ self.tabItem1, self.tabItem2, self.tabItem3, self.tabItem4, self.tabItem5 ];
}
#pragma mark - Helpers
- (void)generateAndVerifySnapshot {
UIView *backgroundView = [self.navigationBar mdc_addToBackgroundView];
[self snapshotVerifyView:backgroundView];
}
- (void)performRippleTouchOnBar:(MDCBottomNavigationBar *)navigationBar item:(UITabBarItem *)item {
[navigationBar layoutIfNeeded];
MDCBottomNavigationItemView *itemView =
(MDCBottomNavigationItemView *)[navigationBar viewForItem:item];
CGPoint point = CGPointMake(CGRectGetMidX(itemView.bounds), CGRectGetMidY(itemView.bounds));
[itemView.rippleTouchController.rippleView beginRippleTouchDownAtPoint:point
animated:NO
completion:nil];
}
- (void)configureBottomNavigation:(MDCFakeBottomNavigationBar *)bottomNavigation
withAlignment:(MDCBottomNavigationBarAlignment)alignment
titleVisibility:(MDCBottomNavigationBarTitleVisibility)titleVisibility
traitCollection:(nullable UITraitCollection *)traitCollection
allTitles:(NSString *)title {
bottomNavigation.alignment = alignment;
bottomNavigation.titleVisibility = titleVisibility;
if (traitCollection) {
bottomNavigation.traitCollectionOverride = traitCollection;
}
if (title) {
for (UITabBarItem *item in bottomNavigation.items) {
item.title = title;
}
}
}
- (void)changeToRTLAndArabicWithTitle:(NSString *)title {
static UIFont *urduFont;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
urduFont = [UIFont fontWithName:@"NotoNastaliqUrdu" size:12];
});
self.navigationBar.itemTitleFont = urduFont;
self.navigationBar.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
for (UITabBarItem *item in self.navigationBar.items) {
item.title = title;
UIView *view = [self.navigationBar viewForItem:item];
view.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
}
self.navigationBar.items[1].badgeValue = MDCBottomNavigationTestBadgeTitleArabic;
}
#pragma mark - Title length tests
- (void)testJustifiedUnspecifiedAlwaysWithFiveLongTitleItemsiPadWidthTypicalHeightLTR {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustified
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedAlwaysWithFiveLongTitleItemsUnboundiPadWidthTypicalHeightLTR {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustified
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
self.navigationBar.truncatesLongTitles = NO;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedAlwaysWithFiveLongTitleItemsiPadWidthTypicalHeightRTL {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustified
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedAlwaysWithFiveLongTitleItemsUnboundiPadWidthTypicalHeightRTL {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustified
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
self.navigationBar.truncatesLongTitles = NO;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedAdjacentRegularAlwaysWithFiveLongTitleItemsiPadWidthTypicalHeightLTR {
// Given
MDCBottomNavigationSnapshotTestMutableTraitCollection *traitCollection =
[[MDCBottomNavigationSnapshotTestMutableTraitCollection alloc] init];
traitCollection.horizontalSizeClassOverride = UIUserInterfaceSizeClassRegular;
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustifiedAdjacentTitles
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:traitCollection
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedAdjacentRegularAlwaysWithFiveLongTitleItemsUnboundiPadWidthTypicalHeightLTR {
// Given
MDCBottomNavigationSnapshotTestMutableTraitCollection *traitCollection =
[[MDCBottomNavigationSnapshotTestMutableTraitCollection alloc] init];
traitCollection.horizontalSizeClassOverride = UIUserInterfaceSizeClassRegular;
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustifiedAdjacentTitles
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:traitCollection
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
self.navigationBar.truncatesLongTitles = NO;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedAdjacentRegularAlwaysWithFiveLongTitleItemsWrappediPadWidthTypicalHeightLTR {
// Given
MDCBottomNavigationSnapshotTestMutableTraitCollection *traitCollection =
[[MDCBottomNavigationSnapshotTestMutableTraitCollection alloc] init];
traitCollection.horizontalSizeClassOverride = UIUserInterfaceSizeClassRegular;
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustifiedAdjacentTitles
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:traitCollection
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.titlesNumberOfLines = 0;
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedAdjacentRegularAlwaysWithFiveLongTitleItemsiPadWidthTypicalHeightRTL {
// Given
MDCBottomNavigationSnapshotTestMutableTraitCollection *traitCollection =
[[MDCBottomNavigationSnapshotTestMutableTraitCollection alloc] init];
traitCollection.horizontalSizeClassOverride = UIUserInterfaceSizeClassRegular;
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustifiedAdjacentTitles
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:traitCollection
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedAdjacentRegularAlwaysWithFiveLongTitleItemsUnboundiPadWidthTypicalHeightRTL {
// Given
MDCBottomNavigationSnapshotTestMutableTraitCollection *traitCollection =
[[MDCBottomNavigationSnapshotTestMutableTraitCollection alloc] init];
traitCollection.horizontalSizeClassOverride = UIUserInterfaceSizeClassRegular;
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustifiedAdjacentTitles
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:traitCollection
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
self.navigationBar.truncatesLongTitles = NO;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedAdjacentRegularAlwaysWithFiveLongTitleItemsWrappediPadWidthTypicalHeightRTL {
// Given
MDCBottomNavigationSnapshotTestMutableTraitCollection *traitCollection =
[[MDCBottomNavigationSnapshotTestMutableTraitCollection alloc] init];
traitCollection.horizontalSizeClassOverride = UIUserInterfaceSizeClassRegular;
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentJustifiedAdjacentTitles
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:traitCollection
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
self.navigationBar.titlesNumberOfLines = 0;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testCenteredUnspecifiedAlwaysWithFiveLongTitleItemsiPadWidthTypicalHeightLTR {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentCentered
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testCenteredUnspecifiedAlwaysWithFiveLongTitleItemsUnboundiPadWidthTypicalHeightLTR {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentCentered
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
self.navigationBar.truncatesLongTitles = NO;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testCenteredUnspecifiedAlwaysWithFiveLongTitleItemsWrappediPadWidthTypicalHeightLTR {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentCentered
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
self.navigationBar.titlesNumberOfLines = 0;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testCenteredUnspecifiedAlwaysWithFiveLongTitleItemsiPadWidthTypicalHeightRTL {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentCentered
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testCenteredUnspecifiedAlwaysWithFiveLongTitleItemsUnboundiPadWidthTypicalHeightRTL {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentCentered
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
self.navigationBar.truncatesLongTitles = NO;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testCenteredUnspecifiedAlwaysWithFiveLongTitleItemsWrappediPadWidthTypicalHeightRTL {
// When
[self configureBottomNavigation:self.navigationBar
withAlignment:MDCBottomNavigationBarAlignmentCentered
titleVisibility:MDCBottomNavigationBarTitleVisibilityAlways
traitCollection:nil
allTitles:MDCBottomNavigationTestLongTitleLatin];
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthiPad,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestLongTitleArabic];
self.navigationBar.titlesNumberOfLines = 0;
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
#pragma mark - Title visibility tests
- (void)testJustifiedUnspecifiedSelectedWithThreeItemsTypicalWidthTypicalHeightLTR {
// When
self.navigationBar.items = @[ self.tabItem1, self.tabItem2, self.tabItem3 ];
self.navigationBar.titleVisibility = MDCBottomNavigationBarTitleVisibilitySelected;
self.navigationBar.selectedItem = self.tabItem2;
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthTypical,
MDCBottomNavigationBarTestHeightTypical);
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedSelectedWithThreeItemsTypicalWidthTypicalHeightRTL {
// When
self.navigationBar.items = @[ self.tabItem1, self.tabItem2, self.tabItem3 ];
self.navigationBar.titleVisibility = MDCBottomNavigationBarTitleVisibilitySelected;
self.navigationBar.selectedItem = self.tabItem2;
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthTypical,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestShortTitleArabic];
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedAlwaysWithThreeItemsTypicalWidthTypicalHeightLTR {
// When
self.navigationBar.items = @[ self.tabItem1, self.tabItem2, self.tabItem3 ];
self.navigationBar.titleVisibility = MDCBottomNavigationBarTitleVisibilityAlways;
self.navigationBar.selectedItem = self.tabItem2;
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthTypical,
MDCBottomNavigationBarTestHeightTypical);
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedAlwaysWithThreeItemsTypicalWidthTypicalHeightRTL {
// When
self.navigationBar.items = @[ self.tabItem1, self.tabItem2, self.tabItem3 ];
self.navigationBar.titleVisibility = MDCBottomNavigationBarTitleVisibilityAlways;
self.navigationBar.selectedItem = self.tabItem2;
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthTypical,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestShortTitleArabic];
[self performRippleTouchOnBar:self.navigationBar item:self.tabItem1];
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedNeverWithThreeItemsTypicalWidthTypicalHeightLTR {
// When
self.navigationBar.items = @[ self.tabItem1, self.tabItem2, self.tabItem3 ];
self.navigationBar.titleVisibility = MDCBottomNavigationBarTitleVisibilityNever;
self.navigationBar.selectedItem = self.tabItem2;
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthTypical,
MDCBottomNavigationBarTestHeightTypical);
// Then
[self generateAndVerifySnapshot];
}
- (void)testJustifiedUnspecifiedNeverWithThreeItemsTypicalWidthTypicalHeightRTL {
// When
self.navigationBar.items = @[ self.tabItem1, self.tabItem2, self.tabItem3 ];
self.navigationBar.titleVisibility = MDCBottomNavigationBarTitleVisibilityNever;
self.navigationBar.selectedItem = self.tabItem2;
self.navigationBar.frame = CGRectMake(0, 0, MDCBottomNavigationBarTestWidthTypical,
MDCBottomNavigationBarTestHeightTypical);
[self changeToRTLAndArabicWithTitle:MDCBottomNavigationTestShortTitleArabic];
// Then
[self generateAndVerifySnapshot];
}
@end
NS_ASSUME_NONNULL_END