App-Test-Generator
view release on metacpan or search on metacpan
the MetaCPAN API is unavailable. Results are merged into the
existing Dependency Version Cliffs section alongside findings
from detect_version_cliffs(). Added report HTML caching in
fetch_report_html() to avoid fetching the same report twice when
both aggregate_dependency_stats() and detect_prereq_version_cliffs()
process the same GUIDs.
- bin/fuzz-harness-generator: fixed shell injection risk in final
system() call, replaced string eval with block eval for JSON
module loading, added explicit use File::Spec, normalised if()
spacing throughout, added structured comment blocks for all four
helper functions, added YAML input validation before calling
generate()
- bin/generate-test-dashboard: removed duplicate cover -report json
step that was running twice per dashboard build
- bin/test-generator-index: added structured comment blocks for six
private analysis functions; fixed detect_universal_failure() to
partition genuine FAILs from NAs before counting, returning undef
when all reports are NA so detect_perl_version_cliff() can
diagnose correctly
- SchemaExtractor.pm: added structured comment blocks for all private
methods (Pass 3)
- App::Test::Generator: added relationships_code emission so schemas
containing relationship metadata produced by SchemaExtractor are
serialised into the generated test file
- Template test.tt: added semantic type test cases for filepath
(including Windows paths, reserved device names, UNC paths),
email, date_string, and iso8601_string; added relationship test
loop covering all six relationship types (mutually_exclusive,
required_group, conditional_requirement, dependency,
value_constraint, value_conditional); added float edge cases for
Inf, -Inf, and NaN with correct status handling based on whether
max is defined
0.32 Sun Apr 12 08:16:47 EDT 2026
- Added detect_scattered_failures() root cause detector. Surfaces a
weak-confidence advisory when failures and passes coexist across
2 or more common Perl series with no detectable version cliff or
OS pattern, suggesting flaky tests, optional dependency
differences, or CGI environment assumptions rather than a
compatibility issue. Complements detect_universal_failure() which
handles the opposite case of near-total failure. Confidence is
intentionally set to 0.40 (Weak) since this is a catch-all
signal rather than a precise diagnosis, ensuring it appears below
stronger signals in the root causes table when multiple detectors
fire simultaneously.
- Added detect_universal_failure() root cause detector. Surfaces a
high-confidence warning when failures occur across 3 or more
distinct Perl versions and 2 or more OS types with fewer than
10% passing reports, indicating a likely broken release rather
than a version- or platform-specific compatibility issue. Likely
causes listed in evidence: missing file in tarball, broken
Makefile.PL, or undeclared dependency. Integrated into
detect_root_causes() where it is evaluated first and sorted by
confidence alongside the existing OS, locale, and Perl version
cliff detectors.
- Fixed blib/ paths appearing in coverage table instead of lib/
paths. Devel::Cover instruments blib/ during testing; paths are
now normalised to lib/ for display, with deduplication against
any native lib/ entry.
- Fixed structural coverage percentages in Executive Summary and
Structural Coverage sections showing ~24% instead of ~93%.
_coverage_totals now aggregates from individual own-project files
rather than Devel::Cover's pre-aggregated Total key which
includes all instrumented CPAN dependencies.
- Fixed cyclomatic complexity badge colour and tooltip inverted.
High complexity now correctly shows red/Needs improvement;
low complexity shows green/Good. Second condition also fixed
to use $complexity rather than $score.
0.31 Fri Apr 10 08:07:40 EDT 2026
- Added TER3 (LCSAJ path coverage) column to mutation files table in
the test dashboard index, showing percentage and raw fraction
(e.g. "71.8% (352/491)")
- Added TER1, TER2 and TER3 metrics to per-file mutation report pages,
replacing the plain "Statement" and "Branch" labels with their
formal Test Effectiveness Ratio names
- Renamed the LCSAJ column header in the mutation files table to TER3
- With min set to zero on an integer, sometimes negative or floats could be created - added abs() and int() calls as needed
- Added --generate_mutant_tests=DIR option to generate_index.pl to
produce a timestamped test stub file (t/mutant_YYYYMMDD_HHMMSS.t)
for surviving mutants. High/Medium difficulty survivors get TODO
test stubs; Low difficulty survivors get comment-only hints.
Multiple mutations on the same source line are deduplicated into
one stub listing all variants â one good test kills them all.
Boundary value suggestions are generated for numeric mutations,
clamped and deduplicated for non-negative contexts such as
scalar() and length(). Environment variable hints are added where
the source line references $ENV{...}. The enclosing subroutine
name is shown in each stub for navigation context. File is skipped
if there are no survivors or low-difficulty hints to report.
- LCSAJ path dots on per-file mutation pages are now coloured blue
(covered) or red (not covered), based on whether any line in the
path range was executed during testing. Uncovered paths show
[NOT COVERED] in the hover tooltip. The LCSAJ legend is updated
to explain both colours.
- Replaced TER3-only column in mutation files table with a
TER1 / TER2 / TER3 triple, each component shown as a
colour-coded badge (green/yellow/red). TER1=Statement,
TER2=Branch, TER3=LCSAJ path coverage. Any component
without data shows a grey n/a badge. Column header carries
a tooltip defining all three metrics.
- Added --generate_test=mutant option to generate_index.pl (used
alongside --generate_mutant_tests=DIR). For NUM_BOUNDARY survivors,
attempts to produce a runnable YAML schema file in t/conf/ using
App::Test::Generator::SchemaExtractor rather than a TODO stub.
The schema is augmented with boundary values from the surviving
mutant (the exact boundary value plus one either side) and picked
up automatically by t/fuzz.t on the next test run. Falls back to
a TODO stub if SchemaExtractor fails, the enclosing sub cannot be
found, or confidence in the extracted schema is too low. The
--generate_test option is designed to accept future classes beyond
'mutant'. Updated generate_test_dashboard Step 7 to pass
--generate_test=mutant by default.
- Made output_dir optional in App::Test::Generator::SchemaExtractor
new() -- it is now only required if schema files will be written.
extract_all() gains a no_write option to suppress file output and
return schemas only, for use by callers that want to inspect or
augment schemas before deciding where to write them.
- Added --generate_fuzz flag to generate_index.pl. Scans t/conf/
for existing YAML schema files and writes timestamped augmented
copies (mutant_fuzz_YYYYMMDD_HHMMSS_FUNCTION.yml) with boundary
values from surviving NUM_BOUNDARY mutants merged in. The original
schema is never modified. Augmented schemas are picked up
automatically by t/fuzz.t. Schemas with no matching survivors are
skipped (with a verbose note). Boundary values are merged into
whichever edge key already exists in the schema (edge_case_array
or edge_cases), with deduplication. Schemas already prefixed with
mutant_fuzz_ are skipped to prevent cascading augmentation.
Updated generate_test_dashboard Step 7 to pass --generate_fuzz.
0.30 Thu Apr 2 07:17:16 EDT 2026
Added mutation levels.
( run in 1.104 second using v1.01-cache-2.11-cpan-39bf76dae61 )