Add non-enumerable symbol tests.

This commit is contained in:
John-David Dalton
2016-11-24 00:04:48 -06:00
parent 67926a4df2
commit ec74813be6

View File

@@ -2925,7 +2925,7 @@
}); });
QUnit.test('`_.' + methodName + '` should clone symbol properties', function(assert) { QUnit.test('`_.' + methodName + '` should clone symbol properties', function(assert) {
assert.expect(3); assert.expect(7);
function Foo() { function Foo() {
this[symbol] = { 'c': 1 }; this[symbol] = { 'c': 1 };
@@ -2935,24 +2935,33 @@
var symbol2 = Symbol('b'); var symbol2 = Symbol('b');
Foo.prototype[symbol2] = 2; Foo.prototype[symbol2] = 2;
var symbol3 = Symbol('c');
defineProperty(Foo.prototype, symbol3, {
'configurable': true,
'enumerable': false,
'writable': true,
'value': 3
});
var object = { 'a': { 'b': new Foo } }; var object = { 'a': { 'b': new Foo } };
object[symbol] = { 'b': 1 }; object[symbol] = { 'b': 1 };
var actual = func(object); var actual = func(object);
assert.deepEqual(getSymbols(actual.a.b), [symbol]);
if (isDeep) { if (isDeep) {
assert.deepEqual(actual[symbol], object[symbol]); assert.notStrictEqual(actual[symbol], object[symbol]);
assert.deepEqual(actual.a.b[symbol], object.a.b[symbol]); assert.notStrictEqual(actual.a, object.a);
} } else {
else {
assert.strictEqual(actual[symbol], object[symbol]); assert.strictEqual(actual[symbol], object[symbol]);
assert.strictEqual(actual.a, object.a); assert.strictEqual(actual.a, object.a);
} }
assert.deepEqual(actual[symbol], object[symbol]);
assert.deepEqual(getSymbols(actual.a.b), [symbol]);
assert.deepEqual(actual.a.b[symbol], object.a.b[symbol]);
assert.deepEqual(actual.a.b[symbol2], object.a.b[symbol2]);
assert.deepEqual(actual.a.b[symbol3], object.a.b[symbol3])
} }
else { else {
skipAssert(assert, 3); skipAssert(assert, 7);
} }
}); });
@@ -7363,8 +7372,8 @@
pass = true; pass = true;
defineProperty(object, 'a', { defineProperty(object, 'a', {
'enumerable': true,
'configurable': true, 'configurable': true,
'enumerable': true,
'get': lodashStable.constant(value), 'get': lodashStable.constant(value),
'set': function() { pass = false; } 'set': function() { pass = false; }
}); });
@@ -7846,21 +7855,27 @@
}); });
QUnit.test('`_.' + methodName + '` should work with a symbol `path`', function(assert) { QUnit.test('`_.' + methodName + '` should work with a symbol `path`', function(assert) {
assert.expect(1); assert.expect(2);
function Foo() { function Foo() {}
this[symbol] = 1;
}
if (Symbol) { if (Symbol) {
var symbol2 = Symbol('b'); Foo.prototype[symbol] = 1;
Foo.prototype[symbol2] = 2;
var path = isHas ? symbol : symbol2;
assert.strictEqual(func(new Foo, path), true); var symbol2 = Symbol('b');
defineProperty(Foo.prototype, symbol2, {
'configurable': true,
'enumerable': false,
'writable': true,
'value': 2
});
var object = isHas ? Foo.prototype : new Foo;
assert.strictEqual(func(object, symbol), true);
assert.strictEqual(func(object, symbol2), true);
} }
else { else {
skipAssert(assert); skipAssert(assert, 2);
} }
}); });
@@ -10114,14 +10129,22 @@
var object1 = { 'a': 1 }, var object1 = { 'a': 1 },
object2 = { 'a': 1 }; object2 = { 'a': 1 };
object1[symbol] = { 'a': { 'b': 2 } }; object1[symbol1] = { 'a': { 'b': 2 } };
object2[symbol] = { 'a': { 'b': 2 } }; object2[symbol1] = { 'a': { 'b': 2 } };
defineProperty(object2, symbol2, {
'configurable': true,
'enumerable': false,
'writable': true,
'value': 2
});
assert.strictEqual(_.isEqual(object1, object2), true); assert.strictEqual(_.isEqual(object1, object2), true);
object2[symbol] = { 'a': 1 }; object2[symbol1] = { 'a': 1 };
assert.strictEqual(_.isEqual(object1, object2), false); assert.strictEqual(_.isEqual(object1, object2), false);
delete object2[symbol]; delete object2[symbol1];
object2[Symbol('a')] = { 'a': { 'b': 2 } }; object2[Symbol('a')] = { 'a': { 'b': 2 } };
assert.strictEqual(_.isEqual(object1, object2), false); assert.strictEqual(_.isEqual(object1, object2), false);
} }
@@ -15108,8 +15131,8 @@
pass = true; pass = true;
defineProperty(object, 'a', { defineProperty(object, 'a', {
'enumerable': true,
'configurable': true, 'configurable': true,
'enumerable': true,
'get': function() { pass = false; }, 'get': function() { pass = false; },
'set': function() { pass = false; } 'set': function() { pass = false; }
}); });
@@ -16499,7 +16522,7 @@
}); });
QUnit.test('`_.' + methodName + '` should include symbols', function(assert) { QUnit.test('`_.' + methodName + '` should include symbols', function(assert) {
assert.expect(2); assert.expect(3);
function Foo() { function Foo() {
this.a = 0; this.a = 0;
@@ -16510,19 +16533,28 @@
var symbol2 = Symbol('b'); var symbol2 = Symbol('b');
Foo.prototype[symbol2] = 2; Foo.prototype[symbol2] = 2;
var symbol3 = Symbol('c');
defineProperty(Foo.prototype, symbol3, {
'configurable': true,
'enumerable': false,
'writable': true,
'value': 3
});
var foo = new Foo, var foo = new Foo,
actual = func(foo, resolve(foo, 'a')); actual = func(foo, resolve(foo, 'a'));
assert.strictEqual(actual[symbol], 1); assert.strictEqual(actual[symbol], 1);
assert.strictEqual(actual[symbol2], 2); assert.strictEqual(actual[symbol2], 2);
assert.notOk(symbol3 in actual);
} }
else { else {
skipAssert(assert, 2); skipAssert(assert, 3);
} }
}); });
QUnit.test('`_.' + methodName + '` should create an object with omitted symbols', function(assert) { QUnit.test('`_.' + methodName + '` should create an object with omitted symbols', function(assert) {
assert.expect(6); assert.expect(8);
function Foo() { function Foo() {
this.a = 0; this.a = 0;
@@ -16533,21 +16565,31 @@
var symbol2 = Symbol('b'); var symbol2 = Symbol('b');
Foo.prototype[symbol2] = 2; Foo.prototype[symbol2] = 2;
var symbol3 = Symbol('c');
defineProperty(Foo.prototype, symbol3, {
'configurable': true,
'enumerable': false,
'writable': true,
'value': 3
});
var foo = new Foo, var foo = new Foo,
actual = func(foo, resolve(foo, symbol)); actual = func(foo, resolve(foo, symbol));
assert.strictEqual(actual.a, 0); assert.strictEqual(actual.a, 0);
assert.strictEqual(actual[symbol], undefined); assert.notOk(symbol in actual);
assert.strictEqual(actual[symbol2], 2); assert.strictEqual(actual[symbol2], 2);
assert.notOk(symbol3 in actual);
actual = func(foo, resolve(foo, symbol2)); actual = func(foo, resolve(foo, symbol2));
assert.strictEqual(actual.a, 0); assert.strictEqual(actual.a, 0);
assert.strictEqual(actual[symbol], 1); assert.strictEqual(actual[symbol], 1);
assert.strictEqual(actual[symbol2], undefined); assert.notOk(symbol2 in actual);
assert.notOk(symbol3 in actual);
} }
else { else {
skipAssert(assert, 6); skipAssert(assert, 8);
} }
}); });
@@ -17711,6 +17753,7 @@
lodashStable.each(['pick', 'pickBy'], function(methodName) { lodashStable.each(['pick', 'pickBy'], function(methodName) {
var expected = { 'a': 1, 'c': 3 }, var expected = { 'a': 1, 'c': 3 },
func = _[methodName], func = _[methodName],
isPick = methodName == 'pick',
object = { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }, object = { 'a': 1, 'b': 2, 'c': 3, 'd': 4 },
resolve = lodashStable.nthArg(1); resolve = lodashStable.nthArg(1);
@@ -17757,7 +17800,7 @@
}); });
QUnit.test('`_.' + methodName + '` should pick symbols', function(assert) { QUnit.test('`_.' + methodName + '` should pick symbols', function(assert) {
assert.expect(2); assert.expect(3);
function Foo() { function Foo() {
this[symbol] = 1; this[symbol] = 1;
@@ -17767,14 +17810,28 @@
var symbol2 = Symbol('b'); var symbol2 = Symbol('b');
Foo.prototype[symbol2] = 2; Foo.prototype[symbol2] = 2;
var symbol3 = Symbol('c');
defineProperty(Foo.prototype, symbol3, {
'configurable': true,
'enumerable': false,
'writable': true,
'value': 3
});
var foo = new Foo, var foo = new Foo,
actual = func(foo, resolve(foo, [symbol, symbol2])); actual = func(foo, resolve(foo, [symbol, symbol2, symbol3]));
assert.strictEqual(actual[symbol], 1); assert.strictEqual(actual[symbol], 1);
assert.strictEqual(actual[symbol2], 2); assert.strictEqual(actual[symbol2], 2);
if (isPick) {
assert.strictEqual(actual[symbol3], 3);
} else {
assert.notOk(symbol3 in actual);
}
} }
else { else {
skipAssert(assert, 2); skipAssert(assert, 3);
} }
}); });
@@ -20065,8 +20122,8 @@
updater = isUpdate ? lodashStable.constant(value) : value; updater = isUpdate ? lodashStable.constant(value) : value;
defineProperty(object, 'a', { defineProperty(object, 'a', {
'enumerable': true,
'configurable': true, 'configurable': true,
'enumerable': true,
'get': lodashStable.constant(value), 'get': lodashStable.constant(value),
'set': function() { pass = false; } 'set': function() { pass = false; }
}); });