Changes for version 0.33 - 2026-04-21
- Fixed NumericBoundary mutator incorrectly identifying the '<' in open() mode strings and readline operators (<$fh>) as numeric comparison operators, producing invalid mutants that caused compilation errors in the mutated code. Two guards added to mutate(): skip any operator whose next sibling is a PPI symbol token (catching <$fh>), and skip operators not parented by a PPI::Statement, PPI::Structure::Condition, or PPI::Structure::Block (catching quoted mode strings in open() argument lists). The same readline guard is also applied inside the transform closure to prevent mutation at apply time if PPI tokenisation differs between the analysis and mutation documents.
- Rationalised program names so that they can be used in other modules without the need to have copies
- Added detect_prereq_version_cliffs() to cross-reference declared prerequisites from the MetaCPAN API against installed module versions reported by CPAN Testers. Flags cases where failing reports have an installed version below the declared minimum, surfacing dependency version mismatches (e.g. Test::Mockingbird 0.02 installed where >= 0.03 is required) that the existing detect_version_cliffs() misses because it only examines prereq metadata within the reports themselves. Falls back to scanning raw CPAN Testers report output for version complaint patterns if 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
Documentation
Demonstrate the schema extractor
Extract test schemas from Perl modules
Extract schemas and optionally emit Perl tests
Generate fuzzing + corpus-based test harnesses from test schemas
Test coverage dashboard generator
Run mutation testing against a Perl test suite
Modules
Fuzz Testing, Mutation Testing, LCSAJ Metrics and Test Dashboard for Perl modules
AFL-style coverage-guided fuzzing for App::Test::Generator
Static LCSAJ extraction for Perl
Merge LCSAJ path data with runtime hits
Negate boolean return expressions to expose missing assertion coverage
Replace return expressions with undef to expose missing undef-return checks in the test suite
Generate and apply mutation tests
Example module for schema extraction testing
Extract test schemas from Perl modules
Template for the test files generated by App::Test::Generator
Debugger backend for LCSAJ coverage
Provides
in lib/App/Test/Generator/Analyzer/Complexity.pm
in lib/App/Test/Generator/Analyzer/Return.pm
in lib/App/Test/Generator/Analyzer/ReturnMeta.pm
in lib/App/Test/Generator/Analyzer/SideEffect.pm
in lib/App/Test/Generator/Emitter/Perl.pm
in lib/App/Test/Generator/Model/Method.pm
in lib/App/Test/Generator/Mutant.pm
in lib/App/Test/Generator/Mutation/Base.pm
in lib/App/Test/Generator/Mutation/ConditionalInversion.pm
in lib/App/Test/Generator/Mutation/NumericBoundary.pm
in lib/App/Test/Generator/Pipeline.pm
in lib/App/Test/Generator/Planner.pm
in lib/App/Test/Generator/Planner/Fixture.pm
in lib/App/Test/Generator/Planner/Grouping.pm
in lib/App/Test/Generator/Planner/Isolation.pm
in lib/App/Test/Generator/Planner/Mock.pm
in lib/App/Test/Generator/TestStrategy.pm