added tests for screens

This commit is contained in:
Will McGugan
2022-08-17 09:17:39 +01:00
parent 97a9619d59
commit 78c6c89544
3 changed files with 73 additions and 19 deletions

View File

@@ -1,7 +1,6 @@
from __future__ import annotations from __future__ import annotations
import asyncio import asyncio
from datetime import datetime
import inspect import inspect
import io import io
import os import os
@@ -9,9 +8,11 @@ import platform
import sys import sys
import warnings import warnings
from contextlib import redirect_stdout from contextlib import redirect_stdout
from datetime import datetime
from pathlib import PurePath from pathlib import PurePath
from time import perf_counter from time import perf_counter
from typing import ( from typing import (
TYPE_CHECKING,
Any, Any,
Generic, Generic,
Iterable, Iterable,
@@ -19,11 +20,10 @@ from typing import (
TextIO, TextIO,
Type, Type,
TypeVar, TypeVar,
TYPE_CHECKING,
) )
from weakref import WeakSet, WeakValueDictionary from weakref import WeakSet, WeakValueDictionary
from ._ansi_sequences import SYNC_START, SYNC_END from ._ansi_sequences import SYNC_END, SYNC_START
if sys.version_info >= (3, 8): if sys.version_info >= (3, 8):
from typing import Literal from typing import Literal
@@ -39,30 +39,24 @@ from rich.protocol import is_renderable
from rich.segment import Segments from rich.segment import Segments
from rich.traceback import Traceback from rich.traceback import Traceback
from . import actions from . import actions, events, log, messages
from . import events
from . import log
from . import messages
from ._animator import Animator from ._animator import Animator
from ._callback import invoke from ._callback import invoke
from ._context import active_app from ._context import active_app
from ._event_broker import extract_handler_actions, NoHandler from ._event_broker import NoHandler, extract_handler_actions
from .binding import Bindings, NoBinding from .binding import Bindings, NoBinding
from .css.stylesheet import Stylesheet
from .css.query import NoMatchingNodesError from .css.query import NoMatchingNodesError
from .css.stylesheet import Stylesheet
from .design import ColorSystem from .design import ColorSystem
from .devtools.client import DevtoolsClient, DevtoolsConnectionError, DevtoolsLog from .devtools.client import DevtoolsClient, DevtoolsConnectionError, DevtoolsLog
from .devtools.redirect_output import StdoutRedirector from .devtools.redirect_output import StdoutRedirector
from .dom import DOMNode from .dom import DOMNode
from .driver import Driver from .driver import Driver
from .features import parse_features, FeatureFlag from .features import FeatureFlag, parse_features
from .file_monitor import FileMonitor from .file_monitor import FileMonitor
from .geometry import Offset, Region, Size from .geometry import Offset, Region, Size
from .message_pump import MessagePump
from .reactive import Reactive from .reactive import Reactive
from .renderables.blank import Blank from .renderables.blank import Blank
from ._profile import timer
from .screen import Screen from .screen import Screen
from .widget import Widget from .widget import Widget

66
tests/test_screens.py Normal file
View File

@@ -0,0 +1,66 @@
import pytest
from textual.app import App, ScreenStackError
from textual.screen import Screen
@pytest.mark.asyncio
async def test_screens():
app = App()
app._set_active()
assert not app._installed_screens
screen1 = Screen(name="screen1")
screen2 = Screen(name="screen2")
screen3 = Screen(name="screen3")
# installs screens
app.install_screen(screen1, "screen1")
app.install_screen(screen2, "screen2")
# Check they are installed
assert app.is_screen_installed("screen1")
assert app.is_screen_installed("screen2")
assert app.get_screen("screen1") is screen1
with pytest.raises(KeyError):
app.get_screen("foo")
# Check screen3 is not installed
assert not app.is_screen_installed("screen3")
# Installs screen3
app.install_screen(screen3, "screen3")
# Confirm installed
assert app.is_screen_installed("screen3")
# Check screen stack is empty
assert app.screen_stack == []
# Push a screen
app.push_screen("screen1")
# Check it is on the stack
assert app.screen_stack == [screen1]
# Check it is current
assert app.screen is screen1
# Switch to another screen
app.switch_screen("screen2")
# Check it has changed the stack and that it is current
assert app.screen_stack == [screen2]
assert app.screen is screen2
# Push another screen
app.push_screen("screen3")
assert app.screen_stack == [screen2, screen3]
assert app.screen is screen3
# Pop a screen
assert app.pop_screen() is screen3
assert app.screen is screen2
assert app.screen_stack == [screen2]
# Check we can't pop last screen
with pytest.raises(ScreenStackError):
app.pop_screen()

View File

@@ -1,6 +0,0 @@
import pytest
from textual.layouts.grid import GridLayout
from textual.layouts.horizontal import HorizontalLayout
from textual.layouts.vertical import VerticalLayout
from textual.screen import Screen