//
//  MTLDictionaryManipulationSpec.m
//  Mantle
//
//  Created by Justin Spahr-Summers on 2012-09-24.
//  Copyright (c) 2012 GitHub. All rights reserved.
//

SpecBegin(MTLDictionaryManipulationAdditions)

describe(@"-mtl_dictionaryByAddingEntriesFromDictionary:", ^{
	NSDictionary *dict = @{ @"foo": @"bar", @(5): NSNull.null };

	it(@"should return the same dictionary when adding from an empty dictionary", ^{
		NSDictionary *combined = [dict mtl_dictionaryByAddingEntriesFromDictionary:@{}];
		expect(combined).to.equal(dict);
	});

	it(@"should return the same dictionary when adding from nil", ^{
		NSDictionary *combined = [dict mtl_dictionaryByAddingEntriesFromDictionary:nil];
		expect(combined).to.equal(dict);
	});

	it(@"should add any new keys", ^{
		NSDictionary *combined = [dict mtl_dictionaryByAddingEntriesFromDictionary:@{ @"buzz": @(10), @"baz": NSNull.null }];
		NSDictionary *expected = @{ @"foo": @"bar", @(5): NSNull.null, @"buzz": @(10), @"baz": NSNull.null };
		expect(combined).to.equal(expected);
	});

	it(@"should replace any existing keys", ^{
		NSDictionary *combined = [dict mtl_dictionaryByAddingEntriesFromDictionary:@{ @(5): @(10), @"buzz": @"baz" }];
		NSDictionary *expected = @{ @"foo": @"bar", @(5): @(10), @"buzz": @"baz" };
		expect(combined).to.equal(expected);
	});
});

describe(@"-mtl_dictionaryByRemovingEntriesWithKeys:", ^{
	NSDictionary *dict = @{ @"foo": @"bar", @(5): NSNull.null };

	it(@"should return the same dictionary when removing keys that don't exist in the receiver", ^{
		NSDictionary *removed = [dict mtl_dictionaryByRemovingEntriesWithKeys:[NSSet setWithObject:@"hi"]];
		expect(removed).to.equal(dict);
	});

	it(@"should return the same dictionary when given a nil array of keys", ^{
		NSDictionary *removed = [dict mtl_dictionaryByRemovingEntriesWithKeys:nil];
		expect(removed).to.equal(dict);
	});

	it(@"should remove all the entries for the given keys", ^{
		NSDictionary *removed = [dict mtl_dictionaryByRemovingEntriesWithKeys:[NSSet setWithObject:@(5)]];
		NSDictionary *expected = @{ @"foo": @"bar" };
		expect(removed).to.equal(expected);
	});

	it(@"should return an empty dictionary when it removes all its keys", ^{
		NSDictionary *removed = [dict mtl_dictionaryByRemovingEntriesWithKeys:[NSSet setWithArray:dict.allKeys]];
		NSDictionary *expected = @{};
		expect(removed).to.equal(expected);
	});
});

SpecEnd
