Files
TUIkit/Tests/TUIkitTests/PaddingModifierTests.swift
T
phranck 3fb4944472 Refactor: Move runtime services from RenderContext to EnvironmentValues
- Add ServiceEnvironment.swift with 9 EnvironmentKeys for runtime services
  (stateStorage, lifecycle, keyEventDispatcher, renderCache, preferenceStorage,
  pulsePhase, cursorTimer, focusIndicatorColor, activeFocusSectionID)
- Remove tuiContext, pulsePhase, cursorTimer, focusIndicatorColor, and
  activeFocusSectionID as direct RenderContext properties
- Inject all services through EnvironmentValues in RenderLoop.buildEnvironment()
- Add convenience RenderContext init that accepts TUIContext and auto-injects
  services into the environment
- Simplify isolatedForBackground() to only swap environment values
- Migrate ~49 access sites in ~25 source files from context.tuiContext.X and
  context.pulsePhase/cursorTimer to context.environment.X
- Update 38 test files to use the new convenience init
2026-02-14 13:13:24 +01:00

104 lines
3.4 KiB
Swift

// TUIKit - Terminal UI Kit for Swift
// PaddingModifierTests.swift
//
// Created by LAYERED.work
// License: MIT
import Testing
@testable import TUIkit
// MARK: - Test Helpers
/// Creates a default render context for testing.
private func testContext(width: Int = 40, height: Int = 24) -> RenderContext {
RenderContext(availableWidth: width, availableHeight: height, tuiContext: TUIContext())
}
// MARK: - PaddingModifier Tests
@MainActor
@Suite("PaddingModifier Tests")
struct PaddingModifierTests {
@Test("Padding adds empty lines for top and bottom")
func paddingTopBottom() {
let modifier = PaddingModifier(insets: EdgeInsets(top: 1, leading: 0, bottom: 1, trailing: 0))
let buffer = FrameBuffer(lines: ["Hello"])
let context = testContext()
let result = modifier.modify(buffer: buffer, context: context)
// 1 top + 1 content + 1 bottom = 3
#expect(result.height == 3)
#expect(result.lines[0].trimmingCharacters(in: .whitespaces).isEmpty)
#expect(result.lines[1] == "Hello")
#expect(result.lines[2].trimmingCharacters(in: .whitespaces).isEmpty)
}
@Test("Padding adds spaces for leading and trailing")
func paddingLeadingTrailing() {
let modifier = PaddingModifier(insets: EdgeInsets(top: 0, leading: 2, bottom: 0, trailing: 3))
let buffer = FrameBuffer(lines: ["Hi"])
let context = testContext()
let result = modifier.modify(buffer: buffer, context: context)
#expect(result.height == 1)
// " Hi " 2 leading + "Hi" + 3 trailing
#expect(result.lines[0] == " Hi ")
}
@Test("Padding all sides")
func paddingAllSides() {
let modifier = PaddingModifier(insets: EdgeInsets(all: 1))
let buffer = FrameBuffer(lines: ["X"])
let context = testContext()
let result = modifier.modify(buffer: buffer, context: context)
// 1 top + 1 content + 1 bottom = 3
#expect(result.height == 3)
// Content line: 1 leading + "X" + 1 trailing = " X "
#expect(result.lines[1] == " X ")
}
@Test("Padding on empty buffer returns empty")
func paddingEmptyBuffer() {
let modifier = PaddingModifier(insets: EdgeInsets(all: 2))
let buffer = FrameBuffer()
let context = testContext()
let result = modifier.modify(buffer: buffer, context: context)
// Only padding lines (no content)
#expect(result.height == 4) // 2 top + 0 content + 2 bottom
}
@Test("Padding preserves multiple content lines")
func paddingMultipleLines() {
let modifier = PaddingModifier(insets: EdgeInsets(top: 1, leading: 1, bottom: 1, trailing: 1))
let buffer = FrameBuffer(lines: ["AAA", "BBB"])
let context = testContext()
let result = modifier.modify(buffer: buffer, context: context)
// 1 top + 2 content + 1 bottom = 4
#expect(result.height == 4)
#expect(result.lines[1] == " AAA ")
#expect(result.lines[2] == " BBB ")
}
@Test("Zero padding returns original dimensions")
func paddingZero() {
let modifier = PaddingModifier(insets: EdgeInsets())
let buffer = FrameBuffer(lines: ["Test"])
let context = testContext()
let result = modifier.modify(buffer: buffer, context: context)
#expect(result.height == 1)
#expect(result.lines[0] == "Test")
}
}