promise_test(async () => { let inactiveAfterB = false; const source = new Observable(subscriber => { subscriber.next("a"); subscriber.next("b"); inactiveAfterB = !subscriber.active; subscriber.next("c"); subscriber.complete(); }); const value = await source.find((value) => value === "b"); assert_equals(value, "b", "Promise resolves with the first value that passes the predicate"); assert_true(inactiveAfterB, "subscriber is inactive after the first value that passes the predicate"); }, "find(): Promise resolves with the first value that passes the predicate"); promise_test(async () => { const source = new Observable(subscriber => { subscriber.next("a"); subscriber.next("b"); subscriber.next("c"); subscriber.complete(); }); const value = await source.find(() => false); assert_equals(value, undefined, "Promise resolves with undefined if no value passes the predicate"); }, "find(): Promise resolves with undefined if no value passes the predicate"); promise_test(async t => { const error = new Error("error from source"); const source = new Observable(subscriber => { subscriber.error(error); }); promise_rejects_exactly(t, error, source.find(() => true), "Promise " + "rejects with the error emitted from the source Observable"); }, "find(): Promise rejects with the error emitted from the source Observable"); promise_test(async t => { const source = new Observable(subscriber => { subscriber.next("ignored"); }); const error = new Error("thrown from predicate"); promise_rejects_exactly(t, error, source.find(() => {throw error}), "Promise rejects with any error thrown from the predicate"); }, "find(): Promise rejects with any error thrown from the predicate"); promise_test(async () => { let indices = []; const source = new Observable(subscriber => { subscriber.next("a"); subscriber.next("b"); subscriber.next("c"); subscriber.complete(); }); const value = await source.find((value, index) => { indices.push(index); return false; }); assert_equals(value, undefined, "Promise resolves with undefined if no value passes the predicate"); assert_array_equals(indices, [0, 1, 2], "find(): Passes the index of the value to the predicate"); }, "find(): Passes the index of the value to the predicate"); promise_test(async t => { const controller = new AbortController(); const source = new Observable(subscriber => { subscriber.next("a"); subscriber.next("b"); subscriber.next("c"); subscriber.complete(); }); controller.abort(); const promise = source.find(() => true, { signal: controller.signal }); promise_rejects_dom(t, 'AbortError', promise, "Promise rejects with " + "DOMException when the signal is aborted"); }, "find(): Rejects with AbortError when the signal is aborted");