Back to Repositories

Testing Layout Component Implementation in Textualize/Rich

This test suite validates the core functionality of the Layout component in the Rich library, focusing on layout manipulation, rendering, and screen refresh capabilities.

Test Coverage Overview

The test suite provides comprehensive coverage of the Layout class functionality:
  • Layout splitting and manipulation (split, add_split, unsplit)
  • Layout rendering and display formatting
  • Tree structure visualization
  • Screen refresh capabilities
  • Error handling for invalid splitters and keys

Implementation Analysis

The testing approach utilizes pytest’s fixture and assertion mechanisms to validate layout operations:
  • Console capture for output verification
  • Platform-specific test skipping using pytest.mark.skipif
  • Exception testing with pytest.raises
  • Mock terminal environment testing

Technical Details

Testing infrastructure includes:
  • pytest framework for test execution
  • Rich Console for output capture and verification
  • Mock terminal configuration
  • Platform-specific test conditions
  • Custom assertions for layout structure validation

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Isolated test cases for specific functionality
  • Comprehensive assertion coverage
  • Platform-aware test execution
  • Clear test case organization
  • Effective use of pytest features for robust testing

textualize/rich

tests/test_layout.py

            
import sys

import pytest

from rich.console import Console
from rich.layout import Layout, NoSplitter
from rich.panel import Panel


def test_no_layout():
    layout = Layout()
    with pytest.raises(NoSplitter):
        layout.split(Layout(), Layout(), splitter="nope")


def test_add_split():
    layout = Layout()
    layout.split(Layout(), Layout())
    assert len(layout.children) == 2
    layout.add_split(Layout(name="foo"))
    assert len(layout.children) == 3
    assert layout.children[2].name == "foo"


def test_unsplit():
    layout = Layout()
    layout.split(Layout(), Layout())
    assert len(layout.children) == 2

    layout.unsplit()
    assert len(layout.children) == 0


@pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows")
def test_render():
    layout = Layout(name="root")
    repr(layout)

    layout.split_column(Layout(name="top"), Layout(name="bottom"))
    top = layout["top"]
    top.update(Panel("foo"))

    print(type(top._renderable))
    assert isinstance(top.renderable, Panel)
    layout["bottom"].split_row(Layout(name="left"), Layout(name="right"))

    assert layout["root"].name == "root"
    assert layout["left"].name == "left"

    assert isinstance(layout.map, dict)

    with pytest.raises(KeyError):
        top["asdasd"]

    layout["left"].update("foobar")
    print(layout["left"].children)

    console = Console(width=60, color_system=None)

    with console.capture() as capture:
        console.print(layout, height=10)

    result = capture.get()
    print(repr(result))
    expected = "╭──────────────────────────────────────────────────────────╮
│ foo                                                      │
│                                                          │
│                                                          │
╰──────────────────────────────────────────────────────────╯
foobar                        ╭───── 'right' (30 x 5) ─────╮
                              │                            │
                              │    Layout(name='right')    │
                              │                            │
                              ╰────────────────────────────╯
"

    assert result == expected


def test_tree():
    layout = Layout(name="root")
    layout.split(Layout("foo", size=2), Layout("bar", name="bar"))
    layout["bar"].split_row(Layout(), Layout())

    console = Console(width=60, color_system=None)

    with console.capture() as capture:
        console.print(layout.tree, height=10)
    result = capture.get()
    print(repr(result))
    expected = "⬍ Layout(name='root')
├── ⬍ Layout(size=2)
└── ⬌ Layout(name='bar')
    ├── ⬍ Layout()
    └── ⬍ Layout()
"
    print(result, "
", expected)
    assert result == expected


@pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows")
def test_refresh_screen():
    layout = Layout()
    layout.split_row(Layout(name="foo"), Layout(name="bar"))
    console = Console(force_terminal=True, width=20, height=5, _environ={})
    with console.capture():
        console.print(layout)
    with console.screen():
        with console.capture() as capture:
            layout.refresh_screen(console, "foo")
    result = capture.get()
    print()
    print(repr(result))
    expected = "\x1b[1;1H\x1b[34m╭─\x1b[0m\x1b[34m \x1b[0m\x1b[32m'foo'\x1b[0m\x1b[34m─╮\x1b[0m\x1b[2;1H\x1b[34m│\x1b[0m \x1b[1;35mLayout\x1b[0m \x1b[34m│\x1b[0m\x1b[3;1H\x1b[34m│\x1b[0m \x1b[1m(\x1b[0m      \x1b[34m│\x1b[0m\x1b[4;1H\x1b[34m│\x1b[0m     \x1b[33mna\x1b[0m \x1b[34m│\x1b[0m\x1b[5;1H\x1b[34m╰────────╯\x1b[0m"
    assert result == expected