Skip to content

Commit 42a9145

Browse files
committed
Refactored a part of tests to be more flexible and reusable.
1 parent 6dd0b2b commit 42a9145

File tree

9 files changed

+187
-110
lines changed

9 files changed

+187
-110
lines changed

FZAccordionTableView/FZAccordionTableView.m

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ @interface FZAccordionTableView() <UITableViewDataSource, UITableViewDelegate, F
9898
@property id<UITableViewDelegate, FZAccordionTableViewDelegate> subclassDelegate;
9999
@property id<UITableViewDataSource> subclassDataSource;
100100

101+
@property (nonatomic) BOOL numberOfSectionsCalled;
101102
@property (strong, nonatomic) NSMutableSet *mutableInitialOpenSections;
102103
@property (strong, nonatomic) NSMutableArray <FZAccordionTableViewSectionInfo *> *sectionInfos;
103104

@@ -114,28 +115,15 @@ - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
114115
return self;
115116
}
116117

117-
- (id)initWithFrame:(CGRect)frame {
118-
if (self = [super initWithFrame:frame]) {
119-
[self initializeVars];
120-
}
121-
return self;
122-
}
123-
124118
- (id)initWithCoder:(NSCoder *)aDecoder {
125119
if (self = [super initWithCoder:aDecoder]) {
126120
[self initializeVars];
127121
}
128122
return self;
129123
}
130124

131-
- (id)init {
132-
if (self = [super init]) {
133-
[self initializeVars];
134-
}
135-
return self;
136-
}
137-
138125
- (void)initializeVars {
126+
_numberOfSectionsCalled = NO;
139127
_sectionInfos = [NSMutableArray new];
140128
_allowMultipleSectionsOpen = NO;
141129
_enableAnimationFix = NO;
@@ -419,6 +407,7 @@ - (void)autoCollapseAllSectionsExceptSection:(NSInteger)section {
419407
#pragma mark - <UITableViewDataSource> -
420408

421409
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
410+
self.numberOfSectionsCalled = YES;
422411

423412
NSInteger numOfSections = 1; // Default value for UITableView is 1
424413

@@ -443,16 +432,27 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
443432
[self.sectionInfos addObject:section];
444433
}
445434

435+
446436
return numOfSections;
447437
}
448438

449439
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
450-
440+
if (!self.numberOfSectionsCalled) {
441+
// There is some potential UITableView bug where
442+
// 'tableView:numberOfRowsInSection:' gets called before
443+
// 'numberOfSectionsInTableView' gets called.
444+
NSLog(@"ENCOUNTERED UITABLEVIEW BUG");
445+
return 0;
446+
}
447+
451448
NSInteger numOfRows = 0;
452449

453450
if ([self.subclassDataSource respondsToSelector:@selector(tableView:numberOfRowsInSection:)]) {
454451
numOfRows = [self.subclassDataSource tableView:tableView numberOfRowsInSection:section];;
455452
}
453+
454+
return 5;
455+
456456
[self.sectionInfos[section] setNumberOfRows:numOfRows];
457457

458458
return ([self isSectionOpen:section]) ? numOfRows : 0;

Tests/Testing_Example/FZAccordionTableViewTestApp/Base.lproj/Main.storyboard

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,9 @@
1616
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
1717
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
1818
<subviews>
19-
<tableView clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="37Y-td-hS9" userLabel="tableView" customClass="FZAccordionTableView">
20-
<rect key="frame" x="0.0" y="0.0" width="600" height="551"/>
19+
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="37Y-td-hS9" userLabel="tableView" customClass="FZAccordionTableView">
20+
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
2121
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
22-
<connections>
23-
<outlet property="dataSource" destination="9pv-A4-QxB" id="i7H-Jc-4fH"/>
24-
<outlet property="delegate" destination="9pv-A4-QxB" id="mvl-Qm-JxQ"/>
25-
</connections>
2622
</tableView>
2723
</subviews>
2824
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>

Tests/Testing_Example/FZAccordionTableViewTestApp/MainViewController.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
@property (weak, nonatomic) IBOutlet FZAccordionTableView *tableView;
1515
@property (strong, nonatomic) NSMutableArray <NSNumber *> *sections;
1616

17-
17+
- (void)connectTableView;
1818

1919
@end
2020

