Skip to content

Commit 098dbbf

Browse files
author
Martin Richter
committed
Generalize API of Changeset model and add tests
1 parent 31d7638 commit 098dbbf

File tree

5 files changed

+114
-7
lines changed

5 files changed

+114
-7
lines changed

ObjectiveGoal.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
0FA2AE021A228F79002801D2 /* OpenSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0FA2ADFF1A228F79002801D2 /* OpenSans-Light.ttf */; };
3030
0FA2AE031A228F79002801D2 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0FA2AE001A228F79002801D2 /* OpenSans-Regular.ttf */; };
3131
0FA2AE041A228F79002801D2 /* OpenSans-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0FA2AE011A228F79002801D2 /* OpenSans-Semibold.ttf */; };
32+
0FBA66641A835BDB0089A3E8 /* ChangesetTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FBA66631A835BDB0089A3E8 /* ChangesetTests.m */; };
3233
0FC0BFE71A229D45006A6695 /* PlayerCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FC0BFE61A229D45006A6695 /* PlayerCell.m */; };
3334
0FC0BFEA1A22A25C006A6695 /* Player.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FC0BFE91A22A25C006A6695 /* Player.m */; };
3435
0FDBE03F1A1FD9F5001CA0ED /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FDBE03E1A1FD9F5001CA0ED /* main.m */; };
@@ -88,6 +89,7 @@
8889
0FA2ADFF1A228F79002801D2 /* OpenSans-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Light.ttf"; sourceTree = "<group>"; };
8990
0FA2AE001A228F79002801D2 /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Regular.ttf"; sourceTree = "<group>"; };
9091
0FA2AE011A228F79002801D2 /* OpenSans-Semibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Semibold.ttf"; sourceTree = "<group>"; };
92+
0FBA66631A835BDB0089A3E8 /* ChangesetTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChangesetTests.m; sourceTree = "<group>"; };
9193
0FC0BFE51A229D45006A6695 /* PlayerCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = PlayerCell.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
9294
0FC0BFE61A229D45006A6695 /* PlayerCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = PlayerCell.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
9395
0FC0BFE81A22A25C006A6695 /* Player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Player.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
@@ -210,6 +212,7 @@
210212
children = (
211213
0FA2ADFD1A224772002801D2 /* TestHelper.h */,
212214
0FA2ADFB1A22475F002801D2 /* TestHelper.m */,
215+
0FBA66631A835BDB0089A3E8 /* ChangesetTests.m */,
213216
0FDCB2A51A1FFC0900656AF2 /* MatchesViewModelTests.m */,
214217
0FA2ADE71A2139C8002801D2 /* EditMatchViewModelTests.m */,
215218
0FA2ADF91A224631002801D2 /* ManagePlayersViewModelTests.m */,
@@ -494,6 +497,7 @@
494497
isa = PBXSourcesBuildPhase;
495498
buildActionMask = 2147483647;
496499
files = (
500+
0FBA66641A835BDB0089A3E8 /* ChangesetTests.m in Sources */,
497501
0FA2ADE81A2139C8002801D2 /* EditMatchViewModelTests.m in Sources */,
498502
0F9E47411A2E6A880022AA38 /* RankedPlayersViewModelTests.m in Sources */,
499503
0FA2ADFA1A224631002801D2 /* ManagePlayersViewModelTests.m in Sources */,

ObjectiveGoal/Model/Changeset.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
@property (nonatomic, copy, readonly) NSArray *deletions;
1414
@property (nonatomic, copy, readonly) NSArray *insertions;
1515

16-
+ (Changeset *)changesetFromMatches:(NSArray *)oldMatches toMatches:(NSArray *)newMatches;
16+
+ (Changeset *)changesetOfIndexPathsFromItems:(NSArray *)oldItems toItems:(NSArray *)newItems;
1717

1818
@end

ObjectiveGoal/Model/Changeset.m

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,19 @@ - (instancetype)initWithDeletions:(NSArray *)deletions insertions:(NSArray *)ins
2929

3030
#pragma mark - Match Changesets
3131

32-
+ (Changeset *)changesetFromMatches:(NSArray *)oldMatches toMatches:(NSArray *)newMatches {
32+
+ (Changeset *)changesetOfIndexPathsFromItems:(NSArray *)oldItems toItems:(NSArray *)newItems
33+
{
3334
NSMutableArray *mutableDeletions = [NSMutableArray array];
3435
NSMutableArray *mutableInsertions = [NSMutableArray array];
3536

36-
[oldMatches enumerateObjectsUsingBlock:^(NSObject *match, NSUInteger index, BOOL *stop) {
37-
if (![newMatches containsObject:match]) {
37+
[oldItems enumerateObjectsUsingBlock:^(NSObject *item, NSUInteger index, BOOL *stop) {
38+
if (![newItems containsObject:item]) {
3839
[mutableDeletions addObject:[NSIndexPath indexPathForRow:index inSection:0]];
3940
}
4041
}];
4142

42-
[newMatches enumerateObjectsUsingBlock:^(NSObject *match, NSUInteger index, BOOL *stop) {
43-
if (![oldMatches containsObject:match]) {
43+
[newItems enumerateObjectsUsingBlock:^(NSObject *item, NSUInteger index, BOOL *stop) {
44+
if (![oldItems containsObject:item]) {
4445
[mutableInsertions addObject:[NSIndexPath indexPathForRow:index inSection:0]];
4546
}
4647
}];

ObjectiveGoal/ViewModel/MatchesViewModel.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ - (instancetype)initWithAPIClient:(APIClient *)apiClient {
5252

5353
_contentChangesSignal = [updatedContentSignal
5454
combinePreviousWithStart:@[] reduce:^(NSArray *previousMatches, NSArray *currentMatches) {
55-
return [Changeset changesetFromMatches:previousMatches toMatches:currentMatches];
55+
return [Changeset changesetOfIndexPathsFromItems:previousMatches toItems:currentMatches];
5656
}];
5757

5858
_refreshIndicatorVisibleSignal = [RACSignal merge:@[

ObjectiveGoalTests/ChangesetTests.m

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
//
2+
// ChangesetTests.m
3+
// ObjectiveGoal
4+
//
5+
// Created by Martin Richter on 05/02/15.
6+
// Copyright (c) 2015 Martin Richter. All rights reserved.
7+
//
8+
9+
#import <XCTest/XCTest.h>
10+
#import <UIKit/UITableView.h>
11+
#import "Changeset.h"
12+
13+
@interface ChangesetTests : XCTestCase
14+
15+
@end
16+
17+
@implementation ChangesetTests
18+
19+
- (void)testChangesetBetweenEmptyArrays
20+
{
21+
Changeset *changeset = [Changeset changesetOfIndexPathsFromItems:@[] toItems:@[]];
22+
23+
XCTAssertEqual(changeset.deletions.count, 0);
24+
XCTAssertEqual(changeset.insertions.count, 0);
25+
}
26+
27+
- (void)testChangesetFromEmptyToNonEmptyArray
28+
{
29+
Changeset *changeset = [Changeset changesetOfIndexPathsFromItems:@[] toItems:@[[NSObject new]]];
30+
31+
XCTAssertEqual(changeset.deletions.count, 0);
32+
XCTAssertEqual(changeset.insertions.count, 1);
33+
XCTAssertEqual(changeset.insertions.firstObject, [NSIndexPath indexPathForRow:0 inSection:0]);
34+
}
35+
36+
- (void)testChangesetFromNonEmptyToEmptyArray
37+
{
38+
Changeset *changeset = [Changeset changesetOfIndexPathsFromItems:@[[NSObject new]] toItems:@[]];
39+
40+
XCTAssertEqual(changeset.deletions.count, 1);
41+
XCTAssertEqual(changeset.deletions.firstObject, [NSIndexPath indexPathForRow:0 inSection:0]);
42+
XCTAssertEqual(changeset.insertions.count, 0);
43+
}
44+
45+
- (void)testChangesetWithInsertedItems
46+
{
47+
NSObject *firstItem = [NSObject new];
48+
NSObject *secondItem = [NSObject new];
49+
NSObject *firstInsertedItem = [NSObject new];
50+
NSObject *secondInsertedItem = [NSObject new];
51+
52+
Changeset *changeset = [Changeset
53+
changesetOfIndexPathsFromItems:@[firstItem, secondItem]
54+
toItems:@[firstItem, firstInsertedItem, secondItem, secondInsertedItem]];
55+
56+
XCTAssertEqual(changeset.deletions.count, 0);
57+
XCTAssertEqual(changeset.insertions.count, 2);
58+
XCTAssertEqual(changeset.insertions[0], [NSIndexPath indexPathForRow:1 inSection:0]);
59+
XCTAssertEqual(changeset.insertions[1], [NSIndexPath indexPathForRow:3 inSection:0]);
60+
}
61+
62+
- (void)testChangesetWithDeletedItems
63+
{
64+
NSObject *firstItem = [NSObject new];
65+
NSObject *secondItem = [NSObject new];
66+
NSObject *thirdItem = [NSObject new];
67+
NSObject *fourthItem = [NSObject new];
68+
69+
Changeset *changeset = [Changeset
70+
changesetOfIndexPathsFromItems:@[firstItem, secondItem, thirdItem, fourthItem]
71+
toItems:@[firstItem, thirdItem]];
72+
73+
XCTAssertEqual(changeset.deletions.count, 2);
74+
XCTAssertEqual(changeset.deletions[0], [NSIndexPath indexPathForRow:1 inSection:0]);
75+
XCTAssertEqual(changeset.deletions[1], [NSIndexPath indexPathForRow:3 inSection:0]);
76+
XCTAssertEqual(changeset.insertions.count, 0);
77+
}
78+
79+
- (void)testChangesetWithDeletedAndInsertedItems
80+
{
81+
NSObject *firstItem = [NSObject new];
82+
NSObject *secondItem = [NSObject new];
83+
NSObject *thirdItem = [NSObject new];
84+
NSObject *fourthItem = [NSObject new];
85+
86+
NSObject *firstInsertedItem = [NSObject new];
87+
NSObject *secondInsertedItem = [NSObject new];
88+
89+
Changeset *changeset = [Changeset
90+
changesetOfIndexPathsFromItems:@[firstItem, secondItem, thirdItem, fourthItem]
91+
toItems:@[firstInsertedItem, firstItem, secondInsertedItem, thirdItem]];
92+
93+
XCTAssertEqual(changeset.deletions.count, 2);
94+
XCTAssertEqual(changeset.deletions[0], [NSIndexPath indexPathForRow:1 inSection:0]);
95+
XCTAssertEqual(changeset.deletions[1], [NSIndexPath indexPathForRow:3 inSection:0]);
96+
97+
XCTAssertEqual(changeset.insertions.count, 2);
98+
XCTAssertEqual(changeset.insertions[0], [NSIndexPath indexPathForRow:0 inSection:0]);
99+
XCTAssertEqual(changeset.insertions[1], [NSIndexPath indexPathForRow:2 inSection:0]);
100+
}
101+
102+
@end

0 commit comments

Comments
 (0)