import pytest from .support import PyScriptTest, filter_inner_text, only_main class TestAsync(PyScriptTest): # ensure_future() and create_task() should behave similarly; # we'll use the same source code to test both coroutine_script = """ """ def test_asyncio_ensure_future(self): self.pyscript_run(self.coroutine_script.format(func="ensure_future")) self.wait_for_console("third") assert self.console.log.lines[-3:] == ["first", "second", "third"] def test_asyncio_create_task(self): self.pyscript_run(self.coroutine_script.format(func="create_task")) self.wait_for_console("third") assert self.console.log.lines[-3:] == ["first", "second", "third"] def test_asyncio_gather(self): self.pyscript_run( """ """ ) self.wait_for_console("DONE") assert self.console.log.lines[-2:] == ["[3, 2, 1]", "DONE"] @only_main def test_multiple_async(self): self.pyscript_run( """ """ ) self.wait_for_console("b func done") assert self.console.log.lines == [ "A 0", "B 0", "A 1", "B 1", "A 2", "B 2", "b func done", ] @only_main def test_multiple_async_multiple_display_targeted(self): self.pyscript_run( """ """ ) self.wait_for_console("B DONE") inner_text = self.page.inner_text("html") assert "A0\nA1\nB0\nB1" in filter_inner_text(inner_text) def test_async_display_untargeted(self): self.pyscript_run( """ """ ) self.wait_for_console("DONE") assert self.page.locator("script-py").inner_text() == "A" @only_main def test_sync_and_async_order(self): """ The order of execution is defined as follows: 1. first, we execute all the script tags in order 2. then, we start all the tasks which were scheduled with create_task Note that tasks are started *AFTER* all py-script tags have been executed. That's why the console.log() inside mytask1 and mytask2 are executed after e.g. js.console.log("6"). """ src = """ """ self.pyscript_run(src, wait_for_pyscript=False) self.wait_for_console("DONE") lines = self.console.log.lines[-11:] assert lines == ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "DONE"]