Tests/Testing_Example/FZAccordionTableViewTestApp/MainViewController.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,18 @@ - (void)setupTableView {
4040
// [self.tableView registerClass:[FZAccordionTableViewHeaderView class] forHeaderFooterViewReuseIdentifier:kAccordionHeaderViewReuseIdentifier];
4141
[self.tableView registerNib:[UINib nibWithNibName:@"AccordionHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:kAccordionHeaderViewReuseIdentifier];
4242

43+
// [self connectTableView];
4344
// [self testSettingProperties];
4445
// [self testAddingSection];
4546
// [self testDeletingMultipleSectionsAtTheSameTime];
4647
}
4748

49+
- (void)connectTableView
50+
{
51+
self.tableView.delegate = self;
52+
self.tableView.dataSource = self;
53+
}
54+
4855
- (void)testSettingProperties
4956
{
5057
// self.tableView.allowsMultipleSelectionDuringEditing = NO;

Tests/Testing_Example/FZAccordionTableViewTests.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
0137E0ED1CCDAED200C2CFAC /* FZAccordionTableViewInitializationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0137E0EC1CCDAED200C2CFAC /* FZAccordionTableViewInitializationTests.m */; };
11+
0137E0F01CCDAF0400C2CFAC /* FZAccordionTableViewTestHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 0137E0EF1CCDAF0400C2CFAC /* FZAccordionTableViewTestHelpers.m */; };
1012
0156F1441CCD219800E0530C /* FZAccordionTableViewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0156F1431CCD219800E0530C /* FZAccordionTableViewUITests.m */; };
1113
0156F14B1CCD26F000E0530C /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 01D1F33A1B24D94A007B97BD /* MainViewController.m */; };
1214
0156F14C1CCD26F500E0530C /* FZAccordionTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 01D1F35D1B24D9B2007B97BD /* FZAccordionTableView.m */; };
@@ -44,6 +46,9 @@
4446
/* End PBXContainerItemProxy section */
4547

