1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 09:07:45 +00:00

LibJS: Implement %IteratorHelperPrototype%.return

This commit is contained in:
Timothy Flynn 2023-07-16 16:06:06 -04:00 committed by Linus Groh
parent 57e7112a20
commit 0e63d04a35
6 changed files with 263 additions and 6 deletions

View file

@ -49,6 +49,28 @@ describe("errors", () => {
iterator.next();
}).toThrow(TestError);
});
test("iterator's return method throws", () => {
function TestError() {}
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
throw new TestError();
}
}
expect(() => {
const iterator = new TestIterator().drop(1);
iterator.return();
}).toThrow(TestError);
});
});
describe("normal behavior", () => {
@ -115,4 +137,31 @@ describe("normal behavior", () => {
expect(value.value).toBeUndefined();
expect(value.done).toBeTrue();
});
test("return is forwarded to the underlying iterator's return method", () => {
let returnCount = 0;
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
++returnCount;
return {};
}
}
const iterator = new TestIterator().drop(1);
expect(returnCount).toBe(0);
iterator.return();
expect(returnCount).toBe(1);
iterator.return();
expect(returnCount).toBe(1);
});
});

View file

@ -40,6 +40,28 @@ describe("errors", () => {
}).toThrow(TestError);
});
test("iterator's return method throws", () => {
function TestError() {}
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
throw new TestError();
}
}
expect(() => {
const iterator = new TestIterator().filter(() => true);
iterator.return();
}).toThrow(TestError);
});
test("predicate function throws", () => {
function TestError() {}
@ -153,4 +175,31 @@ describe("normal behavior", () => {
expect(firstFilterCount).toBe(4);
expect(secondFilterCount).toBe(2);
});
test("return is forwarded to the underlying iterator's return method", () => {
let returnCount = 0;
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
++returnCount;
return {};
}
}
const iterator = new TestIterator().filter(() => true);
expect(returnCount).toBe(0);
iterator.return();
expect(returnCount).toBe(1);
iterator.return();
expect(returnCount).toBe(1);
});
});

View file

@ -40,6 +40,28 @@ describe("errors", () => {
}).toThrow(TestError);
});
test("iterator's return method throws", () => {
function TestError() {}
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
throw new TestError();
}
}
expect(() => {
const iterator = new TestIterator().flatMap(() => 0);
iterator.return();
}).toThrow(TestError);
});
test("mapper function throws", () => {
function TestError() {}
@ -138,4 +160,31 @@ describe("normal behavior", () => {
expect(value.value).toBeUndefined();
expect(value.done).toBeTrue();
});
test("return is forwarded to the underlying iterator's return method", () => {
let returnCount = 0;
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
++returnCount;
return {};
}
}
const iterator = new TestIterator().flatMap(() => 0);
expect(returnCount).toBe(0);
iterator.return();
expect(returnCount).toBe(1);
iterator.return();
expect(returnCount).toBe(1);
});
});

View file

@ -40,6 +40,28 @@ describe("errors", () => {
}).toThrow(TestError);
});
test("iterator's return method throws", () => {
function TestError() {}
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
throw new TestError();
}
}
expect(() => {
const iterator = new TestIterator().map(() => 0);
iterator.return();
}).toThrow(TestError);
});
test("mapper function throws", () => {
function TestError() {}
@ -141,4 +163,31 @@ describe("normal behavior", () => {
expect(value.value).toBeUndefined();
expect(value.done).toBeTrue();
});
test("return is forwarded to the underlying iterator's return method", () => {
let returnCount = 0;
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
++returnCount;
return {};
}
}
const iterator = new TestIterator().map(() => 0);
expect(returnCount).toBe(0);
iterator.return();
expect(returnCount).toBe(1);
iterator.return();
expect(returnCount).toBe(1);
});
});

View file

@ -49,6 +49,28 @@ describe("errors", () => {
iterator.next();
}).toThrow(TestError);
});
test("iterator's return method throws", () => {
function TestError() {}
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
throw new TestError();
}
}
expect(() => {
const iterator = new TestIterator().take(1);
iterator.return();
}).toThrow(TestError);
});
});
describe("normal behavior", () => {
@ -120,4 +142,31 @@ describe("normal behavior", () => {
expect(value.value).toBeUndefined();
expect(value.done).toBeTrue();
});
test("return is forwarded to the underlying iterator's return method", () => {
let returnCount = 0;
class TestIterator extends Iterator {
next() {
return {
done: false,
value: 1,
};
}
return() {
++returnCount;
return {};
}
}
const iterator = new TestIterator().take(1);
expect(returnCount).toBe(0);
iterator.return();
expect(returnCount).toBe(1);
iterator.return();
expect(returnCount).toBe(1);
});
});