Skip to content

Commit

Permalink
add tests for "iterator helpers close receiver on argument validation…
Browse files Browse the repository at this point in the history
… failure" (#4350)

* add tests for "iterator helpers close receiver on argument validation failure"

* address comments

* avoid re-using Test262Error
  • Loading branch information
bakkot authored Feb 4, 2025
1 parent d8e2cb2 commit d405213
Show file tree
Hide file tree
Showing 11 changed files with 380 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.drop
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.drop ( limit )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(RangeError, function() {
closable.drop();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(RangeError, function() {
closable.drop(NaN);
});
assert.sameValue(closed, true);

closed = false;
assert.throws(RangeError, function() {
closable.drop(-1);
});
assert.sameValue(closed, true);

closed = false;
class ShouldNotGetValueOf {}
assert.throws(ShouldNotGetValueOf, function() {
closable.drop({ get valueOf() { throw new ShouldNotGetValueOf(); }});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.every
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.every ( predicate )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.every();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.every({});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.filter
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.filter ( predicate )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.filter();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.filter({});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.find
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.find ( predicate )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.find();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.find({});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.flatMap
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.flatMap ( mapper )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.flatMap();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.flatMap({});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.forEach
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.forEach ( predicate )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.forEach();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.forEach({});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.map
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.map ( mapper )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.map();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.map({});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.reduce
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.reduce ( reducer, [ initialValue ] )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.reduce();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.reduce({});
});
assert.sameValue(closed, true);
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ features: [iterator-helpers]
flags: []
---*/
let nonCallable = {};
let iterator = (function* () {
function* gen() {
yield 1;
})();
}

assert.throws(TypeError, function () {
iterator.reduce(nonCallable);
gen().reduce(nonCallable);
});

iterator.reduce(() => {});
gen().reduce(() => {});
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright (C) 2024 Kevin Gibbons. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-iteratorprototype.some
description: >
Underlying iterator is closed when argument validation fails
info: |
%Iterator.prototype%.some ( predicate )
features: [iterator-helpers]
flags: []
---*/

let closed = false;
let closable = {
__proto__: Iterator.prototype,
get next() {
throw new Test262Error('next should not be read');
},
return() {
closed = true;
return {};
},
};

assert.throws(TypeError, function() {
closable.some();
});
assert.sameValue(closed, true);

closed = false;
assert.throws(TypeError, function() {
closable.some({});
});
assert.sameValue(closed, true);
Loading

0 comments on commit d405213

Please sign in to comment.