| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | #import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>
#import "RNNDotIndicatorPresenter.h"
#import "DotIndicatorOptions.h"
#import "RNNBottomTabsController.h"
#import <ReactNativeNavigation/RNNComponentViewController.h>
#import "RNNTestBase.h"
#import "UITabBarController+RNNUtils.h"
#import <ReactNativeNavigation/BottomTabPresenterCreator.h>
#import "RNNBottomTabsController+Helpers.h"
@interface RNNDotIndicatorPresenterTest : RNNTestBase
@property(nonatomic, strong) id uut;
@property(nonatomic, strong) RNNComponentViewController *child;
@property(nonatomic, strong) id bottomTabs;
@property(nonatomic, strong) BottomTabPresenter* bottomTabPresenter;
@end
@implementation RNNDotIndicatorPresenterTest
- (void)setUp {
    [super setUp];
	self.child = [self createChild];
	self.bottomTabPresenter = [BottomTabPresenterCreator createWithDefaultOptions:nil];
    self.uut = [OCMockObject partialMockForObject:[RNNDotIndicatorPresenter new]];
    self.bottomTabs = [OCMockObject partialMockForObject:[RNNBottomTabsController createWithChildren:@[self.child]]];
    [self setupTopLevelUI:self.bottomTabs];
}
- (void)tearDown {
    [self tearDownTopLevelUI:_bottomTabs];
    [super tearDown];
}
- (void)testApply_doesNothingIfDoesNotHaveValue {
    DotIndicatorOptions *empty = [DotIndicatorOptions new];
    [[self uut] apply:self.child :empty];
    XCTAssertFalse([self tabHasIndicator]);
}
- (void)testApply_indicatorIsAddedToTabView {
    [self applyIndicator];
    XCTAssertTrue([self tabHasIndicator]);
}
- (void)testApply_indicatorIsRemovedIfNotVisible {
    [self applyIndicator];
    XCTAssertTrue([self tabHasIndicator]);
    DotIndicatorOptions *options = [DotIndicatorOptions new];
    options.visible = [[Bool alloc] initWithBOOL:NO];
    [[self uut] apply:self.child :options];
    XCTAssertFalse([self tabHasIndicator]);
}
- (void)testApply_invisibleIndicatorIsNotAdded {
    DotIndicatorOptions *options = [DotIndicatorOptions new];
    options.visible = [[Bool alloc] initWithBOOL:NO];
    [[self uut] apply:self.child :options];
    XCTAssertFalse([self tabHasIndicator]);
}
- (void)testApply_itDoesNotRecreateIfEqualToCurrentlyVisibleIndicator {
    [self applyIndicator];
    UIView *indicator1 = [self getIndicator];
    [self applyIndicator];
    UIView *indicator2 = [self getIndicator];
    XCTAssertEqualObjects(indicator1, indicator2);
}
- (void)testApply_itAddsIndicatorToCorrectTabView {
    [self applyIndicator];
    UIView *indicator1 = [self getIndicator];
    XCTAssertEqualObjects([indicator1 superview], [_bottomTabs getTabView:0]);
}
- (void)testApply_itRemovesPreviousDotIndicator {
    NSUInteger childCountBeforeApplyingIndicator = [[_bottomTabs getTabView:0] subviews].count;
    [self applyIndicator];
    NSUInteger childCountAfterApplyingIndicatorOnce = [[_bottomTabs getTabView:0] subviews].count;
    XCTAssertEqual(childCountBeforeApplyingIndicator + 1, childCountAfterApplyingIndicatorOnce);
    [self applyIndicator:[UIColor greenColor]];
    NSUInteger childCountAfterApplyingIndicatorTwice = [[_bottomTabs getTabView:0] subviews].count;
    XCTAssertEqual([[self getIndicator] backgroundColor], [UIColor greenColor]);
    XCTAssertEqual(childCountAfterApplyingIndicatorOnce, childCountAfterApplyingIndicatorTwice);
}
- (void)testApply_itRemovesPreviousIndicator {
    DotIndicatorOptions *options = [DotIndicatorOptions new];
    options.visible = [[Bool alloc] initWithBOOL:YES];
    options.color = [[Color alloc] initWithValue:[UIColor redColor]];
    options.size = [[Number alloc] initWithValue:[[NSNumber alloc] initWithInt:8]];
    [[self uut] apply:self.child :options];
    XCTAssertTrue([self tabHasIndicator]);
    options.visible = [[Bool alloc] initWithBOOL:NO];
    [[self uut] apply:self.child :options];
    XCTAssertFalse([self tabHasIndicator]);
}
- (void)testApply_indicatorIsAlignedToTopRightOfIcon {
    DotIndicatorOptions *options = [DotIndicatorOptions new];
    options.visible = [[Bool alloc] initWithBOOL:YES];
    options.size = [[Number alloc] initWithValue:[[NSNumber alloc] initWithInt:8]];
    [[self uut] apply:self.child :options];
    UIView *indicator = [self getIndicator];
    UIView * icon = [_bottomTabs getTabIcon:0];
    NSArray<NSLayoutConstraint *> *alignmentConstraints = [_bottomTabs getTabView:0].constraints;
    XCTAssertEqual([alignmentConstraints count], 2);
    XCTAssertEqual([alignmentConstraints[0] constant], -4);
    XCTAssertEqual([alignmentConstraints[0] firstItem], indicator);
    XCTAssertEqual([alignmentConstraints[0] secondItem], icon);
    XCTAssertEqual([alignmentConstraints[0] firstAttribute], NSLayoutAttributeLeft);
    XCTAssertEqual([alignmentConstraints[0] secondAttribute], NSLayoutAttributeRight);
    XCTAssertEqual([alignmentConstraints[1] constant], -4);
    XCTAssertEqual([alignmentConstraints[1] firstItem], indicator);
    XCTAssertEqual([alignmentConstraints[1] secondItem], icon);
    XCTAssertEqual([alignmentConstraints[1] firstAttribute], NSLayoutAttributeTop);
    XCTAssertEqual([alignmentConstraints[1] secondAttribute], NSLayoutAttributeTop);
    NSArray *sizeConstraints = indicator.constraints;
    XCTAssertEqual([sizeConstraints count], 2);
    XCTAssertEqual([sizeConstraints[0] constant], 8);
    XCTAssertEqual([sizeConstraints[1] constant], 8);
}
- (void)testApply_onBottomTabsViewDidLayout {
	[[self.uut expect] apply:self.child :self.child.resolveOptions.bottomTab.dotIndicator];
	[self.uut bottomTabsDidLayoutSubviews:self.bottomTabs];
	[self.uut verify];
}
- (void)applyIndicator {
    [self applyIndicator:[UIColor redColor]];
}
- (void)applyIndicator:(UIColor *) color {
    DotIndicatorOptions *options = [DotIndicatorOptions new];
    options.visible = [[Bool alloc] initWithBOOL:YES];
    options.color = [[Color alloc] initWithValue:color];
    [[self uut] apply:self.child :options];
}
- (RNNComponentViewController *)createChild {
    RNNNavigationOptions *options = [RNNNavigationOptions new];
    options.bottomTab = [RNNBottomTabOptions new];
    id img = [OCMockObject partialMockForObject:[UIImage new]];
    options.bottomTab.icon = [[Image alloc] initWithValue:img];
    return [[RNNComponentViewController alloc] initWithLayoutInfo:nil rootViewCreator:nil eventEmitter:nil presenter:[[RNNComponentPresenter alloc] initWithDefaultOptions:[[RNNNavigationOptions alloc] initEmptyOptions]] options:options defaultOptions:nil];
}
- (BOOL)tabHasIndicator {
    return [self.child tabBarItem].tag > 0;
}
- (UIView *)getIndicator {
    return [self tabHasIndicator] ? [[((UITabBarController *) _bottomTabs) tabBar] viewWithTag:_child.tabBarItem.tag] : nil;
}
@end
 |