ComponentKitTests/TransactionalDataSource/CKDataSourceChangesetTests.mm (168 lines of code) (raw):
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
#import <XCTest/XCTest.h>
#import <UIKit/UIKit.h>
#import <ComponentKit/CKDataSourceChangesetInternal.h>
#import <ComponentKitTestHelpers/CKChangesetHelpers.h>
@interface CKDataSourceChangesetTests : XCTestCase
@end
@implementation CKDataSourceChangesetTests
- (void)testChangesetEquality
{
CKDataSourceChangeset *firstChangeset =
[[CKDataSourceChangeset alloc] initWithUpdatedItems:@{[NSIndexPath indexPathForItem:0 inSection:0] : @"A"}
removedItems:[NSSet setWithObject:[NSIndexPath indexPathForItem:1 inSection:0]]
removedSections:[NSIndexSet indexSetWithIndex:2]
movedItems:@{[NSIndexPath indexPathForItem:2 inSection:0] : [NSIndexPath indexPathForItem:3 inSection:0]}
insertedSections:[NSIndexSet indexSetWithIndex:1]
insertedItems:@{[NSIndexPath indexPathForItem:0 inSection:1] : @"B"}];
CKDataSourceChangeset *secondChangeset =
[[CKDataSourceChangeset alloc] initWithUpdatedItems:@{[NSIndexPath indexPathForItem:0 inSection:0] : @"A"}
removedItems:[NSSet setWithObject:[NSIndexPath indexPathForItem:1 inSection:0]]
removedSections:[NSIndexSet indexSetWithIndex:2]
movedItems:@{[NSIndexPath indexPathForItem:2 inSection:0] : [NSIndexPath indexPathForItem:3 inSection:0]}
insertedSections:[NSIndexSet indexSetWithIndex:1]
insertedItems:@{[NSIndexPath indexPathForItem:0 inSection:1] : @"B"}];
XCTAssertEqualObjects(firstChangeset, secondChangeset);
}
- (void)testChangesetsNotEqual
{
CKDataSourceChangeset *firstChangeset =
[[CKDataSourceChangeset alloc] initWithUpdatedItems:@{[NSIndexPath indexPathForItem:0 inSection:0] : @"A"}
removedItems:[NSSet setWithObject:[NSIndexPath indexPathForItem:1 inSection:0]]
removedSections:[NSIndexSet indexSetWithIndex:2]
movedItems:@{[NSIndexPath indexPathForItem:2 inSection:0] : [NSIndexPath indexPathForItem:3 inSection:0]}
insertedSections:[NSIndexSet indexSetWithIndex:1]
insertedItems:@{[NSIndexPath indexPathForItem:0 inSection:1] : @"B"}];
CKDataSourceChangeset *secondChangeset =
[[CKDataSourceChangeset alloc] initWithUpdatedItems:@{[NSIndexPath indexPathForItem:0 inSection:0] : @"A"}
removedItems:[NSSet setWithObject:[NSIndexPath indexPathForItem:1 inSection:0]]
removedSections:[NSIndexSet indexSetWithIndex:2]
movedItems:@{[NSIndexPath indexPathForItem:2 inSection:0] : [NSIndexPath indexPathForItem:3 inSection:0]}
insertedSections:[NSIndexSet indexSetWithIndex:1]
insertedItems:@{[NSIndexPath indexPathForItem:0 inSection:1] : @"C"}];
XCTAssertNotEqualObjects(firstChangeset, secondChangeset);
}
- (void)testChangesetIsEmpty
{
XCTAssertTrue([[CKDataSourceChangesetBuilder dataSourceChangeset] build].isEmpty);
XCTAssertFalse([[[CKDataSourceChangesetBuilder dataSourceChangeset]
withInsertedItems:@{[NSIndexPath indexPathForItem:0 inSection:0] : @"A"}] build].isEmpty);
XCTAssertFalse([[[CKDataSourceChangesetBuilder dataSourceChangeset]
withRemovedItems:[NSSet setWithObject:[NSIndexPath indexPathForItem:1 inSection:0]]] build].isEmpty);
XCTAssertFalse([[[CKDataSourceChangesetBuilder dataSourceChangeset]
withRemovedSections:[NSIndexSet indexSetWithIndex:2]] build].isEmpty);
XCTAssertFalse([[[CKDataSourceChangesetBuilder dataSourceChangeset]
withUpdatedItems:@{[NSIndexPath indexPathForItem:2 inSection:0] : [NSIndexPath indexPathForItem:3 inSection:0]}] build].isEmpty);
XCTAssertFalse([[[CKDataSourceChangesetBuilder dataSourceChangeset]
withInsertedSections:[NSIndexSet indexSetWithIndex:1]] build].isEmpty);
XCTAssertFalse([[[CKDataSourceChangesetBuilder dataSourceChangeset]
withInsertedItems:@{[NSIndexPath indexPathForItem:0 inSection:1] : @"C"}] build].isEmpty);
}
- (void)testOriginName {
NSString *testOrigin = @"test_origin";
XCTAssertEqualObjects([[CKDataSourceChangesetBuilder dataSourceChangesetWithOriginName:testOrigin] build].originName, testOrigin);
}
@end
@interface CKDataSourceChangesetTests_Description: XCTestCase
@end
@implementation CKDataSourceChangesetTests_Description
- (void)test_WhenChangesetIsEmpty_DescriptionIsEmpty
{
const auto cs = CK::makeChangeset({});
XCTAssertEqualObjects(CK::changesetDescription(cs), @"");
}
- (void)test_WhenChangesetHasSectionChanges_IncludesThemInDescription
{
const auto cs = CK::makeChangeset({
.removedSections = {0, 1},
.insertedSections = {0},
});
const auto expectedDescription =
@"\
{\n\
Removed Sections: 0–1\n\
Inserted Sections: 0\n\
}";
XCTAssertEqualObjects(CK::changesetDescription(cs), expectedDescription);
}
- (void)test_WhenChangesetIncludesOnlyOneTypeOfSectionChange_IncludesOnlyItInDescription
{
const auto cs = CK::makeChangeset({
.removedSections = {0, 1},
});
const auto expectedDescription =
@"\
{\n\
Removed Sections: 0–1\n\
}";
XCTAssertEqualObjects(CK::changesetDescription(cs), expectedDescription);
}
- (void)test_WhenChangesetHasRemovedItems_IncludesThemInDescriptionSorted
{
const auto cs = CK::makeChangeset({
.removedItems = {{1, 1}, {0, 2}},
});
const auto expectedDescription =
@"\
{\n\
Removed Items: {\n\
(0-2),\n\
(1-1)\n\
}\n\
}";
XCTAssertEqualObjects(CK::changesetDescription(cs), expectedDescription);
}
- (void)test_WhenChangesetHasUpdatedItems_IncludesThemInDescriptionSorted
{
const auto cs = CK::makeChangeset({
.updatedItems = {
{{1, 1}, @"A"},
{{0, 2}, @"B"},
},
});
const auto expectedDescription =
@"\
{\n\
Updated Items: {\n\
(0-2): B,\n\
(1-1): A\n\
}\n\
}";
XCTAssertEqualObjects(CK::changesetDescription(cs), expectedDescription);
}
- (void)test_WhenChangesetHasInsertedItems_IncludesThemInDescriptionSorted
{
const auto cs = CK::makeChangeset({
.insertedItems = {
{{1, 1}, @"A"},
{{0, 2}, @"B"},
},
});
const auto expectedDescription =
@"\
{\n\
Inserted Items: {\n\
(0-2): B,\n\
(1-1): A\n\
}\n\
}";
XCTAssertEqualObjects(CK::changesetDescription(cs), expectedDescription);
}
- (void)test_WhenChangesetHasMovedItems_IncludesThemInDescriptionSortedByFromIndexPath
{
const auto cs = CK::makeChangeset({
.movedItems = {
{{1, 1}, {1, 2}},
{{0, 2}, {0, 0}},
},
});
const auto expectedDescription =
@"\
{\n\
Moved Items: {\n\
(0-2) → (0-0),\n\
(1-1) → (1-2)\n\
}\n\
}";
XCTAssertEqualObjects(CK::changesetDescription(cs), expectedDescription);
}
@end