Blob Blame History Raw
'use strict';
/* eslint-env mocha */
var assert = require('assert');

Object.assign = undefined;
var objectAssign = require('./');

it('should have the correct length', function () {
	assert.equal(objectAssign.length, 2);
});

it('should throw when target is not an object', function () {
	assert.throws(function () {
		objectAssign(null);
	}, TypeError);
	assert.throws(function () {
		objectAssign(undefined);
	}, TypeError);
});

it('should objectAssign own enumerable properties from source to target object', function () {
	assert.deepEqual(objectAssign({foo: 0}, {bar: 1}), {
		foo: 0,
		bar: 1
	});
	assert.deepEqual(objectAssign({foo: 0}, null, undefined), {foo: 0});
	assert.deepEqual(objectAssign({foo: 0}, null, undefined, {bar: 1}, null), {
		foo: 0,
		bar: 1
	});
});

it('should throw on null/undefined target', function () {
	assert.throws(function () {
		objectAssign(null, {});
	});

	assert.throws(function () {
		objectAssign(undefined, {});
	});

	assert.throws(function () {
		objectAssign(undefined, undefined);
	});
});

it('should not throw on null/undefined sources', function () {
	assert.doesNotThrow(function () {
		objectAssign({}, null);
	});

	assert.doesNotThrow(function () {
		objectAssign({}, undefined);
	});

	assert.doesNotThrow(function () {
		objectAssign({}, undefined, null);
	});
});

it('should support multiple sources', function () {
	assert.deepEqual(objectAssign({foo: 0}, {bar: 1}, {bar: 2}), {
		foo: 0,
		bar: 2
	});
	assert.deepEqual(objectAssign({}, {}, {foo: 1}), {foo: 1});
});

it('should only iterate own keys', function () {
	var Unicorn = function () {};
	Unicorn.prototype.rainbows = 'many';
	var unicorn = new Unicorn();
	unicorn.bar = 1;

	assert.deepEqual(objectAssign({foo: 1}, unicorn), {
		foo: 1,
		bar: 1
	});
});

it('should return the modified target object', function () {
	var target = {};
	var returned = objectAssign(target, {a: 1});
	assert.equal(returned, target);
});

it('should support `Object.create(null)` objects', function () {
	var obj = Object.create(null);
	obj.foo = true;
	assert.deepEqual(objectAssign({}, obj), {foo: true});
});

it('should preserve property order', function () {
	var letters = 'abcdefghijklmnopqrst';
	var source = {};
	letters.split('').forEach(function (letter) {
		source[letter] = letter;
	});
	var target = objectAssign({}, source);
	assert.equal(Object.keys(target).join(''), letters);
});

it('should accept primitives as target', function () {
	var target = objectAssign('abcdefg', {foo: 'bar'});
	var strObj = Object('abcdefg');
	strObj.foo = 'bar';
	assert.deepEqual(target, strObj);
});

if (typeof Symbol !== 'undefined') {
	it('should support symbol properties', function () {
		var target = {};
		var source = {};
		var sym = Symbol('foo');
		source[sym] = 'bar';
		objectAssign(target, source);
		assert.equal(target[sym], 'bar');
	});

	it('should only copy enumerable symbols', function () {
		var target = {};
		var source = {};
		var sym = Symbol('foo');
		Object.defineProperty(source, sym, {
			enumerable: false,
			value: 'bar'
		});
		objectAssign(target, source);
		assert.equal(target[sym], undefined);
	});
}