react-native/Examples/UIExplorer/UIExplorerUnitTests/RCTCacheTests.m

169 lines
4.5 KiB
Objective-C

/**
* The examples provided by Facebook are for non-commercial testing and
* evaluation purposes only.
*
* Facebook reserves all rights not expressly granted.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#import <XCTest/XCTest.h>
#import "RCTCache.h"
// Silence silly sign warnings when using int literals
#pragma clang diagnostic ignored "-Wsign-compare"
@interface RCTCache (Private)
- (void)cleanUpAllObjects;
- (void)resequence;
- (NSDictionary *)cache;
- (void)setSequenceNumber:(NSInteger)number;
@end
@interface RCTCacheTests : XCTestCase
@property (nonatomic, strong) RCTCache *cache;
@end
@implementation RCTCacheTests
- (void)setUp
{
self.cache = [RCTCache new];
self.cache.countLimit = 3;
self.cache.totalCostLimit = 100;
}
- (void)tearDown
{
self.cache = nil;
}
- (void)testInsertion
{
[self.cache setObject:@1 forKey:@"foo" cost:1];
[self.cache setObject:@2 forKey:@"bar" cost:2];
[self.cache setObject:@3 forKey:@"baz" cost:3];
XCTAssertEqual([self.cache count], 3);
XCTAssertEqual([self.cache totalCost], 6);
}
- (void)testRemoval
{
[self.cache setObject:@1 forKey:@"foo" cost:1];
[self.cache setObject:@2 forKey:@"bar" cost:2];
[self.cache setObject:@3 forKey:@"baz" cost:3];
[self.cache removeObjectForKey:@"bar"];
XCTAssertEqual([self.cache count], 2);
XCTAssertNil([self.cache objectForKey:@"bar"]);
}
- (void)testCountEviction
{
[self.cache setObject:@1 forKey:@"foo"];
[self.cache setObject:@2 forKey:@"bar"];
[self.cache setObject:@3 forKey:@"baz"];
[self.cache setObject:@4 forKey:@"bam"];
XCTAssertEqual([self.cache count], 3);
XCTAssertNil([self.cache objectForKey:@"foo"]);
[self.cache setObject:@5 forKey:@"boo"];
XCTAssertEqual([self.cache count], 3);
XCTAssertNil([self.cache objectForKey:@"bar"]);
}
- (void)testCostEviction
{
[self.cache setObject:@1 forKey:@"foo" cost:99];
[self.cache setObject:@2 forKey:@"bar" cost:2];
XCTAssertEqual([self.cache count], 1);
XCTAssertEqual([self.cache totalCost], 2);
XCTAssertNil([self.cache objectForKey:@"foo"]);
[self.cache setObject:@3 forKey:@"baz" cost:999];
XCTAssertEqual([self.cache count], 0);
XCTAssertEqual([self.cache totalCost], 0);
}
- (void)testCleanup
{
[self.cache setObject:@1 forKey:@"foo"];
[self.cache setObject:@2 forKey:@"bar"];
[self.cache setObject:@3 forKey:@"baz"];
//simulate memory warning
[self.cache cleanUpAllObjects];
XCTAssertEqual([self.cache count], 0);
XCTAssertEqual([self.cache totalCost], 0);
}
- (void)testResequence
{
[self.cache setObject:@1 forKey:@"foo"];
[self.cache setObject:@2 forKey:@"bar"];
[self.cache setObject:@3 forKey:@"baz"];
[self.cache resequence];
NSDictionary *innerCache = [self.cache cache];
XCTAssertEqualObjects([innerCache[@"foo"] valueForKey:@"sequenceNumber"], @0);
XCTAssertEqualObjects([innerCache[@"bar"] valueForKey:@"sequenceNumber"], @1);
XCTAssertEqualObjects([innerCache[@"baz"] valueForKey:@"sequenceNumber"], @2);
[self.cache removeObjectForKey:@"foo"];
[self.cache resequence];
XCTAssertEqualObjects([innerCache[@"bar"] valueForKey:@"sequenceNumber"], @0);
XCTAssertEqualObjects([innerCache[@"baz"] valueForKey:@"sequenceNumber"], @1);
}
- (void)testResequenceTrigger
{
[self.cache setObject:@1 forKey:@"foo"];
[self.cache setObject:@2 forKey:@"bar"];
//first object should now be bar with sequence number of 1
[self.cache removeObjectForKey:@"foo"];
//should trigger resequence
[self.cache setSequenceNumber:NSIntegerMax];
[self.cache setObject:@3 forKey:@"baz"];
NSDictionary *innerCache = [self.cache cache];
XCTAssertEqualObjects([innerCache[@"bar"] valueForKey:@"sequenceNumber"], @0);
XCTAssertEqualObjects([innerCache[@"baz"] valueForKey:@"sequenceNumber"], @1);
//first object should now be baz with sequence number of 1
[self.cache removeObjectForKey:@"bar"];
//should also trigger resequence
[self.cache setSequenceNumber:NSIntegerMax];
[self.cache objectForKey:@"baz"];
XCTAssertEqualObjects([innerCache[@"baz"] valueForKey:@"sequenceNumber"], @0);
}
- (void)testName
{
self.cache.name = @"Hello";
XCTAssertEqualObjects(self.cache.name, @"Hello");
}
@end