4648
/* Begin PBXFileReference section */
49+
0137E0EC1CCDAED200C2CFAC /* FZAccordionTableViewInitializationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FZAccordionTableViewInitializationTests.m; sourceTree = "<group>"; };
50+
0137E0EE1CCDAF0400C2CFAC /* FZAccordionTableViewTestHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FZAccordionTableViewTestHelpers.h; sourceTree = "<group>"; };
51+
0137E0EF1CCDAF0400C2CFAC /* FZAccordionTableViewTestHelpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FZAccordionTableViewTestHelpers.m; sourceTree = "<group>"; };
4752
0156F1411CCD219800E0530C /* FZAccordionTableViewUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FZAccordionTableViewUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
4853
0156F1431CCD219800E0530C /* FZAccordionTableViewUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FZAccordionTableViewUITests.m; sourceTree = "<group>"; };
4954
0156F1451CCD219800E0530C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -104,7 +109,10 @@
104109
0156F1561CCD2BA400E0530C /* FZAccordionTableViewUnitTests */ = {
105110
isa = PBXGroup;
106111
children = (
112+
0137E0EE1CCDAF0400C2CFAC /* FZAccordionTableViewTestHelpers.h */,
113+
0137E0EF1CCDAF0400C2CFAC /* FZAccordionTableViewTestHelpers.m */,
107114
0156F1571CCD2BA400E0530C /* FZAccordionTableViewUnitTests.m */,
115+
0137E0EC1CCDAED200C2CFAC /* FZAccordionTableViewInitializationTests.m */,
108116
0156F1591CCD2BA400E0530C /* Info.plist */,
109117
);
110118
path = FZAccordionTableViewUnitTests;
@@ -313,6 +321,8 @@
313321
isa = PBXSourcesBuildPhase;
314322
buildActionMask = 2147483647;
315323
files = (
324+
0137E0F01CCDAF0400C2CFAC /* FZAccordionTableViewTestHelpers.m in Sources */,
325+
0137E0ED1CCDAED200C2CFAC /* FZAccordionTableViewInitializationTests.m in Sources */,
316326
0156F1581CCD2BA400E0530C /* FZAccordionTableViewUnitTests.m in Sources */,
317327
);
318328
runOnlyForDeploymentPostprocessing = 0;
@@ -538,6 +548,7 @@
538548
0156F14A1CCD219800E0530C /* Release */,
539549
);
540550
defaultConfigurationIsVisible = 0;
551+
defaultConfigurationName = Release;
541552
};
542553
0156F15C1CCD2BA400E0530C /* Build configuration list for PBXNativeTarget "FZAccordionTableViewUnitTests" */ = {
543554
isa = XCConfigurationList;
@@ -546,6 +557,7 @@
546557
0156F15E1CCD2BA400E0530C /* Release */,
547558
);
548559
defaultConfigurationIsVisible = 0;
560+
defaultConfigurationName = Release;
549561
};
550562
01D1F32A1B24D949007B97BD /* Build configuration list for PBXProject "FZAccordionTableViewTests" */ = {
551563
isa = XCConfigurationList;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//
2+
// FZAccordionTableViewInitializationTests.m
3+
// FZAccordionTableViewTests
4+
//
5+
// Created by Krisjanis Gaidis on 4/24/16.
6+
// Copyright © 2016 Fuzz. All rights reserved.
7+
//
8+
9+
#import <XCTest/XCTest.h>
10+
#import "FZAccordionTableViewTestHelpers.h"
11+
12+
@interface FZAccordionTableViewInitializationTests : XCTestCase
13+
14+
@property (strong, nonatomic) MainViewController *mainViewController;
15+
@property (weak, nonatomic) FZAccordionTableView *tableView;
16+
17+
@end
18+
19+
@implementation FZAccordionTableViewInitializationTests
20+
21+
#pragma mark - Setup
22+
23+
- (void)setUp {
24+
[super setUp];
25+
self.mainViewController = [FZAccordionTableViewTestHelpers setupMainViewController];
26+
self.tableView = self.mainViewController.tableView;
27+
}
28+
29+
- (void)tearDown {
30+
[FZAccordionTableViewTestHelpers tearDownMainViewController];
31+
self.mainViewController = nil;
32+
self.tableView = nil;
33+
[super tearDown];
34+
}
35+
36+
#pragma mark - Helpers
37+
38+
- (void)waitForHeaderViewInSection:(NSInteger)section
39+
{
40+
[FZAccordionTableViewTestHelpers waitForHeaderViewInSection:section tableView:self.tableView];
41+
}
42+
43+
#pragma mark - Property 'initialOpenSections' Tests -
44+
45+
- (void)testInitialOpenSections {
46+
47+
NSMutableArray *initialOpenSections = [NSMutableArray new];
48+
49+
for (NSInteger i = 0; i < self.mainViewController.sections.count; i++) {
50+
[initialOpenSections addObject:@(i)];
51+
}
52+
53+
self.tableView.initialOpenSections = [NSSet setWithArray:initialOpenSections];
54+
55+
[self.mainViewController connectTableView];
56+
57+
for (NSInteger i = 0; i < self.tableView.numberOfSections; i++) {
58+
[self waitForHeaderViewInSection:i];
59+
XCTAssert([self.tableView isSectionOpen:i], @"Section %d should be open.", (int)i);
60+
}
61+
}
62+
@end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// FZAccordionTableViewTestHelpers.h
3+
// FZAccordionTableViewTests
4+
//
5+
// Created by Krisjanis Gaidis on 4/24/16.
6+
// Copyright © 2016 Fuzz. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
#import "MainViewController.h"
11+
12+
@interface FZAccordionTableViewTestHelpers : NSObject
13+
14+
+ (MainViewController *)setupMainViewController;
15+
+ (void)tearDownMainViewController;
16+
17+
+ (void)waitForHeaderViewInSection:(NSInteger)section tableView:(FZAccordionTableView *)tableView;
18+
19+
@end
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//
2+
// FZAccordionTableViewTestHelpers.m
3+
// FZAccordionTableViewTests
4+
//
5+
// Created by Krisjanis Gaidis on 4/24/16.
6+
// Copyright © 2016 Fuzz. All rights reserved.
7+
//
8+
9+
#import "FZAccordionTableViewTestHelpers.h"
10+
11+
@implementation FZAccordionTableViewTestHelpers
12+
13+
+ (MainViewController *)setupMainViewController {
14+
MainViewController *mainViewController = (MainViewController *)[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateInitialViewController];
15+
if (![mainViewController isKindOfClass:[MainViewController class]]) {
16+
return nil;
17+
}
18+
19+
[[[UIApplication sharedApplication] delegate] window].rootViewController = mainViewController;
20+
21+
[mainViewController view];
22+
23+
return mainViewController;
24+
}
25+
26+
+ (void)tearDownMainViewController {
27+
[[[UIApplication sharedApplication] delegate] window].rootViewController = nil;
28+
}
29+
30+
+ (void)waitForHeaderViewInSection:(NSInteger)section tableView:(FZAccordionTableView *)tableView {
31+
NSInteger lastSection = -1;
32+
33+
while (![tableView headerViewForSection:section]) {
34+
NSLog(@"%@", NSStringFromCGRect([tableView rectForSection:section]));
35+
36+
if (lastSection == section) {
37+
CGFloat validContentOffSet = tableView.contentSize.height - tableView.bounds.size.height;
38+
CGPoint contentOffset = CGPointMake(0, 1 + arc4random_uniform(validContentOffSet)-10);
39+
// [tableView setContentOffset:CGPointMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height) animated:NO];
40+
[tableView setContentOffset:CGPointMake(0, contentOffset.y) animated:NO];
41+
}
42+
else {
43+
CGRect sectionRect = [tableView rectForSection:section];
44+
sectionRect.origin.y -= 100;
45+
sectionRect.size.height += 100;
46+
[tableView scrollRectToVisible:sectionRect animated:NO];
47+
}
48+
49+
lastSection = section;
50+
51+
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]];
52+
}
53+
}
54+
55+
56+
@end

0 commit comments

Comments
 (0)