blob: e85d76d550cc4df061c3b272d5ac44f0d837a41d [file] [log] [blame] [edit]
//
// RACTupleSpec.m
// ReactiveCocoa
//
// Created by Justin Spahr-Summers on 2012-12-12.
// Copyright (c) 2012 GitHub, Inc. All rights reserved.
//
#import "RACTuple.h"
#import "RACUnit.h"
SpecBegin(RACTuple)
describe(@"RACTupleUnpack", ^{
it(@"should unpack a single value", ^{
RACTupleUnpack(RACUnit *value) = [RACTuple tupleWithObjects:RACUnit.defaultUnit, nil];
expect(value).to.equal(RACUnit.defaultUnit);
});
it(@"should translate RACTupleNil", ^{
RACTupleUnpack(id value) = [RACTuple tupleWithObjects:RACTupleNil.tupleNil, nil];
expect(value).to.beNil();
});
it(@"should unpack multiple values", ^{
RACTupleUnpack(NSString *str, NSNumber *num) = [RACTuple tupleWithObjects:@"foobar", @5, nil];
expect(str).to.equal(@"foobar");
expect(num).to.equal(@5);
});
it(@"should fill in missing values with nil", ^{
RACTupleUnpack(NSString *str, NSNumber *num) = [RACTuple tupleWithObjects:@"foobar", nil];
expect(str).to.equal(@"foobar");
expect(num).to.beNil();
});
it(@"should skip any values not assigned to", ^{
RACTupleUnpack(NSString *str, NSNumber *num) = [RACTuple tupleWithObjects:@"foobar", @5, RACUnit.defaultUnit, nil];
expect(str).to.equal(@"foobar");
expect(num).to.equal(@5);
});
it(@"should keep an unpacked value alive when captured in a block", ^{
__weak id weakPtr = nil;
id (^block)(void) = nil;
@autoreleasepool {
RACTupleUnpack(NSString *str) = [RACTuple tupleWithObjects:[[NSMutableString alloc] init], nil];
weakPtr = str;
expect(weakPtr).notTo.beNil();
block = [^{
return str;
} copy];
}
expect(weakPtr).notTo.beNil();
expect(block()).to.equal(weakPtr);
});
});
describe(@"RACTuplePack", ^{
it(@"should pack a single value", ^{
RACTuple *tuple = [RACTuple tupleWithObjects:RACUnit.defaultUnit, nil];
expect(RACTuplePack(RACUnit.defaultUnit)).to.equal(tuple);
});
it(@"should translate nil", ^{
RACTuple *tuple = [RACTuple tupleWithObjects:RACTupleNil.tupleNil, nil];
expect(RACTuplePack(nil)).to.equal(tuple);
});
it(@"should pack multiple values", ^{
NSString *string = @"foobar";
NSNumber *number = @5;
RACTuple *tuple = [RACTuple tupleWithObjects:string, number, nil];
expect(RACTuplePack(string, number)).to.equal(tuple);
});
});
describe(@"-tupleByAddingObject:", ^{
__block RACTuple *tuple;
beforeEach(^{
tuple = RACTuplePack(@"foo", nil, @"bar");
});
it(@"should add a non-nil object", ^{
RACTuple *newTuple = [tuple tupleByAddingObject:@"buzz"];
expect(newTuple.count).to.equal(4);
expect(newTuple[0]).to.equal(@"foo");
expect(newTuple[1]).to.beNil();
expect(newTuple[2]).to.equal(@"bar");
expect(newTuple[3]).to.equal(@"buzz");
});
it(@"should add nil", ^{
RACTuple *newTuple = [tuple tupleByAddingObject:nil];
expect(newTuple.count).to.equal(4);
expect(newTuple[0]).to.equal(@"foo");
expect(newTuple[1]).to.beNil();
expect(newTuple[2]).to.equal(@"bar");
expect(newTuple[3]).to.beNil();
});
it(@"should add NSNull", ^{
RACTuple *newTuple = [tuple tupleByAddingObject:NSNull.null];
expect(newTuple.count).to.equal(4);
expect(newTuple[0]).to.equal(@"foo");
expect(newTuple[1]).to.beNil();
expect(newTuple[2]).to.equal(@"bar");
expect(newTuple[3]).to.equal(NSNull.null);
});
});
SpecEnd