Skip to content
Snippets Groups Projects
Commit ddc687d0 authored by Brian Terlson's avatar Brian Terlson
Browse files

Merge pull request #320 from bocoup/WeakSet

Add tests for WeakSet
parents 134c484a b898493f
No related branches found
No related tags found
No related merge requests found
Showing
with 486 additions and 0 deletions
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
Throws TypeError if add is not callable on constructor call.
info: >
23.4.1.1 WeakSet ( [ iterable ] )
...
5. If iterable is not present, let iterable be undefined.
6. If iterable is either undefined or null, let iter be undefined.
7. Else,
a. Let adder be Get(set, "add").
b. ReturnIfAbrupt(adder).
c. If IsCallable(adder) is false, throw a TypeError exception.
...
---*/
WeakSet.prototype.add = null;
new WeakSet();
assert.throws(TypeError, function() {
new WeakSet([]);
});
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1
description: >
The WeakSet constructor is the %WeakSet% intrinsic object and the initial
value of the WeakSet property of the global object.
---*/
assert.sameValue(
typeof WeakSet, 'function',
'typeof WeakSet is "function"'
);
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
If the iterable argument is empty, return new Weakset object.
info: >
23.4.1.1 WeakSet ( [ iterable ] )
...
9. Repeat
a. Let next be IteratorStep(iter).
b. ReturnIfAbrupt(next).
c. If next is false, return set.
...
---*/
var counter = 0;
var add = WeakSet.prototype.add;
WeakSet.prototype.add = function(value) {
counter++;
return add.call(this, value);
};
var set = new WeakSet([]);
assert.sameValue(Object.getPrototypeOf(set), WeakSet.prototype);
assert(set instanceof WeakSet);
assert.sameValue(
counter, 0,
'empty iterable does not call WeakSet.prototype.add'
);
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
Return abrupt after getting `add` method.
info: >
23.4.1.1 WeakSet ( [ iterable ] )
...
5. If iterable is not present, let iterable be undefined.
6. If iterable is either undefined or null, let iter be undefined.
7. Else,
a. Let adder be Get(set, "add").
b. ReturnIfAbrupt(adder).
...
---*/
Object.defineProperty(WeakSet.prototype, 'add', {
get: function() {
throw new Test262Error();
}
});
new WeakSet();
new WeakSet(null);
assert.throws(Test262Error, function() {
new WeakSet([]);
});
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
If the iterable argument is undefined, return new Weakset object.
info: >
23.4.1.1 WeakSet ( [ iterable ] )
...
7. Else,
d. Let iter be GetIterator(iterable).
e. ReturnIfAbrupt(iter).
...
---*/
assert.throws(TypeError, function() {
new WeakSet({});
});
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
Returns the new WeakSet adding the objects from the iterable parameter.
info: >
WeakSet ( [ iterable ] )
...
9. Repeat
f. Let status be Call(adder, set, «nextValue»).
g. If status is an abrupt completion, return IteratorClose(iter, status).
includes: [compareArray.js]
---*/
var first = {};
var second = {};
var added = [];
var add = WeakSet.prototype.add;
WeakSet.prototype.add = function(value) {
added.push(value);
return add.call(this, value);
};
var s = new WeakSet([first, second]);
assert.sameValue(added.length, 2, 'Called WeakSet#add for each object');
assert.sameValue(added[0], first, 'Adds object in order - first');
assert.sameValue(added[1], second, 'Adds object in order - second');
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
Return IteratorClose(iter, status) if fail on adding value on constructing.
info: >
WeakSet ( [ iterable ] )
...
9. Repeat
f. Let status be Call(adder, set, «nextValue»).
g. If status is an abrupt completion, return IteratorClose(iter, status).
---*/
var count = 0;
var iterable = {};
iterable[Symbol.iterator] = function() {
return {
next: function() {
return { value: null, done: false };
},
return: function() {
count += 1;
}
};
};
WeakSet.prototype.add = function() { throw new Test262Error(); };
assert.throws(Test262Error, function() {
new WeakSet(iterable);
});
assert.sameValue(
count, 1,
'The iterator is closed when `WeakSet.prototype.add` throws an error.'
);
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
Return abrupt from next iterator step.
info: >
23.4.1.1 WeakSet ( [ iterable ] )
...
9. Repeat
a. Let next be IteratorStep(iter).
b. ReturnIfAbrupt(next).
...
---*/
var iterable = {};
iterable[Symbol.iterator] = function() {
return {
next: function() {
throw new Test262Error();
}
};
};
assert.throws(Test262Error, function() {
new WeakSet(iterable);
});
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
If the iterable argument is empty, return new Weakset object.
info: >
23.4.1.1 WeakSet ( [ iterable ] )
...
9. Repeat
...
d. Let nextValue be IteratorValue(next).
e. ReturnIfAbrupt(nextValue).
---*/
var count = 0;
var iterable = {};
iterable[Symbol.iterator] = function() {
return {
next: function() {
return {
get value() {
throw new Test262Error();
},
done: false
};
}
};
};
assert.throws(Test262Error, function() {
new WeakSet(iterable);
});
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.2
description: >
The length property of the WeakSet constructor is 0.
includes: [propertyHelper.js]
---*/
assert.sameValue(WeakSet.length, 0, 'The value of `WeakSet.length` is `0`');
verifyNotEnumerable(WeakSet, 'length');
verifyNotWritable(WeakSet, 'length');
verifyConfigurable(WeakSet, 'length');
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
WeakSet ( [ iterable ] )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
WeakSet.name, 'WeakSet',
'The value of `WeakSet.name` is "WeakSet"'
);
verifyNotEnumerable(WeakSet, 'name');
verifyNotWritable(WeakSet, 'name');
verifyConfigurable(WeakSet, 'name');
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.1.1
description: >
If the iterable argument is undefined, return new Weakset object.
info: >
23.4.1.1 WeakSet ( [ iterable ] )
...
5. If iterable is not present, let iterable be undefined.
6. If iterable is either undefined or null, let iter be undefined.
...
8. If iter is undefined, return set.
...
---*/
var a = new WeakSet();
var b = new WeakSet(undefined);
var c = new WeakSet(null);
assert.sameValue(Object.getPrototypeOf(a), WeakSet.prototype);
assert.sameValue(Object.getPrototypeOf(b), WeakSet.prototype);
assert.sameValue(Object.getPrototypeOf(c), WeakSet.prototype);
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.3
description: >
The WeakSet.prototype's prototype is Object.prototype.
info: >
23.4.3 Properties of the WeakSet Prototype Object
The WeakSet prototype object is the intrinsic object %WeakSetPrototype%. The
value of the [[Prototype]] internal slot of the WeakSet prototype object is
the intrinsic object %ObjectPrototype% (19.1.3). The WeakSet prototype
object is an ordinary object. It does not have a [[WeakSetData]] internal
slot.
---*/
assert.sameValue(
Object.getPrototypeOf(WeakSet.prototype),
Object.prototype,
'`Object.getPrototypeOf(WeakSet.prototype)` returns `Object.prototype`'
);
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.2
description: >
The value of the [[Prototype]] internal slot of the WeakSet constructor
is the intrinsic object %FunctionPrototype% (19.2.3).
---*/
assert.sameValue(
Object.getPrototypeOf(WeakSet),
Function.prototype,
'`Object.getPrototypeOf(WeakSet)` returns `Function.prototype`'
);
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.3.5
description: "WeakSet#@@toStringTag value and writability"
info: >
23.4.3.5 WeakSet.prototype [ @@toStringTag ]
The initial value of the @@toStringTag property is the string value
"WeakSet".
This property has the attributes { [[Writable]]: false, [[Enumerable]]:
false, [[Configurable]]: true }.
includes: [propertyHelper.js]
---*/
var WeakSetProto = WeakSet.prototype;
assert.sameValue(
WeakSetProto[Symbol.toStringTag],
'WeakSet',
'The value of WeakSet.prototype[Symbol.toStringTag] is "WeakSet"'
);
verifyNotEnumerable(WeakSetProto, Symbol.toStringTag);
verifyNotWritable(WeakSetProto, Symbol.toStringTag);
verifyConfigurable(WeakSetProto, Symbol.toStringTag);
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.3.1
description: WeakSet.prototype.add property descriptor
info: >
WeakSet.prototype.add ( value )
17 ECMAScript Standard Built-in Objects
includes: [propertyHelper.js]
---*/
assert.sameValue(
typeof WeakSet.prototype.add,
'function',
'typeof WeakSet.prototype.add is "function"'
);
verifyNotEnumerable(WeakSet.prototype, 'add');
verifyWritable(WeakSet.prototype, 'add');
verifyConfigurable(WeakSet.prototype, 'add');
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.3.1
description: >
Appends value as the last element of entries.
info: >
WeakSet.prototype.add ( value )
...
7. Append value as the last element of entries.
...
---*/
var s = new WeakSet();
var foo = {};
var bar = {};
var baz = {};
s.add(foo);
s.add(bar);
s.add(baz);
assert(s.has(foo));
assert(s.has(bar));
assert(s.has(baz));
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.3.1
description: >
Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
info: >
WeakSet.prototype.add ( value )
...
3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
exception.
...
---*/
assert.throws(TypeError, function() {
WeakSet.prototype.add.call([], {});
});
assert.throws(TypeError, function() {
var s = new WeakSet();
s.add.call([], {});
});
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.3.1
description: >
Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
info: >
WeakSet.prototype.add ( value )
...
3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
exception.
...
---*/
assert.throws(TypeError, function() {
WeakSet.prototype.add.call(new Map(), {});
});
assert.throws(TypeError, function() {
var s = new WeakSet();
s.add.call(new Map(), {});
});
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 23.4.3.1
description: >
Throws TypeError if context doesn't have a [[WeakSetData]] internal slot.
info: >
WeakSet.prototype.add ( value )
...
3. If S does not have a [[WeakSetData]] internal slot, throw a TypeError
exception.
...
---*/
assert.throws(TypeError, function() {
WeakSet.prototype.add.call({}, {});
});
assert.throws(TypeError, function() {
var s = new WeakSet();
s.add.call({}, {});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment