/*
 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)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);
}

@end
