Skip to content

[#140] Closed the data-provider gap in the largest test suites. - #141

Merged
AlexSkrypnyk merged 10 commits into
mainfrom
feature/140-data-providers
Jul 29, 2026
Merged

[#140] Closed the data-provider gap in the largest test suites.#141
AlexSkrypnyk merged 10 commits into
mainfrom
feature/140-data-providers

Conversation

@AlexSkrypnyk

@AlexSkrypnyk AlexSkrypnyk commented Jul 29, 2026

Copy link
Copy Markdown
Member

Closes #140

Summary

AGENTS.md asks for data providers wherever they fit, and the suite already followed the naming half of that rule perfectly: all 147 providers were dataProvider-prefixed and placed after the test they feed. The gap was adoption, concentrated in the six largest files, where 232 test methods carried only 4 providers between them and repeated the same setup and assertion shapes by hand.

This converts every genuinely tabular cluster in those six files into a provider, collapsing 232 test methods into 159 while growing the number of executed cases from 2215 to 2239. Line coverage on all nine classes under test is byte-identical to the baseline, and the assertion count rose from 4878 to 4886 because merged twins now assert the union of what each twin asserted rather than the intersection.

No production code changed.

Changes

Where a provider was the right shape

Three distinct shapes turned up, and they were treated differently rather than collapsed one way:

  • Tabular - cases differ only in scalar input and expected output. InputResolverTest coercion and env-name resolution, and WidgetFactoryTest widget-by-type, value seeding and editor handoff, became plain value providers.
  • Declaration-shaped - cases differ in how a form is declared but assert one uniform outcome. FormTest's rejections and AgentHelpTest's field shapes became providers of closures, following the pattern dataProviderLayoutMismatchThrows already demonstrated in FormTest.
  • Interaction-shaped - cases differ in both the keystroke sequence and what they assert. Most of PanelControllerTest is this, and a provider is the wrong tool for it: merging such tests produces one test that branches internally and stops naming the behaviour on failure. Only the twin clusters were converted; the fullscreen alignment tests look like a family but each asserts a structurally different thing (line count, indent width, line indices, a box-glyph row) and were left alone.

Per file

File Test methods Providers
Unit/Render/PanelControllerTest.php 80 to 75 0 to 4
Unit/Builder/FormTest.php 52 to 35 3 to 3
Unit/Widget/WidgetFactoryTest.php 40 to 30 1 to 4
Unit/Schema/AgentHelpTest.php 23 to 5 0 to 4
Unit/Resolver/InputResolverTest.php 21 to 6 0 to 2
Unit/Schema/SchemaGeneratorTest.php 16 to 8 0 to 3
  • FormTest - 17 one-off ...Throws methods plus testLayoutMismatchThrows became a single testBuildThrows with 21 named rows, each asserting the one contract they share: this declaration is refused at build time with this message. testRatingCollapsedScaleThrows and testToggleInvalidDefaultThrows were left as they are, since they already use providers and their scalar parameterization carries meaning the closure form would flatten.
  • InputResolverTest - the coercion cluster became 15 tabular rows and the env-name and alias cluster 7 rows. Tests that previously set three environment variables in one body now resolve each independently, so a failure names the one coercion that broke.
  • WidgetFactoryTest - the five field helpers became static so providers can call them; testCreatesByType, previously 17 sequential assertInstanceOf lines in a single body, is now 17 rows. The value-seeding cluster and the three external-editor tests each became one provider. The two file-picker cases stayed out of the seeding provider and got their own test seeded from vfsStream, since a static provider is evaluated at collection time whereas the virtual filesystem has per-test lifetime.
  • SchemaGeneratorTest - a prompt() helper now supplies the 26-key skeleton that three expectations each spelled out in full. testGenerate deliberately keeps its fully-written arrays: it is the one place that documents the complete shape of a generated prompt, and that is worth its verbosity.
  • AgentHelpTest - four providers covering field shape, environment advertisement, closure defaults and skipped non-answering types, sharing one assertHelp() helper for the contains, absent and regex assertion lists.
  • PanelControllerTest - modal dismissal (Cancel button and Escape), the textarea editor hint, the fullscreen too-small guard, and the fullscreen minimum-size family.

Determinism

Two tests previously leaned on ambient state and no longer do:

  • The file-picker cases pointed at a host path that was assumed not to exist. They now read an empty vfsStream directory, matching the convention FilePickerWidgetTest already follows.
  • testDateWithNonStringCurrentOpensOnToday computed its expectation after the widget had already resolved today, leaving a midnight window. It now reads the date either side of the call and accepts either boundary.

Two adjacent cleanups

The issue's own analysis called out repetition that is not data-provider work, so it landed as separate commits that can be reverted independently:

  • BuildsThemesTrait::plainTheme() already existed and PanelControllerTest already used the trait, yet wrote that exact theme literal out 15 times. Those now call the helper. The other 17 DefaultTheme constructions in the file differ genuinely and were left alone.
  • The opaque Enter/Enter opener repeated in 16 test bodies is now drillAndEdit(), which names what those two keystrokes do.

Verification

  • composer test - 2239 tests, 4886 assertions, green.
  • composer test-coverage - line coverage identical to the pre-change baseline on Form, LayoutGuard, PanelBuilder, FieldBuilder, InputResolver, WidgetFactory, SchemaGenerator, AgentHelp and PanelController; FilePickerWidget remains at 100%. This was the pass or fail gate rather than the assertion count, since a deleted assertion also passes a green suite.
  • composer lint - PHPCS, PHPStan level 9 and Rector all clean. Two test methods gained docblocks because PHPStan needed list<string> and class-string narrowing that the project's iterable-value-type waiver does not cover.

Before / After

BEFORE                                   AFTER

FormTest                                 FormTest
├── testTemplateWithoutPatternThrows     ├── testBuildThrows
├── testRatingStepThrows                 │   ├── 'template without a pattern'
├── testDateInvalidBoundThrows           │   ├── 'rating with a step'
├── testDateMinAfterMaxThrows            │   ├── 'unparseable date bound'
├── testNumberMinGreaterThanMaxThrows    │   ├── 'min date after max date'
├── ... 12 more, 8 lines each            │   ├── ... 17 more named rows
└── testLayoutMismatchThrows ──┐         │   └── (layout rows folded in)
    └── 4 provider rows ───────┘         └── dataProviderBuildThrows

18 methods, 21 cases                     1 method, 21 cases


PanelControllerTest                      PanelControllerTest
├── testModalCancelButton...             ├── testModalDismissalRestores...
│   asserts: !modal, value               │   asserts: !modal, value, cursor
└── testModalEscapeRestores...           └── dataProvider...
    asserts: !modal, value, cursor           ├── 'cancel button'
                                             └── 'escape'
intersection of assertions               union of assertions


SchemaGeneratorTest expectations         SchemaGeneratorTest expectations
┌───────────────────────────────┐        ┌───────────────────────────────┐
│ 'id'    => 'crate'            │        │ self::prompt([                │
│ 'type'  => 'template'         │        │   'id'       => 'crate',      │
│ 'label' => 'Crate label'      │        │   'type'     => 'template',   │
│ 'description' => ''           │        │   'label'    => 'Crate label',│
│ 'hint'  => ''                 │        │   'template' => '{{a}}-{{b}}',│
│ ... 21 more mostly-NULL keys  │        │ ])                            │
└───────────────────────────────┘        └───────────────────────────────┘
x3, ~90 lines of filler                  x2, only the keys that matter

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 21 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c267eeea-ff2a-4e5d-9dfa-729e60d969b8

📥 Commits

Reviewing files that changed from the base of the PR and between 1e7db38 and fd0142b.

📒 Files selected for processing (1)
  • tests/phpunit/Unit/Widget/WidgetFactoryTest.php
📝 Walkthrough

Walkthrough

This test-only refactor consolidates repeated PHPUnit cases into data-provider-driven tests across form validation, panel rendering, input resolution, schema generation, agent help, and widget creation.

Changes

Form validation

Layer / File(s) Summary
Form builder exception provider
tests/phpunit/Unit/Builder/FormTest.php
Invalid form declarations are covered by one closure-based testBuildThrows() and dataProviderBuildThrows() pair.

Panel controller flows

Layer / File(s) Summary
Panel controller flow providers
tests/phpunit/Unit/Render/PanelControllerTest.php
Shared themes and editor-entry helpers replace repeated setup, while textarea hints, modal dismissal, and fullscreen behavior use data providers.

Resolver and schema coverage

Layer / File(s) Summary
Environment resolver providers
tests/phpunit/Unit/Resolver/InputResolverTest.php
Environment coercion and name-resolution scenarios are parameterized.
Agent help schema providers
tests/phpunit/Unit/Schema/AgentHelpTest.php
Field shape, environment variables, defaults, and skipped fields use providers and shared assertions.
Schema generator providers
tests/phpunit/Unit/Schema/SchemaGeneratorTest.php
Field JSON, defaults, and environment-variable assertions use providers and a shared prompt helper.

Widget coverage

Layer / File(s) Summary
Widget factory providers
tests/phpunit/Unit/Widget/WidgetFactoryTest.php
Widget creation, current-value seeding, and textarea editor handoff are parameterized; fixture builders become static.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • drevops/tui#138 — Both changes update PanelControllerTest to use the shared plainTheme().
  • drevops/tui#62 — This refactor consolidates modal-panel builder and controller coverage.
  • drevops/tui#28 — The resolver refactor retains toggle coercion coverage in the same test area.

Suggested labels: Needs review

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 47.37% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding data-provider coverage across the largest test suites.
Linked Issues check ✅ Passed The PR refactors the six targeted test suites to data providers and shared helpers, matching the issue's test-only refactor objective.
Out of Scope Changes check ✅ Passed The changes stay within the requested test refactor scope and add no unrelated production or feature work.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/140-data-providers

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown

@github-actions

This comment has been minimized.

@codecov

codecov Bot commented Jul 29, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.09%. Comparing base (0a3bda7) to head (fd0142b).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #141   +/-   ##
=======================================
  Coverage   99.09%   99.09%           
=======================================
  Files         119      119           
  Lines        4650     4650           
=======================================
  Hits         4608     4608           
  Misses         42       42           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/phpunit/Unit/Widget/WidgetFactoryTest.php`:
- Around line 118-127: Update the picker-path fixtures in the relevant
WidgetFactory tests to use vfsStream instead of the host-dependent /nonexistent
path. Initialize the virtual filesystem for both “single picker outside its
start” and “multiple picker keeps its paths” cases, and pass corresponding
vfs:// paths while preserving each test’s expected result.
- Around line 131-136: Update testDateWithNonStringCurrentOpensOnToday so the
expected date is captured both before and after WidgetFactory::create, then
assert that the widget value matches either captured boundary date, preserving
midnight-safe validation of today.
- Line 205: Update the Key::char call in the widget handling test to construct
the control byte with chr(5) instead of the double-quoted "\x05" literal,
preserving the existing behavior and required string-quoting convention.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b8c26c8e-ac11-4351-b648-067623d7ca9b

📥 Commits

Reviewing files that changed from the base of the PR and between 0a3bda7 and 1e7db38.

📒 Files selected for processing (6)
  • tests/phpunit/Unit/Builder/FormTest.php
  • tests/phpunit/Unit/Render/PanelControllerTest.php
  • tests/phpunit/Unit/Resolver/InputResolverTest.php
  • tests/phpunit/Unit/Schema/AgentHelpTest.php
  • tests/phpunit/Unit/Schema/SchemaGeneratorTest.php
  • tests/phpunit/Unit/Widget/WidgetFactoryTest.php

Comment thread tests/phpunit/Unit/Widget/WidgetFactoryTest.php Outdated
Comment thread tests/phpunit/Unit/Widget/WidgetFactoryTest.php Outdated
Comment thread tests/phpunit/Unit/Widget/WidgetFactoryTest.php
@github-actions

Copy link
Copy Markdown
Code Coverage Report:
  2026-07-29 08:06:52

 Summary:
  Classes: 84.03% (100/119)
  Methods: 96.79% (1025/1059)
  Lines:   99.10% (4608/4650)

DrevOps\Tui\Answers\Answer
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Answers\Answers
  Methods: 100.00% (10/10)   Lines: 100.00% ( 21/ 21)
DrevOps\Tui\Answers\Provenance
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Answers\SummaryFormatter
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 22/ 22)
DrevOps\Tui\Answers\ValueFormatter
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  6/  6)
DrevOps\Tui\Builder\FieldBuilder
  Methods:  98.33% (59/60)   Lines:  98.70% (227/230)
DrevOps\Tui\Builder\Form
  Methods:  84.62% (11/13)   Lines:  95.45% ( 63/ 66)
DrevOps\Tui\Builder\LayoutGuard
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Builder\PanelBuilder
  Methods: 100.00% (25/25)   Lines: 100.00% ( 44/ 44)
DrevOps\Tui\Condition\CompositeCondition
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 19/ 19)
DrevOps\Tui\Condition\Condition
  Methods: 100.00% (10/10)   Lines: 100.00% ( 38/ 38)
DrevOps\Tui\Derive\Derive
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 10/ 10)
DrevOps\Tui\Derive\Deriver
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 13/ 13)
DrevOps\Tui\Derive\Transform
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Discovery\AbstractDiscover
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Discovery\Dotenv
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 19/ 19)
DrevOps\Tui\Discovery\JsonValue
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Discovery\PathExists
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Discovery\Scan
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Engine\Engine
  Methods: 100.00% (24/24)   Lines: 100.00% (187/187)
DrevOps\Tui\Handler\HandlerRegistry
  Methods:  85.71% ( 6/ 7)   Lines:  95.45% ( 21/ 22)
DrevOps\Tui\Input\Binding
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Input\DefaultKeyMap
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 43/ 43)
DrevOps\Tui\Input\Hint
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Input\Key
  Methods:  87.50% ( 7/ 8)   Lines:  63.64% (  7/ 11)
DrevOps\Tui\Input\KeyMap
  Methods: 100.00% (11/11)   Lines: 100.00% ( 61/ 61)
DrevOps\Tui\Input\KeyMapManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Input\KeyParser
  Methods:  85.71% ( 6/ 7)   Lines:  98.95% ( 94/ 95)
DrevOps\Tui\Input\Scope
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 17/ 17)
DrevOps\Tui\Input\ScopedKeyMap
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% (  4/  4)
DrevOps\Tui\Input\VimKeyMap
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Model\Buttons
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Model\DateBounds
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 28/ 28)
DrevOps\Tui\Model\Field
  Methods:  90.91% (20/22)   Lines:  98.61% (142/144)
DrevOps\Tui\Model\FieldType
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 45/ 45)
DrevOps\Tui\Model\FilePickerConstraints
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 53/ 53)
DrevOps\Tui\Model\FormDefinition
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 31/ 31)
DrevOps\Tui\Model\Modal
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Model\NumberBounds
  Methods:  83.33% ( 5/ 6)   Lines:  95.24% ( 20/ 21)
DrevOps\Tui\Model\Option
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Model\Panel
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Model\SelectionBounds
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 23/ 23)
DrevOps\Tui\Model\TableSpec
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  9/  9)
DrevOps\Tui\Model\Template
  Methods: 100.00% (19/19)   Lines: 100.00% ( 67/ 67)
DrevOps\Tui\Model\Weekday
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Primitive\Output
  Methods: 100.00% (16/16)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Primitive\Progress
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 28/ 28)
DrevOps\Tui\Primitive\ProgressReporter
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Render\Ansi
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 22/ 22)
DrevOps\Tui\Render\Box
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Render\ExternalEditor
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 27/ 27)
DrevOps\Tui\Render\HelpSection
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Render\Markup
  Methods: 100.00% (10/10)   Lines: 100.00% ( 69/ 69)
DrevOps\Tui\Render\MarkupSegment
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Render\Navigator
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Render\Overlay
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 24/ 24)
DrevOps\Tui\Render\PanelController
  Methods:  98.11% (52/53)   Lines:  99.74% (377/378)
DrevOps\Tui\Render\Scroller
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Render\Table
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 64/ 64)
DrevOps\Tui\Render\Terminal
  Methods:  95.65% (22/23)   Lines:  96.97% ( 64/ 66)
DrevOps\Tui\Render\TerminalControl
  Methods: 100.00% (11/11)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Render\Viewport
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Resolver\EnvNameResolver
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Resolver\InputResolver
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Schema\AgentHelp
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 67/ 67)
DrevOps\Tui\Schema\DefaultResolver
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Schema\OptionsResolver
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Schema\SchemaGenerator
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 46/ 46)
DrevOps\Tui\Schema\SchemaValidator
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 40/ 40)
DrevOps\Tui\Testing\ArrayKeyStream
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Testing\BufferedTerminal
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Testing\KeyEncoder
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 22/ 22)
DrevOps\Tui\Testing\TuiTester
  Methods: 100.00% (14/14)   Lines: 100.00% ( 36/ 36)
DrevOps\Tui\Testing\WidgetRunner
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Theme\DefaultTheme
  Methods:  97.01% (130/134)   Lines:  99.27% (680/685)
DrevOps\Tui\Theme\DosTheme
  Methods:  81.25% (13/16)   Lines:  83.33% ( 15/ 18)
DrevOps\Tui\Theme\EmberTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\FrostTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\MidnightTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\MonoTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\Sgr
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Theme\ThemeManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Translation\Translator
  Methods: 100.00% (18/18)   Lines: 100.00% ( 87/ 87)
DrevOps\Tui\Tui
  Methods: 100.00% (29/29)   Lines: 100.00% ( 99/ 99)
DrevOps\Tui\Utils\Strings
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 36/ 36)
DrevOps\Tui\Widget\AbstractWidget
  Methods:  95.00% (19/20)   Lines:  98.33% ( 59/ 60)
DrevOps\Tui\Widget\CalendarWidget
  Methods: 100.00% (13/13)   Lines: 100.00% ( 52/ 52)
DrevOps\Tui\Widget\Capability\CompletionCapableTrait
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Widget\Capability\FilterCapableTrait
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Widget\Capability\OptionsCapableTrait
  Methods: 100.00% (10/10)   Lines: 100.00% ( 36/ 36)
DrevOps\Tui\Widget\Capability\PagingCapableTrait
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Widget\Capability\PlaceholderCapableTrait
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Widget\Capability\QueryOptionsCapableTrait
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 35/ 35)
DrevOps\Tui\Widget\Capability\SearchCapableTrait
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Widget\Capability\SelectionBoundedTrait
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Widget\Capability\SelectionCapableTrait
  Methods: 100.00% (13/13)   Lines: 100.00% ( 88/ 88)
DrevOps\Tui\Widget\Capability\TextEditCapableTrait
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 34/ 34)
DrevOps\Tui\Widget\ConfirmWidget
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 22/ 22)
DrevOps\Tui\Widget\FilePickerWidget
  Methods: 100.00% (33/33)   Lines: 100.00% (187/187)
DrevOps\Tui\Widget\MatchResult
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Widget\MatchTier
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  6/  6)
DrevOps\Tui\Widget\Matcher
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 73/ 73)
DrevOps\Tui\Widget\NumberWidget
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 36/ 36)
DrevOps\Tui\Widget\PasswordDisplay
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Widget\PasswordWidget
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 46/ 46)
DrevOps\Tui\Widget\PauseWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Widget\RatingWidget
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 25/ 25)
DrevOps\Tui\Widget\ReorderWidget
  Methods: 100.00% (11/11)   Lines: 100.00% ( 58/ 58)
DrevOps\Tui\Widget\SearchWidget
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Widget\SelectWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Widget\SuggestWidget
  Methods: 100.00% (19/19)   Lines: 100.00% ( 74/ 74)
DrevOps\Tui\Widget\TemplateWidget
  Methods: 100.00% (14/14)   Lines: 100.00% ( 63/ 63)
DrevOps\Tui\Widget\TextWidget
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 18/ 18)
DrevOps\Tui\Widget\TextareaWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 49/ 49)
DrevOps\Tui\Widget\ToggleWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Widget\WidgetFactory
  Methods: 100.00% (13/13)   Lines: 100.00% ( 59/ 59)

@AlexSkrypnyk AlexSkrypnyk added the Needs review Pull request needs a review from assigned developers label Jul 29, 2026
@AlexSkrypnyk
AlexSkrypnyk merged commit 764d612 into main Jul 29, 2026
12 checks passed
@AlexSkrypnyk
AlexSkrypnyk deleted the feature/140-data-providers branch July 29, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs review Pull request needs a review from assigned developers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Close the data-provider gap in the largest test suites

1 participant