mirror of
https://github.com/Instagram/IGListKit
synced 2026-05-24 09:48:21 +00:00
Summary: ## Changes in this pull request It's been a few years since I did an audit of our test suite. The majority of changes to IGListKit since then were adding additional error checking and hardening, so this was relatively straightforward. ### Checklist - [x] All tests pass. Demo project builds and runs. - [x] I added tests, an experiment, or detailed why my change isn't tested. - [x] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/main/.github/CONTRIBUTING.md) Pull Request resolved: https://github.com/instagram/IGListKit/pull/1654 Reviewed By: jurmarcus Differential Revision: D91551666 Pulled By: TimOliver fbshipit-source-id: c89c7a45abebb44dbf50b252bfadc9a7c2928683
125 lines
3.9 KiB
Objective-C
125 lines
3.9 KiB
Objective-C
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import <XCTest/XCTest.h>
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import "IGListViewVisibilityTrackerInternal.h"
|
|
|
|
@interface IGListViewVisibilityTrackerTests : XCTestCase
|
|
@property (nonatomic, strong) UIWindow *window;
|
|
@property (nonatomic, strong) UIView *containerView;
|
|
@property (nonatomic, strong) UIView *view;
|
|
@property (nonatomic, strong) IGListViewVisibilityTracker *tracker;
|
|
@end
|
|
|
|
@implementation IGListViewVisibilityTrackerTests
|
|
|
|
- (void)setUp {
|
|
self.window = [UIWindow new];
|
|
self.window.hidden = NO;
|
|
|
|
self.containerView = [UIView new];
|
|
[self.window addSubview:self.containerView];
|
|
|
|
self.view = [UIView new];
|
|
[self.containerView addSubview:self.view];
|
|
|
|
// Advance compare date so it's not early
|
|
self.tracker = [[IGListViewVisibilityTracker alloc] initWithView:self.view];
|
|
self.tracker.comparedDateOverride = [self.tracker.dateCreated dateByAddingTimeInterval:self.tracker.earlyTimeInterval + 1];
|
|
}
|
|
|
|
#pragma mark - Window
|
|
|
|
- (void)test_whenOnWindow_thatVisible {
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateMaybeVisible);
|
|
}
|
|
|
|
- (void)test_whenNoWindow_thatNotVisible {
|
|
[self.view removeFromSuperview];
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);
|
|
}
|
|
|
|
#pragma mark - Hidden
|
|
|
|
- (void)test_whenOnWindow_hidden_thatNotVisible {
|
|
self.view.hidden = YES;
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);
|
|
}
|
|
|
|
- (void)test_whenOnWindow_parentHidden_thatNotVisible {
|
|
self.containerView.hidden = YES;
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);
|
|
}
|
|
|
|
#pragma mark - Alpha
|
|
|
|
- (void)test_whenOnWindow_zeroAlpha_thatNotVisible {
|
|
self.view.alpha = 0;
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);
|
|
}
|
|
|
|
- (void)test_whenOnWindow_parentZeroAlpha_thatNotVisible {
|
|
self.containerView.alpha = 0;
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);
|
|
}
|
|
|
|
- (void)test_whenOnWindow_windowHidden_thatNotVisible {
|
|
self.window.hidden = YES;
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);
|
|
}
|
|
|
|
- (void)test_whenOnWindow_alphaVerySmall_thatNotVisible {
|
|
self.view.alpha = FLT_EPSILON / 2;
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);
|
|
}
|
|
|
|
- (void)test_whenOnWindow_alphaAtEpsilon_thatVisible {
|
|
self.view.alpha = FLT_EPSILON;
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateMaybeVisible);
|
|
}
|
|
|
|
#pragma mark - Early
|
|
|
|
- (void)test_whenNoWindow_andEarly_thatNotVisibleEarly {
|
|
[self.view removeFromSuperview];
|
|
|
|
self.tracker.earlyTimeInterval = 1.0;
|
|
self.tracker.comparedDateOverride = self.tracker.dateCreated;
|
|
|
|
XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisibleEarly);
|
|
}
|
|
|
|
- (void)test_whenNoWindow_andEarly_withoutDateOverride_thatNotVisibleEarly {
|
|
UIView *const newView = [UIView new];
|
|
IGListViewVisibilityTracker *const newTracker = [[IGListViewVisibilityTracker alloc] initWithView:newView];
|
|
newTracker.earlyTimeInterval = 100.0; // Large interval ensures we're still "early"
|
|
|
|
// No comparedDateOverride set, so it uses [NSDate date]
|
|
XCTAssertEqual(newTracker.state, IGListViewVisibilityStateNotVisibleEarly);
|
|
}
|
|
|
|
#pragma mark - Attached
|
|
|
|
- (void)test_whenAttachingTracker_thatReturnsTheSame {
|
|
UIView *const view = [UIView new];
|
|
IGListViewVisibilityTracker *const tracker1 = IGListViewVisibilityTrackerAttachedOnView(view);
|
|
XCTAssertNotNil(tracker1);
|
|
|
|
IGListViewVisibilityTracker *const tracker2 = IGListViewVisibilityTrackerAttachedOnView(view);
|
|
XCTAssertEqual(tracker1, tracker2);
|
|
}
|
|
|
|
- (void)test_whenAttachingTracker_andViewIsNil_thatReturnsNil {
|
|
UIView *view = [UIView new];
|
|
view = nil;
|
|
XCTAssertNil(IGListViewVisibilityTrackerAttachedOnView(view));
|
|
}
|
|
|
|
@end
|