blob: 44451eafd008460ab9279d002c757a4385d2b487 [file] [log] [blame] [edit]
// 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/XCTest.h>
#import "MaterialSnackbar.h"
#import "MDCFakeMDCSnackbarManagerDelegate.h"
@interface MDCSnackbarManagerInstanceTests : XCTestCase
@property(nonatomic, strong) UIColor *messageTextColor;
@property(nonatomic, strong) UIColor *snackbarMessageViewShadowColor;
@property(nonatomic, strong) UIColor *snackbarMessageViewBackgroundColor;
@property(nonatomic, strong) NSMutableDictionary *titleColorForState;
@end
@implementation MDCSnackbarManagerInstanceTests
// The fact that MDCSnackbarManager.defaultInstance is a singleton means it's incredibly hard to
// test correctly. The -setUp and -tearDown methods below attempt to save/restore the
// defaultManager's tested state as well as possible. If either these tests or any of the "default"
// styling tests begin to flake/fail, it's probably best to remove these methods as well as
// -testClassPropertiesAssignToDefaultInstance .
- (void)setUp {
[super setUp];
self.messageTextColor = MDCSnackbarManager.defaultManager.messageTextColor;
self.snackbarMessageViewShadowColor =
MDCSnackbarManager.defaultManager.snackbarMessageViewShadowColor;
self.snackbarMessageViewBackgroundColor =
MDCSnackbarManager.defaultManager.snackbarMessageViewBackgroundColor;
self.titleColorForState = [@{} mutableCopy];
NSUInteger maxState = UIControlStateNormal | UIControlStateDisabled | UIControlStateSelected |
UIControlStateHighlighted;
for (NSUInteger state = 0; state < maxState; ++state) {
self.titleColorForState[@(state)] =
[MDCSnackbarManager.defaultManager buttonTitleColorForState:state];
}
}
- (void)tearDown {
// Restore the Snackbar Manager's state
MDCSnackbarManager.defaultManager.messageTextColor = self.messageTextColor;
MDCSnackbarManager.defaultManager.snackbarMessageViewShadowColor =
self.snackbarMessageViewShadowColor;
MDCSnackbarManager.defaultManager.snackbarMessageViewBackgroundColor =
self.snackbarMessageViewBackgroundColor;
for (NSNumber *state in self.titleColorForState.allKeys) {
if (self.titleColorForState[state] != nil) {
[MDCSnackbarManager.defaultManager setButtonTitleColor:self.titleColorForState[state]
forState:state.unsignedIntegerValue];
}
}
// Clean-up the test case
[self.titleColorForState removeAllObjects];
self.messageTextColor = nil;
self.snackbarMessageViewShadowColor = nil;
self.snackbarMessageViewBackgroundColor = nil;
[super tearDown];
}
- (void)testTwoInitializationsProvideTwoObjects {
// When
MDCSnackbarManager *manager1 = [[MDCSnackbarManager alloc] init];
MDCSnackbarManager *manager2 = [[MDCSnackbarManager alloc] init];
// Then
XCTAssertNotEqual(manager1, manager2);
}
- (void)testDefaultInstanceIsTheSame {
// Given
MDCSnackbarManager *manager = MDCSnackbarManager.defaultManager;
// Then
XCTAssertEqual(MDCSnackbarManager.defaultManager, manager);
}
- (void)testClassPropertiesAssignToDefaultInstance {
// Given
MDCSnackbarManager *manager = MDCSnackbarManager.defaultManager;
FakeMDCSnackbarManagerDelegate *delegate = [[FakeMDCSnackbarManagerDelegate alloc] init];
// When
MDCSnackbarManager.defaultManager.horizontalAlignment = MDCSnackbarHorizontalAlignmentLeading;
MDCSnackbarManager.defaultManager.buttonFont = [UIFont systemFontOfSize:72];
MDCSnackbarManager.defaultManager.delegate = delegate;
MDCSnackbarManager.defaultManager.messageFont = [UIFont systemFontOfSize:66];
MDCSnackbarManager.defaultManager.messageTextColor = UIColor.orangeColor;
MDCSnackbarManager.defaultManager.shouldApplyStyleChangesToVisibleSnackbars = YES;
MDCSnackbarManager.defaultManager.snackbarMessageViewBackgroundColor = UIColor.brownColor;
MDCSnackbarManager.defaultManager.snackbarMessageViewShadowColor = UIColor.purpleColor;
[MDCSnackbarManager.defaultManager setButtonTitleColor:UIColor.greenColor
forState:UIControlStateDisabled];
// Then
XCTAssertEqual(manager.horizontalAlignment,
MDCSnackbarManager.defaultManager.horizontalAlignment);
XCTAssertEqualObjects(manager.buttonFont, MDCSnackbarManager.defaultManager.buttonFont);
XCTAssertEqual(manager.delegate, MDCSnackbarManager.defaultManager.delegate);
XCTAssertEqualObjects(manager.messageFont, MDCSnackbarManager.defaultManager.messageFont);
XCTAssertEqual(manager.messageTextColor, MDCSnackbarManager.defaultManager.messageTextColor);
XCTAssertEqual(manager.shouldApplyStyleChangesToVisibleSnackbars,
MDCSnackbarManager.defaultManager.shouldApplyStyleChangesToVisibleSnackbars);
XCTAssertEqual(manager.snackbarMessageViewBackgroundColor,
MDCSnackbarManager.defaultManager.snackbarMessageViewBackgroundColor);
XCTAssertEqual(manager.snackbarMessageViewShadowColor,
MDCSnackbarManager.defaultManager.snackbarMessageViewShadowColor);
XCTAssertEqual(
[manager buttonTitleColorForState:UIControlStateDisabled],
[MDCSnackbarManager.defaultManager buttonTitleColorForState:UIControlStateDisabled]);
}
- (void)testInstancesDoNotSharePropertyStorage {
// Given
MDCSnackbarManager *manager1 = [[MDCSnackbarManager alloc] init];
MDCSnackbarManager *manager2 = [[MDCSnackbarManager alloc] init];
FakeMDCSnackbarManagerDelegate *delegate1 = [[FakeMDCSnackbarManagerDelegate alloc] init];
FakeMDCSnackbarManagerDelegate *delegate2 = [[FakeMDCSnackbarManagerDelegate alloc] init];
// When
manager1.horizontalAlignment = MDCSnackbarHorizontalAlignmentLeading;
manager2.horizontalAlignment = MDCSnackbarHorizontalAlignmentCenter;
manager1.buttonFont = [UIFont systemFontOfSize:72];
manager2.buttonFont = [UIFont systemFontOfSize:41];
manager1.delegate = delegate1;
manager2.delegate = delegate2;
manager1.messageFont = [UIFont systemFontOfSize:66];
manager2.messageFont = [UIFont systemFontOfSize:33];
manager1.messageTextColor = UIColor.orangeColor;
manager2.messageTextColor = UIColor.blueColor;
manager1.shouldApplyStyleChangesToVisibleSnackbars = YES;
manager2.shouldApplyStyleChangesToVisibleSnackbars = NO;
manager1.snackbarMessageViewBackgroundColor = UIColor.brownColor;
manager2.snackbarMessageViewBackgroundColor = UIColor.yellowColor;
manager1.snackbarMessageViewShadowColor = UIColor.purpleColor;
manager2.snackbarMessageViewShadowColor = UIColor.cyanColor;
[manager1 setButtonTitleColor:UIColor.greenColor forState:UIControlStateDisabled];
[manager2 setButtonTitleColor:UIColor.magentaColor forState:UIControlStateDisabled];
// Then
XCTAssertNotEqual(manager1.horizontalAlignment, manager2.horizontalAlignment);
XCTAssertNotEqual(manager1.buttonFont, manager2.buttonFont);
XCTAssertNotEqual(manager1.delegate, manager2.delegate);
XCTAssertNotEqual(manager1.messageFont, manager2.messageFont);
XCTAssertNotEqual(manager1.messageTextColor, manager2.messageTextColor);
XCTAssertNotEqual(manager1.shouldApplyStyleChangesToVisibleSnackbars,
manager2.shouldApplyStyleChangesToVisibleSnackbars);
XCTAssertNotEqual(manager1.snackbarMessageViewBackgroundColor,
manager2.snackbarMessageViewBackgroundColor);
XCTAssertNotEqual(manager1.snackbarMessageViewShadowColor,
manager2.snackbarMessageViewShadowColor);
XCTAssertNotEqual([manager1 buttonTitleColorForState:UIControlStateDisabled],
[manager2 buttonTitleColorForState:UIControlStateDisabled]);
}
@end