blob: e5b58340592653b79ea2c09743eb9e3aa351d3d6 [file] [log] [blame]
//
// RACSequenceAdditionsSpec.m
// ReactiveCocoa
//
// Created by Justin Spahr-Summers on 2012-11-01.
// Copyright (c) 2012 GitHub, Inc. All rights reserved.
//
#import "RACSequenceExamples.h"
#import "NSArray+RACSequenceAdditions.h"
#import "NSDictionary+RACSequenceAdditions.h"
#import "NSOrderedSet+RACSequenceAdditions.h"
#import "NSSet+RACSequenceAdditions.h"
#import "NSString+RACSequenceAdditions.h"
#import "NSIndexSet+RACSequenceAdditions.h"
#import "RACSequence.h"
#import "RACTuple.h"
SpecBegin(RACSequenceAdditions)
__block NSArray *numbers;
beforeEach(^{
NSMutableArray *mutableNumbers = [NSMutableArray array];
for (NSUInteger i = 0; i < 100; i++) {
[mutableNumbers addObject:@(i)];
}
numbers = [mutableNumbers copy];
});
describe(@"NSArray sequences", ^{
__block NSMutableArray *values;
__block RACSequence *sequence;
beforeEach(^{
values = [numbers mutableCopy];
sequence = values.rac_sequence;
expect(sequence).notTo.beNil();
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: values
};
});
describe(@"should be immutable", ^{
__block NSArray *unchangedValues;
beforeEach(^{
unchangedValues = [values copy];
[values addObject:@6];
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: unchangedValues
};
});
});
it(@"should fast enumerate after zipping", ^{
// This certain list of values causes issues, for some reason.
NSArray *values = @[ @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0, @0 ];
RACSequence *zippedSequence = [RACSequence zip:@[ values.rac_sequence, values.rac_sequence ] reduce:^(id obj1, id obj2) {
return obj1;
}];
NSMutableArray *collectedValues = [NSMutableArray array];
for (id value in zippedSequence) {
[collectedValues addObject:value];
}
expect(collectedValues).to.equal(values);
});
});
describe(@"NSDictionary sequences", ^{
__block NSMutableDictionary *dict;
__block NSMutableArray *tuples;
__block RACSequence *tupleSequence;
__block NSArray *keys;
__block RACSequence *keySequence;
__block NSArray *values;
__block RACSequence *valueSequence;
beforeEach(^{
dict = [@{
@"foo": @"bar",
@"baz": @"buzz",
@5: NSNull.null
} mutableCopy];
tuples = [NSMutableArray array];
for (id key in dict) {
RACTuple *tuple = [RACTuple tupleWithObjects:key, dict[key], nil];
[tuples addObject:tuple];
}
tupleSequence = dict.rac_sequence;
expect(tupleSequence).notTo.beNil();
keys = [dict.allKeys copy];
keySequence = dict.rac_keySequence;
expect(keySequence).notTo.beNil();
values = [dict.allValues copy];
valueSequence = dict.rac_valueSequence;
expect(valueSequence).notTo.beNil();
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: tupleSequence,
RACSequenceExampleExpectedValues: tuples
};
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: keySequence,
RACSequenceExampleExpectedValues: keys
};
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: valueSequence,
RACSequenceExampleExpectedValues: values
};
});
describe(@"should be immutable", ^{
beforeEach(^{
dict[@"foo"] = @"rab";
dict[@6] = @7;
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: tupleSequence,
RACSequenceExampleExpectedValues: tuples
};
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: keySequence,
RACSequenceExampleExpectedValues: keys
};
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: valueSequence,
RACSequenceExampleExpectedValues: values
};
});
});
});
describe(@"NSOrderedSet sequences", ^{
__block NSMutableOrderedSet *values;
__block RACSequence *sequence;
beforeEach(^{
values = [NSMutableOrderedSet orderedSetWithArray:numbers];
sequence = values.rac_sequence;
expect(sequence).notTo.beNil();
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: values.array
};
});
describe(@"should be immutable", ^{
__block NSArray *unchangedValues;
beforeEach(^{
unchangedValues = [values.array copy];
[values addObject:@6];
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: unchangedValues
};
});
});
});
describe(@"NSSet sequences", ^{
__block NSMutableSet *values;
__block RACSequence *sequence;
beforeEach(^{
values = [NSMutableSet setWithArray:numbers];
sequence = values.rac_sequence;
expect(sequence).notTo.beNil();
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: values.allObjects
};
});
describe(@"should be immutable", ^{
__block NSArray *unchangedValues;
beforeEach(^{
unchangedValues = [values.allObjects copy];
[values addObject:@6];
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: unchangedValues
};
});
});
});
describe(@"NSString sequences", ^{
__block NSMutableString *string;
__block NSArray *values;
__block RACSequence *sequence;
beforeEach(^{
string = [@"foobar" mutableCopy];
values = @[ @"f", @"o", @"o", @"b", @"a", @"r" ];
sequence = string.rac_sequence;
expect(sequence).notTo.beNil();
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: values
};
});
describe(@"should be immutable", ^{
beforeEach(^{
[string appendString:@"buzz"];
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: values
};
});
});
it(@"should work with composed characters", ^{
NSString *string = @"\u2665\uFE0F\u2666\uFE0F";
NSArray *expectedSequence = @[ @"\u2665\uFE0F", @"\u2666\uFE0F" ];
expect(string.rac_sequence.array).to.equal(expectedSequence);
});
});
describe(@"RACTuple sequences", ^{
__block RACTuple *tuple;
__block RACSequence *sequence;
beforeEach(^{
tuple = RACTuplePack(@"foo", nil, @"bar", NSNull.null, RACTupleNil.tupleNil);
sequence = tuple.rac_sequence;
expect(sequence).notTo.beNil();
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: @[ @"foo", NSNull.null, @"bar", NSNull.null, NSNull.null ]
};
});
});
describe(@"NSIndexSet sequences", ^{
__block NSMutableIndexSet *values;
__block RACSequence *sequence;
NSArray * (^valuesFromIndexSet)(NSIndexSet *indexSet) = ^NSArray *(NSIndexSet *indexSet) {
NSMutableArray *arr = [NSMutableArray array];
[values enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
[arr addObject:@(idx)];
}];
return [arr copy];
};
beforeEach(^{
values = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 10)];
sequence = values.rac_sequence;
expect(sequence).notTo.beNil();
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: valuesFromIndexSet(values)
};
});
describe(@"should be immutable", ^{
__block NSArray *unchangedValues;
beforeEach(^{
unchangedValues = valuesFromIndexSet(values);
[values addIndex:20];
});
itShouldBehaveLike(RACSequenceExamples, ^{
return @{
RACSequenceExampleSequence: sequence,
RACSequenceExampleExpectedValues: unchangedValues
};
});
});
});
SpecEnd