Back to Repositories

Testing Measurement System Components in Textualize/rich

A comprehensive test suite for Rich’s measurement functionality, focusing on text rendering and dimension calculations. The tests verify measurement operations, handle edge cases for non-renderable content, and validate dimension clamping behaviors.

Test Coverage Overview

The test suite provides thorough coverage of Rich’s measurement system, including span calculations, renderable validation, and dimension clamping.

  • Tests span calculation accuracy for text measurements
  • Validates error handling for non-renderable content
  • Verifies measurement operations with zero-width conditions
  • Covers dimension clamping with various boundary conditions

Implementation Analysis

The testing approach utilizes pytest fixtures and assertions to validate measurement functionality. Tests employ a combination of direct measurement validation and error condition verification.

  • Uses pytest’s raise context manager for error testing
  • Implements console options manipulation for width testing
  • Employs systematic boundary testing for clamp operations

Technical Details

  • Testing Framework: pytest
  • Key Classes: Measurement, Console, Text
  • Error Handling: NotRenderableError
  • Test Utilities: Console options, measurement calculations

Best Practices Demonstrated

The test suite exemplifies robust testing practices with clear separation of concerns and comprehensive edge case coverage.

  • Isolated test cases for specific functionality
  • Explicit error condition validation
  • Comprehensive boundary testing
  • Clean test method organization

textualize/rich

tests/test_measure.py

            
from rich.text import Text
import pytest

from rich.errors import NotRenderableError
from rich.console import Console
from rich.measure import Measurement, measure_renderables


def test_span():
    measurement = Measurement(10, 100)
    assert measurement.span == 90


def test_no_renderable():
    console = Console()
    text = Text()

    with pytest.raises(NotRenderableError):
        Measurement.get(console, console.options, None)


def test_measure_renderables():
    console = Console()
    assert measure_renderables(console, console.options, "") == Measurement(0, 0)
    assert measure_renderables(
        console, console.options.update_width(0), "hello"
    ) == Measurement(0, 0)


def test_clamp():
    measurement = Measurement(20, 100)
    assert measurement.clamp(10, 50) == Measurement(20, 50)
    assert measurement.clamp(30, 50) == Measurement(30, 50)
    assert measurement.clamp(None, 50) == Measurement(20, 50)
    assert measurement.clamp(30, None) == Measurement(30, 100)
    assert measurement.clamp(None, None) == Measurement(20, 100)