123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- /* Copyright 2017 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- import {
- EventBus,
- waitOnEventOrTimeout,
- WaitOnType,
- } from "../../web/event_utils.js";
- import { isNodeJS } from "../../src/shared/is_node.js";
- describe("event_utils", function () {
- describe("EventBus", function () {
- it("dispatch event", function () {
- const eventBus = new EventBus();
- let count = 0;
- eventBus.on("test", function (evt) {
- expect(evt).toEqual(undefined);
- count++;
- });
- eventBus.dispatch("test");
- expect(count).toEqual(1);
- });
- it("dispatch event with arguments", function () {
- const eventBus = new EventBus();
- let count = 0;
- eventBus.on("test", function (evt) {
- expect(evt).toEqual({ abc: 123 });
- count++;
- });
- eventBus.dispatch("test", {
- abc: 123,
- });
- expect(count).toEqual(1);
- });
- it("dispatch different event", function () {
- const eventBus = new EventBus();
- let count = 0;
- eventBus.on("test", function () {
- count++;
- });
- eventBus.dispatch("nottest");
- expect(count).toEqual(0);
- });
- it("dispatch event multiple times", function () {
- const eventBus = new EventBus();
- let count = 0;
- eventBus.dispatch("test");
- eventBus.on("test", function () {
- count++;
- });
- eventBus.dispatch("test");
- eventBus.dispatch("test");
- expect(count).toEqual(2);
- });
- it("dispatch event to multiple handlers", function () {
- const eventBus = new EventBus();
- let count = 0;
- eventBus.on("test", function () {
- count++;
- });
- eventBus.on("test", function () {
- count++;
- });
- eventBus.dispatch("test");
- expect(count).toEqual(2);
- });
- it("dispatch to detached", function () {
- const eventBus = new EventBus();
- let count = 0;
- const listener = function () {
- count++;
- };
- eventBus.on("test", listener);
- eventBus.dispatch("test");
- eventBus.off("test", listener);
- eventBus.dispatch("test");
- expect(count).toEqual(1);
- });
- it("dispatch to wrong detached", function () {
- const eventBus = new EventBus();
- let count = 0;
- eventBus.on("test", function () {
- count++;
- });
- eventBus.dispatch("test");
- eventBus.off("test", function () {
- count++;
- });
- eventBus.dispatch("test");
- expect(count).toEqual(2);
- });
- it("dispatch to detached during handling", function () {
- const eventBus = new EventBus();
- let count = 0;
- const listener1 = function () {
- eventBus.off("test", listener2);
- count++;
- };
- const listener2 = function () {
- eventBus.off("test", listener1);
- count++;
- };
- eventBus.on("test", listener1);
- eventBus.on("test", listener2);
- eventBus.dispatch("test");
- eventBus.dispatch("test");
- expect(count).toEqual(2);
- });
- it("dispatch event to handlers with/without 'once' option", function () {
- const eventBus = new EventBus();
- let multipleCount = 0,
- onceCount = 0;
- eventBus.on("test", function () {
- multipleCount++;
- });
- eventBus.on(
- "test",
- function () {
- onceCount++;
- },
- { once: true }
- );
- eventBus.dispatch("test");
- eventBus.dispatch("test");
- eventBus.dispatch("test");
- expect(multipleCount).toEqual(3);
- expect(onceCount).toEqual(1);
- });
- it("should not re-dispatch to DOM", async function () {
- if (isNodeJS) {
- pending("Document is not supported in Node.js.");
- }
- const eventBus = new EventBus();
- let count = 0;
- eventBus.on("test", function (evt) {
- expect(evt).toEqual(undefined);
- count++;
- });
- function domEventListener() {
- // Shouldn't get here.
- expect(false).toEqual(true);
- }
- document.addEventListener("test", domEventListener);
- eventBus.dispatch("test");
- await Promise.resolve();
- expect(count).toEqual(1);
- document.removeEventListener("test", domEventListener);
- });
- });
- describe("waitOnEventOrTimeout", function () {
- let eventBus;
- beforeAll(function () {
- eventBus = new EventBus();
- });
- afterAll(function () {
- eventBus = null;
- });
- it("should reject invalid parameters", async function () {
- const invalidTarget = waitOnEventOrTimeout({
- target: "window",
- name: "DOMContentLoaded",
- }).then(
- function () {
- // Shouldn't get here.
- expect(false).toEqual(true);
- },
- function (reason) {
- expect(reason instanceof Error).toEqual(true);
- }
- );
- const invalidName = waitOnEventOrTimeout({
- target: eventBus,
- name: "",
- }).then(
- function () {
- // Shouldn't get here.
- expect(false).toEqual(true);
- },
- function (reason) {
- expect(reason instanceof Error).toEqual(true);
- }
- );
- const invalidDelay = waitOnEventOrTimeout({
- target: eventBus,
- name: "pagerendered",
- delay: -1000,
- }).then(
- function () {
- // Shouldn't get here.
- expect(false).toEqual(true);
- },
- function (reason) {
- expect(reason instanceof Error).toEqual(true);
- }
- );
- await Promise.all([invalidTarget, invalidName, invalidDelay]);
- });
- it("should resolve on event, using the DOM", async function () {
- if (isNodeJS) {
- pending("Document is not supported in Node.js.");
- }
- const button = document.createElement("button");
- const buttonClicked = waitOnEventOrTimeout({
- target: button,
- name: "click",
- delay: 10000,
- });
- // Immediately dispatch the expected event.
- button.click();
- const type = await buttonClicked;
- expect(type).toEqual(WaitOnType.EVENT);
- });
- it("should resolve on timeout, using the DOM", async function () {
- if (isNodeJS) {
- pending("Document is not supported in Node.js.");
- }
- const button = document.createElement("button");
- const buttonClicked = waitOnEventOrTimeout({
- target: button,
- name: "click",
- delay: 10,
- });
- // Do *not* dispatch the event, and wait for the timeout.
- const type = await buttonClicked;
- expect(type).toEqual(WaitOnType.TIMEOUT);
- });
- it("should resolve on event, using the EventBus", async function () {
- const pageRendered = waitOnEventOrTimeout({
- target: eventBus,
- name: "pagerendered",
- delay: 10000,
- });
- // Immediately dispatch the expected event.
- eventBus.dispatch("pagerendered");
- const type = await pageRendered;
- expect(type).toEqual(WaitOnType.EVENT);
- });
- it("should resolve on timeout, using the EventBus", async function () {
- const pageRendered = waitOnEventOrTimeout({
- target: eventBus,
- name: "pagerendered",
- delay: 10,
- });
- // Do *not* dispatch the event, and wait for the timeout.
- const type = await pageRendered;
- expect(type).toEqual(WaitOnType.TIMEOUT);
- });
- });
- });
|