blob: c75325b46c11eba03d9119edc361c227ced9acd2 [file] [log] [blame] [edit]
// Copyright 2015-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 "MaterialPageControl.h"
@interface PageControlExampleTests : XCTestCase
@end
@implementation PageControlExampleTests {
MDCPageControl *_pageControl;
}
- (void)setUp {
[super setUp];
_pageControl = [[MDCPageControl alloc] initWithFrame:CGRectZero];
}
- (void)tearDown {
_pageControl = nil;
[super tearDown];
}
#pragma mark - Tests
- (void)testInitialNumberOfPages {
XCTAssertEqual(_pageControl.numberOfPages, 0);
}
- (void)testInitialCurrentPage {
XCTAssertEqual(_pageControl.currentPage, 0);
}
- (void)testSetCurrentPage {
_pageControl.numberOfPages = 3;
[_pageControl setCurrentPage:1 animated:YES];
XCTAssertEqual(_pageControl.currentPage, 1);
[_pageControl setCurrentPage:2 animated:NO];
XCTAssertEqual(_pageControl.currentPage, 2);
}
- (void)testHidesForSinglePage {
_pageControl.hidesForSinglePage = YES;
_pageControl.numberOfPages = 3;
[_pageControl layoutIfNeeded];
XCTAssertEqual(_pageControl.hidden, NO);
_pageControl.numberOfPages = 1;
[_pageControl layoutIfNeeded];
XCTAssertEqual(_pageControl.hidden, YES);
_pageControl.hidesForSinglePage = NO;
_pageControl.numberOfPages = 1;
[_pageControl layoutIfNeeded];
XCTAssertEqual(_pageControl.hidden, NO);
}
- (void)testSizeThatFits {
// Tests that MDCPageControl and UIPageControl frames are equivalent when calling -sizeToFit.
MDCPageControl *pageControl = [[MDCPageControl alloc] init];
UIPageControl *nativePageControl = [[UIPageControl alloc] init];
// Test both controls with 1 page.
pageControl.numberOfPages = 1;
[pageControl sizeToFit];
nativePageControl.numberOfPages = 1;
[nativePageControl sizeToFit];
CGRect frame = CGRectIntegral(pageControl.frame);
XCTAssertEqual(frame.size.height, 48.0);
XCTAssertEqual(frame.size.width, nativePageControl.frame.size.width);
// Test both controls with 4 pages.
pageControl.numberOfPages = 4;
[pageControl sizeToFit];
nativePageControl.numberOfPages = 4;
[nativePageControl sizeToFit];
frame = CGRectIntegral(pageControl.frame);
XCTAssertEqual(frame.size.height, 48.0);
XCTAssertEqual(frame.size.width, nativePageControl.frame.size.width);
// Test with different number of pages for each control.
pageControl.numberOfPages = 4;
[pageControl sizeToFit];
nativePageControl.numberOfPages = 2;
[nativePageControl sizeToFit];
frame = CGRectIntegral(pageControl.frame);
XCTAssertEqual(frame.size.height, 48.0);
XCTAssertNotEqual(frame.size.width, nativePageControl.frame.size.width);
}
- (void)testIntrinsicContentSize {
// Tests that MDCPageControl's intrinsicContentSize matches its size after `sizeToFit`.
MDCPageControl *pageControl = [[MDCPageControl alloc] init];
CGSize intrinsicSize = CGSizeZero;
CGSize frameSize = CGSizeZero;
// Test with one page.
pageControl.numberOfPages = 1;
[pageControl sizeToFit];
intrinsicSize = pageControl.intrinsicContentSize;
frameSize = pageControl.frame.size;
XCTAssertEqual(frameSize.height, intrinsicSize.height);
XCTAssertEqual(frameSize.width, intrinsicSize.width);
// Test with multiple pages.
pageControl.numberOfPages = 4;
[pageControl sizeToFit];
intrinsicSize = pageControl.intrinsicContentSize;
frameSize = pageControl.frame.size;
XCTAssertEqual(frameSize.height, intrinsicSize.height);
XCTAssertEqual(frameSize.width, intrinsicSize.width);
// Test it isn't dependent on sizeToFit being called. Call ordering matters here, relying on the
// old frame still being set.
pageControl.numberOfPages = 3;
intrinsicSize = pageControl.intrinsicContentSize;
frameSize = pageControl.frame.size;
XCTAssertEqual(frameSize.height, intrinsicSize.height); // Height shouldn't change.
XCTAssertNotEqual(frameSize.width, intrinsicSize.width);
[pageControl sizeToFit];
frameSize = pageControl.frame.size;
XCTAssertEqual(frameSize.height, intrinsicSize.height);
XCTAssertEqual(frameSize.width, intrinsicSize.width);
}
- (void)testScrollOffsetOutOfBoundsOfNumberOfPages {
// Given
CGRect frame = CGRectMake(0, 0, 100, 100);
MDCPageControl *pageControl = [[MDCPageControl alloc] init];
pageControl.numberOfPages = 3;
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
scrollView.delegate = pageControl;
// When
[scrollView setContentOffset:CGPointMake(frame.size.width * pageControl.numberOfPages, 0)
animated:YES];
// Then
XCTAssertEqual(pageControl.currentPage, pageControl.numberOfPages - 1);
}
- (void)testCurrentPageGetsUpdatedWhenOffsetIsChanged {
// Given
CGRect frame = CGRectMake(0, 0, 100, 100);
MDCPageControl *pageControl = [[MDCPageControl alloc] init];
pageControl.numberOfPages = 3;
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame];
scrollView.delegate = pageControl;
NSInteger page = 2;
// When
[scrollView setContentOffset:CGPointMake(frame.size.width * page, 0) animated:YES];
// Then
XCTAssertEqual(pageControl.currentPage, page);
}
- (void)testResetNumberOfPagesToZero {
// Given
MDCPageControl *pageControl = [[MDCPageControl alloc] init];
pageControl.numberOfPages = 3;
NSException *exception;
// When
@try {
pageControl.numberOfPages = 0;
pageControl.currentPage = 0;
} @catch (NSException *e) {
exception = e;
}
// Then
XCTAssertNil(exception, @"PageControl crashed with exception: %@", exception);
}
- (void)testScrollViewDidScrollWithZeroPages {
// Given
MDCPageControl *pageControl = [[MDCPageControl alloc] init];
pageControl.numberOfPages = 0;
UIScrollView *scrollView = [[UIScrollView alloc] init];
NSException *exception;
// When
@try {
[pageControl scrollViewDidScroll:scrollView];
} @catch (NSException *e) {
exception = e;
}
// Then
XCTAssertNil(exception, @"PageControl crashed with exception: %@", exception);
}
- (void)testTraitCollectionDidChangeBlockCalledWithExpectedParameters {
// Given
XCTestExpectation *expectation =
[[XCTestExpectation alloc] initWithDescription:@"traitCollection"];
__block UITraitCollection *passedTraitCollection = nil;
__block MDCPageControl *passedPageControl = nil;
_pageControl.traitCollectionDidChangeBlock = ^(
MDCPageControl *_Nonnull pageControl, UITraitCollection *_Nullable previousTraitCollection) {
passedTraitCollection = previousTraitCollection;
passedPageControl = pageControl;
[expectation fulfill];
};
UITraitCollection *fakeTraitCollection = [UITraitCollection traitCollectionWithDisplayScale:7];
// When
[_pageControl traitCollectionDidChange:fakeTraitCollection];
// Then
[self waitForExpectations:@[ expectation ] timeout:1];
XCTAssertEqual(passedPageControl, _pageControl);
XCTAssertEqual(passedTraitCollection, fakeTraitCollection);
}
@end